aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2006-02-02 21:51:52 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2006-02-02 21:51:52 -0500
commit33052057e3e2db7f37fc78aa3f25c98f7e989fae (patch)
treee80a3aa1371f513c833dc94a16674f78faeeeb1d
parent00b464debf0038b1628996065f0be564ccfbfd86 (diff)
parent1113a7e92e483074c6235da59460759e33b9b144 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
-rw-r--r--Documentation/kernel-parameters.txt5
-rw-r--r--Documentation/sound/alsa/ALSA-Configuration.txt10
-rw-r--r--Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl4
-rw-r--r--arch/i386/kernel/acpi/Makefile2
-rw-r--r--arch/i386/kernel/acpi/boot.c6
-rw-r--r--arch/i386/kernel/acpi/cstate.c58
-rw-r--r--arch/i386/kernel/acpi/processor.c75
-rw-r--r--arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c71
-rw-r--r--arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c12
-rw-r--r--arch/i386/kernel/mpparse.c8
-rw-r--r--arch/ia64/kernel/Makefile5
-rw-r--r--arch/ia64/kernel/acpi-ext.c22
-rw-r--r--arch/ia64/kernel/acpi-processor.c67
-rw-r--r--arch/ia64/kernel/acpi.c6
-rw-r--r--arch/ia64/kernel/cpufreq/Makefile1
-rw-r--r--arch/ia64/kernel/cpufreq/acpi-cpufreq.c51
-rw-r--r--arch/ia64/pci/pci.c10
-rw-r--r--arch/powerpc/platforms/pseries/pci_dlpar.c3
-rw-r--r--arch/x86_64/kernel/acpi/Makefile5
-rw-r--r--arch/x86_64/kernel/acpi/processor.c72
-rw-r--r--arch/x86_64/kernel/io_apic.c10
-rw-r--r--arch/x86_64/kernel/mpparse.c8
-rw-r--r--drivers/acpi/Kconfig1
-rw-r--r--drivers/acpi/acpi_memhotplug.c17
-rw-r--r--drivers/acpi/asus_acpi.c35
-rw-r--r--drivers/acpi/dispatcher/dsfield.c37
-rw-r--r--drivers/acpi/dispatcher/dsinit.c51
-rw-r--r--drivers/acpi/dispatcher/dsmethod.c360
-rw-r--r--drivers/acpi/dispatcher/dsmthdat.c37
-rw-r--r--drivers/acpi/dispatcher/dsobject.c106
-rw-r--r--drivers/acpi/dispatcher/dsopcode.c58
-rw-r--r--drivers/acpi/dispatcher/dsutils.c33
-rw-r--r--drivers/acpi/dispatcher/dswexec.c80
-rw-r--r--drivers/acpi/dispatcher/dswload.c270
-rw-r--r--drivers/acpi/dispatcher/dswscope.c6
-rw-r--r--drivers/acpi/dispatcher/dswstate.c128
-rw-r--r--drivers/acpi/ec.c291
-rw-r--r--drivers/acpi/events/evevent.c63
-rw-r--r--drivers/acpi/events/evgpe.c54
-rw-r--r--drivers/acpi/events/evgpeblk.c215
-rw-r--r--drivers/acpi/events/evmisc.c26
-rw-r--r--drivers/acpi/events/evregion.c63
-rw-r--r--drivers/acpi/events/evrgnini.c8
-rw-r--r--drivers/acpi/events/evsci.c6
-rw-r--r--drivers/acpi/events/evxface.c19
-rw-r--r--drivers/acpi/events/evxfevnt.c34
-rw-r--r--drivers/acpi/events/evxfregn.c2
-rw-r--r--drivers/acpi/executer/exconfig.c8
-rw-r--r--drivers/acpi/executer/exconvrt.c36
-rw-r--r--drivers/acpi/executer/excreate.c6
-rw-r--r--drivers/acpi/executer/exdump.c671
-rw-r--r--drivers/acpi/executer/exfield.c11
-rw-r--r--drivers/acpi/executer/exfldio.c93
-rw-r--r--drivers/acpi/executer/exmisc.c113
-rw-r--r--drivers/acpi/executer/exmutex.c28
-rw-r--r--drivers/acpi/executer/exnames.c23
-rw-r--r--drivers/acpi/executer/exoparg1.c72
-rw-r--r--drivers/acpi/executer/exoparg2.c46
-rw-r--r--drivers/acpi/executer/exoparg3.c12
-rw-r--r--drivers/acpi/executer/exoparg6.c16
-rw-r--r--drivers/acpi/executer/exprep.c34
-rw-r--r--drivers/acpi/executer/exregion.c35
-rw-r--r--drivers/acpi/executer/exresnte.c51
-rw-r--r--drivers/acpi/executer/exresolv.c35
-rw-r--r--drivers/acpi/executer/exresop.c143
-rw-r--r--drivers/acpi/executer/exstore.c27
-rw-r--r--drivers/acpi/executer/exstoren.c24
-rw-r--r--drivers/acpi/executer/exstorob.c6
-rw-r--r--drivers/acpi/executer/exsystem.c6
-rw-r--r--drivers/acpi/executer/exutils.c20
-rw-r--r--drivers/acpi/glue.c8
-rw-r--r--drivers/acpi/hardware/hwacpi.c25
-rw-r--r--drivers/acpi/hardware/hwgpe.c2
-rw-r--r--drivers/acpi/hardware/hwregs.c59
-rw-r--r--drivers/acpi/hardware/hwsleep.c23
-rw-r--r--drivers/acpi/hardware/hwtimer.c2
-rw-r--r--drivers/acpi/motherboard.c30
-rw-r--r--drivers/acpi/namespace/nsaccess.c35
-rw-r--r--drivers/acpi/namespace/nsalloc.c11
-rw-r--r--drivers/acpi/namespace/nsdump.c13
-rw-r--r--drivers/acpi/namespace/nsdumpdv.c2
-rw-r--r--drivers/acpi/namespace/nseval.c5
-rw-r--r--drivers/acpi/namespace/nsinit.c105
-rw-r--r--drivers/acpi/namespace/nsload.c10
-rw-r--r--drivers/acpi/namespace/nsnames.c14
-rw-r--r--drivers/acpi/namespace/nsobject.c13
-rw-r--r--drivers/acpi/namespace/nsparse.c2
-rw-r--r--drivers/acpi/namespace/nssearch.c30
-rw-r--r--drivers/acpi/namespace/nsutils.c43
-rw-r--r--drivers/acpi/namespace/nswalk.c2
-rw-r--r--drivers/acpi/namespace/nsxfeval.c29
-rw-r--r--drivers/acpi/namespace/nsxfname.c5
-rw-r--r--drivers/acpi/namespace/nsxfobj.c2
-rw-r--r--drivers/acpi/osl.c10
-rw-r--r--drivers/acpi/parser/psargs.c358
-rw-r--r--drivers/acpi/parser/psloop.c39
-rw-r--r--drivers/acpi/parser/psopcode.c4
-rw-r--r--drivers/acpi/parser/psparse.c55
-rw-r--r--drivers/acpi/parser/psscope.c2
-rw-r--r--drivers/acpi/parser/pstree.c5
-rw-r--r--drivers/acpi/parser/psutils.c2
-rw-r--r--drivers/acpi/parser/pswalk.c2
-rw-r--r--drivers/acpi/parser/psxface.c144
-rw-r--r--drivers/acpi/pci_irq.c48
-rw-r--r--drivers/acpi/pci_link.c100
-rw-r--r--drivers/acpi/pci_root.c8
-rw-r--r--drivers/acpi/processor_core.c30
-rw-r--r--drivers/acpi/processor_idle.c133
-rw-r--r--drivers/acpi/processor_perflib.c4
-rw-r--r--drivers/acpi/processor_thermal.c7
-rw-r--r--drivers/acpi/processor_throttling.c7
-rw-r--r--drivers/acpi/resources/Makefile2
-rw-r--r--drivers/acpi/resources/rsaddr.c1164
-rw-r--r--drivers/acpi/resources/rscalc.c831
-rw-r--r--drivers/acpi/resources/rscreate.c231
-rw-r--r--drivers/acpi/resources/rsdump.c1399
-rw-r--r--drivers/acpi/resources/rsinfo.c204
-rw-r--r--drivers/acpi/resources/rsio.c544
-rw-r--r--drivers/acpi/resources/rsirq.c568
-rw-r--r--drivers/acpi/resources/rslist.c534
-rw-r--r--drivers/acpi/resources/rsmemory.c517
-rw-r--r--drivers/acpi/resources/rsmisc.c860
-rw-r--r--drivers/acpi/resources/rsutils.c390
-rw-r--r--drivers/acpi/resources/rsxface.c230
-rw-r--r--drivers/acpi/scan.c2
-rw-r--r--drivers/acpi/sleep/poweroff.c15
-rw-r--r--drivers/acpi/sleep/sleep.h2
-rw-r--r--drivers/acpi/sleep/wakeup.c6
-rw-r--r--drivers/acpi/tables/tbconvrt.c23
-rw-r--r--drivers/acpi/tables/tbget.c39
-rw-r--r--drivers/acpi/tables/tbgetall.c27
-rw-r--r--drivers/acpi/tables/tbinstal.c12
-rw-r--r--drivers/acpi/tables/tbrsdt.c30
-rw-r--r--drivers/acpi/tables/tbutils.c50
-rw-r--r--drivers/acpi/tables/tbxface.c18
-rw-r--r--drivers/acpi/tables/tbxfroot.c35
-rw-r--r--drivers/acpi/utilities/Makefile5
-rw-r--r--drivers/acpi/utilities/utalloc.c61
-rw-r--r--drivers/acpi/utilities/utcache.c2
-rw-r--r--drivers/acpi/utilities/utcopy.c27
-rw-r--r--drivers/acpi/utilities/utdebug.c2
-rw-r--r--drivers/acpi/utilities/utdelete.c15
-rw-r--r--drivers/acpi/utilities/uteval.c46
-rw-r--r--drivers/acpi/utilities/utglobal.c108
-rw-r--r--drivers/acpi/utilities/utinit.c13
-rw-r--r--drivers/acpi/utilities/utmath.c10
-rw-r--r--drivers/acpi/utilities/utmisc.c209
-rw-r--r--drivers/acpi/utilities/utmutex.c58
-rw-r--r--drivers/acpi/utilities/utobject.c33
-rw-r--r--drivers/acpi/utilities/utresrc.c554
-rw-r--r--drivers/acpi/utilities/utstate.c4
-rw-r--r--drivers/acpi/utilities/utxface.c69
-rw-r--r--drivers/acpi/video.c8
-rw-r--r--drivers/char/drm/ati_pcigart.c17
-rw-r--r--drivers/char/drm/drmP.h5
-rw-r--r--drivers/char/drm/drm_auth.c20
-rw-r--r--drivers/char/drm/drm_bufs.c80
-rw-r--r--drivers/char/drm/drm_context.c52
-rw-r--r--drivers/char/drm/drm_drv.c4
-rw-r--r--drivers/char/drm/drm_fops.c12
-rw-r--r--drivers/char/drm/drm_ioctl.c18
-rw-r--r--drivers/char/drm/drm_irq.c16
-rw-r--r--drivers/char/drm/drm_pciids.h2
-rw-r--r--drivers/char/drm/drm_proc.c28
-rw-r--r--drivers/char/drm/drm_stub.c4
-rw-r--r--drivers/char/drm/drm_vm.c12
-rw-r--r--drivers/char/drm/i810_dma.c2
-rw-r--r--drivers/char/drm/i810_drv.h2
-rw-r--r--drivers/char/drm/i830_dma.c2
-rw-r--r--drivers/char/drm/i830_drv.h3
-rw-r--r--drivers/char/drm/i915_dma.c42
-rw-r--r--drivers/char/drm/i915_drm.h33
-rw-r--r--drivers/char/drm/i915_drv.h6
-rw-r--r--drivers/char/drm/i915_mem.c31
-rw-r--r--drivers/char/drm/radeon_cp.c2
-rw-r--r--drivers/char/drm/savage_bci.c4
-rw-r--r--drivers/char/drm/savage_drv.h1
-rw-r--r--drivers/char/drm/via_dma.c10
-rw-r--r--drivers/char/drm/via_dmablit.c6
-rw-r--r--drivers/char/drm/via_drv.h7
-rw-r--r--drivers/char/drm/via_irq.c2
-rw-r--r--drivers/char/hpet.c26
-rw-r--r--drivers/ide/pci/sgiioc4.c9
-rw-r--r--drivers/md/dm-log.c3
-rw-r--r--drivers/md/md.c32
-rw-r--r--drivers/md/raid6main.c149
-rw-r--r--drivers/pci/hotplug/rpaphp_slot.c1
-rw-r--r--drivers/pnp/card.c9
-rw-r--r--drivers/pnp/pnpacpi/core.c14
-rw-r--r--drivers/pnp/pnpacpi/rsparser.c547
-rw-r--r--drivers/serial/8250_acpi.c22
-rw-r--r--fs/cifs/connect.c11
-rw-r--r--fs/cifs/file.c8
-rw-r--r--fs/cifs/transport.c1
-rw-r--r--fs/compat.c12
-rw-r--r--include/acpi/acconfig.h24
-rw-r--r--include/acpi/acdebug.h2
-rw-r--r--include/acpi/acdisasm.h81
-rw-r--r--include/acpi/acdispat.h5
-rw-r--r--include/acpi/acevents.h8
-rw-r--r--include/acpi/acexcep.h2
-rw-r--r--include/acpi/acglobal.h23
-rw-r--r--include/acpi/achware.h2
-rw-r--r--include/acpi/acinterp.h48
-rw-r--r--include/acpi/aclocal.h112
-rw-r--r--include/acpi/acmacros.h201
-rw-r--r--include/acpi/acnames.h2
-rw-r--r--include/acpi/acnamesp.h4
-rw-r--r--include/acpi/acobject.h4
-rw-r--r--include/acpi/acopcode.h2
-rw-r--r--include/acpi/acoutput.h12
-rw-r--r--include/acpi/acparser.h2
-rw-r--r--include/acpi/acpi.h2
-rw-r--r--include/acpi/acpi_drivers.h4
-rw-r--r--include/acpi/acpiosxf.h6
-rw-r--r--include/acpi/acpixf.h13
-rw-r--r--include/acpi/acresrc.h390
-rw-r--r--include/acpi/acstruct.h2
-rw-r--r--include/acpi/actables.h2
-rw-r--r--include/acpi/actbl.h8
-rw-r--r--include/acpi/actbl1.h2
-rw-r--r--include/acpi/actbl2.h2
-rw-r--r--include/acpi/actypes.h613
-rw-r--r--include/acpi/acutils.h82
-rw-r--r--include/acpi/amlcode.h2
-rw-r--r--include/acpi/amlresrc.h271
-rw-r--r--include/acpi/pdc_intel.h4
-rw-r--r--include/acpi/platform/acenv.h24
-rw-r--r--include/acpi/platform/acgcc.h10
-rw-r--r--include/acpi/platform/aclinux.h8
-rw-r--r--include/acpi/processor.h28
-rw-r--r--include/asm-i386/acpi.h2
-rw-r--r--include/asm-x86_64/mpspec.h2
-rw-r--r--include/linux/acpi.h2
-rw-r--r--include/linux/kernel.h1
-rw-r--r--include/linux/reboot.h3
-rw-r--r--include/linux/syscalls.h6
-rw-r--r--kernel/power/disk.c9
-rw-r--r--kernel/power/main.c4
-rw-r--r--kernel/sys.c25
-rw-r--r--sound/core/info.c33
-rw-r--r--sound/drivers/serial-u16550.c2
-rw-r--r--sound/isa/cmi8330.c6
-rw-r--r--sound/isa/cs423x/cs4236.c13
-rw-r--r--sound/isa/es18xx.c6
-rw-r--r--sound/isa/gus/gusclassic.c2
-rw-r--r--sound/isa/opl3sa2.c12
-rw-r--r--sound/isa/opti9xx/opti92x-ad1848.c2
-rw-r--r--sound/isa/sb/sb16.c4
-rw-r--r--sound/isa/sscape.c6
-rw-r--r--sound/isa/wavefront/wavefront.c7
-rw-r--r--sound/isa/wavefront/wavefront_synth.c2
-rw-r--r--sound/pci/ac97/ac97_patch.c53
-rw-r--r--sound/pci/ali5451/ali5451.c2
-rw-r--r--sound/pci/au88x0/au88x0_eq.c2
-rw-r--r--sound/pci/bt87x.c4
-rw-r--r--sound/pci/ca0106/ca0106_main.c12
-rw-r--r--sound/pci/cs46xx/dsp_spos_scb_lib.c2
-rw-r--r--sound/pci/cs5535audio/cs5535audio.c6
-rw-r--r--sound/pci/emu10k1/emumixer.c10
-rw-r--r--sound/pci/hda/hda_intel.c2
-rw-r--r--sound/pci/hda/patch_realtek.c11
-rw-r--r--sound/pci/hda/patch_si3054.c1
-rw-r--r--sound/pci/hda/patch_sigmatel.c176
-rw-r--r--sound/pci/intel8x0.c15
-rw-r--r--sound/pci/pcxhr/pcxhr.c9
-rw-r--r--sound/pci/rme9652/hdspm.c6
-rw-r--r--sound/pci/trident/trident.c8
-rw-r--r--sound/pci/via82xx.c5
-rw-r--r--sound/pci/ymfpci/ymfpci_main.c2
-rw-r--r--sound/usb/usbaudio.c31
271 files changed, 9399 insertions, 8793 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 1cbcf65b764b..84370363da80 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -452,6 +452,11 @@ running once the system is up.
452 452
453 eata= [HW,SCSI] 453 eata= [HW,SCSI]
454 454
455 ec_intr= [HW,ACPI] ACPI Embedded Controller interrupt mode
456 Format: <int>
457 0: polling mode
458 non-0: interrupt mode (default)
459
455 eda= [HW,PS2] 460 eda= [HW,PS2]
456 461
457 edb= [HW,PS2] 462 edb= [HW,PS2]
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
index d2578013e829..36b511c7cade 100644
--- a/Documentation/sound/alsa/ALSA-Configuration.txt
+++ b/Documentation/sound/alsa/ALSA-Configuration.txt
@@ -837,8 +837,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
837 837
838 Module for AC'97 motherboards from Intel and compatibles. 838 Module for AC'97 motherboards from Intel and compatibles.
839 * Intel i810/810E, i815, i820, i830, i84x, MX440 839 * Intel i810/810E, i815, i820, i830, i84x, MX440
840 ICH5, ICH6, ICH7, ESB2
840 * SiS 7012 (SiS 735) 841 * SiS 7012 (SiS 735)
841 * NVidia NForce, NForce2 842 * NVidia NForce, NForce2, NForce3, MCP04, CK804
843 CK8, CK8S, MCP501
842 * AMD AMD768, AMD8111 844 * AMD AMD768, AMD8111
843 * ALi m5455 845 * ALi m5455
844 846
@@ -868,6 +870,12 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
868 -------------------- 870 --------------------
869 871
870 Module for Intel ICH (i8x0) chipset MC97 modems. 872 Module for Intel ICH (i8x0) chipset MC97 modems.
873 * Intel i810/810E, i815, i820, i830, i84x, MX440
874 ICH5, ICH6, ICH7
875 * SiS 7013 (SiS 735)
876 * NVidia NForce, NForce2, NForce2s, NForce3
877 * AMD AMD8111
878 * ALi m5455
871 879
872 ac97_clock - AC'97 codec clock base (0 = auto-detect) 880 ac97_clock - AC'97 codec clock base (0 = auto-detect)
873 881
diff --git a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
index e651ed8d1e6f..4251085d38d3 100644
--- a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
+++ b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
@@ -5206,14 +5206,14 @@ struct _snd_pcm_runtime {
5206 You need to pass the <function>snd_dma_pci_data(pci)</function>, 5206 You need to pass the <function>snd_dma_pci_data(pci)</function>,
5207 where pci is the struct <structname>pci_dev</structname> pointer 5207 where pci is the struct <structname>pci_dev</structname> pointer
5208 of the chip as well. 5208 of the chip as well.
5209 The <type>snd_sg_buf_t</type> instance is created as 5209 The <type>struct snd_sg_buf</type> instance is created as
5210 substream-&gt;dma_private. You can cast 5210 substream-&gt;dma_private. You can cast
5211 the pointer like: 5211 the pointer like:
5212 5212
5213 <informalexample> 5213 <informalexample>
5214 <programlisting> 5214 <programlisting>
5215<![CDATA[ 5215<![CDATA[
5216 struct snd_sg_buf *sgbuf = (struct snd_sg_buf_t*)substream->dma_private; 5216 struct snd_sg_buf *sgbuf = (struct snd_sg_buf *)substream->dma_private;
5217]]> 5217]]>
5218 </programlisting> 5218 </programlisting>
5219 </informalexample> 5219 </informalexample>
diff --git a/arch/i386/kernel/acpi/Makefile b/arch/i386/kernel/acpi/Makefile
index 267ca48e1b6c..d51c7313cae8 100644
--- a/arch/i386/kernel/acpi/Makefile
+++ b/arch/i386/kernel/acpi/Makefile
@@ -3,6 +3,6 @@ obj-$(CONFIG_X86_IO_APIC) += earlyquirk.o
3obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o 3obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o
4 4
5ifneq ($(CONFIG_ACPI_PROCESSOR),) 5ifneq ($(CONFIG_ACPI_PROCESSOR),)
6obj-y += cstate.o 6obj-y += cstate.o processor.o
7endif 7endif
8 8
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c
index 2111529dea77..f21fa0d4482f 100644
--- a/arch/i386/kernel/acpi/boot.c
+++ b/arch/i386/kernel/acpi/boot.c
@@ -464,7 +464,7 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
464 * success: return IRQ number (>=0) 464 * success: return IRQ number (>=0)
465 * failure: return < 0 465 * failure: return < 0
466 */ 466 */
467int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low) 467int acpi_register_gsi(u32 gsi, int triggering, int polarity)
468{ 468{
469 unsigned int irq; 469 unsigned int irq;
470 unsigned int plat_gsi = gsi; 470 unsigned int plat_gsi = gsi;
@@ -476,14 +476,14 @@ int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
476 if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) { 476 if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) {
477 extern void eisa_set_level_irq(unsigned int irq); 477 extern void eisa_set_level_irq(unsigned int irq);
478 478
479 if (edge_level == ACPI_LEVEL_SENSITIVE) 479 if (triggering == ACPI_LEVEL_SENSITIVE)
480 eisa_set_level_irq(gsi); 480 eisa_set_level_irq(gsi);
481 } 481 }
482#endif 482#endif
483 483
484#ifdef CONFIG_X86_IO_APIC 484#ifdef CONFIG_X86_IO_APIC
485 if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) { 485 if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) {
486 plat_gsi = mp_register_gsi(gsi, edge_level, active_high_low); 486 plat_gsi = mp_register_gsi(gsi, triggering, polarity);
487 } 487 }
488#endif 488#endif
489 acpi_gsi_to_irq(plat_gsi, &irq); 489 acpi_gsi_to_irq(plat_gsi, &irq);
diff --git a/arch/i386/kernel/acpi/cstate.c b/arch/i386/kernel/acpi/cstate.c
index 4c3036ba65df..25db49ef1770 100644
--- a/arch/i386/kernel/acpi/cstate.c
+++ b/arch/i386/kernel/acpi/cstate.c
@@ -14,64 +14,6 @@
14#include <acpi/processor.h> 14#include <acpi/processor.h>
15#include <asm/acpi.h> 15#include <asm/acpi.h>
16 16
17static void acpi_processor_power_init_intel_pdc(struct acpi_processor_power
18 *pow)
19{
20 struct acpi_object_list *obj_list;
21 union acpi_object *obj;
22 u32 *buf;
23
24 /* allocate and initialize pdc. It will be used later. */
25 obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
26 if (!obj_list) {
27 printk(KERN_ERR "Memory allocation error\n");
28 return;
29 }
30
31 obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
32 if (!obj) {
33 printk(KERN_ERR "Memory allocation error\n");
34 kfree(obj_list);
35 return;
36 }
37
38 buf = kmalloc(12, GFP_KERNEL);
39 if (!buf) {
40 printk(KERN_ERR "Memory allocation error\n");
41 kfree(obj);
42 kfree(obj_list);
43 return;
44 }
45
46 buf[0] = ACPI_PDC_REVISION_ID;
47 buf[1] = 1;
48 buf[2] = ACPI_PDC_C_CAPABILITY_SMP;
49
50 obj->type = ACPI_TYPE_BUFFER;
51 obj->buffer.length = 12;
52 obj->buffer.pointer = (u8 *) buf;
53 obj_list->count = 1;
54 obj_list->pointer = obj;
55 pow->pdc = obj_list;
56
57 return;
58}
59
60/* Initialize _PDC data based on the CPU vendor */
61void acpi_processor_power_init_pdc(struct acpi_processor_power *pow,
62 unsigned int cpu)
63{
64 struct cpuinfo_x86 *c = cpu_data + cpu;
65
66 pow->pdc = NULL;
67 if (c->x86_vendor == X86_VENDOR_INTEL)
68 acpi_processor_power_init_intel_pdc(pow);
69
70 return;
71}
72
73EXPORT_SYMBOL(acpi_processor_power_init_pdc);
74
75/* 17/*
76 * Initialize bm_flags based on the CPU cache properties 18 * Initialize bm_flags based on the CPU cache properties
77 * On SMP it depends on cache configuration 19 * On SMP it depends on cache configuration
diff --git a/arch/i386/kernel/acpi/processor.c b/arch/i386/kernel/acpi/processor.c
new file mode 100644
index 000000000000..9f4cc02717ec
--- /dev/null
+++ b/arch/i386/kernel/acpi/processor.c
@@ -0,0 +1,75 @@
1/*
2 * arch/i386/kernel/acpi/processor.c
3 *
4 * Copyright (C) 2005 Intel Corporation
5 * Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
6 * - Added _PDC for platforms with Intel CPUs
7 */
8
9#include <linux/kernel.h>
10#include <linux/module.h>
11#include <linux/init.h>
12#include <linux/acpi.h>
13
14#include <acpi/processor.h>
15#include <asm/acpi.h>
16
17static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
18{
19 struct acpi_object_list *obj_list;
20 union acpi_object *obj;
21 u32 *buf;
22
23 /* allocate and initialize pdc. It will be used later. */
24 obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
25 if (!obj_list) {
26 printk(KERN_ERR "Memory allocation error\n");
27 return;
28 }
29
30 obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
31 if (!obj) {
32 printk(KERN_ERR "Memory allocation error\n");
33 kfree(obj_list);
34 return;
35 }
36
37 buf = kmalloc(12, GFP_KERNEL);
38 if (!buf) {
39 printk(KERN_ERR "Memory allocation error\n");
40 kfree(obj);
41 kfree(obj_list);
42 return;
43 }
44
45 buf[0] = ACPI_PDC_REVISION_ID;
46 buf[1] = 1;
47 buf[2] = ACPI_PDC_C_CAPABILITY_SMP;
48
49 if (cpu_has(c, X86_FEATURE_EST))
50 buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP;
51
52 obj->type = ACPI_TYPE_BUFFER;
53 obj->buffer.length = 12;
54 obj->buffer.pointer = (u8 *) buf;
55 obj_list->count = 1;
56 obj_list->pointer = obj;
57 pr->pdc = obj_list;
58
59 return;
60}
61
62/* Initialize _PDC data based on the CPU vendor */
63void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
64{
65 unsigned int cpu = pr->id;
66 struct cpuinfo_x86 *c = cpu_data + cpu;
67
68 pr->pdc = NULL;
69 if (c->x86_vendor == X86_VENDOR_INTEL)
70 init_intel_pdc(pr, c);
71
72 return;
73}
74
75EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
diff --git a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
index 7975e79d5fa4..3852d0a4c1b5 100644
--- a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -295,68 +295,6 @@ acpi_cpufreq_guess_freq (
295} 295}
296 296
297 297
298/*
299 * acpi_processor_cpu_init_pdc_est - let BIOS know about the SMP capabilities
300 * of this driver
301 * @perf: processor-specific acpi_io_data struct
302 * @cpu: CPU being initialized
303 *
304 * To avoid issues with legacy OSes, some BIOSes require to be informed of
305 * the SMP capabilities of OS P-state driver. Here we set the bits in _PDC
306 * accordingly, for Enhanced Speedstep. Actual call to _PDC is done in
307 * driver/acpi/processor.c
308 */
309static void
310acpi_processor_cpu_init_pdc_est(
311 struct acpi_processor_performance *perf,
312 unsigned int cpu,
313 struct acpi_object_list *obj_list
314 )
315{
316 union acpi_object *obj;
317 u32 *buf;
318 struct cpuinfo_x86 *c = cpu_data + cpu;
319 dprintk("acpi_processor_cpu_init_pdc_est\n");
320
321 if (!cpu_has(c, X86_FEATURE_EST))
322 return;
323
324 /* Initialize pdc. It will be used later. */
325 if (!obj_list)
326 return;
327
328 if (!(obj_list->count && obj_list->pointer))
329 return;
330
331 obj = obj_list->pointer;
332 if ((obj->buffer.length == 12) && obj->buffer.pointer) {
333 buf = (u32 *)obj->buffer.pointer;
334 buf[0] = ACPI_PDC_REVISION_ID;
335 buf[1] = 1;
336 buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
337 perf->pdc = obj_list;
338 }
339 return;
340}
341
342
343/* CPU specific PDC initialization */
344static void
345acpi_processor_cpu_init_pdc(
346 struct acpi_processor_performance *perf,
347 unsigned int cpu,
348 struct acpi_object_list *obj_list
349 )
350{
351 struct cpuinfo_x86 *c = cpu_data + cpu;
352 dprintk("acpi_processor_cpu_init_pdc\n");
353 perf->pdc = NULL;
354 if (cpu_has(c, X86_FEATURE_EST))
355 acpi_processor_cpu_init_pdc_est(perf, cpu, obj_list);
356 return;
357}
358
359
360static int 298static int
361acpi_cpufreq_cpu_init ( 299acpi_cpufreq_cpu_init (
362 struct cpufreq_policy *policy) 300 struct cpufreq_policy *policy)
@@ -367,14 +305,7 @@ acpi_cpufreq_cpu_init (
367 unsigned int result = 0; 305 unsigned int result = 0;
368 struct cpuinfo_x86 *c = &cpu_data[policy->cpu]; 306 struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
369 307
370 union acpi_object arg0 = {ACPI_TYPE_BUFFER};
371 u32 arg0_buf[3];
372 struct acpi_object_list arg_list = {1, &arg0};
373
374 dprintk("acpi_cpufreq_cpu_init\n"); 308 dprintk("acpi_cpufreq_cpu_init\n");
375 /* setup arg_list for _PDC settings */
376 arg0.buffer.length = 12;
377 arg0.buffer.pointer = (u8 *) arg0_buf;
378 309
379 data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL); 310 data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
380 if (!data) 311 if (!data)
@@ -382,9 +313,7 @@ acpi_cpufreq_cpu_init (
382 313
383 acpi_io_data[cpu] = data; 314 acpi_io_data[cpu] = data;
384 315
385 acpi_processor_cpu_init_pdc(&data->acpi_data, cpu, &arg_list);
386 result = acpi_processor_register_performance(&data->acpi_data, cpu); 316 result = acpi_processor_register_performance(&data->acpi_data, cpu);
387 data->acpi_data.pdc = NULL;
388 317
389 if (result) 318 if (result)
390 goto err_free; 319 goto err_free;
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
index 9a826cde4fd1..c173c0fa117a 100644
--- a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
@@ -362,22 +362,10 @@ static struct acpi_processor_performance p;
362 */ 362 */
363static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) 363static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
364{ 364{
365 union acpi_object arg0 = {ACPI_TYPE_BUFFER};
366 u32 arg0_buf[3];
367 struct acpi_object_list arg_list = {1, &arg0};
368 unsigned long cur_freq; 365 unsigned long cur_freq;
369 int result = 0, i; 366 int result = 0, i;
370 unsigned int cpu = policy->cpu; 367 unsigned int cpu = policy->cpu;
371 368
372 /* _PDC settings */
373 arg0.buffer.length = 12;
374 arg0.buffer.pointer = (u8 *) arg0_buf;
375 arg0_buf[0] = ACPI_PDC_REVISION_ID;
376 arg0_buf[1] = 1;
377 arg0_buf[2] = ACPI_PDC_EST_CAPABILITY_SMP_MSR;
378
379 p.pdc = &arg_list;
380
381 /* register with ACPI core */ 369 /* register with ACPI core */
382 if (acpi_processor_register_performance(&p, cpu)) { 370 if (acpi_processor_register_performance(&p, cpu)) {
383 dprintk(KERN_INFO PFX "obtaining ACPI data failed\n"); 371 dprintk(KERN_INFO PFX "obtaining ACPI data failed\n");
diff --git a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c
index 91a64016956e..0102f3d50e57 100644
--- a/arch/i386/kernel/mpparse.c
+++ b/arch/i386/kernel/mpparse.c
@@ -1080,7 +1080,7 @@ void __init mp_config_acpi_legacy_irqs (void)
1080 1080
1081#define MAX_GSI_NUM 4096 1081#define MAX_GSI_NUM 4096
1082 1082
1083int mp_register_gsi (u32 gsi, int edge_level, int active_high_low) 1083int mp_register_gsi (u32 gsi, int triggering, int polarity)
1084{ 1084{
1085 int ioapic = -1; 1085 int ioapic = -1;
1086 int ioapic_pin = 0; 1086 int ioapic_pin = 0;
@@ -1129,7 +1129,7 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
1129 1129
1130 mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit); 1130 mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
1131 1131
1132 if (edge_level) { 1132 if (triggering == ACPI_LEVEL_SENSITIVE) {
1133 /* 1133 /*
1134 * For PCI devices assign IRQs in order, avoiding gaps 1134 * For PCI devices assign IRQs in order, avoiding gaps
1135 * due to unused I/O APIC pins. 1135 * due to unused I/O APIC pins.
@@ -1151,8 +1151,8 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
1151 } 1151 }
1152 1152
1153 io_apic_set_pci_routing(ioapic, ioapic_pin, gsi, 1153 io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
1154 edge_level == ACPI_EDGE_SENSITIVE ? 0 : 1, 1154 triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
1155 active_high_low == ACPI_ACTIVE_HIGH ? 0 : 1); 1155 polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
1156 return gsi; 1156 return gsi;
1157} 1157}
1158 1158
diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
index 307514f7a282..09a0dbc17fb6 100644
--- a/arch/ia64/kernel/Makefile
+++ b/arch/ia64/kernel/Makefile
@@ -13,6 +13,11 @@ obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o
13obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o 13obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o
14obj-$(CONFIG_IA64_HP_ZX1) += acpi-ext.o 14obj-$(CONFIG_IA64_HP_ZX1) += acpi-ext.o
15obj-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += acpi-ext.o 15obj-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += acpi-ext.o
16
17ifneq ($(CONFIG_ACPI_PROCESSOR),)
18obj-y += acpi-processor.o
19endif
20
16obj-$(CONFIG_IA64_PALINFO) += palinfo.o 21obj-$(CONFIG_IA64_PALINFO) += palinfo.o
17obj-$(CONFIG_IOSAPIC) += iosapic.o 22obj-$(CONFIG_IOSAPIC) += iosapic.o
18obj-$(CONFIG_MODULES) += module.o 23obj-$(CONFIG_MODULES) += module.o
diff --git a/arch/ia64/kernel/acpi-ext.c b/arch/ia64/kernel/acpi-ext.c
index 13a5b3b49bf8..4a5574ff007b 100644
--- a/arch/ia64/kernel/acpi-ext.c
+++ b/arch/ia64/kernel/acpi-ext.c
@@ -33,33 +33,33 @@ acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
33 struct acpi_vendor_info *info = (struct acpi_vendor_info *)context; 33 struct acpi_vendor_info *info = (struct acpi_vendor_info *)context;
34 struct acpi_resource_vendor *vendor; 34 struct acpi_resource_vendor *vendor;
35 struct acpi_vendor_descriptor *descriptor; 35 struct acpi_vendor_descriptor *descriptor;
36 u32 length; 36 u32 byte_length;
37 37
38 if (resource->id != ACPI_RSTYPE_VENDOR) 38 if (resource->type != ACPI_RESOURCE_TYPE_VENDOR)
39 return AE_OK; 39 return AE_OK;
40 40
41 vendor = (struct acpi_resource_vendor *)&resource->data; 41 vendor = (struct acpi_resource_vendor *)&resource->data;
42 descriptor = (struct acpi_vendor_descriptor *)vendor->reserved; 42 descriptor = (struct acpi_vendor_descriptor *)vendor->byte_data;
43 if (vendor->length <= sizeof(*info->descriptor) || 43 if (vendor->byte_length <= sizeof(*info->descriptor) ||
44 descriptor->guid_id != info->descriptor->guid_id || 44 descriptor->guid_id != info->descriptor->guid_id ||
45 efi_guidcmp(descriptor->guid, info->descriptor->guid)) 45 efi_guidcmp(descriptor->guid, info->descriptor->guid))
46 return AE_OK; 46 return AE_OK;
47 47
48 length = vendor->length - sizeof(struct acpi_vendor_descriptor); 48 byte_length = vendor->byte_length - sizeof(struct acpi_vendor_descriptor);
49 info->data = acpi_os_allocate(length); 49 info->data = acpi_os_allocate(byte_length);
50 if (!info->data) 50 if (!info->data)
51 return AE_NO_MEMORY; 51 return AE_NO_MEMORY;
52 52
53 memcpy(info->data, 53 memcpy(info->data,
54 vendor->reserved + sizeof(struct acpi_vendor_descriptor), 54 vendor->byte_data + sizeof(struct acpi_vendor_descriptor),
55 length); 55 byte_length);
56 info->length = length; 56 info->length = byte_length;
57 return AE_CTRL_TERMINATE; 57 return AE_CTRL_TERMINATE;
58} 58}
59 59
60acpi_status 60acpi_status
61acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor * id, 61acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor * id,
62 u8 ** data, u32 * length) 62 u8 ** data, u32 * byte_length)
63{ 63{
64 struct acpi_vendor_info info; 64 struct acpi_vendor_info info;
65 65
@@ -72,7 +72,7 @@ acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor * id,
72 return AE_NOT_FOUND; 72 return AE_NOT_FOUND;
73 73
74 *data = info.data; 74 *data = info.data;
75 *length = info.length; 75 *byte_length = info.length;
76 return AE_OK; 76 return AE_OK;
77} 77}
78 78
diff --git a/arch/ia64/kernel/acpi-processor.c b/arch/ia64/kernel/acpi-processor.c
new file mode 100644
index 000000000000..e683630c8ce2
--- /dev/null
+++ b/arch/ia64/kernel/acpi-processor.c
@@ -0,0 +1,67 @@
1/*
2 * arch/ia64/kernel/cpufreq/processor.c
3 *
4 * Copyright (C) 2005 Intel Corporation
5 * Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
6 * - Added _PDC for platforms with Intel CPUs
7 */
8
9#include <linux/kernel.h>
10#include <linux/module.h>
11#include <linux/init.h>
12#include <linux/acpi.h>
13
14#include <acpi/processor.h>
15#include <asm/acpi.h>
16
17static void init_intel_pdc(struct acpi_processor *pr)
18{
19 struct acpi_object_list *obj_list;
20 union acpi_object *obj;
21 u32 *buf;
22
23 /* allocate and initialize pdc. It will be used later. */
24 obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
25 if (!obj_list) {
26 printk(KERN_ERR "Memory allocation error\n");
27 return;
28 }
29
30 obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
31 if (!obj) {
32 printk(KERN_ERR "Memory allocation error\n");
33 kfree(obj_list);
34 return;
35 }
36
37 buf = kmalloc(12, GFP_KERNEL);
38 if (!buf) {
39 printk(KERN_ERR "Memory allocation error\n");
40 kfree(obj);
41 kfree(obj_list);
42 return;
43 }
44
45 buf[0] = ACPI_PDC_REVISION_ID;
46 buf[1] = 1;
47 buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP;
48
49 obj->type = ACPI_TYPE_BUFFER;
50 obj->buffer.length = 12;
51 obj->buffer.pointer = (u8 *) buf;
52 obj_list->count = 1;
53 obj_list->pointer = obj;
54 pr->pdc = obj_list;
55
56 return;
57}
58
59/* Initialize _PDC data based on the CPU vendor */
60void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
61{
62 pr->pdc = NULL;
63 init_intel_pdc(pr);
64 return;
65}
66
67EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
index 9ad94ddf6687..d2702c419cf8 100644
--- a/arch/ia64/kernel/acpi.c
+++ b/arch/ia64/kernel/acpi.c
@@ -567,16 +567,16 @@ void __init acpi_numa_arch_fixup(void)
567 * success: return IRQ number (>=0) 567 * success: return IRQ number (>=0)
568 * failure: return < 0 568 * failure: return < 0
569 */ 569 */
570int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low) 570int acpi_register_gsi(u32 gsi, int triggering, int polarity)
571{ 571{
572 if (has_8259 && gsi < 16) 572 if (has_8259 && gsi < 16)
573 return isa_irq_to_vector(gsi); 573 return isa_irq_to_vector(gsi);
574 574
575 return iosapic_register_intr(gsi, 575 return iosapic_register_intr(gsi,
576 (active_high_low == 576 (polarity ==
577 ACPI_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH : 577 ACPI_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH :
578 IOSAPIC_POL_LOW, 578 IOSAPIC_POL_LOW,
579 (edge_level == 579 (triggering ==
580 ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE : 580 ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE :
581 IOSAPIC_LEVEL); 581 IOSAPIC_LEVEL);
582} 582}
diff --git a/arch/ia64/kernel/cpufreq/Makefile b/arch/ia64/kernel/cpufreq/Makefile
index f748d34c02f0..4838f2a57c7a 100644
--- a/arch/ia64/kernel/cpufreq/Makefile
+++ b/arch/ia64/kernel/cpufreq/Makefile
@@ -1 +1,2 @@
1obj-$(CONFIG_IA64_ACPI_CPUFREQ) += acpi-cpufreq.o 1obj-$(CONFIG_IA64_ACPI_CPUFREQ) += acpi-cpufreq.o
2
diff --git a/arch/ia64/kernel/cpufreq/acpi-cpufreq.c b/arch/ia64/kernel/cpufreq/acpi-cpufreq.c
index da4d5cf80a48..5a1bf815282d 100644
--- a/arch/ia64/kernel/cpufreq/acpi-cpufreq.c
+++ b/arch/ia64/kernel/cpufreq/acpi-cpufreq.c
@@ -269,48 +269,6 @@ acpi_cpufreq_verify (
269} 269}
270 270
271 271
272/*
273 * processor_init_pdc - let BIOS know about the SMP capabilities
274 * of this driver
275 * @perf: processor-specific acpi_io_data struct
276 * @cpu: CPU being initialized
277 *
278 * To avoid issues with legacy OSes, some BIOSes require to be informed of
279 * the SMP capabilities of OS P-state driver. Here we set the bits in _PDC
280 * accordingly. Actual call to _PDC is done in driver/acpi/processor.c
281 */
282static void
283processor_init_pdc (
284 struct acpi_processor_performance *perf,
285 unsigned int cpu,
286 struct acpi_object_list *obj_list
287 )
288{
289 union acpi_object *obj;
290 u32 *buf;
291
292 dprintk("processor_init_pdc\n");
293
294 perf->pdc = NULL;
295 /* Initialize pdc. It will be used later. */
296 if (!obj_list)
297 return;
298
299 if (!(obj_list->count && obj_list->pointer))
300 return;
301
302 obj = obj_list->pointer;
303 if ((obj->buffer.length == 12) && obj->buffer.pointer) {
304 buf = (u32 *)obj->buffer.pointer;
305 buf[0] = ACPI_PDC_REVISION_ID;
306 buf[1] = 1;
307 buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
308 perf->pdc = obj_list;
309 }
310 return;
311}
312
313
314static int 272static int
315acpi_cpufreq_cpu_init ( 273acpi_cpufreq_cpu_init (
316 struct cpufreq_policy *policy) 274 struct cpufreq_policy *policy)
@@ -320,14 +278,7 @@ acpi_cpufreq_cpu_init (
320 struct cpufreq_acpi_io *data; 278 struct cpufreq_acpi_io *data;
321 unsigned int result = 0; 279 unsigned int result = 0;
322 280
323 union acpi_object arg0 = {ACPI_TYPE_BUFFER};
324 u32 arg0_buf[3];
325 struct acpi_object_list arg_list = {1, &arg0};
326
327 dprintk("acpi_cpufreq_cpu_init\n"); 281 dprintk("acpi_cpufreq_cpu_init\n");
328 /* setup arg_list for _PDC settings */
329 arg0.buffer.length = 12;
330 arg0.buffer.pointer = (u8 *) arg0_buf;
331 282
332 data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL); 283 data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
333 if (!data) 284 if (!data)
@@ -337,9 +288,7 @@ acpi_cpufreq_cpu_init (
337 288
338 acpi_io_data[cpu] = data; 289 acpi_io_data[cpu] = data;
339 290
340 processor_init_pdc(&data->acpi_data, cpu, &arg_list);
341 result = acpi_processor_register_performance(&data->acpi_data, cpu); 291 result = acpi_processor_register_performance(&data->acpi_data, cpu);
342 data->acpi_data.pdc = NULL;
343 292
344 if (result) 293 if (result)
345 goto err_free; 294 goto err_free;
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index d27ecdcb6fca..0b30ca006286 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -193,12 +193,12 @@ add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr)
193 goto free_resource; 193 goto free_resource;
194 } 194 }
195 195
196 min = addr->min_address_range; 196 min = addr->minimum;
197 max = min + addr->address_length - 1; 197 max = min + addr->address_length - 1;
198 if (addr->attribute.io.translation_attribute == ACPI_SPARSE_TRANSLATION) 198 if (addr->info.io.translation_type == ACPI_SPARSE_TRANSLATION)
199 sparse = 1; 199 sparse = 1;
200 200
201 space_nr = new_space(addr->address_translation_offset, sparse); 201 space_nr = new_space(addr->translation_offset, sparse);
202 if (space_nr == ~0) 202 if (space_nr == ~0)
203 goto free_name; 203 goto free_name;
204 204
@@ -285,7 +285,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
285 if (addr.resource_type == ACPI_MEMORY_RANGE) { 285 if (addr.resource_type == ACPI_MEMORY_RANGE) {
286 flags = IORESOURCE_MEM; 286 flags = IORESOURCE_MEM;
287 root = &iomem_resource; 287 root = &iomem_resource;
288 offset = addr.address_translation_offset; 288 offset = addr.translation_offset;
289 } else if (addr.resource_type == ACPI_IO_RANGE) { 289 } else if (addr.resource_type == ACPI_IO_RANGE) {
290 flags = IORESOURCE_IO; 290 flags = IORESOURCE_IO;
291 root = &ioport_resource; 291 root = &ioport_resource;
@@ -298,7 +298,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
298 window = &info->controller->window[info->controller->windows++]; 298 window = &info->controller->window[info->controller->windows++];
299 window->resource.name = info->name; 299 window->resource.name = info->name;
300 window->resource.flags = flags; 300 window->resource.flags = flags;
301 window->resource.start = addr.min_address_range + offset; 301 window->resource.start = addr.minimum + offset;
302 window->resource.end = window->resource.start + addr.address_length - 1; 302 window->resource.end = window->resource.start + addr.address_length - 1;
303 window->resource.child = NULL; 303 window->resource.child = NULL;
304 window->offset = offset; 304 window->offset = offset;
diff --git a/arch/powerpc/platforms/pseries/pci_dlpar.c b/arch/powerpc/platforms/pseries/pci_dlpar.c
index 21934784f936..bdaa8aabdaa6 100644
--- a/arch/powerpc/platforms/pseries/pci_dlpar.c
+++ b/arch/powerpc/platforms/pseries/pci_dlpar.c
@@ -58,6 +58,7 @@ pcibios_find_pci_bus(struct device_node *dn)
58 58
59 return find_bus_among_children(pdn->phb->bus, dn); 59 return find_bus_among_children(pdn->phb->bus, dn);
60} 60}
61EXPORT_SYMBOL_GPL(pcibios_find_pci_bus);
61 62
62/** 63/**
63 * pcibios_remove_pci_devices - remove all devices under this bus 64 * pcibios_remove_pci_devices - remove all devices under this bus
@@ -106,6 +107,7 @@ pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
106 } 107 }
107 } 108 }
108} 109}
110EXPORT_SYMBOL_GPL(pcibios_fixup_new_pci_devices);
109 111
110static int 112static int
111pcibios_pci_config_bridge(struct pci_dev *dev) 113pcibios_pci_config_bridge(struct pci_dev *dev)
@@ -172,3 +174,4 @@ pcibios_add_pci_devices(struct pci_bus * bus)
172 pcibios_pci_config_bridge(dev); 174 pcibios_pci_config_bridge(dev);
173 } 175 }
174} 176}
177EXPORT_SYMBOL_GPL(pcibios_add_pci_devices);
diff --git a/arch/x86_64/kernel/acpi/Makefile b/arch/x86_64/kernel/acpi/Makefile
index 7da9ace890bd..4fe97071f297 100644
--- a/arch/x86_64/kernel/acpi/Makefile
+++ b/arch/x86_64/kernel/acpi/Makefile
@@ -1,3 +1,8 @@
1obj-y := boot.o 1obj-y := boot.o
2boot-y := ../../../i386/kernel/acpi/boot.o 2boot-y := ../../../i386/kernel/acpi/boot.o
3obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o 3obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o
4
5ifneq ($(CONFIG_ACPI_PROCESSOR),)
6obj-y += processor.o
7endif
8
diff --git a/arch/x86_64/kernel/acpi/processor.c b/arch/x86_64/kernel/acpi/processor.c
new file mode 100644
index 000000000000..3bdc2baa5bb1
--- /dev/null
+++ b/arch/x86_64/kernel/acpi/processor.c
@@ -0,0 +1,72 @@
1/*
2 * arch/x86_64/kernel/acpi/processor.c
3 *
4 * Copyright (C) 2005 Intel Corporation
5 * Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
6 * - Added _PDC for platforms with Intel CPUs
7 */
8
9#include <linux/kernel.h>
10#include <linux/module.h>
11#include <linux/init.h>
12#include <linux/acpi.h>
13
14#include <acpi/processor.h>
15#include <asm/acpi.h>
16
17static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
18{
19 struct acpi_object_list *obj_list;
20 union acpi_object *obj;
21 u32 *buf;
22
23 /* allocate and initialize pdc. It will be used later. */
24 obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
25 if (!obj_list) {
26 printk(KERN_ERR "Memory allocation error\n");
27 return;
28 }
29
30 obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
31 if (!obj) {
32 printk(KERN_ERR "Memory allocation error\n");
33 kfree(obj_list);
34 return;
35 }
36
37 buf = kmalloc(12, GFP_KERNEL);
38 if (!buf) {
39 printk(KERN_ERR "Memory allocation error\n");
40 kfree(obj);
41 kfree(obj_list);
42 return;
43 }
44
45 buf[0] = ACPI_PDC_REVISION_ID;
46 buf[1] = 1;
47 buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
48
49 obj->type = ACPI_TYPE_BUFFER;
50 obj->buffer.length = 12;
51 obj->buffer.pointer = (u8 *) buf;
52 obj_list->count = 1;
53 obj_list->pointer = obj;
54 pr->pdc = obj_list;
55
56 return;
57}
58
59/* Initialize _PDC data based on the CPU vendor */
60void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
61{
62 unsigned int cpu = pr->id;
63 struct cpuinfo_x86 *c = cpu_data + cpu;
64
65 pr->pdc = NULL;
66 if (c->x86_vendor == X86_VENDOR_INTEL && cpu_has(c, X86_FEATURE_EST))
67 init_intel_pdc(pr, c);
68
69 return;
70}
71
72EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c
index e8cf44ef8778..1a5060b434b8 100644
--- a/arch/x86_64/kernel/io_apic.c
+++ b/arch/x86_64/kernel/io_apic.c
@@ -2027,7 +2027,7 @@ int __init io_apic_get_redir_entries (int ioapic)
2027} 2027}
2028 2028
2029 2029
2030int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low) 2030int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int polarity)
2031{ 2031{
2032 struct IO_APIC_route_entry entry; 2032 struct IO_APIC_route_entry entry;
2033 unsigned long flags; 2033 unsigned long flags;
@@ -2049,8 +2049,8 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
2049 entry.delivery_mode = INT_DELIVERY_MODE; 2049 entry.delivery_mode = INT_DELIVERY_MODE;
2050 entry.dest_mode = INT_DEST_MODE; 2050 entry.dest_mode = INT_DEST_MODE;
2051 entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS); 2051 entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
2052 entry.trigger = edge_level; 2052 entry.trigger = triggering;
2053 entry.polarity = active_high_low; 2053 entry.polarity = polarity;
2054 entry.mask = 1; /* Disabled (masked) */ 2054 entry.mask = 1; /* Disabled (masked) */
2055 2055
2056 irq = gsi_irq_sharing(irq); 2056 irq = gsi_irq_sharing(irq);
@@ -2065,9 +2065,9 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
2065 apic_printk(APIC_VERBOSE,KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> " 2065 apic_printk(APIC_VERBOSE,KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> "
2066 "IRQ %d Mode:%i Active:%i)\n", ioapic, 2066 "IRQ %d Mode:%i Active:%i)\n", ioapic,
2067 mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, 2067 mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
2068 edge_level, active_high_low); 2068 triggering, polarity);
2069 2069
2070 ioapic_register_intr(irq, entry.vector, edge_level); 2070 ioapic_register_intr(irq, entry.vector, triggering);
2071 2071
2072 if (!ioapic && (irq < 16)) 2072 if (!ioapic && (irq < 16))
2073 disable_8259A_irq(irq); 2073 disable_8259A_irq(irq);
diff --git a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c
index 1105250bf02c..dc49bfb6db0a 100644
--- a/arch/x86_64/kernel/mpparse.c
+++ b/arch/x86_64/kernel/mpparse.c
@@ -915,7 +915,7 @@ void __init mp_config_acpi_legacy_irqs (void)
915 915
916#define MAX_GSI_NUM 4096 916#define MAX_GSI_NUM 4096
917 917
918int mp_register_gsi(u32 gsi, int edge_level, int active_high_low) 918int mp_register_gsi(u32 gsi, int triggering, int polarity)
919{ 919{
920 int ioapic = -1; 920 int ioapic = -1;
921 int ioapic_pin = 0; 921 int ioapic_pin = 0;
@@ -964,7 +964,7 @@ int mp_register_gsi(u32 gsi, int edge_level, int active_high_low)
964 964
965 mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit); 965 mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
966 966
967 if (edge_level) { 967 if (triggering == ACPI_LEVEL_SENSITIVE) {
968 /* 968 /*
969 * For PCI devices assign IRQs in order, avoiding gaps 969 * For PCI devices assign IRQs in order, avoiding gaps
970 * due to unused I/O APIC pins. 970 * due to unused I/O APIC pins.
@@ -986,8 +986,8 @@ int mp_register_gsi(u32 gsi, int edge_level, int active_high_low)
986 } 986 }
987 987
988 io_apic_set_pci_routing(ioapic, ioapic_pin, gsi, 988 io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
989 edge_level == ACPI_EDGE_SENSITIVE ? 0 : 1, 989 triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
990 active_high_low == ACPI_ACTIVE_HIGH ? 0 : 1); 990 polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
991 return gsi; 991 return gsi;
992} 992}
993 993
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index 6d61945260a8..0cce28c4025b 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -267,7 +267,6 @@ config ACPI_DEBUG
267 267
268config ACPI_EC 268config ACPI_EC
269 bool 269 bool
270 depends on X86
271 default y 270 default y
272 help 271 help
273 This driver is required on some systems for the proper operation of 272 This driver is required on some systems for the proper operation of
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
index 2143609d2936..d882bf87fa96 100644
--- a/drivers/acpi/acpi_memhotplug.c
+++ b/drivers/acpi/acpi_memhotplug.c
@@ -71,8 +71,8 @@ static struct acpi_driver acpi_memory_device_driver = {
71struct acpi_memory_device { 71struct acpi_memory_device {
72 acpi_handle handle; 72 acpi_handle handle;
73 unsigned int state; /* State of the memory device */ 73 unsigned int state; /* State of the memory device */
74 unsigned short cache_attribute; /* memory cache attribute */ 74 unsigned short caching; /* memory cache attribute */
75 unsigned short read_write_attribute; /* memory read/write attribute */ 75 unsigned short write_protect; /* memory read/write attribute */
76 u64 start_addr; /* Memory Range start physical addr */ 76 u64 start_addr; /* Memory Range start physical addr */
77 u64 end_addr; /* Memory Range end physical addr */ 77 u64 end_addr; /* Memory Range end physical addr */
78}; 78};
@@ -97,12 +97,12 @@ acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
97 if (ACPI_SUCCESS(status)) { 97 if (ACPI_SUCCESS(status)) {
98 if (address64.resource_type == ACPI_MEMORY_RANGE) { 98 if (address64.resource_type == ACPI_MEMORY_RANGE) {
99 /* Populate the structure */ 99 /* Populate the structure */
100 mem_device->cache_attribute = 100 mem_device->caching =
101 address64.attribute.memory.cache_attribute; 101 address64.info.mem.caching;
102 mem_device->read_write_attribute = 102 mem_device->write_protect =
103 address64.attribute.memory.read_write_attribute; 103 address64.info.mem.write_protect;
104 mem_device->start_addr = address64.min_address_range; 104 mem_device->start_addr = address64.minimum;
105 mem_device->end_addr = address64.max_address_range; 105 mem_device->end_addr = address64.maximum;
106 } 106 }
107 } 107 }
108 108
@@ -250,7 +250,6 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
250 int result; 250 int result;
251 u64 start = mem_device->start_addr; 251 u64 start = mem_device->start_addr;
252 u64 len = mem_device->end_addr - start + 1; 252 u64 len = mem_device->end_addr - start + 1;
253 unsigned long attr = mem_device->read_write_attribute;
254 253
255 ACPI_FUNCTION_TRACE("acpi_memory_disable_device"); 254 ACPI_FUNCTION_TRACE("acpi_memory_disable_device");
256 255
diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c
index fec895af6ae6..f4c87750dbf2 100644
--- a/drivers/acpi/asus_acpi.c
+++ b/drivers/acpi/asus_acpi.c
@@ -78,9 +78,9 @@ MODULE_LICENSE("GPL");
78static uid_t asus_uid; 78static uid_t asus_uid;
79static gid_t asus_gid; 79static gid_t asus_gid;
80module_param(asus_uid, uint, 0); 80module_param(asus_uid, uint, 0);
81MODULE_PARM_DESC(uid, "UID for entries in /proc/acpi/asus.\n"); 81MODULE_PARM_DESC(asus_uid, "UID for entries in /proc/acpi/asus.\n");
82module_param(asus_gid, uint, 0); 82module_param(asus_gid, uint, 0);
83MODULE_PARM_DESC(gid, "GID for entries in /proc/acpi/asus.\n"); 83MODULE_PARM_DESC(asus_gid, "GID for entries in /proc/acpi/asus.\n");
84 84
85/* For each model, all features implemented, 85/* For each model, all features implemented,
86 * those marked with R are relative to HOTK, A for absolute */ 86 * those marked with R are relative to HOTK, A for absolute */
@@ -302,7 +302,7 @@ static struct model_data model_conf[END_MODEL] = {
302 .brightness_set = "SPLV", 302 .brightness_set = "SPLV",
303 .brightness_get = "GPLV", 303 .brightness_get = "GPLV",
304 .display_set = "SDSP", 304 .display_set = "SDSP",
305 .display_get = "\\SSTE"}, 305 .display_get = "\\_SB.PCI0.P0P1.VGA.GETD"},
306 { 306 {
307 .name = "M6R", 307 .name = "M6R",
308 .mt_mled = "MLED", 308 .mt_mled = "MLED",
@@ -851,6 +851,8 @@ static int __init asus_hotk_add_fs(struct acpi_device *device)
851 mode = S_IFREG | S_IRUGO | S_IWUGO; 851 mode = S_IFREG | S_IRUGO | S_IWUGO;
852 } else { 852 } else {
853 mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP; 853 mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP;
854 printk(KERN_WARNING " asus_uid and asus_gid parameters are "
855 "deprecated, use chown and chmod instead!\n");
854 } 856 }
855 857
856 acpi_device_dir(device) = asus_proc_dir; 858 acpi_device_dir(device) = asus_proc_dir;
@@ -987,9 +989,21 @@ static int __init asus_hotk_get_info(void)
987 printk(KERN_NOTICE " BSTS called, 0x%02x returned\n", 989 printk(KERN_NOTICE " BSTS called, 0x%02x returned\n",
988 bsts_result); 990 bsts_result);
989 991
990 /* Samsung P30 has a device with a valid _HID whose INIT does not 992 /* This is unlikely with implicit return */
991 * return anything. Catch this one and any similar here */ 993 if (buffer.pointer == NULL)
992 if (buffer.pointer == NULL) { 994 return -EINVAL;
995
996 model = (union acpi_object *) buffer.pointer;
997 /*
998 * Samsung P30 has a device with a valid _HID whose INIT does not
999 * return anything. It used to be possible to catch this exception,
1000 * but the implicit return code will now happily confuse the
1001 * driver. We assume that every ACPI_TYPE_STRING is a valid model
1002 * identifier but it's still possible to get completely bogus data.
1003 */
1004 if (model->type == ACPI_TYPE_STRING) {
1005 printk(KERN_NOTICE " %s model detected, ", model->string.pointer);
1006 } else {
993 if (asus_info && /* Samsung P30 */ 1007 if (asus_info && /* Samsung P30 */
994 strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) { 1008 strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) {
995 hotk->model = P30; 1009 hotk->model = P30;
@@ -1002,13 +1016,10 @@ static int __init asus_hotk_get_info(void)
1002 "the developers with your DSDT\n"); 1016 "the developers with your DSDT\n");
1003 } 1017 }
1004 hotk->methods = &model_conf[hotk->model]; 1018 hotk->methods = &model_conf[hotk->model];
1005 return AE_OK; 1019
1006 } 1020 acpi_os_free(model);
1007 1021
1008 model = (union acpi_object *)buffer.pointer; 1022 return AE_OK;
1009 if (model->type == ACPI_TYPE_STRING) {
1010 printk(KERN_NOTICE " %s model detected, ",
1011 model->string.pointer);
1012 } 1023 }
1013 1024
1014 hotk->model = END_MODEL; 1025 hotk->model = END_MODEL;
diff --git a/drivers/acpi/dispatcher/dsfield.c b/drivers/acpi/dispatcher/dsfield.c
index 2022aeaecfbb..76bc0463f6de 100644
--- a/drivers/acpi/dispatcher/dsfield.c
+++ b/drivers/acpi/dispatcher/dsfield.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -128,7 +128,7 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
128 ACPI_IMODE_LOAD_PASS1, flags, walk_state, 128 ACPI_IMODE_LOAD_PASS1, flags, walk_state,
129 &(node)); 129 &(node));
130 if (ACPI_FAILURE(status)) { 130 if (ACPI_FAILURE(status)) {
131 ACPI_REPORT_NSERROR(arg->common.value.string, status); 131 ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
132 return_ACPI_STATUS(status); 132 return_ACPI_STATUS(status);
133 } 133 }
134 } 134 }
@@ -232,7 +232,8 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
232 + (acpi_integer) arg->common.value.size; 232 + (acpi_integer) arg->common.value.size;
233 233
234 if (position > ACPI_UINT32_MAX) { 234 if (position > ACPI_UINT32_MAX) {
235 ACPI_REPORT_ERROR(("Bit offset within field too large (> 0xFFFFFFFF)\n")); 235 ACPI_ERROR((AE_INFO,
236 "Bit offset within field too large (> 0xFFFFFFFF)"));
236 return_ACPI_STATUS(AE_SUPPORT); 237 return_ACPI_STATUS(AE_SUPPORT);
237 } 238 }
238 239
@@ -268,8 +269,8 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
268 ACPI_NS_DONT_OPEN_SCOPE, 269 ACPI_NS_DONT_OPEN_SCOPE,
269 walk_state, &info->field_node); 270 walk_state, &info->field_node);
270 if (ACPI_FAILURE(status)) { 271 if (ACPI_FAILURE(status)) {
271 ACPI_REPORT_NSERROR((char *)&arg->named.name, 272 ACPI_ERROR_NAMESPACE((char *)&arg->named.name,
272 status); 273 status);
273 if (status != AE_ALREADY_EXISTS) { 274 if (status != AE_ALREADY_EXISTS) {
274 return_ACPI_STATUS(status); 275 return_ACPI_STATUS(status);
275 } 276 }
@@ -293,7 +294,11 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
293 + (acpi_integer) arg->common.value.size; 294 + (acpi_integer) arg->common.value.size;
294 295
295 if (position > ACPI_UINT32_MAX) { 296 if (position > ACPI_UINT32_MAX) {
296 ACPI_REPORT_ERROR(("Field [%4.4s] bit offset too large (> 0xFFFFFFFF)\n", (char *)&info->field_node->name)); 297 ACPI_ERROR((AE_INFO,
298 "Field [%4.4s] bit offset too large (> 0xFFFFFFFF)",
299 ACPI_CAST_PTR(char,
300 &info->field_node->
301 name)));
297 return_ACPI_STATUS(AE_SUPPORT); 302 return_ACPI_STATUS(AE_SUPPORT);
298 } 303 }
299 304
@@ -302,9 +307,9 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
302 307
303 default: 308 default:
304 309
305 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 310 ACPI_ERROR((AE_INFO,
306 "Invalid opcode in field list: %X\n", 311 "Invalid opcode in field list: %X",
307 arg->common.aml_opcode)); 312 arg->common.aml_opcode));
308 return_ACPI_STATUS(AE_AML_BAD_OPCODE); 313 return_ACPI_STATUS(AE_AML_BAD_OPCODE);
309 } 314 }
310 315
@@ -349,7 +354,7 @@ acpi_ds_create_field(union acpi_parse_object *op,
349 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 354 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
350 walk_state, &region_node); 355 walk_state, &region_node);
351 if (ACPI_FAILURE(status)) { 356 if (ACPI_FAILURE(status)) {
352 ACPI_REPORT_NSERROR(arg->common.value.name, status); 357 ACPI_ERROR_NAMESPACE(arg->common.value.name, status);
353 return_ACPI_STATUS(status); 358 return_ACPI_STATUS(status);
354 } 359 }
355 } 360 }
@@ -431,8 +436,8 @@ acpi_ds_init_field_objects(union acpi_parse_object *op,
431 ACPI_NS_ERROR_IF_FOUND, 436 ACPI_NS_ERROR_IF_FOUND,
432 walk_state, &node); 437 walk_state, &node);
433 if (ACPI_FAILURE(status)) { 438 if (ACPI_FAILURE(status)) {
434 ACPI_REPORT_NSERROR((char *)&arg->named.name, 439 ACPI_ERROR_NAMESPACE((char *)&arg->named.name,
435 status); 440 status);
436 if (status != AE_ALREADY_EXISTS) { 441 if (status != AE_ALREADY_EXISTS) {
437 return_ACPI_STATUS(status); 442 return_ACPI_STATUS(status);
438 } 443 }
@@ -488,7 +493,7 @@ acpi_ds_create_bank_field(union acpi_parse_object *op,
488 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 493 ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
489 walk_state, &region_node); 494 walk_state, &region_node);
490 if (ACPI_FAILURE(status)) { 495 if (ACPI_FAILURE(status)) {
491 ACPI_REPORT_NSERROR(arg->common.value.name, status); 496 ACPI_ERROR_NAMESPACE(arg->common.value.name, status);
492 return_ACPI_STATUS(status); 497 return_ACPI_STATUS(status);
493 } 498 }
494 } 499 }
@@ -502,7 +507,7 @@ acpi_ds_create_bank_field(union acpi_parse_object *op,
502 ACPI_NS_SEARCH_PARENT, walk_state, 507 ACPI_NS_SEARCH_PARENT, walk_state,
503 &info.register_node); 508 &info.register_node);
504 if (ACPI_FAILURE(status)) { 509 if (ACPI_FAILURE(status)) {
505 ACPI_REPORT_NSERROR(arg->common.value.string, status); 510 ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
506 return_ACPI_STATUS(status); 511 return_ACPI_STATUS(status);
507 } 512 }
508 513
@@ -560,7 +565,7 @@ acpi_ds_create_index_field(union acpi_parse_object *op,
560 ACPI_NS_SEARCH_PARENT, walk_state, 565 ACPI_NS_SEARCH_PARENT, walk_state,
561 &info.register_node); 566 &info.register_node);
562 if (ACPI_FAILURE(status)) { 567 if (ACPI_FAILURE(status)) {
563 ACPI_REPORT_NSERROR(arg->common.value.string, status); 568 ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
564 return_ACPI_STATUS(status); 569 return_ACPI_STATUS(status);
565 } 570 }
566 571
@@ -573,7 +578,7 @@ acpi_ds_create_index_field(union acpi_parse_object *op,
573 ACPI_NS_SEARCH_PARENT, walk_state, 578 ACPI_NS_SEARCH_PARENT, walk_state,
574 &info.data_register_node); 579 &info.data_register_node);
575 if (ACPI_FAILURE(status)) { 580 if (ACPI_FAILURE(status)) {
576 ACPI_REPORT_NSERROR(arg->common.value.string, status); 581 ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
577 return_ACPI_STATUS(status); 582 return_ACPI_STATUS(status);
578 } 583 }
579 584
diff --git a/drivers/acpi/dispatcher/dsinit.c b/drivers/acpi/dispatcher/dsinit.c
index 8693c704aea6..e65a07ad2422 100644
--- a/drivers/acpi/dispatcher/dsinit.c
+++ b/drivers/acpi/dispatcher/dsinit.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -84,7 +84,7 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
84 acpi_object_type type; 84 acpi_object_type type;
85 acpi_status status; 85 acpi_status status;
86 86
87 ACPI_FUNCTION_NAME("ds_init_one_object"); 87 ACPI_FUNCTION_ENTRY();
88 88
89 /* 89 /*
90 * We are only interested in NS nodes owned by the table that 90 * We are only interested in NS nodes owned by the table that
@@ -105,11 +105,10 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
105 105
106 status = acpi_ds_initialize_region(obj_handle); 106 status = acpi_ds_initialize_region(obj_handle);
107 if (ACPI_FAILURE(status)) { 107 if (ACPI_FAILURE(status)) {
108 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 108 ACPI_EXCEPTION((AE_INFO, status,
109 "Region %p [%4.4s] - Init failure, %s\n", 109 "During Region initialization %p [%4.4s]",
110 obj_handle, 110 obj_handle,
111 acpi_ut_get_node_name(obj_handle), 111 acpi_ut_get_node_name(obj_handle)));
112 acpi_format_exception(status)));
113 } 112 }
114 113
115 info->op_region_count++; 114 info->op_region_count++;
@@ -118,14 +117,6 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
118 case ACPI_TYPE_METHOD: 117 case ACPI_TYPE_METHOD:
119 118
120 /* 119 /*
121 * Print a dot for each method unless we are going to print
122 * the entire pathname
123 */
124 if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
125 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "."));
126 }
127
128 /*
129 * Set the execution data width (32 or 64) based upon the 120 * Set the execution data width (32 or 64) based upon the
130 * revision number of the parent ACPI table. 121 * revision number of the parent ACPI table.
131 * TBD: This is really for possible future support of integer width 122 * TBD: This is really for possible future support of integer width
@@ -134,6 +125,21 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
134 if (info->table_desc->pointer->revision == 1) { 125 if (info->table_desc->pointer->revision == 1) {
135 node->flags |= ANOBJ_DATA_WIDTH_32; 126 node->flags |= ANOBJ_DATA_WIDTH_32;
136 } 127 }
128#ifdef ACPI_INIT_PARSE_METHODS
129 /*
130 * Note 11/2005: Removed this code to parse all methods during table
131 * load because it causes problems if there are any errors during the
132 * parse. Also, it seems like overkill and we probably don't want to
133 * abort a table load because of an issue with a single method.
134 */
135
136 /*
137 * Print a dot for each method unless we are going to print
138 * the entire pathname
139 */
140 if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
141 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "."));
142 }
137 143
138 /* 144 /*
139 * Always parse methods to detect errors, we will delete 145 * Always parse methods to detect errors, we will delete
@@ -141,15 +147,15 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
141 */ 147 */
142 status = acpi_ds_parse_method(obj_handle); 148 status = acpi_ds_parse_method(obj_handle);
143 if (ACPI_FAILURE(status)) { 149 if (ACPI_FAILURE(status)) {
144 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 150 ACPI_ERROR((AE_INFO,
145 "\n+Method %p [%4.4s] - parse failure, %s\n", 151 "Method %p [%4.4s] - parse failure, %s",
146 obj_handle, 152 obj_handle,
147 acpi_ut_get_node_name(obj_handle), 153 acpi_ut_get_node_name(obj_handle),
148 acpi_format_exception(status))); 154 acpi_format_exception(status)));
149 155
150 /* This parse failed, but we will continue parsing more methods */ 156 /* This parse failed, but we will continue parsing more methods */
151 } 157 }
152 158#endif
153 info->method_count++; 159 info->method_count++;
154 break; 160 break;
155 161
@@ -207,8 +213,7 @@ acpi_ds_initialize_objects(struct acpi_table_desc * table_desc,
207 status = acpi_walk_namespace(ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX, 213 status = acpi_walk_namespace(ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX,
208 acpi_ds_init_one_object, &info, NULL); 214 acpi_ds_init_one_object, &info, NULL);
209 if (ACPI_FAILURE(status)) { 215 if (ACPI_FAILURE(status)) {
210 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "walk_namespace failed, %s\n", 216 ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace"));
211 acpi_format_exception(status)));
212 } 217 }
213 218
214 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, 219 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
diff --git a/drivers/acpi/dispatcher/dsmethod.c b/drivers/acpi/dispatcher/dsmethod.c
index 36c1ca0b9adb..c475546535b6 100644
--- a/drivers/acpi/dispatcher/dsmethod.c
+++ b/drivers/acpi/dispatcher/dsmethod.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -47,135 +47,66 @@
47#include <acpi/acdispat.h> 47#include <acpi/acdispat.h>
48#include <acpi/acinterp.h> 48#include <acpi/acinterp.h>
49#include <acpi/acnamesp.h> 49#include <acpi/acnamesp.h>
50#include <acpi/acdisasm.h>
50 51
51#define _COMPONENT ACPI_DISPATCHER 52#define _COMPONENT ACPI_DISPATCHER
52ACPI_MODULE_NAME("dsmethod") 53ACPI_MODULE_NAME("dsmethod")
53 54
54/******************************************************************************* 55/*******************************************************************************
55 * 56 *
56 * FUNCTION: acpi_ds_parse_method 57 * FUNCTION: acpi_ds_method_error
57 * 58 *
58 * PARAMETERS: Node - Method node 59 * PARAMETERS: Status - Execution status
60 * walk_state - Current state
59 * 61 *
60 * RETURN: Status 62 * RETURN: Status
61 * 63 *
62 * DESCRIPTION: Parse the AML that is associated with the method. 64 * DESCRIPTION: Called on method error. Invoke the global exception handler if
65 * present, dump the method data if the disassembler is configured
63 * 66 *
64 * MUTEX: Assumes parser is locked 67 * Note: Allows the exception handler to change the status code
65 * 68 *
66 ******************************************************************************/ 69 ******************************************************************************/
67acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node) 70acpi_status
71acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
68{ 72{
69 acpi_status status; 73 ACPI_FUNCTION_ENTRY();
70 union acpi_operand_object *obj_desc;
71 union acpi_parse_object *op;
72 struct acpi_walk_state *walk_state;
73
74 ACPI_FUNCTION_TRACE_PTR("ds_parse_method", node);
75 74
76 /* Parameter Validation */ 75 /* Ignore AE_OK and control exception codes */
77 76
78 if (!node) { 77 if (ACPI_SUCCESS(status) || (status & AE_CODE_CONTROL)) {
79 return_ACPI_STATUS(AE_NULL_ENTRY); 78 return (status);
80 } 79 }
81 80
82 ACPI_DEBUG_PRINT((ACPI_DB_PARSE, 81 /* Invoke the global exception handler */
83 "**** Parsing [%4.4s] **** named_obj=%p\n",
84 acpi_ut_get_node_name(node), node));
85
86 /* Extract the method object from the method Node */
87 82
88 obj_desc = acpi_ns_get_attached_object(node); 83 if (acpi_gbl_exception_handler) {
89 if (!obj_desc) { 84 /* Exit the interpreter, allow handler to execute methods */
90 return_ACPI_STATUS(AE_NULL_OBJECT);
91 }
92 85
93 /* Create a mutex for the method if there is a concurrency limit */ 86 acpi_ex_exit_interpreter();
94 87
95 if ((obj_desc->method.concurrency != ACPI_INFINITE_CONCURRENCY) && 88 /*
96 (!obj_desc->method.semaphore)) { 89 * Handler can map the exception code to anything it wants, including
97 status = acpi_os_create_semaphore(obj_desc->method.concurrency, 90 * AE_OK, in which case the executing method will not be aborted.
98 obj_desc->method.concurrency, 91 */
99 &obj_desc->method.semaphore); 92 status = acpi_gbl_exception_handler(status,
100 if (ACPI_FAILURE(status)) { 93 walk_state->method_node ?
101 return_ACPI_STATUS(status); 94 walk_state->method_node->
102 } 95 name.integer : 0,
103 } 96 walk_state->opcode,
104 97 walk_state->aml_offset,
105 /* 98 NULL);
106 * Allocate a new parser op to be the root of the parsed 99 (void)acpi_ex_enter_interpreter();
107 * method tree
108 */
109 op = acpi_ps_alloc_op(AML_METHOD_OP);
110 if (!op) {
111 return_ACPI_STATUS(AE_NO_MEMORY);
112 }
113
114 /* Init new op with the method name and pointer back to the Node */
115
116 acpi_ps_set_name(op, node->name.integer);
117 op->common.node = node;
118
119 /*
120 * Get a new owner_id for objects created by this method. Namespace
121 * objects (such as Operation Regions) can be created during the
122 * first pass parse.
123 */
124 status = acpi_ut_allocate_owner_id(&obj_desc->method.owner_id);
125 if (ACPI_FAILURE(status)) {
126 goto cleanup;
127 }
128
129 /* Create and initialize a new walk state */
130
131 walk_state =
132 acpi_ds_create_walk_state(obj_desc->method.owner_id, NULL, NULL,
133 NULL);
134 if (!walk_state) {
135 status = AE_NO_MEMORY;
136 goto cleanup2;
137 } 100 }
138 101#ifdef ACPI_DISASSEMBLER
139 status = acpi_ds_init_aml_walk(walk_state, op, node,
140 obj_desc->method.aml_start,
141 obj_desc->method.aml_length, NULL, 1);
142 if (ACPI_FAILURE(status)) { 102 if (ACPI_FAILURE(status)) {
143 acpi_ds_delete_walk_state(walk_state); 103 /* Display method locals/args if disassembler is present */
144 goto cleanup2;
145 }
146 104
147 /* 105 acpi_dm_dump_method_info(status, walk_state, walk_state->op);
148 * Parse the method, first pass
149 *
150 * The first pass load is where newly declared named objects are added into
151 * the namespace. Actual evaluation of the named objects (what would be
152 * called a "second pass") happens during the actual execution of the
153 * method so that operands to the named objects can take on dynamic
154 * run-time values.
155 */
156 status = acpi_ps_parse_aml(walk_state);
157 if (ACPI_FAILURE(status)) {
158 goto cleanup2;
159 } 106 }
107#endif
160 108
161 ACPI_DEBUG_PRINT((ACPI_DB_PARSE, 109 return (status);
162 "**** [%4.4s] Parsed **** named_obj=%p Op=%p\n",
163 acpi_ut_get_node_name(node), node, op));
164
165 /*
166 * Delete the parse tree. We simply re-parse the method for every
167 * execution since there isn't much overhead (compared to keeping lots
168 * of parse trees around)
169 */
170 acpi_ns_delete_namespace_subtree(node);
171 acpi_ns_delete_namespace_by_owner(obj_desc->method.owner_id);
172
173 cleanup2:
174 acpi_ut_release_owner_id(&obj_desc->method.owner_id);
175
176 cleanup:
177 acpi_ps_delete_parse_tree(op);
178 return_ACPI_STATUS(status);
179} 110}
180 111
181/******************************************************************************* 112/*******************************************************************************
@@ -195,9 +126,9 @@ acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node)
195 ******************************************************************************/ 126 ******************************************************************************/
196 127
197acpi_status 128acpi_status
198acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node, 129acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node,
199 union acpi_operand_object *obj_desc, 130 union acpi_operand_object * obj_desc,
200 struct acpi_namespace_node *calling_method_node) 131 struct acpi_namespace_node * calling_method_node)
201{ 132{
202 acpi_status status = AE_OK; 133 acpi_status status = AE_OK;
203 134
@@ -210,7 +141,8 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
210 /* Prevent wraparound of thread count */ 141 /* Prevent wraparound of thread count */
211 142
212 if (obj_desc->method.thread_count == ACPI_UINT8_MAX) { 143 if (obj_desc->method.thread_count == ACPI_UINT8_MAX) {
213 ACPI_REPORT_ERROR(("Method reached maximum reentrancy limit (255)\n")); 144 ACPI_ERROR((AE_INFO,
145 "Method reached maximum reentrancy limit (255)"));
214 return_ACPI_STATUS(AE_AML_METHOD_LIMIT); 146 return_ACPI_STATUS(AE_AML_METHOD_LIMIT);
215 } 147 }
216 148
@@ -539,22 +471,61 @@ void acpi_ds_terminate_control_method(struct acpi_walk_state *walk_state)
539 acpi_os_signal_semaphore(walk_state->method_desc->method. 471 acpi_os_signal_semaphore(walk_state->method_desc->method.
540 semaphore, 1); 472 semaphore, 1);
541 if (ACPI_FAILURE(status)) { 473 if (ACPI_FAILURE(status)) {
542 ACPI_REPORT_ERROR(("Could not signal method semaphore\n")); 474 ACPI_ERROR((AE_INFO,
475 "Could not signal method semaphore"));
543 476
544 /* Ignore error and continue cleanup */ 477 /* Ignore error and continue cleanup */
545 } 478 }
546 } 479 }
547 480
481 /*
482 * There are no more threads executing this method. Perform
483 * additional cleanup.
484 *
485 * The method Node is stored in the walk state
486 */
487 method_node = walk_state->method_node;
488
489 /* Lock namespace for possible update */
490
491 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
492 if (ACPI_FAILURE(status)) {
493 goto exit;
494 }
495
496 /*
497 * Delete any namespace entries created immediately underneath
498 * the method
499 */
500 if (method_node->child) {
501 acpi_ns_delete_namespace_subtree(method_node);
502 }
503
504 /*
505 * Delete any namespace entries created anywhere else within
506 * the namespace by the execution of this method
507 */
508 acpi_ns_delete_namespace_by_owner(walk_state->method_desc->method.
509 owner_id);
510 status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
511
512 /* Are there any other threads currently executing this method? */
513
548 if (walk_state->method_desc->method.thread_count) { 514 if (walk_state->method_desc->method.thread_count) {
515 /*
516 * Additional threads. Do not release the owner_id in this case,
517 * we immediately reuse it for the next thread executing this method
518 */
549 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 519 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
550 "*** Not deleting method namespace, there are still %d threads\n", 520 "*** Completed execution of one thread, %d threads remaining\n",
551 walk_state->method_desc->method. 521 walk_state->method_desc->method.
552 thread_count)); 522 thread_count));
553 } else { /* This is the last executing thread */ 523 } else {
524 /* This is the only executing thread for this method */
554 525
555 /* 526 /*
556 * Support to dynamically change a method from not_serialized to 527 * Support to dynamically change a method from not_serialized to
557 * Serialized if it appears that the method is written foolishly and 528 * Serialized if it appears that the method is incorrectly written and
558 * does not support multiple thread execution. The best example of this 529 * does not support multiple thread execution. The best example of this
559 * is if such a method creates namespace objects and blocks. A second 530 * is if such a method creates namespace objects and blocks. A second
560 * thread will fail with an AE_ALREADY_EXISTS exception 531 * thread will fail with an AE_ALREADY_EXISTS exception
@@ -570,34 +541,8 @@ void acpi_ds_terminate_control_method(struct acpi_walk_state *walk_state)
570 semaphore); 541 semaphore);
571 } 542 }
572 543
573 /* 544 /* No more threads, we can free the owner_id */
574 * There are no more threads executing this method. Perform
575 * additional cleanup.
576 *
577 * The method Node is stored in the walk state
578 */
579 method_node = walk_state->method_node;
580
581 /*
582 * Delete any namespace entries created immediately underneath
583 * the method
584 */
585 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
586 if (ACPI_FAILURE(status)) {
587 goto exit;
588 }
589
590 if (method_node->child) {
591 acpi_ns_delete_namespace_subtree(method_node);
592 }
593 545
594 /*
595 * Delete any namespace entries created anywhere else within
596 * the namespace
597 */
598 acpi_ns_delete_namespace_by_owner(walk_state->method_desc->
599 method.owner_id);
600 status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
601 acpi_ut_release_owner_id(&walk_state->method_desc->method. 546 acpi_ut_release_owner_id(&walk_state->method_desc->method.
602 owner_id); 547 owner_id);
603 } 548 }
@@ -606,3 +551,140 @@ void acpi_ds_terminate_control_method(struct acpi_walk_state *walk_state)
606 (void)acpi_ut_release_mutex(ACPI_MTX_PARSER); 551 (void)acpi_ut_release_mutex(ACPI_MTX_PARSER);
607 return_VOID; 552 return_VOID;
608} 553}
554
555#ifdef ACPI_INIT_PARSE_METHODS
556 /*
557 * Note 11/2005: Removed this code to parse all methods during table
558 * load because it causes problems if there are any errors during the
559 * parse. Also, it seems like overkill and we probably don't want to
560 * abort a table load because of an issue with a single method.
561 */
562
563/*******************************************************************************
564 *
565 * FUNCTION: acpi_ds_parse_method
566 *
567 * PARAMETERS: Node - Method node
568 *
569 * RETURN: Status
570 *
571 * DESCRIPTION: Parse the AML that is associated with the method.
572 *
573 * MUTEX: Assumes parser is locked
574 *
575 ******************************************************************************/
576
577acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node)
578{
579 acpi_status status;
580 union acpi_operand_object *obj_desc;
581 union acpi_parse_object *op;
582 struct acpi_walk_state *walk_state;
583
584 ACPI_FUNCTION_TRACE_PTR("ds_parse_method", node);
585
586 /* Parameter Validation */
587
588 if (!node) {
589 return_ACPI_STATUS(AE_NULL_ENTRY);
590 }
591
592 ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
593 "**** Parsing [%4.4s] **** named_obj=%p\n",
594 acpi_ut_get_node_name(node), node));
595
596 /* Extract the method object from the method Node */
597
598 obj_desc = acpi_ns_get_attached_object(node);
599 if (!obj_desc) {
600 return_ACPI_STATUS(AE_NULL_OBJECT);
601 }
602
603 /* Create a mutex for the method if there is a concurrency limit */
604
605 if ((obj_desc->method.concurrency != ACPI_INFINITE_CONCURRENCY) &&
606 (!obj_desc->method.semaphore)) {
607 status = acpi_os_create_semaphore(obj_desc->method.concurrency,
608 obj_desc->method.concurrency,
609 &obj_desc->method.semaphore);
610 if (ACPI_FAILURE(status)) {
611 return_ACPI_STATUS(status);
612 }
613 }
614
615 /*
616 * Allocate a new parser op to be the root of the parsed
617 * method tree
618 */
619 op = acpi_ps_alloc_op(AML_METHOD_OP);
620 if (!op) {
621 return_ACPI_STATUS(AE_NO_MEMORY);
622 }
623
624 /* Init new op with the method name and pointer back to the Node */
625
626 acpi_ps_set_name(op, node->name.integer);
627 op->common.node = node;
628
629 /*
630 * Get a new owner_id for objects created by this method. Namespace
631 * objects (such as Operation Regions) can be created during the
632 * first pass parse.
633 */
634 status = acpi_ut_allocate_owner_id(&obj_desc->method.owner_id);
635 if (ACPI_FAILURE(status)) {
636 goto cleanup;
637 }
638
639 /* Create and initialize a new walk state */
640
641 walk_state =
642 acpi_ds_create_walk_state(obj_desc->method.owner_id, NULL, NULL,
643 NULL);
644 if (!walk_state) {
645 status = AE_NO_MEMORY;
646 goto cleanup2;
647 }
648
649 status = acpi_ds_init_aml_walk(walk_state, op, node,
650 obj_desc->method.aml_start,
651 obj_desc->method.aml_length, NULL, 1);
652 if (ACPI_FAILURE(status)) {
653 acpi_ds_delete_walk_state(walk_state);
654 goto cleanup2;
655 }
656
657 /*
658 * Parse the method, first pass
659 *
660 * The first pass load is where newly declared named objects are added into
661 * the namespace. Actual evaluation of the named objects (what would be
662 * called a "second pass") happens during the actual execution of the
663 * method so that operands to the named objects can take on dynamic
664 * run-time values.
665 */
666 status = acpi_ps_parse_aml(walk_state);
667 if (ACPI_FAILURE(status)) {
668 goto cleanup2;
669 }
670
671 ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
672 "**** [%4.4s] Parsed **** named_obj=%p Op=%p\n",
673 acpi_ut_get_node_name(node), node, op));
674
675 /*
676 * Delete the parse tree. We simply re-parse the method for every
677 * execution since there isn't much overhead (compared to keeping lots
678 * of parse trees around)
679 */
680 acpi_ns_delete_namespace_subtree(node);
681 acpi_ns_delete_namespace_by_owner(obj_desc->method.owner_id);
682
683 cleanup2:
684 acpi_ut_release_owner_id(&obj_desc->method.owner_id);
685
686 cleanup:
687 acpi_ps_delete_parse_tree(op);
688 return_ACPI_STATUS(status);
689}
690#endif
diff --git a/drivers/acpi/dispatcher/dsmthdat.c b/drivers/acpi/dispatcher/dsmthdat.c
index 4095ce70982b..c025674f938b 100644
--- a/drivers/acpi/dispatcher/dsmthdat.c
+++ b/drivers/acpi/dispatcher/dsmthdat.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -260,9 +260,9 @@ acpi_ds_method_data_get_node(u16 opcode,
260 case AML_LOCAL_OP: 260 case AML_LOCAL_OP:
261 261
262 if (index > ACPI_METHOD_MAX_LOCAL) { 262 if (index > ACPI_METHOD_MAX_LOCAL) {
263 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 263 ACPI_ERROR((AE_INFO,
264 "Local index %d is invalid (max %d)\n", 264 "Local index %d is invalid (max %d)",
265 index, ACPI_METHOD_MAX_LOCAL)); 265 index, ACPI_METHOD_MAX_LOCAL));
266 return_ACPI_STATUS(AE_AML_INVALID_INDEX); 266 return_ACPI_STATUS(AE_AML_INVALID_INDEX);
267 } 267 }
268 268
@@ -274,9 +274,9 @@ acpi_ds_method_data_get_node(u16 opcode,
274 case AML_ARG_OP: 274 case AML_ARG_OP:
275 275
276 if (index > ACPI_METHOD_MAX_ARG) { 276 if (index > ACPI_METHOD_MAX_ARG) {
277 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 277 ACPI_ERROR((AE_INFO,
278 "Arg index %d is invalid (max %d)\n", 278 "Arg index %d is invalid (max %d)",
279 index, ACPI_METHOD_MAX_ARG)); 279 index, ACPI_METHOD_MAX_ARG));
280 return_ACPI_STATUS(AE_AML_INVALID_INDEX); 280 return_ACPI_STATUS(AE_AML_INVALID_INDEX);
281 } 281 }
282 282
@@ -286,8 +286,7 @@ acpi_ds_method_data_get_node(u16 opcode,
286 break; 286 break;
287 287
288 default: 288 default:
289 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Opcode %d is invalid\n", 289 ACPI_ERROR((AE_INFO, "Opcode %d is invalid", opcode));
290 opcode));
291 return_ACPI_STATUS(AE_AML_BAD_OPCODE); 290 return_ACPI_STATUS(AE_AML_BAD_OPCODE);
292 } 291 }
293 292
@@ -378,8 +377,7 @@ acpi_ds_method_data_get_value(u16 opcode,
378 /* Validate the object descriptor */ 377 /* Validate the object descriptor */
379 378
380 if (!dest_desc) { 379 if (!dest_desc) {
381 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 380 ACPI_ERROR((AE_INFO, "Null object descriptor pointer"));
382 "Null object descriptor pointer\n"));
383 return_ACPI_STATUS(AE_BAD_PARAMETER); 381 return_ACPI_STATUS(AE_BAD_PARAMETER);
384 } 382 }
385 383
@@ -424,23 +422,24 @@ acpi_ds_method_data_get_value(u16 opcode,
424 switch (opcode) { 422 switch (opcode) {
425 case AML_ARG_OP: 423 case AML_ARG_OP:
426 424
427 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 425 ACPI_ERROR((AE_INFO,
428 "Uninitialized Arg[%d] at node %p\n", 426 "Uninitialized Arg[%d] at node %p",
429 index, node)); 427 index, node));
430 428
431 return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG); 429 return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG);
432 430
433 case AML_LOCAL_OP: 431 case AML_LOCAL_OP:
434 432
435 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 433 ACPI_ERROR((AE_INFO,
436 "Uninitialized Local[%d] at node %p\n", 434 "Uninitialized Local[%d] at node %p",
437 index, node)); 435 index, node));
438 436
439 return_ACPI_STATUS(AE_AML_UNINITIALIZED_LOCAL); 437 return_ACPI_STATUS(AE_AML_UNINITIALIZED_LOCAL);
440 438
441 default: 439 default:
442 ACPI_REPORT_ERROR(("Not Arg/Local opcode: %X\n", 440 ACPI_ERROR((AE_INFO,
443 opcode)); 441 "Not a Arg/Local opcode: %X",
442 opcode));
444 return_ACPI_STATUS(AE_AML_INTERNAL); 443 return_ACPI_STATUS(AE_AML_INTERNAL);
445 } 444 }
446 } 445 }
diff --git a/drivers/acpi/dispatcher/dsobject.c b/drivers/acpi/dispatcher/dsobject.c
index 8ac0cd93adb5..8b21f0f9e517 100644
--- a/drivers/acpi/dispatcher/dsobject.c
+++ b/drivers/acpi/dispatcher/dsobject.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -51,6 +51,7 @@
51#define _COMPONENT ACPI_DISPATCHER 51#define _COMPONENT ACPI_DISPATCHER
52ACPI_MODULE_NAME("dsobject") 52ACPI_MODULE_NAME("dsobject")
53 53
54/* Local prototypes */
54static acpi_status 55static acpi_status
55acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, 56acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
56 union acpi_parse_object *op, 57 union acpi_parse_object *op,
@@ -85,7 +86,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
85 *obj_desc_ptr = NULL; 86 *obj_desc_ptr = NULL;
86 if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { 87 if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
87 /* 88 /*
88 * This is an named object reference. If this name was 89 * This is a named object reference. If this name was
89 * previously looked up in the namespace, it was stored in this op. 90 * previously looked up in the namespace, it was stored in this op.
90 * Otherwise, go ahead and look it up now 91 * Otherwise, go ahead and look it up now
91 */ 92 */
@@ -96,18 +97,48 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
96 ACPI_IMODE_EXECUTE, 97 ACPI_IMODE_EXECUTE,
97 ACPI_NS_SEARCH_PARENT | 98 ACPI_NS_SEARCH_PARENT |
98 ACPI_NS_DONT_OPEN_SCOPE, NULL, 99 ACPI_NS_DONT_OPEN_SCOPE, NULL,
99 (struct acpi_namespace_node **) 100 ACPI_CAST_INDIRECT_PTR(struct
100 &(op->common.node)); 101 acpi_namespace_node,
101 102 &(op->
103 common.
104 node)));
102 if (ACPI_FAILURE(status)) { 105 if (ACPI_FAILURE(status)) {
103 ACPI_REPORT_NSERROR(op->common.value.string, 106 /* Check if we are resolving a named reference within a package */
104 status); 107
108 if ((status == AE_NOT_FOUND)
109 && (acpi_gbl_enable_interpreter_slack)
110 &&
111 ((op->common.parent->common.aml_opcode ==
112 AML_PACKAGE_OP)
113 || (op->common.parent->common.aml_opcode ==
114 AML_VAR_PACKAGE_OP))) {
115 /*
116 * We didn't find the target and we are populating elements
117 * of a package - ignore if slack enabled. Some ASL code
118 * contains dangling invalid references in packages and
119 * expects that no exception will be issued. Leave the
120 * element as a null element. It cannot be used, but it
121 * can be overwritten by subsequent ASL code - this is
122 * typically the case.
123 */
124 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
125 "Ignoring unresolved reference in package [%4.4s]\n",
126 walk_state->
127 scope_info->scope.
128 node->name.ascii));
129
130 return_ACPI_STATUS(AE_OK);
131 } else {
132 ACPI_ERROR_NAMESPACE(op->common.value.
133 string, status);
134 }
135
105 return_ACPI_STATUS(status); 136 return_ACPI_STATUS(status);
106 } 137 }
107 } 138 }
108 } 139 }
109 140
110 /* Create and init the internal ACPI object */ 141 /* Create and init a new internal ACPI object */
111 142
112 obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info 143 obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info
113 (op->common.aml_opcode))-> 144 (op->common.aml_opcode))->
@@ -157,13 +188,13 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
157 188
158 ACPI_FUNCTION_TRACE("ds_build_internal_buffer_obj"); 189 ACPI_FUNCTION_TRACE("ds_build_internal_buffer_obj");
159 190
191 /*
192 * If we are evaluating a Named buffer object "Name (xxxx, Buffer)".
193 * The buffer object already exists (from the NS node), otherwise it must
194 * be created.
195 */
160 obj_desc = *obj_desc_ptr; 196 obj_desc = *obj_desc_ptr;
161 if (obj_desc) { 197 if (!obj_desc) {
162 /*
163 * We are evaluating a Named buffer object "Name (xxxx, Buffer)".
164 * The buffer object already exists (from the NS node)
165 */
166 } else {
167 /* Create a new buffer object */ 198 /* Create a new buffer object */
168 199
169 obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER); 200 obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER);
@@ -183,10 +214,9 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
183 byte_list = arg->named.next; 214 byte_list = arg->named.next;
184 if (byte_list) { 215 if (byte_list) {
185 if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) { 216 if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) {
186 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 217 ACPI_ERROR((AE_INFO,
187 "Expecting bytelist, got AML opcode %X in op %p\n", 218 "Expecting bytelist, got AML opcode %X in op %p",
188 byte_list->common.aml_opcode, 219 byte_list->common.aml_opcode, byte_list));
189 byte_list));
190 220
191 acpi_ut_remove_reference(obj_desc); 221 acpi_ut_remove_reference(obj_desc);
192 return (AE_TYPE); 222 return (AE_TYPE);
@@ -259,7 +289,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
259 union acpi_operand_object *obj_desc = NULL; 289 union acpi_operand_object *obj_desc = NULL;
260 u32 package_list_length; 290 u32 package_list_length;
261 acpi_status status = AE_OK; 291 acpi_status status = AE_OK;
262 u32 i; 292 acpi_native_uint i;
263 293
264 ACPI_FUNCTION_TRACE("ds_build_internal_package_obj"); 294 ACPI_FUNCTION_TRACE("ds_build_internal_package_obj");
265 295
@@ -271,13 +301,12 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
271 parent = parent->common.parent; 301 parent = parent->common.parent;
272 } 302 }
273 303
304 /*
305 * If we are evaluating a Named package object "Name (xxxx, Package)",
306 * the package object already exists, otherwise it must be created.
307 */
274 obj_desc = *obj_desc_ptr; 308 obj_desc = *obj_desc_ptr;
275 if (obj_desc) { 309 if (!obj_desc) {
276 /*
277 * We are evaluating a Named package object "Name (xxxx, Package)".
278 * Get the existing package object from the NS node
279 */
280 } else {
281 obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); 310 obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
282 *obj_desc_ptr = obj_desc; 311 *obj_desc_ptr = obj_desc;
283 if (!obj_desc) { 312 if (!obj_desc) {
@@ -291,11 +320,9 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
291 320
292 /* Count the number of items in the package list */ 321 /* Count the number of items in the package list */
293 322
294 package_list_length = 0;
295 arg = op->common.value.arg; 323 arg = op->common.value.arg;
296 arg = arg->common.next; 324 arg = arg->common.next;
297 while (arg) { 325 for (package_list_length = 0; arg; package_list_length++) {
298 package_list_length++;
299 arg = arg->common.next; 326 arg = arg->common.next;
300 } 327 }
301 328
@@ -322,12 +349,11 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
322 } 349 }
323 350
324 /* 351 /*
325 * Now init the elements of the package 352 * Initialize all elements of the package
326 */ 353 */
327 i = 0;
328 arg = op->common.value.arg; 354 arg = op->common.value.arg;
329 arg = arg->common.next; 355 arg = arg->common.next;
330 while (arg) { 356 for (i = 0; arg; i++) {
331 if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { 357 if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
332 /* Object (package or buffer) is already built */ 358 /* Object (package or buffer) is already built */
333 359
@@ -340,8 +366,6 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
340 package. 366 package.
341 elements[i]); 367 elements[i]);
342 } 368 }
343
344 i++;
345 arg = arg->common.next; 369 arg = arg->common.next;
346 } 370 }
347 371
@@ -518,9 +542,9 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
518 542
519 default: 543 default:
520 544
521 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 545 ACPI_ERROR((AE_INFO,
522 "Unknown constant opcode %X\n", 546 "Unknown constant opcode %X",
523 opcode)); 547 opcode));
524 status = AE_AML_OPERAND_TYPE; 548 status = AE_AML_OPERAND_TYPE;
525 break; 549 break;
526 } 550 }
@@ -535,9 +559,8 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
535 break; 559 break;
536 560
537 default: 561 default:
538 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 562 ACPI_ERROR((AE_INFO, "Unknown Integer type %X",
539 "Unknown Integer type %X\n", 563 op_info->type));
540 op_info->type));
541 status = AE_AML_OPERAND_TYPE; 564 status = AE_AML_OPERAND_TYPE;
542 break; 565 break;
543 } 566 }
@@ -615,9 +638,8 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
615 638
616 default: 639 default:
617 640
618 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 641 ACPI_ERROR((AE_INFO, "Unimplemented data type: %X",
619 "Unimplemented data type: %X\n", 642 ACPI_GET_OBJECT_TYPE(obj_desc)));
620 ACPI_GET_OBJECT_TYPE(obj_desc)));
621 643
622 status = AE_AML_OPERAND_TYPE; 644 status = AE_AML_OPERAND_TYPE;
623 break; 645 break;
diff --git a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c
index 939d167bf87b..6229c10674e1 100644
--- a/drivers/acpi/dispatcher/dsopcode.c
+++ b/drivers/acpi/dispatcher/dsopcode.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -245,7 +245,9 @@ acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc)
245 245
246 node = obj_desc->buffer.node; 246 node = obj_desc->buffer.node;
247 if (!node) { 247 if (!node) {
248 ACPI_REPORT_ERROR(("No pointer back to NS node in buffer obj %p\n", obj_desc)); 248 ACPI_ERROR((AE_INFO,
249 "No pointer back to NS node in buffer obj %p",
250 obj_desc));
249 return_ACPI_STATUS(AE_AML_INTERNAL); 251 return_ACPI_STATUS(AE_AML_INTERNAL);
250 } 252 }
251 253
@@ -287,8 +289,9 @@ acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc)
287 289
288 node = obj_desc->package.node; 290 node = obj_desc->package.node;
289 if (!node) { 291 if (!node) {
290 ACPI_REPORT_ERROR(("No pointer back to NS node in package %p\n", 292 ACPI_ERROR((AE_INFO,
291 obj_desc)); 293 "No pointer back to NS node in package %p",
294 obj_desc));
292 return_ACPI_STATUS(AE_AML_INTERNAL); 295 return_ACPI_STATUS(AE_AML_INTERNAL);
293 } 296 }
294 297
@@ -413,9 +416,9 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
413 /* Host object must be a Buffer */ 416 /* Host object must be a Buffer */
414 417
415 if (ACPI_GET_OBJECT_TYPE(buffer_desc) != ACPI_TYPE_BUFFER) { 418 if (ACPI_GET_OBJECT_TYPE(buffer_desc) != ACPI_TYPE_BUFFER) {
416 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 419 ACPI_ERROR((AE_INFO,
417 "Target of Create Field is not a Buffer object - %s\n", 420 "Target of Create Field is not a Buffer object - %s",
418 acpi_ut_get_object_type_name(buffer_desc))); 421 acpi_ut_get_object_type_name(buffer_desc)));
419 422
420 status = AE_AML_OPERAND_TYPE; 423 status = AE_AML_OPERAND_TYPE;
421 goto cleanup; 424 goto cleanup;
@@ -427,10 +430,10 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
427 * after resolution in acpi_ex_resolve_operands(). 430 * after resolution in acpi_ex_resolve_operands().
428 */ 431 */
429 if (ACPI_GET_DESCRIPTOR_TYPE(result_desc) != ACPI_DESC_TYPE_NAMED) { 432 if (ACPI_GET_DESCRIPTOR_TYPE(result_desc) != ACPI_DESC_TYPE_NAMED) {
430 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 433 ACPI_ERROR((AE_INFO,
431 "(%s) destination not a NS Node [%s]\n", 434 "(%s) destination not a NS Node [%s]",
432 acpi_ps_get_opcode_name(aml_opcode), 435 acpi_ps_get_opcode_name(aml_opcode),
433 acpi_ut_get_descriptor_name(result_desc))); 436 acpi_ut_get_descriptor_name(result_desc)));
434 437
435 status = AE_AML_OPERAND_TYPE; 438 status = AE_AML_OPERAND_TYPE;
436 goto cleanup; 439 goto cleanup;
@@ -453,8 +456,8 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
453 /* Must have a valid (>0) bit count */ 456 /* Must have a valid (>0) bit count */
454 457
455 if (bit_count == 0) { 458 if (bit_count == 0) {
456 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 459 ACPI_ERROR((AE_INFO,
457 "Attempt to create_field of length 0\n")); 460 "Attempt to create_field of length zero"));
458 status = AE_AML_OPERAND_VALUE; 461 status = AE_AML_OPERAND_VALUE;
459 goto cleanup; 462 goto cleanup;
460 } 463 }
@@ -507,9 +510,8 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
507 510
508 default: 511 default:
509 512
510 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 513 ACPI_ERROR((AE_INFO,
511 "Unknown field creation opcode %02x\n", 514 "Unknown field creation opcode %02x", aml_opcode));
512 aml_opcode));
513 status = AE_AML_BAD_OPCODE; 515 status = AE_AML_BAD_OPCODE;
514 goto cleanup; 516 goto cleanup;
515 } 517 }
@@ -517,13 +519,12 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
517 /* Entire field must fit within the current length of the buffer */ 519 /* Entire field must fit within the current length of the buffer */
518 520
519 if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) { 521 if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) {
520 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 522 ACPI_ERROR((AE_INFO,
521 "Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n", 523 "Field [%4.4s] at %d exceeds Buffer [%4.4s] size %d (bits)",
522 acpi_ut_get_node_name(result_desc), 524 acpi_ut_get_node_name(result_desc),
523 bit_offset + bit_count, 525 bit_offset + bit_count,
524 acpi_ut_get_node_name(buffer_desc->buffer. 526 acpi_ut_get_node_name(buffer_desc->buffer.node),
525 node), 527 8 * (u32) buffer_desc->buffer.length));
526 8 * (u32) buffer_desc->buffer.length));
527 status = AE_AML_BUFFER_LIMIT; 528 status = AE_AML_BUFFER_LIMIT;
528 goto cleanup; 529 goto cleanup;
529 } 530 }
@@ -629,9 +630,9 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state,
629 "after acpi_ex_resolve_operands"); 630 "after acpi_ex_resolve_operands");
630 631
631 if (ACPI_FAILURE(status)) { 632 if (ACPI_FAILURE(status)) {
632 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "(%s) bad operand(s) (%X)\n", 633 ACPI_ERROR((AE_INFO, "(%s) bad operand(s) (%X)",
633 acpi_ps_get_opcode_name(op->common. 634 acpi_ps_get_opcode_name(op->common.aml_opcode),
634 aml_opcode), status)); 635 status));
635 636
636 return_ACPI_STATUS(status); 637 return_ACPI_STATUS(status);
637 } 638 }
@@ -1155,9 +1156,8 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
1155 1156
1156 default: 1157 default:
1157 1158
1158 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 1159 ACPI_ERROR((AE_INFO, "Unknown control opcode=%X Op=%p",
1159 "Unknown control opcode=%X Op=%p\n", 1160 op->common.aml_opcode, op));
1160 op->common.aml_opcode, op));
1161 1161
1162 status = AE_AML_BAD_OPCODE; 1162 status = AE_AML_BAD_OPCODE;
1163 break; 1163 break;
diff --git a/drivers/acpi/dispatcher/dsutils.c b/drivers/acpi/dispatcher/dsutils.c
index 83ae1c1aa286..53356a591ac1 100644
--- a/drivers/acpi/dispatcher/dsutils.c
+++ b/drivers/acpi/dispatcher/dsutils.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -176,8 +176,8 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
176 /* Must have both an Op and a Result Object */ 176 /* Must have both an Op and a Result Object */
177 177
178 if (!op) { 178 if (!op) {
179 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null Op\n")); 179 ACPI_ERROR((AE_INFO, "Null Op"));
180 return_VALUE(TRUE); 180 return_UINT8(TRUE);
181 } 181 }
182 182
183 /* 183 /*
@@ -208,7 +208,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
208 "At Method level, result of [%s] not used\n", 208 "At Method level, result of [%s] not used\n",
209 acpi_ps_get_opcode_name(op->common. 209 acpi_ps_get_opcode_name(op->common.
210 aml_opcode))); 210 aml_opcode)));
211 return_VALUE(FALSE); 211 return_UINT8(FALSE);
212 } 212 }
213 213
214 /* Get info on the parent. The root_op is AML_SCOPE */ 214 /* Get info on the parent. The root_op is AML_SCOPE */
@@ -216,9 +216,8 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
216 parent_info = 216 parent_info =
217 acpi_ps_get_opcode_info(op->common.parent->common.aml_opcode); 217 acpi_ps_get_opcode_info(op->common.parent->common.aml_opcode);
218 if (parent_info->class == AML_CLASS_UNKNOWN) { 218 if (parent_info->class == AML_CLASS_UNKNOWN) {
219 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 219 ACPI_ERROR((AE_INFO, "Unknown parent opcode Op=%p", op));
220 "Unknown parent opcode. Op=%p\n", op)); 220 return_UINT8(FALSE);
221 return_VALUE(FALSE);
222 } 221 }
223 222
224 /* 223 /*
@@ -304,7 +303,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
304 acpi_ps_get_opcode_name(op->common.parent->common. 303 acpi_ps_get_opcode_name(op->common.parent->common.
305 aml_opcode), op)); 304 aml_opcode), op));
306 305
307 return_VALUE(TRUE); 306 return_UINT8(TRUE);
308 307
309 result_not_used: 308 result_not_used:
310 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 309 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
@@ -313,7 +312,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
313 acpi_ps_get_opcode_name(op->common.parent->common. 312 acpi_ps_get_opcode_name(op->common.parent->common.
314 aml_opcode), op)); 313 aml_opcode), op));
315 314
316 return_VALUE(FALSE); 315 return_UINT8(FALSE);
317} 316}
318 317
319/******************************************************************************* 318/*******************************************************************************
@@ -344,7 +343,7 @@ acpi_ds_delete_result_if_not_used(union acpi_parse_object *op,
344 ACPI_FUNCTION_TRACE_PTR("ds_delete_result_if_not_used", result_obj); 343 ACPI_FUNCTION_TRACE_PTR("ds_delete_result_if_not_used", result_obj);
345 344
346 if (!op) { 345 if (!op) {
347 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null Op\n")); 346 ACPI_ERROR((AE_INFO, "Null Op"));
348 return_VOID; 347 return_VOID;
349 } 348 }
350 349
@@ -567,7 +566,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
567 } 566 }
568 567
569 if (ACPI_FAILURE(status)) { 568 if (ACPI_FAILURE(status)) {
570 ACPI_REPORT_NSERROR(name_string, status); 569 ACPI_ERROR_NAMESPACE(name_string, status);
571 } 570 }
572 } 571 }
573 572
@@ -616,7 +615,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
616 615
617 if (op_info->flags & AML_HAS_RETVAL) { 616 if (op_info->flags & AML_HAS_RETVAL) {
618 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 617 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
619 "Argument previously created, already stacked \n")); 618 "Argument previously created, already stacked\n"));
620 619
621 ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object 620 ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object
622 (walk_state-> 621 (walk_state->
@@ -635,10 +634,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
635 * Only error is underflow, and this indicates 634 * Only error is underflow, and this indicates
636 * a missing or null operand! 635 * a missing or null operand!
637 */ 636 */
638 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 637 ACPI_EXCEPTION((AE_INFO, status,
639 "Missing or null operand, %s\n", 638 "Missing or null operand"));
640 acpi_format_exception
641 (status)));
642 return_ACPI_STATUS(status); 639 return_ACPI_STATUS(status);
643 } 640 }
644 } else { 641 } else {
@@ -730,7 +727,7 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state,
730 */ 727 */
731 (void)acpi_ds_obj_stack_pop_and_delete(arg_count, walk_state); 728 (void)acpi_ds_obj_stack_pop_and_delete(arg_count, walk_state);
732 729
733 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "While creating Arg %d - %s\n", 730 ACPI_EXCEPTION((AE_INFO, status, "While creating Arg %d",
734 (arg_count + 1), acpi_format_exception(status))); 731 (arg_count + 1)));
735 return_ACPI_STATUS(status); 732 return_ACPI_STATUS(status);
736} 733}
diff --git a/drivers/acpi/dispatcher/dswexec.c b/drivers/acpi/dispatcher/dswexec.c
index e522763bb692..f1af655ff113 100644
--- a/drivers/acpi/dispatcher/dswexec.c
+++ b/drivers/acpi/dispatcher/dswexec.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -100,9 +100,8 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
100 if (result_obj) { 100 if (result_obj) {
101 status = acpi_ds_result_pop(&obj_desc, walk_state); 101 status = acpi_ds_result_pop(&obj_desc, walk_state);
102 if (ACPI_FAILURE(status)) { 102 if (ACPI_FAILURE(status)) {
103 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 103 ACPI_EXCEPTION((AE_INFO, status,
104 "Could not get result from predicate evaluation, %s\n", 104 "Could not get result from predicate evaluation"));
105 acpi_format_exception(status)));
106 105
107 return_ACPI_STATUS(status); 106 return_ACPI_STATUS(status);
108 } 107 }
@@ -123,9 +122,9 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
123 } 122 }
124 123
125 if (!obj_desc) { 124 if (!obj_desc) {
126 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 125 ACPI_ERROR((AE_INFO,
127 "No predicate obj_desc=%p State=%p\n", 126 "No predicate obj_desc=%p State=%p",
128 obj_desc, walk_state)); 127 obj_desc, walk_state));
129 128
130 return_ACPI_STATUS(AE_AML_NO_OPERAND); 129 return_ACPI_STATUS(AE_AML_NO_OPERAND);
131 } 130 }
@@ -140,10 +139,10 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
140 } 139 }
141 140
142 if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) { 141 if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) {
143 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 142 ACPI_ERROR((AE_INFO,
144 "Bad predicate (not an integer) obj_desc=%p State=%p Type=%X\n", 143 "Bad predicate (not an integer) obj_desc=%p State=%p Type=%X",
145 obj_desc, walk_state, 144 obj_desc, walk_state,
146 ACPI_GET_OBJECT_TYPE(obj_desc))); 145 ACPI_GET_OBJECT_TYPE(obj_desc)));
147 146
148 status = AE_AML_OPERAND_TYPE; 147 status = AE_AML_OPERAND_TYPE;
149 goto cleanup; 148 goto cleanup;
@@ -314,12 +313,13 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
314 313
315 case AML_CLASS_EXECUTE: 314 case AML_CLASS_EXECUTE:
316 case AML_CLASS_CREATE: 315 case AML_CLASS_CREATE:
317
318 /* 316 /*
319 * Most operators with arguments. 317 * Most operators with arguments.
320 * Start a new result/operand state 318 * Start a new result/operand state
321 */ 319 */
322 status = acpi_ds_result_stack_push(walk_state); 320 if (walk_state->opcode != AML_CREATE_FIELD_OP) {
321 status = acpi_ds_result_stack_push(walk_state);
322 }
323 break; 323 break;
324 324
325 default: 325 default:
@@ -361,8 +361,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
361 op_class = walk_state->op_info->class; 361 op_class = walk_state->op_info->class;
362 362
363 if (op_class == AML_CLASS_UNKNOWN) { 363 if (op_class == AML_CLASS_UNKNOWN) {
364 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown opcode %X\n", 364 ACPI_ERROR((AE_INFO, "Unknown opcode %X",
365 op->common.aml_opcode)); 365 op->common.aml_opcode));
366 return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 366 return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
367 } 367 }
368 368
@@ -452,12 +452,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
452 walk_state->operands[1]->reference.offset)) { 452 walk_state->operands[1]->reference.offset)) {
453 status = AE_OK; 453 status = AE_OK;
454 } else { 454 } else {
455 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 455 ACPI_EXCEPTION((AE_INFO, status,
456 "[%s]: Could not resolve operands, %s\n", 456 "While resolving operands for [%s]",
457 acpi_ps_get_opcode_name 457 acpi_ps_get_opcode_name
458 (walk_state->opcode), 458 (walk_state->opcode)));
459 acpi_format_exception
460 (status)));
461 } 459 }
462 } 460 }
463 461
@@ -676,8 +674,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
676 674
677 case AML_TYPE_UNDEFINED: 675 case AML_TYPE_UNDEFINED:
678 676
679 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 677 ACPI_ERROR((AE_INFO,
680 "Undefined opcode type Op=%p\n", op)); 678 "Undefined opcode type Op=%p", op));
681 return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 679 return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
682 680
683 case AML_TYPE_BOGUS: 681 case AML_TYPE_BOGUS:
@@ -689,10 +687,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
689 687
690 default: 688 default:
691 689
692 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 690 ACPI_ERROR((AE_INFO,
693 "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p\n", 691 "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p",
694 op_class, op_type, 692 op_class, op_type, op->common.aml_opcode,
695 op->common.aml_opcode, op)); 693 op));
696 694
697 status = AE_NOT_IMPLEMENTED; 695 status = AE_NOT_IMPLEMENTED;
698 break; 696 break;
@@ -723,20 +721,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
723 721
724 cleanup: 722 cleanup:
725 723
726 /* Invoke exception handler on error */
727
728 if (ACPI_FAILURE(status) &&
729 acpi_gbl_exception_handler && !(status & AE_CODE_CONTROL)) {
730 acpi_ex_exit_interpreter();
731 status = acpi_gbl_exception_handler(status,
732 walk_state->method_node->
733 name.integer,
734 walk_state->opcode,
735 walk_state->aml_offset,
736 NULL);
737 (void)acpi_ex_enter_interpreter();
738 }
739
740 if (walk_state->result_obj) { 724 if (walk_state->result_obj) {
741 /* Break to debugger to display result */ 725 /* Break to debugger to display result */
742 726
@@ -758,18 +742,14 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
758 } 742 }
759#endif 743#endif
760 744
761 /* Always clear the object stack */ 745 /* Invoke exception handler on error */
762
763 walk_state->num_operands = 0;
764
765#ifdef ACPI_DISASSEMBLER
766
767 /* On error, display method locals/args */
768 746
769 if (ACPI_FAILURE(status)) { 747 if (ACPI_FAILURE(status)) {
770 acpi_dm_dump_method_info(status, walk_state, op); 748 status = acpi_ds_method_error(status, walk_state);
771 } 749 }
772#endif
773 750
751 /* Always clear the object stack */
752
753 walk_state->num_operands = 0;
774 return_ACPI_STATUS(status); 754 return_ACPI_STATUS(status);
775} 755}
diff --git a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c
index 411731261c29..d3d24da31c81 100644
--- a/drivers/acpi/dispatcher/dswload.c
+++ b/drivers/acpi/dispatcher/dswload.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -127,7 +127,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
127 char *path; 127 char *path;
128 u32 flags; 128 u32 flags;
129 129
130 ACPI_FUNCTION_NAME("ds_load1_begin_op"); 130 ACPI_FUNCTION_TRACE("ds_load1_begin_op");
131 131
132 op = walk_state->op; 132 op = walk_state->op;
133 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, 133 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
@@ -138,14 +138,14 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
138 if (op) { 138 if (op) {
139 if (!(walk_state->op_info->flags & AML_NAMED)) { 139 if (!(walk_state->op_info->flags & AML_NAMED)) {
140 *out_op = op; 140 *out_op = op;
141 return (AE_OK); 141 return_ACPI_STATUS(AE_OK);
142 } 142 }
143 143
144 /* Check if this object has already been installed in the namespace */ 144 /* Check if this object has already been installed in the namespace */
145 145
146 if (op->common.node) { 146 if (op->common.node) {
147 *out_op = op; 147 *out_op = op;
148 return (AE_OK); 148 return_ACPI_STATUS(AE_OK);
149 } 149 }
150 } 150 }
151 151
@@ -187,8 +187,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
187 } 187 }
188#endif 188#endif
189 if (ACPI_FAILURE(status)) { 189 if (ACPI_FAILURE(status)) {
190 ACPI_REPORT_NSERROR(path, status); 190 ACPI_ERROR_NAMESPACE(path, status);
191 return (status); 191 return_ACPI_STATUS(status);
192 } 192 }
193 193
194 /* 194 /*
@@ -233,9 +233,11 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
233 233
234 /* All other types are an error */ 234 /* All other types are an error */
235 235
236 ACPI_REPORT_ERROR(("Invalid type (%s) for target of Scope operator [%4.4s] (Cannot override)\n", acpi_ut_get_type_name(node->type), path)); 236 ACPI_ERROR((AE_INFO,
237 "Invalid type (%s) for target of Scope operator [%4.4s] (Cannot override)",
238 acpi_ut_get_type_name(node->type), path));
237 239
238 return (AE_AML_OPERAND_TYPE); 240 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
239 } 241 }
240 break; 242 break;
241 243
@@ -257,6 +259,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
257 * buffer_field, or Package), the name of the object is already 259 * buffer_field, or Package), the name of the object is already
258 * in the namespace. 260 * in the namespace.
259 */ 261 */
262
260 if (walk_state->deferred_node) { 263 if (walk_state->deferred_node) {
261 /* This name is already in the namespace, get the node */ 264 /* This name is already in the namespace, get the node */
262 265
@@ -265,6 +268,16 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
265 break; 268 break;
266 } 269 }
267 270
271 /*
272 * If we are executing a method, do not create any namespace objects
273 * during the load phase, only during execution.
274 */
275 if (walk_state->method_node) {
276 node = NULL;
277 status = AE_OK;
278 break;
279 }
280
268 flags = ACPI_NS_NO_UPSEARCH; 281 flags = ACPI_NS_NO_UPSEARCH;
269 if ((walk_state->opcode != AML_SCOPE_OP) && 282 if ((walk_state->opcode != AML_SCOPE_OP) &&
270 (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) { 283 (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) {
@@ -289,8 +302,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
289 ACPI_IMODE_LOAD_PASS1, flags, walk_state, 302 ACPI_IMODE_LOAD_PASS1, flags, walk_state,
290 &(node)); 303 &(node));
291 if (ACPI_FAILURE(status)) { 304 if (ACPI_FAILURE(status)) {
292 ACPI_REPORT_NSERROR(path, status); 305 ACPI_ERROR_NAMESPACE(path, status);
293 return (status); 306 return_ACPI_STATUS(status);
294 } 307 }
295 break; 308 break;
296 } 309 }
@@ -302,28 +315,29 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
302 315
303 op = acpi_ps_alloc_op(walk_state->opcode); 316 op = acpi_ps_alloc_op(walk_state->opcode);
304 if (!op) { 317 if (!op) {
305 return (AE_NO_MEMORY); 318 return_ACPI_STATUS(AE_NO_MEMORY);
306 } 319 }
307 } 320 }
308 321
309 /* Initialize */ 322 /* Initialize the op */
310
311 op->named.name = node->name.integer;
312 323
313#if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)) 324#if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))
314 op->named.path = (u8 *) path; 325 op->named.path = ACPI_CAST_PTR(u8, path);
315#endif 326#endif
316 327
317 /* 328 if (node) {
318 * Put the Node in the "op" object that the parser uses, so we 329 /*
319 * can get it again quickly when this scope is closed 330 * Put the Node in the "op" object that the parser uses, so we
320 */ 331 * can get it again quickly when this scope is closed
321 op->common.node = node; 332 */
333 op->common.node = node;
334 op->named.name = node->name.integer;
335 }
336
322 acpi_ps_append_arg(acpi_ps_get_parent_scope(&walk_state->parser_state), 337 acpi_ps_append_arg(acpi_ps_get_parent_scope(&walk_state->parser_state),
323 op); 338 op);
324
325 *out_op = op; 339 *out_op = op;
326 return (status); 340 return_ACPI_STATUS(status);
327} 341}
328 342
329/******************************************************************************* 343/*******************************************************************************
@@ -339,13 +353,13 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
339 * 353 *
340 ******************************************************************************/ 354 ******************************************************************************/
341 355
342acpi_status acpi_ds_load1_end_op(struct acpi_walk_state * walk_state) 356acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
343{ 357{
344 union acpi_parse_object *op; 358 union acpi_parse_object *op;
345 acpi_object_type object_type; 359 acpi_object_type object_type;
346 acpi_status status = AE_OK; 360 acpi_status status = AE_OK;
347 361
348 ACPI_FUNCTION_NAME("ds_load1_end_op"); 362 ACPI_FUNCTION_TRACE("ds_load1_end_op");
349 363
350 op = walk_state->op; 364 op = walk_state->op;
351 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, 365 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
@@ -354,7 +368,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state * walk_state)
354 /* We are only interested in opcodes that have an associated name */ 368 /* We are only interested in opcodes that have an associated name */
355 369
356 if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) { 370 if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) {
357 return (AE_OK); 371 return_ACPI_STATUS(AE_OK);
358 } 372 }
359 373
360 /* Get the object type to determine if we should pop the scope */ 374 /* Get the object type to determine if we should pop the scope */
@@ -363,21 +377,37 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state * walk_state)
363 377
364#ifndef ACPI_NO_METHOD_EXECUTION 378#ifndef ACPI_NO_METHOD_EXECUTION
365 if (walk_state->op_info->flags & AML_FIELD) { 379 if (walk_state->op_info->flags & AML_FIELD) {
366 if (walk_state->opcode == AML_FIELD_OP || 380 /*
367 walk_state->opcode == AML_BANK_FIELD_OP || 381 * If we are executing a method, do not create any namespace objects
368 walk_state->opcode == AML_INDEX_FIELD_OP) { 382 * during the load phase, only during execution.
369 status = acpi_ds_init_field_objects(op, walk_state); 383 */
384 if (!walk_state->method_node) {
385 if (walk_state->opcode == AML_FIELD_OP ||
386 walk_state->opcode == AML_BANK_FIELD_OP ||
387 walk_state->opcode == AML_INDEX_FIELD_OP) {
388 status =
389 acpi_ds_init_field_objects(op, walk_state);
390 }
370 } 391 }
371 return (status); 392 return_ACPI_STATUS(status);
372 } 393 }
373 394
374 if (op->common.aml_opcode == AML_REGION_OP) { 395 /*
375 status = acpi_ex_create_region(op->named.data, op->named.length, 396 * If we are executing a method, do not create any namespace objects
376 (acpi_adr_space_type) 397 * during the load phase, only during execution.
377 ((op->common.value.arg)->common. 398 */
378 value.integer), walk_state); 399 if (!walk_state->method_node) {
379 if (ACPI_FAILURE(status)) { 400 if (op->common.aml_opcode == AML_REGION_OP) {
380 return (status); 401 status =
402 acpi_ex_create_region(op->named.data,
403 op->named.length,
404 (acpi_adr_space_type)
405 ((op->common.value.arg)->
406 common.value.integer),
407 walk_state);
408 if (ACPI_FAILURE(status)) {
409 return_ACPI_STATUS(status);
410 }
381 } 411 }
382 } 412 }
383#endif 413#endif
@@ -391,47 +421,63 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state * walk_state)
391 common. 421 common.
392 aml_opcode))-> 422 aml_opcode))->
393 object_type; 423 object_type;
394 op->common.node->type = (u8) object_type; 424
425 /* Set node type if we have a namespace node */
426
427 if (op->common.node) {
428 op->common.node->type = (u8) object_type;
429 }
395 } 430 }
396 } 431 }
397 432
398 if (op->common.aml_opcode == AML_METHOD_OP) { 433 /*
399 /* 434 * If we are executing a method, do not create any namespace objects
400 * method_op pkg_length name_string method_flags term_list 435 * during the load phase, only during execution.
401 * 436 */
402 * Note: We must create the method node/object pair as soon as we 437 if (!walk_state->method_node) {
403 * see the method declaration. This allows later pass1 parsing 438 if (op->common.aml_opcode == AML_METHOD_OP) {
404 * of invocations of the method (need to know the number of 439 /*
405 * arguments.) 440 * method_op pkg_length name_string method_flags term_list
406 */ 441 *
407 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 442 * Note: We must create the method node/object pair as soon as we
408 "LOADING-Method: State=%p Op=%p named_obj=%p\n", 443 * see the method declaration. This allows later pass1 parsing
409 walk_state, op, op->named.node)); 444 * of invocations of the method (need to know the number of
445 * arguments.)
446 */
447 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
448 "LOADING-Method: State=%p Op=%p named_obj=%p\n",
449 walk_state, op, op->named.node));
410 450
411 if (!acpi_ns_get_attached_object(op->named.node)) { 451 if (!acpi_ns_get_attached_object(op->named.node)) {
412 walk_state->operands[0] = (void *)op->named.node; 452 walk_state->operands[0] =
413 walk_state->num_operands = 1; 453 ACPI_CAST_PTR(void, op->named.node);
454 walk_state->num_operands = 1;
414 455
415 status = 456 status =
416 acpi_ds_create_operands(walk_state, 457 acpi_ds_create_operands(walk_state,
417 op->common.value.arg); 458 op->common.value.
418 if (ACPI_SUCCESS(status)) { 459 arg);
419 status = acpi_ex_create_method(op->named.data, 460 if (ACPI_SUCCESS(status)) {
420 op->named.length, 461 status =
421 walk_state); 462 acpi_ex_create_method(op->named.
422 } 463 data,
423 walk_state->operands[0] = NULL; 464 op->named.
424 walk_state->num_operands = 0; 465 length,
466 walk_state);
467 }
468 walk_state->operands[0] = NULL;
469 walk_state->num_operands = 0;
425 470
426 if (ACPI_FAILURE(status)) { 471 if (ACPI_FAILURE(status)) {
427 return (status); 472 return_ACPI_STATUS(status);
473 }
428 } 474 }
429 } 475 }
430 } 476 }
431 477
432 /* Pop the scope stack */ 478 /* Pop the scope stack (only if loading a table) */
433 479
434 if (acpi_ns_opens_scope(object_type)) { 480 if (!walk_state->method_node && acpi_ns_opens_scope(object_type)) {
435 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, 481 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
436 "(%s): Popping scope for Op %p\n", 482 "(%s): Popping scope for Op %p\n",
437 acpi_ut_get_type_name(object_type), op)); 483 acpi_ut_get_type_name(object_type), op));
@@ -439,7 +485,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state * walk_state)
439 status = acpi_ds_scope_stack_pop(walk_state); 485 status = acpi_ds_scope_stack_pop(walk_state);
440 } 486 }
441 487
442 return (status); 488 return_ACPI_STATUS(status);
443} 489}
444 490
445/******************************************************************************* 491/*******************************************************************************
@@ -456,8 +502,8 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state * walk_state)
456 ******************************************************************************/ 502 ******************************************************************************/
457 503
458acpi_status 504acpi_status
459acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state, 505acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
460 union acpi_parse_object ** out_op) 506 union acpi_parse_object **out_op)
461{ 507{
462 union acpi_parse_object *op; 508 union acpi_parse_object *op;
463 struct acpi_namespace_node *node; 509 struct acpi_namespace_node *node;
@@ -574,10 +620,10 @@ acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state,
574 if (status == AE_NOT_FOUND) { 620 if (status == AE_NOT_FOUND) {
575 status = AE_OK; 621 status = AE_OK;
576 } else { 622 } else {
577 ACPI_REPORT_NSERROR(buffer_ptr, status); 623 ACPI_ERROR_NAMESPACE(buffer_ptr, status);
578 } 624 }
579#else 625#else
580 ACPI_REPORT_NSERROR(buffer_ptr, status); 626 ACPI_ERROR_NAMESPACE(buffer_ptr, status);
581#endif 627#endif
582 return_ACPI_STATUS(status); 628 return_ACPI_STATUS(status);
583 } 629 }
@@ -607,7 +653,10 @@ acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state,
607 * Scope (DEB) { ... } 653 * Scope (DEB) { ... }
608 */ 654 */
609 655
610 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))); 656 ACPI_WARNING((AE_INFO,
657 "Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)",
658 buffer_ptr,
659 acpi_ut_get_type_name(node->type)));
611 660
612 node->type = ACPI_TYPE_ANY; 661 node->type = ACPI_TYPE_ANY;
613 walk_state->scope_info->common.value = ACPI_TYPE_ANY; 662 walk_state->scope_info->common.value = ACPI_TYPE_ANY;
@@ -617,7 +666,10 @@ acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state,
617 666
618 /* All other types are an error */ 667 /* All other types are an error */
619 668
620 ACPI_REPORT_ERROR(("Invalid type (%s) for target of Scope operator [%4.4s]\n", acpi_ut_get_type_name(node->type), buffer_ptr)); 669 ACPI_ERROR((AE_INFO,
670 "Invalid type (%s) for target of Scope operator [%4.4s]",
671 acpi_ut_get_type_name(node->type),
672 buffer_ptr));
621 673
622 return (AE_AML_OPERAND_TYPE); 674 return (AE_AML_OPERAND_TYPE);
623 } 675 }
@@ -670,7 +722,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state,
670 } 722 }
671 723
672 if (ACPI_FAILURE(status)) { 724 if (ACPI_FAILURE(status)) {
673 ACPI_REPORT_NSERROR(buffer_ptr, status); 725 ACPI_ERROR_NAMESPACE(buffer_ptr, status);
674 return_ACPI_STATUS(status); 726 return_ACPI_STATUS(status);
675 } 727 }
676 728
@@ -840,6 +892,13 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
840 892
841 case AML_TYPE_NAMED_FIELD: 893 case AML_TYPE_NAMED_FIELD:
842 894
895 /*
896 * If we are executing a method, initialize the field
897 */
898 if (walk_state->method_node) {
899 status = acpi_ds_init_field_objects(op, walk_state);
900 }
901
843 switch (op->common.aml_opcode) { 902 switch (op->common.aml_opcode) {
844 case AML_INDEX_FIELD_OP: 903 case AML_INDEX_FIELD_OP:
845 904
@@ -929,6 +988,24 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
929 switch (op->common.aml_opcode) { 988 switch (op->common.aml_opcode) {
930#ifndef ACPI_NO_METHOD_EXECUTION 989#ifndef ACPI_NO_METHOD_EXECUTION
931 case AML_REGION_OP: 990 case AML_REGION_OP:
991
992 /*
993 * If we are executing a method, initialize the region
994 */
995 if (walk_state->method_node) {
996 status =
997 acpi_ex_create_region(op->named.data,
998 op->named.length,
999 (acpi_adr_space_type)
1000 ((op->common.value.
1001 arg)->common.value.
1002 integer),
1003 walk_state);
1004 if (ACPI_FAILURE(status)) {
1005 return (status);
1006 }
1007 }
1008
932 /* 1009 /*
933 * The op_region is not fully parsed at this time. Only valid 1010 * The op_region is not fully parsed at this time. Only valid
934 * argument is the space_id. (We must save the address of the 1011 * argument is the space_id. (We must save the address of the
@@ -957,11 +1034,50 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
957 1034
958 status = acpi_ds_create_node(walk_state, node, op); 1035 status = acpi_ds_create_node(walk_state, node, op);
959 break; 1036 break;
1037
1038 case AML_METHOD_OP:
1039 /*
1040 * method_op pkg_length name_string method_flags term_list
1041 *
1042 * Note: We must create the method node/object pair as soon as we
1043 * see the method declaration. This allows later pass1 parsing
1044 * of invocations of the method (need to know the number of
1045 * arguments.)
1046 */
1047 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
1048 "LOADING-Method: State=%p Op=%p named_obj=%p\n",
1049 walk_state, op, op->named.node));
1050
1051 if (!acpi_ns_get_attached_object(op->named.node)) {
1052 walk_state->operands[0] =
1053 ACPI_CAST_PTR(void, op->named.node);
1054 walk_state->num_operands = 1;
1055
1056 status =
1057 acpi_ds_create_operands(walk_state,
1058 op->common.value.
1059 arg);
1060 if (ACPI_SUCCESS(status)) {
1061 status =
1062 acpi_ex_create_method(op->named.
1063 data,
1064 op->named.
1065 length,
1066 walk_state);
1067 }
1068 walk_state->operands[0] = NULL;
1069 walk_state->num_operands = 0;
1070
1071 if (ACPI_FAILURE(status)) {
1072 return_ACPI_STATUS(status);
1073 }
1074 }
1075 break;
1076
960#endif /* ACPI_NO_METHOD_EXECUTION */ 1077#endif /* ACPI_NO_METHOD_EXECUTION */
961 1078
962 default: 1079 default:
963 /* All NAMED_COMPLEX opcodes must be handled above */ 1080 /* All NAMED_COMPLEX opcodes must be handled above */
964 /* Note: Method objects were already created in Pass 1 */
965 break; 1081 break;
966 } 1082 }
967 break; 1083 break;
@@ -1004,7 +1120,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
1004 */ 1120 */
1005 op->common.node = new_node; 1121 op->common.node = new_node;
1006 } else { 1122 } else {
1007 ACPI_REPORT_NSERROR(arg->common.value.string, status); 1123 ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
1008 } 1124 }
1009 break; 1125 break;
1010 1126
diff --git a/drivers/acpi/dispatcher/dswscope.c b/drivers/acpi/dispatcher/dswscope.c
index defe956ef751..ada21ef4a174 100644
--- a/drivers/acpi/dispatcher/dswscope.c
+++ b/drivers/acpi/dispatcher/dswscope.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -107,14 +107,14 @@ acpi_ds_scope_stack_push(struct acpi_namespace_node *node,
107 if (!node) { 107 if (!node) {
108 /* Invalid scope */ 108 /* Invalid scope */
109 109
110 ACPI_REPORT_ERROR(("ds_scope_stack_push: null scope passed\n")); 110 ACPI_ERROR((AE_INFO, "Null scope parameter"));
111 return_ACPI_STATUS(AE_BAD_PARAMETER); 111 return_ACPI_STATUS(AE_BAD_PARAMETER);
112 } 112 }
113 113
114 /* Make sure object type is valid */ 114 /* Make sure object type is valid */
115 115
116 if (!acpi_ut_valid_object_type(type)) { 116 if (!acpi_ut_valid_object_type(type)) {
117 ACPI_REPORT_WARNING(("ds_scope_stack_push: Invalid object type: 0x%X\n", type)); 117 ACPI_WARNING((AE_INFO, "Invalid object type: 0x%X", type));
118 } 118 }
119 119
120 /* Allocate a new scope object */ 120 /* Allocate a new scope object */
diff --git a/drivers/acpi/dispatcher/dswstate.c b/drivers/acpi/dispatcher/dswstate.c
index 7d68a5aaf3c4..fa78cb74ee36 100644
--- a/drivers/acpi/dispatcher/dswstate.c
+++ b/drivers/acpi/dispatcher/dswstate.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -92,26 +92,23 @@ acpi_ds_result_remove(union acpi_operand_object **object,
92 92
93 state = walk_state->results; 93 state = walk_state->results;
94 if (!state) { 94 if (!state) {
95 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 95 ACPI_ERROR((AE_INFO, "No result object pushed! State=%p",
96 "No result object pushed! State=%p\n", 96 walk_state));
97 walk_state));
98 return (AE_NOT_EXIST); 97 return (AE_NOT_EXIST);
99 } 98 }
100 99
101 if (index >= ACPI_OBJ_MAX_OPERAND) { 100 if (index >= ACPI_OBJ_MAX_OPERAND) {
102 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 101 ACPI_ERROR((AE_INFO,
103 "Index out of range: %X State=%p Num=%X\n", 102 "Index out of range: %X State=%p Num=%X",
104 index, walk_state, 103 index, walk_state, state->results.num_results));
105 state->results.num_results));
106 } 104 }
107 105
108 /* Check for a valid result object */ 106 /* Check for a valid result object */
109 107
110 if (!state->results.obj_desc[index]) { 108 if (!state->results.obj_desc[index]) {
111 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 109 ACPI_ERROR((AE_INFO,
112 "Null operand! State=%p #Ops=%X, Index=%X\n", 110 "Null operand! State=%p #Ops=%X, Index=%X",
113 walk_state, state->results.num_results, 111 walk_state, state->results.num_results, index));
114 index));
115 return (AE_AML_NO_RETURN_VALUE); 112 return (AE_AML_NO_RETURN_VALUE);
116 } 113 }
117 114
@@ -163,9 +160,8 @@ acpi_ds_result_pop(union acpi_operand_object ** object,
163 } 160 }
164 161
165 if (!state->results.num_results) { 162 if (!state->results.num_results) {
166 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 163 ACPI_ERROR((AE_INFO, "Result stack is empty! State=%p",
167 "Result stack is empty! State=%p\n", 164 walk_state));
168 walk_state));
169 return (AE_AML_NO_RETURN_VALUE); 165 return (AE_AML_NO_RETURN_VALUE);
170 } 166 }
171 167
@@ -192,8 +188,7 @@ acpi_ds_result_pop(union acpi_operand_object ** object,
192 } 188 }
193 } 189 }
194 190
195 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 191 ACPI_ERROR((AE_INFO, "No result objects! State=%p", walk_state));
196 "No result objects! State=%p\n", walk_state));
197 return (AE_AML_NO_RETURN_VALUE); 192 return (AE_AML_NO_RETURN_VALUE);
198} 193}
199 194
@@ -222,15 +217,14 @@ acpi_ds_result_pop_from_bottom(union acpi_operand_object ** object,
222 217
223 state = walk_state->results; 218 state = walk_state->results;
224 if (!state) { 219 if (!state) {
225 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 220 ACPI_ERROR((AE_INFO,
226 "Warning: No result object pushed! State=%p\n", 221 "No result object pushed! State=%p", walk_state));
227 walk_state));
228 return (AE_NOT_EXIST); 222 return (AE_NOT_EXIST);
229 } 223 }
230 224
231 if (!state->results.num_results) { 225 if (!state->results.num_results) {
232 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 226 ACPI_ERROR((AE_INFO, "No result objects! State=%p",
233 "No result objects! State=%p\n", walk_state)); 227 walk_state));
234 return (AE_AML_NO_RETURN_VALUE); 228 return (AE_AML_NO_RETURN_VALUE);
235 } 229 }
236 230
@@ -250,10 +244,10 @@ acpi_ds_result_pop_from_bottom(union acpi_operand_object ** object,
250 /* Check for a valid result object */ 244 /* Check for a valid result object */
251 245
252 if (!*object) { 246 if (!*object) {
253 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 247 ACPI_ERROR((AE_INFO,
254 "Null operand! State=%p #Ops=%X Index=%X\n", 248 "Null operand! State=%p #Ops=%X Index=%X",
255 walk_state, state->results.num_results, 249 walk_state, state->results.num_results,
256 (u32) index)); 250 (u32) index));
257 return (AE_AML_NO_RETURN_VALUE); 251 return (AE_AML_NO_RETURN_VALUE);
258 } 252 }
259 253
@@ -288,23 +282,21 @@ acpi_ds_result_push(union acpi_operand_object * object,
288 282
289 state = walk_state->results; 283 state = walk_state->results;
290 if (!state) { 284 if (!state) {
291 ACPI_REPORT_ERROR(("No result stack frame during push\n")); 285 ACPI_ERROR((AE_INFO, "No result stack frame during push"));
292 return (AE_AML_INTERNAL); 286 return (AE_AML_INTERNAL);
293 } 287 }
294 288
295 if (state->results.num_results == ACPI_OBJ_NUM_OPERANDS) { 289 if (state->results.num_results == ACPI_OBJ_NUM_OPERANDS) {
296 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 290 ACPI_ERROR((AE_INFO,
297 "Result stack overflow: Obj=%p State=%p Num=%X\n", 291 "Result stack overflow: Obj=%p State=%p Num=%X",
298 object, walk_state, 292 object, walk_state, state->results.num_results));
299 state->results.num_results));
300 return (AE_STACK_OVERFLOW); 293 return (AE_STACK_OVERFLOW);
301 } 294 }
302 295
303 if (!object) { 296 if (!object) {
304 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 297 ACPI_ERROR((AE_INFO,
305 "Null Object! Obj=%p State=%p Num=%X\n", 298 "Null Object! Obj=%p State=%p Num=%X",
306 object, walk_state, 299 object, walk_state, state->results.num_results));
307 state->results.num_results));
308 return (AE_BAD_PARAMETER); 300 return (AE_BAD_PARAMETER);
309 } 301 }
310 302
@@ -413,10 +405,9 @@ acpi_ds_obj_stack_push(void *object, struct acpi_walk_state * walk_state)
413 /* Check for stack overflow */ 405 /* Check for stack overflow */
414 406
415 if (walk_state->num_operands >= ACPI_OBJ_NUM_OPERANDS) { 407 if (walk_state->num_operands >= ACPI_OBJ_NUM_OPERANDS) {
416 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 408 ACPI_ERROR((AE_INFO,
417 "overflow! Obj=%p State=%p #Ops=%X\n", 409 "Object stack overflow! Obj=%p State=%p #Ops=%X",
418 object, walk_state, 410 object, walk_state, walk_state->num_operands));
419 walk_state->num_operands));
420 return (AE_STACK_OVERFLOW); 411 return (AE_STACK_OVERFLOW);
421 } 412 }
422 413
@@ -460,10 +451,10 @@ acpi_ds_obj_stack_pop(u32 pop_count, struct acpi_walk_state * walk_state)
460 /* Check for stack underflow */ 451 /* Check for stack underflow */
461 452
462 if (walk_state->num_operands == 0) { 453 if (walk_state->num_operands == 0) {
463 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 454 ACPI_ERROR((AE_INFO,
464 "Underflow! Count=%X State=%p #Ops=%X\n", 455 "Object stack underflow! Count=%X State=%p #Ops=%X",
465 pop_count, walk_state, 456 pop_count, walk_state,
466 walk_state->num_operands)); 457 walk_state->num_operands));
467 return (AE_STACK_UNDERFLOW); 458 return (AE_STACK_UNDERFLOW);
468 } 459 }
469 460
@@ -506,10 +497,10 @@ acpi_ds_obj_stack_pop_and_delete(u32 pop_count,
506 /* Check for stack underflow */ 497 /* Check for stack underflow */
507 498
508 if (walk_state->num_operands == 0) { 499 if (walk_state->num_operands == 0) {
509 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 500 ACPI_ERROR((AE_INFO,
510 "Underflow! Count=%X State=%p #Ops=%X\n", 501 "Object stack underflow! Count=%X State=%p #Ops=%X",
511 pop_count, walk_state, 502 pop_count, walk_state,
512 walk_state->num_operands)); 503 walk_state->num_operands));
513 return (AE_STACK_UNDERFLOW); 504 return (AE_STACK_UNDERFLOW);
514 } 505 }
515 506
@@ -826,16 +817,14 @@ void acpi_ds_delete_walk_state(struct acpi_walk_state *walk_state)
826 } 817 }
827 818
828 if (walk_state->data_type != ACPI_DESC_TYPE_WALK) { 819 if (walk_state->data_type != ACPI_DESC_TYPE_WALK) {
829 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 820 ACPI_ERROR((AE_INFO, "%p is not a valid walk state",
830 "%p is not a valid walk state\n", 821 walk_state));
831 walk_state));
832 return; 822 return;
833 } 823 }
834 824
835 if (walk_state->parser_state.scope) { 825 if (walk_state->parser_state.scope) {
836 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 826 ACPI_ERROR((AE_INFO, "%p walk still has a scope list",
837 "%p walk still has a scope list\n", 827 walk_state));
838 walk_state));
839 } 828 }
840 829
841 /* Always must free any linked control states */ 830 /* Always must free any linked control states */
@@ -894,25 +883,24 @@ acpi_ds_result_insert(void *object,
894 883
895 state = walk_state->results; 884 state = walk_state->results;
896 if (!state) { 885 if (!state) {
897 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 886 ACPI_ERROR((AE_INFO, "No result object pushed! State=%p",
898 "No result object pushed! State=%p\n", 887 walk_state));
899 walk_state));
900 return (AE_NOT_EXIST); 888 return (AE_NOT_EXIST);
901 } 889 }
902 890
903 if (index >= ACPI_OBJ_NUM_OPERANDS) { 891 if (index >= ACPI_OBJ_NUM_OPERANDS) {
904 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 892 ACPI_ERROR((AE_INFO,
905 "Index out of range: %X Obj=%p State=%p Num=%X\n", 893 "Index out of range: %X Obj=%p State=%p Num=%X",
906 index, object, walk_state, 894 index, object, walk_state,
907 state->results.num_results)); 895 state->results.num_results));
908 return (AE_BAD_PARAMETER); 896 return (AE_BAD_PARAMETER);
909 } 897 }
910 898
911 if (!object) { 899 if (!object) {
912 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 900 ACPI_ERROR((AE_INFO,
913 "Null Object! Index=%X Obj=%p State=%p Num=%X\n", 901 "Null Object! Index=%X Obj=%p State=%p Num=%X",
914 index, object, walk_state, 902 index, object, walk_state,
915 state->results.num_results)); 903 state->results.num_results));
916 return (AE_BAD_PARAMETER); 904 return (AE_BAD_PARAMETER);
917 } 905 }
918 906
@@ -986,9 +974,9 @@ acpi_ds_obj_stack_pop_object(union acpi_operand_object **object,
986 /* Check for stack underflow */ 974 /* Check for stack underflow */
987 975
988 if (walk_state->num_operands == 0) { 976 if (walk_state->num_operands == 0) {
989 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 977 ACPI_ERROR((AE_INFO,
990 "Missing operand/stack empty! State=%p #Ops=%X\n", 978 "Missing operand/stack empty! State=%p #Ops=%X",
991 walk_state, walk_state->num_operands)); 979 walk_state, walk_state->num_operands));
992 *object = NULL; 980 *object = NULL;
993 return (AE_AML_NO_OPERAND); 981 return (AE_AML_NO_OPERAND);
994 } 982 }
@@ -1000,9 +988,9 @@ acpi_ds_obj_stack_pop_object(union acpi_operand_object **object,
1000 /* Check for a valid operand */ 988 /* Check for a valid operand */
1001 989
1002 if (!walk_state->operands[walk_state->num_operands]) { 990 if (!walk_state->operands[walk_state->num_operands]) {
1003 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 991 ACPI_ERROR((AE_INFO,
1004 "Null operand! State=%p #Ops=%X\n", 992 "Null operand! State=%p #Ops=%X",
1005 walk_state, walk_state->num_operands)); 993 walk_state, walk_state->num_operands));
1006 *object = NULL; 994 *object = NULL;
1007 return (AE_AML_NO_OPERAND); 995 return (AE_AML_NO_OPERAND);
1008 } 996 }
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 3758b558d2b5..79b09d76c180 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -60,20 +60,20 @@ ACPI_MODULE_NAME("acpi_ec")
60#define ACPI_EC_BURST_ENABLE 0x82 60#define ACPI_EC_BURST_ENABLE 0x82
61#define ACPI_EC_BURST_DISABLE 0x83 61#define ACPI_EC_BURST_DISABLE 0x83
62#define ACPI_EC_COMMAND_QUERY 0x84 62#define ACPI_EC_COMMAND_QUERY 0x84
63#define EC_POLLING 0xFF 63#define EC_POLL 0xFF
64#define EC_BURST 0x00 64#define EC_INTR 0x00
65static int acpi_ec_remove(struct acpi_device *device, int type); 65static int acpi_ec_remove(struct acpi_device *device, int type);
66static int acpi_ec_start(struct acpi_device *device); 66static int acpi_ec_start(struct acpi_device *device);
67static int acpi_ec_stop(struct acpi_device *device, int type); 67static int acpi_ec_stop(struct acpi_device *device, int type);
68static int acpi_ec_burst_add(struct acpi_device *device); 68static int acpi_ec_intr_add(struct acpi_device *device);
69static int acpi_ec_polling_add(struct acpi_device *device); 69static int acpi_ec_poll_add(struct acpi_device *device);
70 70
71static struct acpi_driver acpi_ec_driver = { 71static struct acpi_driver acpi_ec_driver = {
72 .name = ACPI_EC_DRIVER_NAME, 72 .name = ACPI_EC_DRIVER_NAME,
73 .class = ACPI_EC_CLASS, 73 .class = ACPI_EC_CLASS,
74 .ids = ACPI_EC_HID, 74 .ids = ACPI_EC_HID,
75 .ops = { 75 .ops = {
76 .add = acpi_ec_polling_add, 76 .add = acpi_ec_intr_add,
77 .remove = acpi_ec_remove, 77 .remove = acpi_ec_remove,
78 .start = acpi_ec_start, 78 .start = acpi_ec_start,
79 .stop = acpi_ec_stop, 79 .stop = acpi_ec_stop,
@@ -105,7 +105,7 @@ union acpi_ec {
105 atomic_t pending_gpe; 105 atomic_t pending_gpe;
106 struct semaphore sem; 106 struct semaphore sem;
107 wait_queue_head_t wait; 107 wait_queue_head_t wait;
108 } burst; 108 } intr;
109 109
110 struct { 110 struct {
111 u32 mode; 111 u32 mode;
@@ -117,37 +117,37 @@ union acpi_ec {
117 struct acpi_generic_address data_addr; 117 struct acpi_generic_address data_addr;
118 unsigned long global_lock; 118 unsigned long global_lock;
119 spinlock_t lock; 119 spinlock_t lock;
120 } polling; 120 } poll;
121}; 121};
122 122
123static int acpi_ec_polling_wait(union acpi_ec *ec, u8 event); 123static int acpi_ec_poll_wait(union acpi_ec *ec, u8 event);
124static int acpi_ec_burst_wait(union acpi_ec *ec, unsigned int event); 124static int acpi_ec_intr_wait(union acpi_ec *ec, unsigned int event);
125static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data); 125static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data);
126static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data); 126static int acpi_ec_intr_read(union acpi_ec *ec, u8 address, u32 * data);
127static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data); 127static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data);
128static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data); 128static int acpi_ec_intr_write(union acpi_ec *ec, u8 address, u8 data);
129static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data); 129static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data);
130static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data); 130static int acpi_ec_intr_query(union acpi_ec *ec, u32 * data);
131static void acpi_ec_gpe_polling_query(void *ec_cxt); 131static void acpi_ec_gpe_poll_query(void *ec_cxt);
132static void acpi_ec_gpe_burst_query(void *ec_cxt); 132static void acpi_ec_gpe_intr_query(void *ec_cxt);
133static u32 acpi_ec_gpe_polling_handler(void *data); 133static u32 acpi_ec_gpe_poll_handler(void *data);
134static u32 acpi_ec_gpe_burst_handler(void *data); 134static u32 acpi_ec_gpe_intr_handler(void *data);
135static acpi_status __init 135static acpi_status __init
136acpi_fake_ecdt_polling_callback(acpi_handle handle, 136acpi_fake_ecdt_poll_callback(acpi_handle handle,
137 u32 Level, void *context, void **retval); 137 u32 Level, void *context, void **retval);
138 138
139static acpi_status __init 139static acpi_status __init
140acpi_fake_ecdt_burst_callback(acpi_handle handle, 140acpi_fake_ecdt_intr_callback(acpi_handle handle,
141 u32 Level, void *context, void **retval); 141 u32 Level, void *context, void **retval);
142 142
143static int __init acpi_ec_polling_get_real_ecdt(void); 143static int __init acpi_ec_poll_get_real_ecdt(void);
144static int __init acpi_ec_burst_get_real_ecdt(void); 144static int __init acpi_ec_intr_get_real_ecdt(void);
145/* If we find an EC via the ECDT, we need to keep a ptr to its context */ 145/* If we find an EC via the ECDT, we need to keep a ptr to its context */
146static union acpi_ec *ec_ecdt; 146static union acpi_ec *ec_ecdt;
147 147
148/* External interfaces use first EC only, so remember */ 148/* External interfaces use first EC only, so remember */
149static struct acpi_device *first_ec; 149static struct acpi_device *first_ec;
150static int acpi_ec_polling_mode = EC_POLLING; 150static int acpi_ec_poll_mode = EC_INTR;
151 151
152/* -------------------------------------------------------------------------- 152/* --------------------------------------------------------------------------
153 Transaction Management 153 Transaction Management
@@ -163,13 +163,13 @@ static u32 acpi_ec_read_status(union acpi_ec *ec)
163 163
164static int acpi_ec_wait(union acpi_ec *ec, u8 event) 164static int acpi_ec_wait(union acpi_ec *ec, u8 event)
165{ 165{
166 if (acpi_ec_polling_mode) 166 if (acpi_ec_poll_mode)
167 return acpi_ec_polling_wait(ec, event); 167 return acpi_ec_poll_wait(ec, event);
168 else 168 else
169 return acpi_ec_burst_wait(ec, event); 169 return acpi_ec_intr_wait(ec, event);
170} 170}
171 171
172static int acpi_ec_polling_wait(union acpi_ec *ec, u8 event) 172static int acpi_ec_poll_wait(union acpi_ec *ec, u8 event)
173{ 173{
174 u32 acpi_ec_status = 0; 174 u32 acpi_ec_status = 0;
175 u32 i = ACPI_EC_UDELAY_COUNT; 175 u32 i = ACPI_EC_UDELAY_COUNT;
@@ -203,36 +203,31 @@ static int acpi_ec_polling_wait(union acpi_ec *ec, u8 event)
203 203
204 return -ETIME; 204 return -ETIME;
205} 205}
206static int acpi_ec_burst_wait(union acpi_ec *ec, unsigned int event) 206static int acpi_ec_intr_wait(union acpi_ec *ec, unsigned int event)
207{ 207{
208 int result = 0; 208 int result = 0;
209 209
210 ACPI_FUNCTION_TRACE("acpi_ec_wait"); 210 ACPI_FUNCTION_TRACE("acpi_ec_wait");
211 211
212 ec->burst.expect_event = event; 212 ec->intr.expect_event = event;
213 smp_mb(); 213 smp_mb();
214 214
215 switch (event) { 215 switch (event) {
216 case ACPI_EC_EVENT_OBF:
217 if (acpi_ec_read_status(ec) & event) {
218 ec->burst.expect_event = 0;
219 return_VALUE(0);
220 }
221 break;
222
223 case ACPI_EC_EVENT_IBE: 216 case ACPI_EC_EVENT_IBE:
224 if (~acpi_ec_read_status(ec) & event) { 217 if (~acpi_ec_read_status(ec) & event) {
225 ec->burst.expect_event = 0; 218 ec->intr.expect_event = 0;
226 return_VALUE(0); 219 return_VALUE(0);
227 } 220 }
228 break; 221 break;
222 default:
223 break;
229 } 224 }
230 225
231 result = wait_event_timeout(ec->burst.wait, 226 result = wait_event_timeout(ec->intr.wait,
232 !ec->burst.expect_event, 227 !ec->intr.expect_event,
233 msecs_to_jiffies(ACPI_EC_DELAY)); 228 msecs_to_jiffies(ACPI_EC_DELAY));
234 229
235 ec->burst.expect_event = 0; 230 ec->intr.expect_event = 0;
236 smp_mb(); 231 smp_mb();
237 232
238 /* 233 /*
@@ -255,7 +250,12 @@ static int acpi_ec_burst_wait(union acpi_ec *ec, unsigned int event)
255 return_VALUE(-ETIME); 250 return_VALUE(-ETIME);
256} 251}
257 252
258static int acpi_ec_enter_burst_mode(union acpi_ec *ec) 253#ifdef ACPI_FUTURE_USAGE
254/*
255 * Note: samsung nv5000 doesn't work with ec burst mode.
256 * http://bugzilla.kernel.org/show_bug.cgi?id=4980
257 */
258int acpi_ec_enter_burst_mode(union acpi_ec *ec)
259{ 259{
260 u32 tmp = 0; 260 u32 tmp = 0;
261 int status = 0; 261 int status = 0;
@@ -270,45 +270,56 @@ static int acpi_ec_enter_burst_mode(union acpi_ec *ec)
270 acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE, 270 acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE,
271 &ec->common.command_addr); 271 &ec->common.command_addr);
272 status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF); 272 status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
273 if (status)
274 return_VALUE(-EINVAL);
275 acpi_hw_low_level_read(8, &tmp, &ec->common.data_addr); 273 acpi_hw_low_level_read(8, &tmp, &ec->common.data_addr);
276 if (tmp != 0x90) { /* Burst ACK byte */ 274 if (tmp != 0x90) { /* Burst ACK byte */
277 return_VALUE(-EINVAL); 275 return_VALUE(-EINVAL);
278 } 276 }
279 } 277 }
280 278
281 atomic_set(&ec->burst.leaving_burst, 0); 279 atomic_set(&ec->intr.leaving_burst, 0);
282 return_VALUE(0); 280 return_VALUE(0);
283 end: 281 end:
284 printk("Error in acpi_ec_wait\n"); 282 printk(KERN_WARNING PREFIX "Error in acpi_ec_wait\n");
285 return_VALUE(-1); 283 return_VALUE(-1);
286} 284}
287 285
288static int acpi_ec_leave_burst_mode(union acpi_ec *ec) 286int acpi_ec_leave_burst_mode(union acpi_ec *ec)
289{ 287{
288 int status = 0;
290 289
291 ACPI_FUNCTION_TRACE("acpi_ec_leave_burst_mode"); 290 ACPI_FUNCTION_TRACE("acpi_ec_leave_burst_mode");
292 291
293 atomic_set(&ec->burst.leaving_burst, 1); 292 status = acpi_ec_read_status(ec);
293 if (status != -EINVAL && (status & ACPI_EC_FLAG_BURST)){
294 status = acpi_ec_wait(ec, ACPI_EC_FLAG_IBF);
295 if(status)
296 goto end;
297 acpi_hw_low_level_write(8, ACPI_EC_BURST_DISABLE, &ec->common.command_addr);
298 acpi_ec_wait(ec, ACPI_EC_FLAG_IBF);
299 }
300 atomic_set(&ec->intr.leaving_burst, 1);
294 return_VALUE(0); 301 return_VALUE(0);
302end:
303 printk(KERN_WARNING PREFIX "leave burst_mode:error\n");
304 return_VALUE(-1);
295} 305}
306#endif /* ACPI_FUTURE_USAGE */
296 307
297static int acpi_ec_read(union acpi_ec *ec, u8 address, u32 * data) 308static int acpi_ec_read(union acpi_ec *ec, u8 address, u32 * data)
298{ 309{
299 if (acpi_ec_polling_mode) 310 if (acpi_ec_poll_mode)
300 return acpi_ec_polling_read(ec, address, data); 311 return acpi_ec_poll_read(ec, address, data);
301 else 312 else
302 return acpi_ec_burst_read(ec, address, data); 313 return acpi_ec_intr_read(ec, address, data);
303} 314}
304static int acpi_ec_write(union acpi_ec *ec, u8 address, u8 data) 315static int acpi_ec_write(union acpi_ec *ec, u8 address, u8 data)
305{ 316{
306 if (acpi_ec_polling_mode) 317 if (acpi_ec_poll_mode)
307 return acpi_ec_polling_write(ec, address, data); 318 return acpi_ec_poll_write(ec, address, data);
308 else 319 else
309 return acpi_ec_burst_write(ec, address, data); 320 return acpi_ec_intr_write(ec, address, data);
310} 321}
311static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data) 322static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data)
312{ 323{
313 acpi_status status = AE_OK; 324 acpi_status status = AE_OK;
314 int result = 0; 325 int result = 0;
@@ -328,7 +339,7 @@ static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
328 return_VALUE(-ENODEV); 339 return_VALUE(-ENODEV);
329 } 340 }
330 341
331 spin_lock_irqsave(&ec->polling.lock, flags); 342 spin_lock_irqsave(&ec->poll.lock, flags);
332 343
333 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ, 344 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
334 &ec->common.command_addr); 345 &ec->common.command_addr);
@@ -347,7 +358,7 @@ static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
347 *data, address)); 358 *data, address));
348 359
349 end: 360 end:
350 spin_unlock_irqrestore(&ec->polling.lock, flags); 361 spin_unlock_irqrestore(&ec->poll.lock, flags);
351 362
352 if (ec->common.global_lock) 363 if (ec->common.global_lock)
353 acpi_release_global_lock(glk); 364 acpi_release_global_lock(glk);
@@ -355,7 +366,7 @@ static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
355 return_VALUE(result); 366 return_VALUE(result);
356} 367}
357 368
358static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data) 369static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data)
359{ 370{
360 int result = 0; 371 int result = 0;
361 acpi_status status = AE_OK; 372 acpi_status status = AE_OK;
@@ -373,7 +384,7 @@ static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
373 return_VALUE(-ENODEV); 384 return_VALUE(-ENODEV);
374 } 385 }
375 386
376 spin_lock_irqsave(&ec->polling.lock, flags); 387 spin_lock_irqsave(&ec->poll.lock, flags);
377 388
378 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE, 389 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
379 &ec->common.command_addr); 390 &ec->common.command_addr);
@@ -395,7 +406,7 @@ static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
395 data, address)); 406 data, address));
396 407
397 end: 408 end:
398 spin_unlock_irqrestore(&ec->polling.lock, flags); 409 spin_unlock_irqrestore(&ec->poll.lock, flags);
399 410
400 if (ec->common.global_lock) 411 if (ec->common.global_lock)
401 acpi_release_global_lock(glk); 412 acpi_release_global_lock(glk);
@@ -403,7 +414,7 @@ static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
403 return_VALUE(result); 414 return_VALUE(result);
404} 415}
405 416
406static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data) 417static int acpi_ec_intr_read(union acpi_ec *ec, u8 address, u32 * data)
407{ 418{
408 int status = 0; 419 int status = 0;
409 u32 glk; 420 u32 glk;
@@ -422,25 +433,24 @@ static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
422 } 433 }
423 434
424 WARN_ON(in_interrupt()); 435 WARN_ON(in_interrupt());
425 down(&ec->burst.sem); 436 down(&ec->intr.sem);
426 437
427 acpi_ec_enter_burst_mode(ec);
428 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); 438 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
429 if (status) { 439 if (status) {
430 printk("read EC, IB not empty\n"); 440 printk(KERN_DEBUG PREFIX "read EC, IB not empty\n");
431 goto end; 441 goto end;
432 } 442 }
433 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ, 443 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
434 &ec->common.command_addr); 444 &ec->common.command_addr);
435 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); 445 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
436 if (status) { 446 if (status) {
437 printk("read EC, IB not empty\n"); 447 printk(KERN_DEBUG PREFIX "read EC, IB not empty\n");
438 } 448 }
439 449
440 acpi_hw_low_level_write(8, address, &ec->common.data_addr); 450 acpi_hw_low_level_write(8, address, &ec->common.data_addr);
441 status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF); 451 status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
442 if (status) { 452 if (status) {
443 printk("read EC, OB not full\n"); 453 printk(KERN_DEBUG PREFIX "read EC, OB not full\n");
444 goto end; 454 goto end;
445 } 455 }
446 acpi_hw_low_level_read(8, data, &ec->common.data_addr); 456 acpi_hw_low_level_read(8, data, &ec->common.data_addr);
@@ -448,8 +458,7 @@ static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
448 *data, address)); 458 *data, address));
449 459
450 end: 460 end:
451 acpi_ec_leave_burst_mode(ec); 461 up(&ec->intr.sem);
452 up(&ec->burst.sem);
453 462
454 if (ec->common.global_lock) 463 if (ec->common.global_lock)
455 acpi_release_global_lock(glk); 464 acpi_release_global_lock(glk);
@@ -457,7 +466,7 @@ static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
457 return_VALUE(status); 466 return_VALUE(status);
458} 467}
459 468
460static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data) 469static int acpi_ec_intr_write(union acpi_ec *ec, u8 address, u8 data)
461{ 470{
462 int status = 0; 471 int status = 0;
463 u32 glk; 472 u32 glk;
@@ -474,25 +483,23 @@ static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data)
474 } 483 }
475 484
476 WARN_ON(in_interrupt()); 485 WARN_ON(in_interrupt());
477 down(&ec->burst.sem); 486 down(&ec->intr.sem);
478
479 acpi_ec_enter_burst_mode(ec);
480 487
481 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); 488 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
482 if (status) { 489 if (status) {
483 printk("write EC, IB not empty\n"); 490 printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
484 } 491 }
485 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE, 492 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
486 &ec->common.command_addr); 493 &ec->common.command_addr);
487 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); 494 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
488 if (status) { 495 if (status) {
489 printk("write EC, IB not empty\n"); 496 printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
490 } 497 }
491 498
492 acpi_hw_low_level_write(8, address, &ec->common.data_addr); 499 acpi_hw_low_level_write(8, address, &ec->common.data_addr);
493 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); 500 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
494 if (status) { 501 if (status) {
495 printk("write EC, IB not empty\n"); 502 printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
496 } 503 }
497 504
498 acpi_hw_low_level_write(8, data, &ec->common.data_addr); 505 acpi_hw_low_level_write(8, data, &ec->common.data_addr);
@@ -500,8 +507,7 @@ static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data)
500 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n", 507 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n",
501 data, address)); 508 data, address));
502 509
503 acpi_ec_leave_burst_mode(ec); 510 up(&ec->intr.sem);
504 up(&ec->burst.sem);
505 511
506 if (ec->common.global_lock) 512 if (ec->common.global_lock)
507 acpi_release_global_lock(glk); 513 acpi_release_global_lock(glk);
@@ -553,12 +559,12 @@ EXPORT_SYMBOL(ec_write);
553 559
554static int acpi_ec_query(union acpi_ec *ec, u32 * data) 560static int acpi_ec_query(union acpi_ec *ec, u32 * data)
555{ 561{
556 if (acpi_ec_polling_mode) 562 if (acpi_ec_poll_mode)
557 return acpi_ec_polling_query(ec, data); 563 return acpi_ec_poll_query(ec, data);
558 else 564 else
559 return acpi_ec_burst_query(ec, data); 565 return acpi_ec_intr_query(ec, data);
560} 566}
561static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data) 567static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data)
562{ 568{
563 int result = 0; 569 int result = 0;
564 acpi_status status = AE_OK; 570 acpi_status status = AE_OK;
@@ -583,7 +589,7 @@ static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data)
583 * Note that successful completion of the query causes the ACPI_EC_SCI 589 * Note that successful completion of the query causes the ACPI_EC_SCI
584 * bit to be cleared (and thus clearing the interrupt source). 590 * bit to be cleared (and thus clearing the interrupt source).
585 */ 591 */
586 spin_lock_irqsave(&ec->polling.lock, flags); 592 spin_lock_irqsave(&ec->poll.lock, flags);
587 593
588 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY, 594 acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY,
589 &ec->common.command_addr); 595 &ec->common.command_addr);
@@ -596,14 +602,14 @@ static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data)
596 result = -ENODATA; 602 result = -ENODATA;
597 603
598 end: 604 end:
599 spin_unlock_irqrestore(&ec->polling.lock, flags); 605 spin_unlock_irqrestore(&ec->poll.lock, flags);
600 606
601 if (ec->common.global_lock) 607 if (ec->common.global_lock)
602 acpi_release_global_lock(glk); 608 acpi_release_global_lock(glk);
603 609
604 return_VALUE(result); 610 return_VALUE(result);
605} 611}
606static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data) 612static int acpi_ec_intr_query(union acpi_ec *ec, u32 * data)
607{ 613{
608 int status = 0; 614 int status = 0;
609 u32 glk; 615 u32 glk;
@@ -620,11 +626,11 @@ static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
620 return_VALUE(-ENODEV); 626 return_VALUE(-ENODEV);
621 } 627 }
622 628
623 down(&ec->burst.sem); 629 down(&ec->intr.sem);
624 630
625 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); 631 status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
626 if (status) { 632 if (status) {
627 printk("query EC, IB not empty\n"); 633 printk(KERN_DEBUG PREFIX "query EC, IB not empty\n");
628 goto end; 634 goto end;
629 } 635 }
630 /* 636 /*
@@ -636,7 +642,7 @@ static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
636 &ec->common.command_addr); 642 &ec->common.command_addr);
637 status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF); 643 status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
638 if (status) { 644 if (status) {
639 printk("query EC, OB not full\n"); 645 printk(KERN_DEBUG PREFIX "query EC, OB not full\n");
640 goto end; 646 goto end;
641 } 647 }
642 648
@@ -645,7 +651,7 @@ static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
645 status = -ENODATA; 651 status = -ENODATA;
646 652
647 end: 653 end:
648 up(&ec->burst.sem); 654 up(&ec->intr.sem);
649 655
650 if (ec->common.global_lock) 656 if (ec->common.global_lock)
651 acpi_release_global_lock(glk); 657 acpi_release_global_lock(glk);
@@ -664,13 +670,13 @@ union acpi_ec_query_data {
664 670
665static void acpi_ec_gpe_query(void *ec_cxt) 671static void acpi_ec_gpe_query(void *ec_cxt)
666{ 672{
667 if (acpi_ec_polling_mode) 673 if (acpi_ec_poll_mode)
668 acpi_ec_gpe_polling_query(ec_cxt); 674 acpi_ec_gpe_poll_query(ec_cxt);
669 else 675 else
670 acpi_ec_gpe_burst_query(ec_cxt); 676 acpi_ec_gpe_intr_query(ec_cxt);
671} 677}
672 678
673static void acpi_ec_gpe_polling_query(void *ec_cxt) 679static void acpi_ec_gpe_poll_query(void *ec_cxt)
674{ 680{
675 union acpi_ec *ec = (union acpi_ec *)ec_cxt; 681 union acpi_ec *ec = (union acpi_ec *)ec_cxt;
676 u32 value = 0; 682 u32 value = 0;
@@ -685,9 +691,9 @@ static void acpi_ec_gpe_polling_query(void *ec_cxt)
685 if (!ec_cxt) 691 if (!ec_cxt)
686 goto end; 692 goto end;
687 693
688 spin_lock_irqsave(&ec->polling.lock, flags); 694 spin_lock_irqsave(&ec->poll.lock, flags);
689 acpi_hw_low_level_read(8, &value, &ec->common.command_addr); 695 acpi_hw_low_level_read(8, &value, &ec->common.command_addr);
690 spin_unlock_irqrestore(&ec->polling.lock, flags); 696 spin_unlock_irqrestore(&ec->poll.lock, flags);
691 697
692 /* TBD: Implement asynch events! 698 /* TBD: Implement asynch events!
693 * NOTE: All we care about are EC-SCI's. Other EC events are 699 * NOTE: All we care about are EC-SCI's. Other EC events are
@@ -711,7 +717,7 @@ static void acpi_ec_gpe_polling_query(void *ec_cxt)
711 end: 717 end:
712 acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR); 718 acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
713} 719}
714static void acpi_ec_gpe_burst_query(void *ec_cxt) 720static void acpi_ec_gpe_intr_query(void *ec_cxt)
715{ 721{
716 union acpi_ec *ec = (union acpi_ec *)ec_cxt; 722 union acpi_ec *ec = (union acpi_ec *)ec_cxt;
717 u32 value; 723 u32 value;
@@ -736,18 +742,18 @@ static void acpi_ec_gpe_burst_query(void *ec_cxt)
736 742
737 acpi_evaluate_object(ec->common.handle, object_name, NULL, NULL); 743 acpi_evaluate_object(ec->common.handle, object_name, NULL, NULL);
738 end: 744 end:
739 atomic_dec(&ec->burst.pending_gpe); 745 atomic_dec(&ec->intr.pending_gpe);
740 return; 746 return;
741} 747}
742 748
743static u32 acpi_ec_gpe_handler(void *data) 749static u32 acpi_ec_gpe_handler(void *data)
744{ 750{
745 if (acpi_ec_polling_mode) 751 if (acpi_ec_poll_mode)
746 return acpi_ec_gpe_polling_handler(data); 752 return acpi_ec_gpe_poll_handler(data);
747 else 753 else
748 return acpi_ec_gpe_burst_handler(data); 754 return acpi_ec_gpe_intr_handler(data);
749} 755}
750static u32 acpi_ec_gpe_polling_handler(void *data) 756static u32 acpi_ec_gpe_poll_handler(void *data)
751{ 757{
752 acpi_status status = AE_OK; 758 acpi_status status = AE_OK;
753 union acpi_ec *ec = (union acpi_ec *)data; 759 union acpi_ec *ec = (union acpi_ec *)data;
@@ -765,7 +771,7 @@ static u32 acpi_ec_gpe_polling_handler(void *data)
765 else 771 else
766 return ACPI_INTERRUPT_NOT_HANDLED; 772 return ACPI_INTERRUPT_NOT_HANDLED;
767} 773}
768static u32 acpi_ec_gpe_burst_handler(void *data) 774static u32 acpi_ec_gpe_intr_handler(void *data)
769{ 775{
770 acpi_status status = AE_OK; 776 acpi_status status = AE_OK;
771 u32 value; 777 u32 value;
@@ -777,22 +783,22 @@ static u32 acpi_ec_gpe_burst_handler(void *data)
777 acpi_clear_gpe(NULL, ec->common.gpe_bit, ACPI_ISR); 783 acpi_clear_gpe(NULL, ec->common.gpe_bit, ACPI_ISR);
778 value = acpi_ec_read_status(ec); 784 value = acpi_ec_read_status(ec);
779 785
780 switch (ec->burst.expect_event) { 786 switch (ec->intr.expect_event) {
781 case ACPI_EC_EVENT_OBF: 787 case ACPI_EC_EVENT_OBF:
782 if (!(value & ACPI_EC_FLAG_OBF)) 788 if (!(value & ACPI_EC_FLAG_OBF))
783 break; 789 break;
784 case ACPI_EC_EVENT_IBE: 790 case ACPI_EC_EVENT_IBE:
785 if ((value & ACPI_EC_FLAG_IBF)) 791 if ((value & ACPI_EC_FLAG_IBF))
786 break; 792 break;
787 ec->burst.expect_event = 0; 793 ec->intr.expect_event = 0;
788 wake_up(&ec->burst.wait); 794 wake_up(&ec->intr.wait);
789 return ACPI_INTERRUPT_HANDLED; 795 return ACPI_INTERRUPT_HANDLED;
790 default: 796 default:
791 break; 797 break;
792 } 798 }
793 799
794 if (value & ACPI_EC_FLAG_SCI) { 800 if (value & ACPI_EC_FLAG_SCI) {
795 atomic_add(1, &ec->burst.pending_gpe); 801 atomic_add(1, &ec->intr.pending_gpe);
796 status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, 802 status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE,
797 acpi_ec_gpe_query, ec); 803 acpi_ec_gpe_query, ec);
798 return status == AE_OK ? 804 return status == AE_OK ?
@@ -980,7 +986,7 @@ static int acpi_ec_remove_fs(struct acpi_device *device)
980 Driver Interface 986 Driver Interface
981 -------------------------------------------------------------------------- */ 987 -------------------------------------------------------------------------- */
982 988
983static int acpi_ec_polling_add(struct acpi_device *device) 989static int acpi_ec_poll_add(struct acpi_device *device)
984{ 990{
985 int result = 0; 991 int result = 0;
986 acpi_status status = AE_OK; 992 acpi_status status = AE_OK;
@@ -999,7 +1005,7 @@ static int acpi_ec_polling_add(struct acpi_device *device)
999 1005
1000 ec->common.handle = device->handle; 1006 ec->common.handle = device->handle;
1001 ec->common.uid = -1; 1007 ec->common.uid = -1;
1002 spin_lock_init(&ec->polling.lock); 1008 spin_lock_init(&ec->poll.lock);
1003 strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME); 1009 strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
1004 strcpy(acpi_device_class(device), ACPI_EC_CLASS); 1010 strcpy(acpi_device_class(device), ACPI_EC_CLASS);
1005 acpi_driver_data(device) = ec; 1011 acpi_driver_data(device) = ec;
@@ -1038,7 +1044,7 @@ static int acpi_ec_polling_add(struct acpi_device *device)
1038 if (result) 1044 if (result)
1039 goto end; 1045 goto end;
1040 1046
1041 printk(KERN_INFO PREFIX "%s [%s] (gpe %d)\n", 1047 printk(KERN_INFO PREFIX "%s [%s] (gpe %d) polling mode.\n",
1042 acpi_device_name(device), acpi_device_bid(device), 1048 acpi_device_name(device), acpi_device_bid(device),
1043 (u32) ec->common.gpe_bit); 1049 (u32) ec->common.gpe_bit);
1044 1050
@@ -1051,7 +1057,7 @@ static int acpi_ec_polling_add(struct acpi_device *device)
1051 1057
1052 return_VALUE(result); 1058 return_VALUE(result);
1053} 1059}
1054static int acpi_ec_burst_add(struct acpi_device *device) 1060static int acpi_ec_intr_add(struct acpi_device *device)
1055{ 1061{
1056 int result = 0; 1062 int result = 0;
1057 acpi_status status = AE_OK; 1063 acpi_status status = AE_OK;
@@ -1070,10 +1076,10 @@ static int acpi_ec_burst_add(struct acpi_device *device)
1070 1076
1071 ec->common.handle = device->handle; 1077 ec->common.handle = device->handle;
1072 ec->common.uid = -1; 1078 ec->common.uid = -1;
1073 atomic_set(&ec->burst.pending_gpe, 0); 1079 atomic_set(&ec->intr.pending_gpe, 0);
1074 atomic_set(&ec->burst.leaving_burst, 1); 1080 atomic_set(&ec->intr.leaving_burst, 1);
1075 init_MUTEX(&ec->burst.sem); 1081 init_MUTEX(&ec->intr.sem);
1076 init_waitqueue_head(&ec->burst.wait); 1082 init_waitqueue_head(&ec->intr.wait);
1077 strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME); 1083 strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
1078 strcpy(acpi_device_class(device), ACPI_EC_CLASS); 1084 strcpy(acpi_device_class(device), ACPI_EC_CLASS);
1079 acpi_driver_data(device) = ec; 1085 acpi_driver_data(device) = ec;
@@ -1112,8 +1118,7 @@ static int acpi_ec_burst_add(struct acpi_device *device)
1112 if (result) 1118 if (result)
1113 goto end; 1119 goto end;
1114 1120
1115 printk("burst-mode-ec-10-Aug\n"); 1121 printk(KERN_INFO PREFIX "%s [%s] (gpe %d) interrupt mode.\n",
1116 printk(KERN_INFO PREFIX "%s [%s] (gpe %d)\n",
1117 acpi_device_name(device), acpi_device_bid(device), 1122 acpi_device_name(device), acpi_device_bid(device),
1118 (u32) ec->common.gpe_bit); 1123 (u32) ec->common.gpe_bit);
1119 1124
@@ -1151,7 +1156,7 @@ acpi_ec_io_ports(struct acpi_resource *resource, void *context)
1151 union acpi_ec *ec = (union acpi_ec *)context; 1156 union acpi_ec *ec = (union acpi_ec *)context;
1152 struct acpi_generic_address *addr; 1157 struct acpi_generic_address *addr;
1153 1158
1154 if (resource->id != ACPI_RSTYPE_IO) { 1159 if (resource->type != ACPI_RESOURCE_TYPE_IO) {
1155 return AE_OK; 1160 return AE_OK;
1156 } 1161 }
1157 1162
@@ -1171,7 +1176,7 @@ acpi_ec_io_ports(struct acpi_resource *resource, void *context)
1171 addr->address_space_id = ACPI_ADR_SPACE_SYSTEM_IO; 1176 addr->address_space_id = ACPI_ADR_SPACE_SYSTEM_IO;
1172 addr->register_bit_width = 8; 1177 addr->register_bit_width = 8;
1173 addr->register_bit_offset = 0; 1178 addr->register_bit_offset = 0;
1174 addr->address = resource->data.io.min_base_address; 1179 addr->address = resource->data.io.minimum;
1175 1180
1176 return AE_OK; 1181 return AE_OK;
1177} 1182}
@@ -1267,16 +1272,16 @@ acpi_fake_ecdt_callback(acpi_handle handle,
1267 u32 Level, void *context, void **retval) 1272 u32 Level, void *context, void **retval)
1268{ 1273{
1269 1274
1270 if (acpi_ec_polling_mode) 1275 if (acpi_ec_poll_mode)
1271 return acpi_fake_ecdt_polling_callback(handle, 1276 return acpi_fake_ecdt_poll_callback(handle,
1272 Level, context, retval); 1277 Level, context, retval);
1273 else 1278 else
1274 return acpi_fake_ecdt_burst_callback(handle, 1279 return acpi_fake_ecdt_intr_callback(handle,
1275 Level, context, retval); 1280 Level, context, retval);
1276} 1281}
1277 1282
1278static acpi_status __init 1283static acpi_status __init
1279acpi_fake_ecdt_polling_callback(acpi_handle handle, 1284acpi_fake_ecdt_poll_callback(acpi_handle handle,
1280 u32 Level, void *context, void **retval) 1285 u32 Level, void *context, void **retval)
1281{ 1286{
1282 acpi_status status; 1287 acpi_status status;
@@ -1295,7 +1300,7 @@ acpi_fake_ecdt_polling_callback(acpi_handle handle,
1295 &ec_ecdt->common.gpe_bit); 1300 &ec_ecdt->common.gpe_bit);
1296 if (ACPI_FAILURE(status)) 1301 if (ACPI_FAILURE(status))
1297 return status; 1302 return status;
1298 spin_lock_init(&ec_ecdt->polling.lock); 1303 spin_lock_init(&ec_ecdt->poll.lock);
1299 ec_ecdt->common.global_lock = TRUE; 1304 ec_ecdt->common.global_lock = TRUE;
1300 ec_ecdt->common.handle = handle; 1305 ec_ecdt->common.handle = handle;
1301 1306
@@ -1308,13 +1313,13 @@ acpi_fake_ecdt_polling_callback(acpi_handle handle,
1308} 1313}
1309 1314
1310static acpi_status __init 1315static acpi_status __init
1311acpi_fake_ecdt_burst_callback(acpi_handle handle, 1316acpi_fake_ecdt_intr_callback(acpi_handle handle,
1312 u32 Level, void *context, void **retval) 1317 u32 Level, void *context, void **retval)
1313{ 1318{
1314 acpi_status status; 1319 acpi_status status;
1315 1320
1316 init_MUTEX(&ec_ecdt->burst.sem); 1321 init_MUTEX(&ec_ecdt->intr.sem);
1317 init_waitqueue_head(&ec_ecdt->burst.wait); 1322 init_waitqueue_head(&ec_ecdt->intr.wait);
1318 status = acpi_walk_resources(handle, METHOD_NAME__CRS, 1323 status = acpi_walk_resources(handle, METHOD_NAME__CRS,
1319 acpi_ec_io_ports, ec_ecdt); 1324 acpi_ec_io_ports, ec_ecdt);
1320 if (ACPI_FAILURE(status)) 1325 if (ACPI_FAILURE(status))
@@ -1380,13 +1385,13 @@ static int __init acpi_ec_fake_ecdt(void)
1380 1385
1381static int __init acpi_ec_get_real_ecdt(void) 1386static int __init acpi_ec_get_real_ecdt(void)
1382{ 1387{
1383 if (acpi_ec_polling_mode) 1388 if (acpi_ec_poll_mode)
1384 return acpi_ec_polling_get_real_ecdt(); 1389 return acpi_ec_poll_get_real_ecdt();
1385 else 1390 else
1386 return acpi_ec_burst_get_real_ecdt(); 1391 return acpi_ec_intr_get_real_ecdt();
1387} 1392}
1388 1393
1389static int __init acpi_ec_polling_get_real_ecdt(void) 1394static int __init acpi_ec_poll_get_real_ecdt(void)
1390{ 1395{
1391 acpi_status status; 1396 acpi_status status;
1392 struct acpi_table_ecdt *ecdt_ptr; 1397 struct acpi_table_ecdt *ecdt_ptr;
@@ -1411,7 +1416,7 @@ static int __init acpi_ec_polling_get_real_ecdt(void)
1411 ec_ecdt->common.status_addr = ecdt_ptr->ec_control; 1416 ec_ecdt->common.status_addr = ecdt_ptr->ec_control;
1412 ec_ecdt->common.data_addr = ecdt_ptr->ec_data; 1417 ec_ecdt->common.data_addr = ecdt_ptr->ec_data;
1413 ec_ecdt->common.gpe_bit = ecdt_ptr->gpe_bit; 1418 ec_ecdt->common.gpe_bit = ecdt_ptr->gpe_bit;
1414 spin_lock_init(&ec_ecdt->polling.lock); 1419 spin_lock_init(&ec_ecdt->poll.lock);
1415 /* use the GL just to be safe */ 1420 /* use the GL just to be safe */
1416 ec_ecdt->common.global_lock = TRUE; 1421 ec_ecdt->common.global_lock = TRUE;
1417 ec_ecdt->common.uid = ecdt_ptr->uid; 1422 ec_ecdt->common.uid = ecdt_ptr->uid;
@@ -1431,7 +1436,7 @@ static int __init acpi_ec_polling_get_real_ecdt(void)
1431 return -ENODEV; 1436 return -ENODEV;
1432} 1437}
1433 1438
1434static int __init acpi_ec_burst_get_real_ecdt(void) 1439static int __init acpi_ec_intr_get_real_ecdt(void)
1435{ 1440{
1436 acpi_status status; 1441 acpi_status status;
1437 struct acpi_table_ecdt *ecdt_ptr; 1442 struct acpi_table_ecdt *ecdt_ptr;
@@ -1452,8 +1457,8 @@ static int __init acpi_ec_burst_get_real_ecdt(void)
1452 return -ENOMEM; 1457 return -ENOMEM;
1453 memset(ec_ecdt, 0, sizeof(union acpi_ec)); 1458 memset(ec_ecdt, 0, sizeof(union acpi_ec));
1454 1459
1455 init_MUTEX(&ec_ecdt->burst.sem); 1460 init_MUTEX(&ec_ecdt->intr.sem);
1456 init_waitqueue_head(&ec_ecdt->burst.wait); 1461 init_waitqueue_head(&ec_ecdt->intr.wait);
1457 ec_ecdt->common.command_addr = ecdt_ptr->ec_control; 1462 ec_ecdt->common.command_addr = ecdt_ptr->ec_control;
1458 ec_ecdt->common.status_addr = ecdt_ptr->ec_control; 1463 ec_ecdt->common.status_addr = ecdt_ptr->ec_control;
1459 ec_ecdt->common.data_addr = ecdt_ptr->ec_data; 1464 ec_ecdt->common.data_addr = ecdt_ptr->ec_data;
@@ -1571,22 +1576,22 @@ static int __init acpi_fake_ecdt_setup(char *str)
1571} 1576}
1572 1577
1573__setup("acpi_fake_ecdt", acpi_fake_ecdt_setup); 1578__setup("acpi_fake_ecdt", acpi_fake_ecdt_setup);
1574static int __init acpi_ec_set_polling_mode(char *str) 1579static int __init acpi_ec_set_intr_mode(char *str)
1575{ 1580{
1576 int burst; 1581 int intr;
1577 1582
1578 if (!get_option(&str, &burst)) 1583 if (!get_option(&str, &intr))
1579 return 0; 1584 return 0;
1580 1585
1581 if (burst) { 1586 if (intr) {
1582 acpi_ec_polling_mode = EC_BURST; 1587 acpi_ec_poll_mode = EC_INTR;
1583 acpi_ec_driver.ops.add = acpi_ec_burst_add; 1588 acpi_ec_driver.ops.add = acpi_ec_intr_add;
1584 } else { 1589 } else {
1585 acpi_ec_polling_mode = EC_POLLING; 1590 acpi_ec_poll_mode = EC_POLL;
1586 acpi_ec_driver.ops.add = acpi_ec_polling_add; 1591 acpi_ec_driver.ops.add = acpi_ec_poll_add;
1587 } 1592 }
1588 printk(KERN_INFO PREFIX "EC %s mode.\n", burst ? "burst" : "polling"); 1593 printk(KERN_INFO PREFIX "EC %s mode.\n", intr ? "interrupt" : "polling");
1589 return 0; 1594 return 0;
1590} 1595}
1591 1596
1592__setup("ec_burst=", acpi_ec_set_polling_mode); 1597__setup("ec_intr=", acpi_ec_set_intr_mode);
diff --git a/drivers/acpi/events/evevent.c b/drivers/acpi/events/evevent.c
index 842d1e3fb37b..c9ac05c4685f 100644
--- a/drivers/acpi/events/evevent.c
+++ b/drivers/acpi/events/evevent.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -73,7 +73,7 @@ acpi_status acpi_ev_initialize_events(void)
73 /* Make sure we have ACPI tables */ 73 /* Make sure we have ACPI tables */
74 74
75 if (!acpi_gbl_DSDT) { 75 if (!acpi_gbl_DSDT) {
76 ACPI_DEBUG_PRINT((ACPI_DB_WARN, "No ACPI tables present!\n")); 76 ACPI_WARNING((AE_INFO, "No ACPI tables present!"));
77 return_ACPI_STATUS(AE_NO_ACPI_TABLES); 77 return_ACPI_STATUS(AE_NO_ACPI_TABLES);
78 } 78 }
79 79
@@ -84,14 +84,15 @@ acpi_status acpi_ev_initialize_events(void)
84 */ 84 */
85 status = acpi_ev_fixed_event_initialize(); 85 status = acpi_ev_fixed_event_initialize();
86 if (ACPI_FAILURE(status)) { 86 if (ACPI_FAILURE(status)) {
87 ACPI_REPORT_ERROR(("Unable to initialize fixed events, %s\n", 87 ACPI_EXCEPTION((AE_INFO, status,
88 acpi_format_exception(status))); 88 "Unable to initialize fixed events"));
89 return_ACPI_STATUS(status); 89 return_ACPI_STATUS(status);
90 } 90 }
91 91
92 status = acpi_ev_gpe_initialize(); 92 status = acpi_ev_gpe_initialize();
93 if (ACPI_FAILURE(status)) { 93 if (ACPI_FAILURE(status)) {
94 ACPI_REPORT_ERROR(("Unable to initialize general purpose events, %s\n", acpi_format_exception(status))); 94 ACPI_EXCEPTION((AE_INFO, status,
95 "Unable to initialize general purpose events"));
95 return_ACPI_STATUS(status); 96 return_ACPI_STATUS(status);
96 } 97 }
97 98
@@ -100,6 +101,48 @@ acpi_status acpi_ev_initialize_events(void)
100 101
101/******************************************************************************* 102/*******************************************************************************
102 * 103 *
104 * FUNCTION: acpi_ev_install_fadt_gpes
105 *
106 * PARAMETERS: None
107 *
108 * RETURN: Status
109 *
110 * DESCRIPTION: Completes initialization of the FADT-defined GPE blocks
111 * (0 and 1). This causes the _PRW methods to be run, so the HW
112 * must be fully initialized at this point, including global lock
113 * support.
114 *
115 ******************************************************************************/
116
117acpi_status acpi_ev_install_fadt_gpes(void)
118{
119 acpi_status status;
120
121 ACPI_FUNCTION_TRACE("ev_install_fadt_gpes");
122
123 /* Namespace must be locked */
124
125 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
126 if (ACPI_FAILURE(status)) {
127 return (status);
128 }
129
130 /* FADT GPE Block 0 */
131
132 (void)acpi_ev_initialize_gpe_block(acpi_gbl_fadt_gpe_device,
133 acpi_gbl_gpe_fadt_blocks[0]);
134
135 /* FADT GPE Block 1 */
136
137 (void)acpi_ev_initialize_gpe_block(acpi_gbl_fadt_gpe_device,
138 acpi_gbl_gpe_fadt_blocks[1]);
139
140 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
141 return_ACPI_STATUS(AE_OK);
142}
143
144/*******************************************************************************
145 *
103 * FUNCTION: acpi_ev_install_xrupt_handlers 146 * FUNCTION: acpi_ev_install_xrupt_handlers
104 * 147 *
105 * PARAMETERS: None 148 * PARAMETERS: None
@@ -120,7 +163,8 @@ acpi_status acpi_ev_install_xrupt_handlers(void)
120 163
121 status = acpi_ev_install_sci_handler(); 164 status = acpi_ev_install_sci_handler();
122 if (ACPI_FAILURE(status)) { 165 if (ACPI_FAILURE(status)) {
123 ACPI_REPORT_ERROR(("Unable to install System Control Interrupt Handler, %s\n", acpi_format_exception(status))); 166 ACPI_EXCEPTION((AE_INFO, status,
167 "Unable to install System Control Interrupt handler"));
124 return_ACPI_STATUS(status); 168 return_ACPI_STATUS(status);
125 } 169 }
126 170
@@ -128,7 +172,8 @@ acpi_status acpi_ev_install_xrupt_handlers(void)
128 172
129 status = acpi_ev_init_global_lock_handler(); 173 status = acpi_ev_init_global_lock_handler();
130 if (ACPI_FAILURE(status)) { 174 if (ACPI_FAILURE(status)) {
131 ACPI_REPORT_ERROR(("Unable to initialize Global Lock handler, %s\n", acpi_format_exception(status))); 175 ACPI_EXCEPTION((AE_INFO, status,
176 "Unable to initialize Global Lock handler"));
132 return_ACPI_STATUS(status); 177 return_ACPI_STATUS(status);
133 } 178 }
134 179
@@ -262,7 +307,9 @@ static u32 acpi_ev_fixed_event_dispatch(u32 event)
262 enable_register_id, 0, 307 enable_register_id, 0,
263 ACPI_MTX_DO_NOT_LOCK); 308 ACPI_MTX_DO_NOT_LOCK);
264 309
265 ACPI_REPORT_ERROR(("No installed handler for fixed event [%08X]\n", event)); 310 ACPI_ERROR((AE_INFO,
311 "No installed handler for fixed event [%08X]",
312 event));
266 313
267 return (ACPI_INTERRUPT_NOT_HANDLED); 314 return (ACPI_INTERRUPT_NOT_HANDLED);
268 } 315 }
diff --git a/drivers/acpi/events/evgpe.c b/drivers/acpi/events/evgpe.c
index b2f232df13d8..f64f977dd3d5 100644
--- a/drivers/acpi/events/evgpe.c
+++ b/drivers/acpi/events/evgpe.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -372,14 +372,14 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device,
372 372
373u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) 373u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
374{ 374{
375 acpi_status status;
376 struct acpi_gpe_block_info *gpe_block;
377 struct acpi_gpe_register_info *gpe_register_info;
375 u32 int_status = ACPI_INTERRUPT_NOT_HANDLED; 378 u32 int_status = ACPI_INTERRUPT_NOT_HANDLED;
376 u8 enabled_status_byte; 379 u8 enabled_status_byte;
377 struct acpi_gpe_register_info *gpe_register_info;
378 u32 status_reg; 380 u32 status_reg;
379 u32 enable_reg; 381 u32 enable_reg;
380 u32 flags; 382 acpi_cpu_flags flags;
381 acpi_status status;
382 struct acpi_gpe_block_info *gpe_block;
383 acpi_native_uint i; 383 acpi_native_uint i;
384 acpi_native_uint j; 384 acpi_native_uint j;
385 385
@@ -546,7 +546,11 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
546 546
547 status = acpi_ns_evaluate_by_handle(&info); 547 status = acpi_ns_evaluate_by_handle(&info);
548 if (ACPI_FAILURE(status)) { 548 if (ACPI_FAILURE(status)) {
549 ACPI_REPORT_ERROR(("%s while evaluating method [%4.4s] for GPE[%2X]\n", acpi_format_exception(status), acpi_ut_get_node_name(local_gpe_event_info.dispatch.method_node), gpe_number)); 549 ACPI_EXCEPTION((AE_INFO, status,
550 "While evaluating method [%4.4s] for GPE[%2X]",
551 acpi_ut_get_node_name
552 (local_gpe_event_info.dispatch.
553 method_node), gpe_number));
550 } 554 }
551 } 555 }
552 556
@@ -599,8 +603,10 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
599 ACPI_GPE_EDGE_TRIGGERED) { 603 ACPI_GPE_EDGE_TRIGGERED) {
600 status = acpi_hw_clear_gpe(gpe_event_info); 604 status = acpi_hw_clear_gpe(gpe_event_info);
601 if (ACPI_FAILURE(status)) { 605 if (ACPI_FAILURE(status)) {
602 ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to clear GPE[%2X]\n", acpi_format_exception(status), gpe_number)); 606 ACPI_EXCEPTION((AE_INFO, status,
603 return_VALUE(ACPI_INTERRUPT_NOT_HANDLED); 607 "Unable to clear GPE[%2X]",
608 gpe_number));
609 return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
604 } 610 }
605 } 611 }
606 612
@@ -637,8 +643,10 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
637 ACPI_GPE_LEVEL_TRIGGERED) { 643 ACPI_GPE_LEVEL_TRIGGERED) {
638 status = acpi_hw_clear_gpe(gpe_event_info); 644 status = acpi_hw_clear_gpe(gpe_event_info);
639 if (ACPI_FAILURE(status)) { 645 if (ACPI_FAILURE(status)) {
640 ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to clear GPE[%2X]\n", acpi_format_exception(status), gpe_number)); 646 ACPI_EXCEPTION((AE_INFO, status,
641 return_VALUE(ACPI_INTERRUPT_NOT_HANDLED); 647 "Unable to clear GPE[%2X]",
648 gpe_number));
649 return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
642 } 650 }
643 } 651 }
644 break; 652 break;
@@ -651,8 +659,10 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
651 */ 659 */
652 status = acpi_ev_disable_gpe(gpe_event_info); 660 status = acpi_ev_disable_gpe(gpe_event_info);
653 if (ACPI_FAILURE(status)) { 661 if (ACPI_FAILURE(status)) {
654 ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to disable GPE[%2X]\n", acpi_format_exception(status), gpe_number)); 662 ACPI_EXCEPTION((AE_INFO, status,
655 return_VALUE(ACPI_INTERRUPT_NOT_HANDLED); 663 "Unable to disable GPE[%2X]",
664 gpe_number));
665 return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
656 } 666 }
657 667
658 /* 668 /*
@@ -663,7 +673,9 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
663 acpi_ev_asynch_execute_gpe_method, 673 acpi_ev_asynch_execute_gpe_method,
664 gpe_event_info); 674 gpe_event_info);
665 if (ACPI_FAILURE(status)) { 675 if (ACPI_FAILURE(status)) {
666 ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to queue handler for GPE[%2X] - event disabled\n", acpi_format_exception(status), gpe_number)); 676 ACPI_EXCEPTION((AE_INFO, status,
677 "Unable to queue handler for GPE[%2X] - event disabled",
678 gpe_number));
667 } 679 }
668 break; 680 break;
669 681
@@ -671,7 +683,9 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
671 683
672 /* No handler or method to run! */ 684 /* No handler or method to run! */
673 685
674 ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: No handler or method for GPE[%2X], disabling event\n", gpe_number)); 686 ACPI_ERROR((AE_INFO,
687 "No handler or method for GPE[%2X], disabling event",
688 gpe_number));
675 689
676 /* 690 /*
677 * Disable the GPE. The GPE will remain disabled until the ACPI 691 * Disable the GPE. The GPE will remain disabled until the ACPI
@@ -679,13 +693,15 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
679 */ 693 */
680 status = acpi_ev_disable_gpe(gpe_event_info); 694 status = acpi_ev_disable_gpe(gpe_event_info);
681 if (ACPI_FAILURE(status)) { 695 if (ACPI_FAILURE(status)) {
682 ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to disable GPE[%2X]\n", acpi_format_exception(status), gpe_number)); 696 ACPI_EXCEPTION((AE_INFO, status,
683 return_VALUE(ACPI_INTERRUPT_NOT_HANDLED); 697 "Unable to disable GPE[%2X]",
698 gpe_number));
699 return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
684 } 700 }
685 break; 701 break;
686 } 702 }
687 703
688 return_VALUE(ACPI_INTERRUPT_HANDLED); 704 return_UINT32(ACPI_INTERRUPT_HANDLED);
689} 705}
690 706
691#ifdef ACPI_GPE_NOTIFY_CHECK 707#ifdef ACPI_GPE_NOTIFY_CHECK
@@ -722,7 +738,9 @@ acpi_ev_check_for_wake_only_gpe(struct acpi_gpe_event_info *gpe_event_info)
722 738
723 acpi_ev_set_gpe_type(gpe_event_info, ACPI_GPE_TYPE_WAKE); 739 acpi_ev_set_gpe_type(gpe_event_info, ACPI_GPE_TYPE_WAKE);
724 740
725 ACPI_REPORT_INFO(("GPE %p was updated from wake/run to wake-only\n", gpe_event_info)); 741 ACPI_INFO((AE_INFO,
742 "GPE %p was updated from wake/run to wake-only",
743 gpe_event_info));
726 744
727 /* This was a wake-only GPE */ 745 /* This was a wake-only GPE */
728 746
diff --git a/drivers/acpi/events/evgpeblk.c b/drivers/acpi/events/evgpeblk.c
index b312eb33c43e..0fd00b5ad650 100644
--- a/drivers/acpi/events/evgpeblk.c
+++ b/drivers/acpi/events/evgpeblk.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -78,7 +78,7 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block);
78 * 78 *
79 * RETURN: TRUE if the gpe_event is valid 79 * RETURN: TRUE if the gpe_event is valid
80 * 80 *
81 * DESCRIPTION: Validate a GPE event. DO NOT CALL FROM INTERRUPT LEVEL. 81 * DESCRIPTION: Validate a GPE event. DO NOT CALL FROM INTERRUPT LEVEL.
82 * Should be called only when the GPE lists are semaphore locked 82 * Should be called only when the GPE lists are semaphore locked
83 * and not subject to change. 83 * and not subject to change.
84 * 84 *
@@ -136,7 +136,7 @@ acpi_status acpi_ev_walk_gpe_list(ACPI_GPE_CALLBACK gpe_walk_callback)
136 struct acpi_gpe_block_info *gpe_block; 136 struct acpi_gpe_block_info *gpe_block;
137 struct acpi_gpe_xrupt_info *gpe_xrupt_info; 137 struct acpi_gpe_xrupt_info *gpe_xrupt_info;
138 acpi_status status = AE_OK; 138 acpi_status status = AE_OK;
139 u32 flags; 139 acpi_cpu_flags flags;
140 140
141 ACPI_FUNCTION_TRACE("ev_walk_gpe_list"); 141 ACPI_FUNCTION_TRACE("ev_walk_gpe_list");
142 142
@@ -264,7 +264,7 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
264 * 2) Edge/Level determination is based on the 2nd character 264 * 2) Edge/Level determination is based on the 2nd character
265 * of the method name 265 * of the method name
266 * 266 *
267 * NOTE: Default GPE type is RUNTIME. May be changed later to WAKE 267 * NOTE: Default GPE type is RUNTIME. May be changed later to WAKE
268 * if a _PRW object is found that points to this GPE. 268 * if a _PRW object is found that points to this GPE.
269 */ 269 */
270 switch (name[1]) { 270 switch (name[1]) {
@@ -279,9 +279,9 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
279 default: 279 default:
280 /* Unknown method type, just ignore it! */ 280 /* Unknown method type, just ignore it! */
281 281
282 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 282 ACPI_ERROR((AE_INFO,
283 "Unknown GPE method type: %s (name not of form _Lxx or _Exx)\n", 283 "Unknown GPE method type: %s (name not of form _Lxx or _Exx)",
284 name)); 284 name));
285 return_ACPI_STATUS(AE_OK); 285 return_ACPI_STATUS(AE_OK);
286 } 286 }
287 287
@@ -291,9 +291,9 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
291 if (gpe_number == ACPI_UINT32_MAX) { 291 if (gpe_number == ACPI_UINT32_MAX) {
292 /* Conversion failed; invalid method, just ignore it */ 292 /* Conversion failed; invalid method, just ignore it */
293 293
294 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 294 ACPI_ERROR((AE_INFO,
295 "Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)\n", 295 "Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)",
296 name)); 296 name));
297 return_ACPI_STATUS(AE_OK); 297 return_ACPI_STATUS(AE_OK);
298 } 298 }
299 299
@@ -313,14 +313,14 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
313 313
314 /* 314 /*
315 * Now we can add this information to the gpe_event_info block 315 * Now we can add this information to the gpe_event_info block
316 * for use during dispatch of this GPE. Default type is RUNTIME, although 316 * for use during dispatch of this GPE. Default type is RUNTIME, although
317 * this may change when the _PRW methods are executed later. 317 * this may change when the _PRW methods are executed later.
318 */ 318 */
319 gpe_event_info = 319 gpe_event_info =
320 &gpe_block->event_info[gpe_number - gpe_block->block_base_number]; 320 &gpe_block->event_info[gpe_number - gpe_block->block_base_number];
321 321
322 gpe_event_info->flags = (u8) (type | ACPI_GPE_DISPATCH_METHOD | 322 gpe_event_info->flags = (u8)
323 ACPI_GPE_TYPE_RUNTIME); 323 (type | ACPI_GPE_DISPATCH_METHOD | ACPI_GPE_TYPE_RUNTIME);
324 324
325 gpe_event_info->dispatch.method_node = 325 gpe_event_info->dispatch.method_node =
326 (struct acpi_namespace_node *)obj_handle; 326 (struct acpi_namespace_node *)obj_handle;
@@ -341,11 +341,11 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
341 * 341 *
342 * PARAMETERS: Callback from walk_namespace 342 * PARAMETERS: Callback from walk_namespace
343 * 343 *
344 * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is 344 * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is
345 * not aborted on a single _PRW failure. 345 * not aborted on a single _PRW failure.
346 * 346 *
347 * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a 347 * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a
348 * Device. Run the _PRW method. If present, extract the GPE 348 * Device. Run the _PRW method. If present, extract the GPE
349 * number and mark the GPE as a WAKE GPE. 349 * number and mark the GPE as a WAKE GPE.
350 * 350 *
351 ******************************************************************************/ 351 ******************************************************************************/
@@ -443,6 +443,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
443 443
444 gpe_event_info->flags &= 444 gpe_event_info->flags &=
445 ~(ACPI_GPE_WAKE_ENABLED | ACPI_GPE_RUN_ENABLED); 445 ~(ACPI_GPE_WAKE_ENABLED | ACPI_GPE_RUN_ENABLED);
446
446 status = 447 status =
447 acpi_ev_set_gpe_type(gpe_event_info, ACPI_GPE_TYPE_WAKE); 448 acpi_ev_set_gpe_type(gpe_event_info, ACPI_GPE_TYPE_WAKE);
448 if (ACPI_FAILURE(status)) { 449 if (ACPI_FAILURE(status)) {
@@ -466,7 +467,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
466 * 467 *
467 * RETURN: A GPE interrupt block 468 * RETURN: A GPE interrupt block
468 * 469 *
469 * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt 470 * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt
470 * block per unique interrupt level used for GPEs. 471 * block per unique interrupt level used for GPEs.
471 * Should be called only when the GPE lists are semaphore locked 472 * Should be called only when the GPE lists are semaphore locked
472 * and not subject to change. 473 * and not subject to change.
@@ -479,7 +480,7 @@ static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32
479 struct acpi_gpe_xrupt_info *next_gpe_xrupt; 480 struct acpi_gpe_xrupt_info *next_gpe_xrupt;
480 struct acpi_gpe_xrupt_info *gpe_xrupt; 481 struct acpi_gpe_xrupt_info *gpe_xrupt;
481 acpi_status status; 482 acpi_status status;
482 u32 flags; 483 acpi_cpu_flags flags;
483 484
484 ACPI_FUNCTION_TRACE("ev_get_gpe_xrupt_block"); 485 ACPI_FUNCTION_TRACE("ev_get_gpe_xrupt_block");
485 486
@@ -526,9 +527,9 @@ static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32
526 acpi_ev_gpe_xrupt_handler, 527 acpi_ev_gpe_xrupt_handler,
527 gpe_xrupt); 528 gpe_xrupt);
528 if (ACPI_FAILURE(status)) { 529 if (ACPI_FAILURE(status)) {
529 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 530 ACPI_ERROR((AE_INFO,
530 "Could not install GPE interrupt handler at level 0x%X\n", 531 "Could not install GPE interrupt handler at level 0x%X",
531 interrupt_number)); 532 interrupt_number));
532 return_PTR(NULL); 533 return_PTR(NULL);
533 } 534 }
534 } 535 }
@@ -553,7 +554,7 @@ static acpi_status
553acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt) 554acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt)
554{ 555{
555 acpi_status status; 556 acpi_status status;
556 u32 flags; 557 acpi_cpu_flags flags;
557 558
558 ACPI_FUNCTION_TRACE("ev_delete_gpe_xrupt"); 559 ACPI_FUNCTION_TRACE("ev_delete_gpe_xrupt");
559 560
@@ -566,8 +567,9 @@ acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt)
566 567
567 /* Disable this interrupt */ 568 /* Disable this interrupt */
568 569
569 status = acpi_os_remove_interrupt_handler(gpe_xrupt->interrupt_number, 570 status =
570 acpi_ev_gpe_xrupt_handler); 571 acpi_os_remove_interrupt_handler(gpe_xrupt->interrupt_number,
572 acpi_ev_gpe_xrupt_handler);
571 if (ACPI_FAILURE(status)) { 573 if (ACPI_FAILURE(status)) {
572 return_ACPI_STATUS(status); 574 return_ACPI_STATUS(status);
573 } 575 }
@@ -610,7 +612,7 @@ acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block,
610 struct acpi_gpe_block_info *next_gpe_block; 612 struct acpi_gpe_block_info *next_gpe_block;
611 struct acpi_gpe_xrupt_info *gpe_xrupt_block; 613 struct acpi_gpe_xrupt_info *gpe_xrupt_block;
612 acpi_status status; 614 acpi_status status;
613 u32 flags; 615 acpi_cpu_flags flags;
614 616
615 ACPI_FUNCTION_TRACE("ev_install_gpe_block"); 617 ACPI_FUNCTION_TRACE("ev_install_gpe_block");
616 618
@@ -663,7 +665,7 @@ acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block,
663acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block) 665acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
664{ 666{
665 acpi_status status; 667 acpi_status status;
666 u32 flags; 668 acpi_cpu_flags flags;
667 669
668 ACPI_FUNCTION_TRACE("ev_install_gpe_block"); 670 ACPI_FUNCTION_TRACE("ev_install_gpe_block");
669 671
@@ -743,22 +745,22 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
743 sizeof(struct 745 sizeof(struct
744 acpi_gpe_register_info)); 746 acpi_gpe_register_info));
745 if (!gpe_register_info) { 747 if (!gpe_register_info) {
746 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 748 ACPI_ERROR((AE_INFO,
747 "Could not allocate the gpe_register_info table\n")); 749 "Could not allocate the gpe_register_info table"));
748 return_ACPI_STATUS(AE_NO_MEMORY); 750 return_ACPI_STATUS(AE_NO_MEMORY);
749 } 751 }
750 752
751 /* 753 /*
752 * Allocate the GPE event_info block. There are eight distinct GPEs 754 * Allocate the GPE event_info block. There are eight distinct GPEs
753 * per register. Initialization to zeros is sufficient. 755 * per register. Initialization to zeros is sufficient.
754 */ 756 */
755 gpe_event_info = ACPI_MEM_CALLOCATE(((acpi_size) gpe_block-> 757 gpe_event_info = ACPI_MEM_CALLOCATE(((acpi_size) gpe_block->
756 register_count * 758 register_count *
757 ACPI_GPE_REGISTER_WIDTH) * 759 ACPI_GPE_REGISTER_WIDTH) *
758 sizeof(struct acpi_gpe_event_info)); 760 sizeof(struct acpi_gpe_event_info));
759 if (!gpe_event_info) { 761 if (!gpe_event_info) {
760 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 762 ACPI_ERROR((AE_INFO,
761 "Could not allocate the gpe_event_info table\n")); 763 "Could not allocate the gpe_event_info table"));
762 status = AE_NO_MEMORY; 764 status = AE_NO_MEMORY;
763 goto error_exit; 765 goto error_exit;
764 } 766 }
@@ -769,9 +771,9 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
769 gpe_block->event_info = gpe_event_info; 771 gpe_block->event_info = gpe_event_info;
770 772
771 /* 773 /*
772 * Initialize the GPE Register and Event structures. A goal of these 774 * Initialize the GPE Register and Event structures. A goal of these
773 * tables is to hide the fact that there are two separate GPE register sets 775 * tables is to hide the fact that there are two separate GPE register sets
774 * in a given gpe hardware block, the status registers occupy the first half, 776 * in a given GPE hardware block, the status registers occupy the first half,
775 * and the enable registers occupy the second half. 777 * and the enable registers occupy the second half.
776 */ 778 */
777 this_register = gpe_register_info; 779 this_register = gpe_register_info;
@@ -812,11 +814,8 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
812 this_event++; 814 this_event++;
813 } 815 }
814 816
815 /* 817 /* Disable all GPEs within this register */
816 * Clear the status/enable registers. Note that status registers 818
817 * are cleared by writing a '1', while enable registers are cleared
818 * by writing a '0'.
819 */
820 status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0x00, 819 status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0x00,
821 &this_register-> 820 &this_register->
822 enable_address); 821 enable_address);
@@ -824,6 +823,8 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
824 goto error_exit; 823 goto error_exit;
825 } 824 }
826 825
826 /* Clear any pending GPE events within this register */
827
827 status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0xFF, 828 status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0xFF,
828 &this_register-> 829 &this_register->
829 status_address); 830 status_address);
@@ -860,7 +861,9 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
860 * 861 *
861 * RETURN: Status 862 * RETURN: Status
862 * 863 *
863 * DESCRIPTION: Create and Install a block of GPE registers 864 * DESCRIPTION: Create and Install a block of GPE registers. All GPEs within
865 * the block are disabled at exit.
866 * Note: Assumes namespace is locked.
864 * 867 *
865 ******************************************************************************/ 868 ******************************************************************************/
866 869
@@ -872,14 +875,8 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
872 u32 interrupt_number, 875 u32 interrupt_number,
873 struct acpi_gpe_block_info **return_gpe_block) 876 struct acpi_gpe_block_info **return_gpe_block)
874{ 877{
875 struct acpi_gpe_block_info *gpe_block;
876 struct acpi_gpe_event_info *gpe_event_info;
877 acpi_native_uint i;
878 acpi_native_uint j;
879 u32 wake_gpe_count;
880 u32 gpe_enabled_count;
881 acpi_status status; 878 acpi_status status;
882 struct acpi_gpe_walk_info gpe_info; 879 struct acpi_gpe_block_info *gpe_block;
883 880
884 ACPI_FUNCTION_TRACE("ev_create_gpe_block"); 881 ACPI_FUNCTION_TRACE("ev_create_gpe_block");
885 882
@@ -896,22 +893,24 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
896 893
897 /* Initialize the new GPE block */ 894 /* Initialize the new GPE block */
898 895
896 gpe_block->node = gpe_device;
899 gpe_block->register_count = register_count; 897 gpe_block->register_count = register_count;
900 gpe_block->block_base_number = gpe_block_base_number; 898 gpe_block->block_base_number = gpe_block_base_number;
901 gpe_block->node = gpe_device;
902 899
903 ACPI_MEMCPY(&gpe_block->block_address, gpe_block_address, 900 ACPI_MEMCPY(&gpe_block->block_address, gpe_block_address,
904 sizeof(struct acpi_generic_address)); 901 sizeof(struct acpi_generic_address));
905 902
906 /* Create the register_info and event_info sub-structures */ 903 /*
907 904 * Create the register_info and event_info sub-structures
905 * Note: disables and clears all GPEs in the block
906 */
908 status = acpi_ev_create_gpe_info_blocks(gpe_block); 907 status = acpi_ev_create_gpe_info_blocks(gpe_block);
909 if (ACPI_FAILURE(status)) { 908 if (ACPI_FAILURE(status)) {
910 ACPI_MEM_FREE(gpe_block); 909 ACPI_MEM_FREE(gpe_block);
911 return_ACPI_STATUS(status); 910 return_ACPI_STATUS(status);
912 } 911 }
913 912
914 /* Install the new block in the global list(s) */ 913 /* Install the new block in the global lists */
915 914
916 status = acpi_ev_install_gpe_block(gpe_block, interrupt_number); 915 status = acpi_ev_install_gpe_block(gpe_block, interrupt_number);
917 if (ACPI_FAILURE(status)) { 916 if (ACPI_FAILURE(status)) {
@@ -926,16 +925,70 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
926 acpi_ev_save_method_info, gpe_block, 925 acpi_ev_save_method_info, gpe_block,
927 NULL); 926 NULL);
928 927
928 /* Return the new block */
929
930 if (return_gpe_block) {
931 (*return_gpe_block) = gpe_block;
932 }
933
934 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
935 "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n",
936 (u32) gpe_block->block_base_number,
937 (u32) (gpe_block->block_base_number +
938 ((gpe_block->register_count *
939 ACPI_GPE_REGISTER_WIDTH) - 1)),
940 gpe_device->name.ascii, gpe_block->register_count,
941 interrupt_number));
942
943 return_ACPI_STATUS(AE_OK);
944}
945
946/*******************************************************************************
947 *
948 * FUNCTION: acpi_ev_initialize_gpe_block
949 *
950 * PARAMETERS: gpe_device - Handle to the parent GPE block
951 * gpe_block - Gpe Block info
952 *
953 * RETURN: Status
954 *
955 * DESCRIPTION: Initialize and enable a GPE block. First find and run any
956 * _PRT methods associated with the block, then enable the
957 * appropriate GPEs.
958 * Note: Assumes namespace is locked.
959 *
960 ******************************************************************************/
961
962acpi_status
963acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
964 struct acpi_gpe_block_info *gpe_block)
965{
966 acpi_status status;
967 struct acpi_gpe_event_info *gpe_event_info;
968 struct acpi_gpe_walk_info gpe_info;
969 u32 wake_gpe_count;
970 u32 gpe_enabled_count;
971 acpi_native_uint i;
972 acpi_native_uint j;
973
974 ACPI_FUNCTION_TRACE("ev_initialize_gpe_block");
975
976 /* Ignore a null GPE block (e.g., if no GPE block 1 exists) */
977
978 if (!gpe_block) {
979 return_ACPI_STATUS(AE_OK);
980 }
981
929 /* 982 /*
930 * Runtime option: Should Wake GPEs be enabled at runtime? The default 983 * Runtime option: Should wake GPEs be enabled at runtime? The default
931 * is No, they should only be enabled just as the machine goes to sleep. 984 * is no, they should only be enabled just as the machine goes to sleep.
932 */ 985 */
933 if (acpi_gbl_leave_wake_gpes_disabled) { 986 if (acpi_gbl_leave_wake_gpes_disabled) {
934 /* 987 /*
935 * Differentiate RUNTIME vs WAKE GPEs, via the _PRW control methods. 988 * Differentiate runtime vs wake GPEs, via the _PRW control methods.
936 * (Each GPE that has one or more _PRWs that reference it is by 989 * Each GPE that has one or more _PRWs that reference it is by
937 * definition a WAKE GPE and will not be enabled while the machine 990 * definition a wake GPE and will not be enabled while the machine
938 * is running.) 991 * is running.
939 */ 992 */
940 gpe_info.gpe_block = gpe_block; 993 gpe_info.gpe_block = gpe_block;
941 gpe_info.gpe_device = gpe_device; 994 gpe_info.gpe_device = gpe_device;
@@ -948,9 +1001,12 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
948 } 1001 }
949 1002
950 /* 1003 /*
951 * Enable all GPEs in this block that are 1) "runtime" or "run/wake" GPEs, 1004 * Enable all GPEs in this block that have these attributes:
952 * and 2) have a corresponding _Lxx or _Exx method. All other GPEs must 1005 * 1) are "runtime" or "run/wake" GPEs, and
953 * be enabled via the acpi_enable_gpe() external interface. 1006 * 2) have a corresponding _Lxx or _Exx method
1007 *
1008 * Any other GPEs within this block must be enabled via the acpi_enable_gpe()
1009 * external interface.
954 */ 1010 */
955 wake_gpe_count = 0; 1011 wake_gpe_count = 0;
956 gpe_enabled_count = 0; 1012 gpe_enabled_count = 0;
@@ -976,32 +1032,19 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
976 } 1032 }
977 } 1033 }
978 1034
979 /* Dump info about this GPE block */
980
981 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
982 "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n",
983 (u32) gpe_block->block_base_number,
984 (u32) (gpe_block->block_base_number +
985 ((gpe_block->register_count *
986 ACPI_GPE_REGISTER_WIDTH) - 1)),
987 gpe_device->name.ascii, gpe_block->register_count,
988 interrupt_number));
989
990 /* Enable all valid GPEs found above */
991
992 status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block);
993
994 ACPI_DEBUG_PRINT((ACPI_DB_INIT, 1035 ACPI_DEBUG_PRINT((ACPI_DB_INIT,
995 "Found %u Wake, Enabled %u Runtime GPEs in this block\n", 1036 "Found %u Wake, Enabled %u Runtime GPEs in this block\n",
996 wake_gpe_count, gpe_enabled_count)); 1037 wake_gpe_count, gpe_enabled_count));
997 1038
998 /* Return the new block */ 1039 /* Enable all valid runtime GPEs found above */
999 1040
1000 if (return_gpe_block) { 1041 status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block);
1001 (*return_gpe_block) = gpe_block; 1042 if (ACPI_FAILURE(status)) {
1043 ACPI_ERROR((AE_INFO, "Could not enable GPEs in gpe_block %p",
1044 gpe_block));
1002 } 1045 }
1003 1046
1004 return_ACPI_STATUS(AE_OK); 1047 return_ACPI_STATUS(status);
1005} 1048}
1006 1049
1007/******************************************************************************* 1050/*******************************************************************************
@@ -1072,8 +1115,8 @@ acpi_status acpi_ev_gpe_initialize(void)
1072 &acpi_gbl_gpe_fadt_blocks[0]); 1115 &acpi_gbl_gpe_fadt_blocks[0]);
1073 1116
1074 if (ACPI_FAILURE(status)) { 1117 if (ACPI_FAILURE(status)) {
1075 ACPI_REPORT_ERROR(("Could not create GPE Block 0, %s\n", 1118 ACPI_EXCEPTION((AE_INFO, status,
1076 acpi_format_exception(status))); 1119 "Could not create GPE Block 0"));
1077 } 1120 }
1078 } 1121 }
1079 1122
@@ -1086,7 +1129,12 @@ acpi_status acpi_ev_gpe_initialize(void)
1086 1129
1087 if ((register_count0) && 1130 if ((register_count0) &&
1088 (gpe_number_max >= acpi_gbl_FADT->gpe1_base)) { 1131 (gpe_number_max >= acpi_gbl_FADT->gpe1_base)) {
1089 ACPI_REPORT_ERROR(("GPE0 block (GPE 0 to %d) overlaps the GPE1 block (GPE %d to %d) - Ignoring GPE1\n", gpe_number_max, acpi_gbl_FADT->gpe1_base, acpi_gbl_FADT->gpe1_base + ((register_count1 * ACPI_GPE_REGISTER_WIDTH) - 1))); 1132 ACPI_ERROR((AE_INFO,
1133 "GPE0 block (GPE 0 to %d) overlaps the GPE1 block (GPE %d to %d) - Ignoring GPE1",
1134 gpe_number_max, acpi_gbl_FADT->gpe1_base,
1135 acpi_gbl_FADT->gpe1_base +
1136 ((register_count1 *
1137 ACPI_GPE_REGISTER_WIDTH) - 1)));
1090 1138
1091 /* Ignore GPE1 block by setting the register count to zero */ 1139 /* Ignore GPE1 block by setting the register count to zero */
1092 1140
@@ -1104,7 +1152,8 @@ acpi_status acpi_ev_gpe_initialize(void)
1104 [1]); 1152 [1]);
1105 1153
1106 if (ACPI_FAILURE(status)) { 1154 if (ACPI_FAILURE(status)) {
1107 ACPI_REPORT_ERROR(("Could not create GPE Block 1, %s\n", acpi_format_exception(status))); 1155 ACPI_EXCEPTION((AE_INFO, status,
1156 "Could not create GPE Block 1"));
1108 } 1157 }
1109 1158
1110 /* 1159 /*
@@ -1130,7 +1179,9 @@ acpi_status acpi_ev_gpe_initialize(void)
1130 /* Check for Max GPE number out-of-range */ 1179 /* Check for Max GPE number out-of-range */
1131 1180
1132 if (gpe_number_max > ACPI_GPE_MAX) { 1181 if (gpe_number_max > ACPI_GPE_MAX) {
1133 ACPI_REPORT_ERROR(("Maximum GPE number from FADT is too large: 0x%X\n", gpe_number_max)); 1182 ACPI_ERROR((AE_INFO,
1183 "Maximum GPE number from FADT is too large: 0x%X",
1184 gpe_number_max));
1134 status = AE_BAD_VALUE; 1185 status = AE_BAD_VALUE;
1135 goto cleanup; 1186 goto cleanup;
1136 } 1187 }
diff --git a/drivers/acpi/events/evmisc.c b/drivers/acpi/events/evmisc.c
index 7e57b8470f55..0909ba69577e 100644
--- a/drivers/acpi/events/evmisc.c
+++ b/drivers/acpi/events/evmisc.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -303,7 +303,8 @@ static void ACPI_SYSTEM_XFACE acpi_ev_global_lock_thread(void *context)
303 acpi_os_signal_semaphore(acpi_gbl_global_lock_semaphore, 303 acpi_os_signal_semaphore(acpi_gbl_global_lock_semaphore,
304 acpi_gbl_global_lock_thread_count); 304 acpi_gbl_global_lock_thread_count);
305 if (ACPI_FAILURE(status)) { 305 if (ACPI_FAILURE(status)) {
306 ACPI_REPORT_ERROR(("Could not signal Global Lock semaphore\n")); 306 ACPI_ERROR((AE_INFO,
307 "Could not signal Global Lock semaphore"));
307 } 308 }
308 } 309 }
309} 310}
@@ -344,7 +345,8 @@ static u32 acpi_ev_global_lock_handler(void *context)
344 acpi_ev_global_lock_thread, 345 acpi_ev_global_lock_thread,
345 context); 346 context);
346 if (ACPI_FAILURE(status)) { 347 if (ACPI_FAILURE(status)) {
347 ACPI_REPORT_ERROR(("Could not queue Global Lock thread, %s\n", acpi_format_exception(status))); 348 ACPI_EXCEPTION((AE_INFO, status,
349 "Could not queue Global Lock thread"));
348 350
349 return (ACPI_INTERRUPT_NOT_HANDLED); 351 return (ACPI_INTERRUPT_NOT_HANDLED);
350 } 352 }
@@ -384,7 +386,8 @@ acpi_status acpi_ev_init_global_lock_handler(void)
384 * with an error. 386 * with an error.
385 */ 387 */
386 if (status == AE_NO_HARDWARE_RESPONSE) { 388 if (status == AE_NO_HARDWARE_RESPONSE) {
387 ACPI_REPORT_ERROR(("No response from Global Lock hardware, disabling lock\n")); 389 ACPI_ERROR((AE_INFO,
390 "No response from Global Lock hardware, disabling lock"));
388 391
389 acpi_gbl_global_lock_present = FALSE; 392 acpi_gbl_global_lock_present = FALSE;
390 status = AE_OK; 393 status = AE_OK;
@@ -480,7 +483,8 @@ acpi_status acpi_ev_release_global_lock(void)
480 ACPI_FUNCTION_TRACE("ev_release_global_lock"); 483 ACPI_FUNCTION_TRACE("ev_release_global_lock");
481 484
482 if (!acpi_gbl_global_lock_thread_count) { 485 if (!acpi_gbl_global_lock_thread_count) {
483 ACPI_REPORT_WARNING(("Cannot release HW Global Lock, it has not been acquired\n")); 486 ACPI_WARNING((AE_INFO,
487 "Cannot release HW Global Lock, it has not been acquired"));
484 return_ACPI_STATUS(AE_NOT_ACQUIRED); 488 return_ACPI_STATUS(AE_NOT_ACQUIRED);
485 } 489 }
486 490
@@ -542,9 +546,9 @@ void acpi_ev_terminate(void)
542 for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) { 546 for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
543 status = acpi_disable_event((u32) i, 0); 547 status = acpi_disable_event((u32) i, 0);
544 if (ACPI_FAILURE(status)) { 548 if (ACPI_FAILURE(status)) {
545 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 549 ACPI_ERROR((AE_INFO,
546 "Could not disable fixed event %d\n", 550 "Could not disable fixed event %d",
547 (u32) i)); 551 (u32) i));
548 } 552 }
549 } 553 }
550 554
@@ -556,8 +560,7 @@ void acpi_ev_terminate(void)
556 560
557 status = acpi_ev_remove_sci_handler(); 561 status = acpi_ev_remove_sci_handler();
558 if (ACPI_FAILURE(status)) { 562 if (ACPI_FAILURE(status)) {
559 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 563 ACPI_ERROR((AE_INFO, "Could not remove SCI handler"));
560 "Could not remove SCI handler\n"));
561 } 564 }
562 } 565 }
563 566
@@ -570,8 +573,7 @@ void acpi_ev_terminate(void)
570 if (acpi_gbl_original_mode == ACPI_SYS_MODE_LEGACY) { 573 if (acpi_gbl_original_mode == ACPI_SYS_MODE_LEGACY) {
571 status = acpi_disable(); 574 status = acpi_disable();
572 if (ACPI_FAILURE(status)) { 575 if (ACPI_FAILURE(status)) {
573 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 576 ACPI_WARNING((AE_INFO, "acpi_disable failed"));
574 "acpi_disable failed\n"));
575 } 577 }
576 } 578 }
577 return_VOID; 579 return_VOID;
diff --git a/drivers/acpi/events/evregion.c b/drivers/acpi/events/evregion.c
index 84fad082d80d..6da58e776413 100644
--- a/drivers/acpi/events/evregion.c
+++ b/drivers/acpi/events/evregion.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -295,12 +295,12 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
295 295
296 handler_desc = region_obj->region.handler; 296 handler_desc = region_obj->region.handler;
297 if (!handler_desc) { 297 if (!handler_desc) {
298 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 298 ACPI_ERROR((AE_INFO,
299 "No handler for Region [%4.4s] (%p) [%s]\n", 299 "No handler for Region [%4.4s] (%p) [%s]",
300 acpi_ut_get_node_name(region_obj->region. 300 acpi_ut_get_node_name(region_obj->region.node),
301 node), region_obj, 301 region_obj,
302 acpi_ut_get_region_name(region_obj->region. 302 acpi_ut_get_region_name(region_obj->region.
303 space_id))); 303 space_id)));
304 304
305 return_ACPI_STATUS(AE_NOT_EXIST); 305 return_ACPI_STATUS(AE_NOT_EXIST);
306 } 306 }
@@ -317,12 +317,11 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
317 if (!region_setup) { 317 if (!region_setup) {
318 /* No initialization routine, exit with error */ 318 /* No initialization routine, exit with error */
319 319
320 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 320 ACPI_ERROR((AE_INFO,
321 "No init routine for region(%p) [%s]\n", 321 "No init routine for region(%p) [%s]",
322 region_obj, 322 region_obj,
323 acpi_ut_get_region_name(region_obj-> 323 acpi_ut_get_region_name(region_obj->region.
324 region. 324 space_id)));
325 space_id)));
326 return_ACPI_STATUS(AE_NOT_EXIST); 325 return_ACPI_STATUS(AE_NOT_EXIST);
327 } 326 }
328 327
@@ -347,12 +346,11 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
347 /* Check for failure of the Region Setup */ 346 /* Check for failure of the Region Setup */
348 347
349 if (ACPI_FAILURE(status)) { 348 if (ACPI_FAILURE(status)) {
350 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 349 ACPI_EXCEPTION((AE_INFO, status,
351 "Region Init: %s [%s]\n", 350 "During region initialization: [%s]",
352 acpi_format_exception(status), 351 acpi_ut_get_region_name(region_obj->
353 acpi_ut_get_region_name(region_obj-> 352 region.
354 region. 353 space_id)));
355 space_id)));
356 return_ACPI_STATUS(status); 354 return_ACPI_STATUS(status);
357 } 355 }
358 356
@@ -406,10 +404,9 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
406 region_obj2->extra.region_context); 404 region_obj2->extra.region_context);
407 405
408 if (ACPI_FAILURE(status)) { 406 if (ACPI_FAILURE(status)) {
409 ACPI_REPORT_ERROR(("Handler for [%s] returned %s\n", 407 ACPI_EXCEPTION((AE_INFO, status, "Returned by Handler for [%s]",
410 acpi_ut_get_region_name(region_obj->region. 408 acpi_ut_get_region_name(region_obj->region.
411 space_id), 409 space_id)));
412 acpi_format_exception(status)));
413 } 410 }
414 411
415 if (! 412 if (!
@@ -501,12 +498,10 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj,
501 498
502 status = acpi_ev_execute_reg_method(region_obj, 0); 499 status = acpi_ev_execute_reg_method(region_obj, 0);
503 if (ACPI_FAILURE(status)) { 500 if (ACPI_FAILURE(status)) {
504 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 501 ACPI_EXCEPTION((AE_INFO, status,
505 "%s from region _REG, [%s]\n", 502 "from region _REG, [%s]",
506 acpi_format_exception(status), 503 acpi_ut_get_region_name
507 acpi_ut_get_region_name 504 (region_obj->region.space_id)));
508 (region_obj->region.
509 space_id)));
510 } 505 }
511 506
512 if (acpi_ns_is_locked) { 507 if (acpi_ns_is_locked) {
@@ -528,12 +523,10 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj,
528 /* Init routine may fail, Just ignore errors */ 523 /* Init routine may fail, Just ignore errors */
529 524
530 if (ACPI_FAILURE(status)) { 525 if (ACPI_FAILURE(status)) {
531 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 526 ACPI_EXCEPTION((AE_INFO, status,
532 "%s from region init, [%s]\n", 527 "from region init, [%s]",
533 acpi_format_exception(status), 528 acpi_ut_get_region_name
534 acpi_ut_get_region_name 529 (region_obj->region.space_id)));
535 (region_obj->region.
536 space_id)));
537 } 530 }
538 531
539 region_obj->region.flags &= ~(AOPOBJ_SETUP_COMPLETE); 532 region_obj->region.flags &= ~(AOPOBJ_SETUP_COMPLETE);
diff --git a/drivers/acpi/events/evrgnini.c b/drivers/acpi/events/evrgnini.c
index a1bd2da27c45..baed8c1a1b9f 100644
--- a/drivers/acpi/events/evrgnini.c
+++ b/drivers/acpi/events/evrgnini.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -233,7 +233,11 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
233 */ 233 */
234 status = AE_OK; 234 status = AE_OK;
235 } else { 235 } else {
236 ACPI_REPORT_ERROR(("Could not install pci_config handler for Root Bridge %4.4s, %s\n", acpi_ut_get_node_name(pci_root_node), acpi_format_exception(status))); 236 ACPI_EXCEPTION((AE_INFO,
237 status,
238 "Could not install pci_config handler for Root Bridge %4.4s",
239 acpi_ut_get_node_name
240 (pci_root_node)));
237 } 241 }
238 } 242 }
239 break; 243 break;
diff --git a/drivers/acpi/events/evsci.c b/drivers/acpi/events/evsci.c
index 141835977002..9a622169008a 100644
--- a/drivers/acpi/events/evsci.c
+++ b/drivers/acpi/events/evsci.c
@@ -6,7 +6,7 @@
6 ******************************************************************************/ 6 ******************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -88,7 +88,7 @@ static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context)
88 */ 88 */
89 interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list); 89 interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
90 90
91 return_VALUE(interrupt_handled); 91 return_UINT32(interrupt_handled);
92} 92}
93 93
94/******************************************************************************* 94/*******************************************************************************
@@ -121,7 +121,7 @@ u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context)
121 */ 121 */
122 interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list); 122 interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
123 123
124 return_VALUE(interrupt_handled); 124 return_UINT32(interrupt_handled);
125} 125}
126 126
127/****************************************************************************** 127/******************************************************************************
diff --git a/drivers/acpi/events/evxface.c b/drivers/acpi/events/evxface.c
index 43b33d19cdf9..b38b39dde543 100644
--- a/drivers/acpi/events/evxface.c
+++ b/drivers/acpi/events/evxface.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -143,8 +143,8 @@ acpi_install_fixed_event_handler(u32 event,
143 if (ACPI_SUCCESS(status)) 143 if (ACPI_SUCCESS(status))
144 status = acpi_enable_event(event, 0); 144 status = acpi_enable_event(event, 0);
145 if (ACPI_FAILURE(status)) { 145 if (ACPI_FAILURE(status)) {
146 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 146 ACPI_WARNING((AE_INFO, "Could not enable fixed event %X",
147 "Could not enable fixed event.\n")); 147 event));
148 148
149 /* Remove the handler */ 149 /* Remove the handler */
150 150
@@ -204,10 +204,11 @@ acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler)
204 acpi_gbl_fixed_event_handlers[event].context = NULL; 204 acpi_gbl_fixed_event_handlers[event].context = NULL;
205 205
206 if (ACPI_FAILURE(status)) { 206 if (ACPI_FAILURE(status)) {
207 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 207 ACPI_WARNING((AE_INFO,
208 "Could not write to fixed event enable register.\n")); 208 "Could not write to fixed event enable register %X",
209 event));
209 } else { 210 } else {
210 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Disabled fixed event %X.\n", 211 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Disabled fixed event %X\n",
211 event)); 212 event));
212 } 213 }
213 214
@@ -434,7 +435,7 @@ acpi_remove_notify_handler(acpi_handle device,
434 435
435 if (device == ACPI_ROOT_OBJECT) { 436 if (device == ACPI_ROOT_OBJECT) {
436 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 437 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
437 "Removing notify handler for ROOT object.\n")); 438 "Removing notify handler for namespace root object\n"));
438 439
439 if (((handler_type & ACPI_SYSTEM_NOTIFY) && 440 if (((handler_type & ACPI_SYSTEM_NOTIFY) &&
440 !acpi_gbl_system_notify.handler) || 441 !acpi_gbl_system_notify.handler) ||
@@ -562,7 +563,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
562 struct acpi_gpe_event_info *gpe_event_info; 563 struct acpi_gpe_event_info *gpe_event_info;
563 struct acpi_handler_info *handler; 564 struct acpi_handler_info *handler;
564 acpi_status status; 565 acpi_status status;
565 u32 flags; 566 acpi_cpu_flags flags;
566 567
567 ACPI_FUNCTION_TRACE("acpi_install_gpe_handler"); 568 ACPI_FUNCTION_TRACE("acpi_install_gpe_handler");
568 569
@@ -653,7 +654,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
653 struct acpi_gpe_event_info *gpe_event_info; 654 struct acpi_gpe_event_info *gpe_event_info;
654 struct acpi_handler_info *handler; 655 struct acpi_handler_info *handler;
655 acpi_status status; 656 acpi_status status;
656 u32 flags; 657 acpi_cpu_flags flags;
657 658
658 ACPI_FUNCTION_TRACE("acpi_remove_gpe_handler"); 659 ACPI_FUNCTION_TRACE("acpi_remove_gpe_handler");
659 660
diff --git a/drivers/acpi/events/evxfevnt.c b/drivers/acpi/events/evxfevnt.c
index 887ff9f28a0d..ec9ce8429f15 100644
--- a/drivers/acpi/events/evxfevnt.c
+++ b/drivers/acpi/events/evxfevnt.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -70,8 +70,7 @@ acpi_status acpi_enable(void)
70 /* Make sure we have the FADT */ 70 /* Make sure we have the FADT */
71 71
72 if (!acpi_gbl_FADT) { 72 if (!acpi_gbl_FADT) {
73 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 73 ACPI_WARNING((AE_INFO, "No FADT information present!"));
74 "No FADT information present!\n"));
75 return_ACPI_STATUS(AE_NO_ACPI_TABLES); 74 return_ACPI_STATUS(AE_NO_ACPI_TABLES);
76 } 75 }
77 76
@@ -83,7 +82,8 @@ acpi_status acpi_enable(void)
83 82
84 status = acpi_hw_set_mode(ACPI_SYS_MODE_ACPI); 83 status = acpi_hw_set_mode(ACPI_SYS_MODE_ACPI);
85 if (ACPI_FAILURE(status)) { 84 if (ACPI_FAILURE(status)) {
86 ACPI_REPORT_ERROR(("Could not transition to ACPI mode.\n")); 85 ACPI_ERROR((AE_INFO,
86 "Could not transition to ACPI mode"));
87 return_ACPI_STATUS(status); 87 return_ACPI_STATUS(status);
88 } 88 }
89 89
@@ -113,8 +113,7 @@ acpi_status acpi_disable(void)
113 ACPI_FUNCTION_TRACE("acpi_disable"); 113 ACPI_FUNCTION_TRACE("acpi_disable");
114 114
115 if (!acpi_gbl_FADT) { 115 if (!acpi_gbl_FADT) {
116 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 116 ACPI_WARNING((AE_INFO, "No FADT information present!"));
117 "No FADT information present!\n"));
118 return_ACPI_STATUS(AE_NO_ACPI_TABLES); 117 return_ACPI_STATUS(AE_NO_ACPI_TABLES);
119 } 118 }
120 119
@@ -127,8 +126,8 @@ acpi_status acpi_disable(void)
127 status = acpi_hw_set_mode(ACPI_SYS_MODE_LEGACY); 126 status = acpi_hw_set_mode(ACPI_SYS_MODE_LEGACY);
128 127
129 if (ACPI_FAILURE(status)) { 128 if (ACPI_FAILURE(status)) {
130 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 129 ACPI_ERROR((AE_INFO,
131 "Could not exit ACPI mode to legacy mode")); 130 "Could not exit ACPI mode to legacy mode"));
132 return_ACPI_STATUS(status); 131 return_ACPI_STATUS(status);
133 } 132 }
134 133
@@ -185,9 +184,9 @@ acpi_status acpi_enable_event(u32 event, u32 flags)
185 } 184 }
186 185
187 if (value != 1) { 186 if (value != 1) {
188 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 187 ACPI_ERROR((AE_INFO,
189 "Could not enable %s event\n", 188 "Could not enable %s event",
190 acpi_ut_get_event_name(event))); 189 acpi_ut_get_event_name(event)));
191 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE); 190 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
192 } 191 }
193 192
@@ -384,9 +383,9 @@ acpi_status acpi_disable_event(u32 event, u32 flags)
384 } 383 }
385 384
386 if (value != 0) { 385 if (value != 0) {
387 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 386 ACPI_ERROR((AE_INFO,
388 "Could not disable %s events\n", 387 "Could not disable %s events",
389 acpi_ut_get_event_name(event))); 388 acpi_ut_get_event_name(event)));
390 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE); 389 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
391 } 390 }
392 391
@@ -626,6 +625,13 @@ acpi_install_gpe_block(acpi_handle gpe_device,
626 goto unlock_and_exit; 625 goto unlock_and_exit;
627 } 626 }
628 627
628 /* Run the _PRW methods and enable the GPEs */
629
630 status = acpi_ev_initialize_gpe_block(node, gpe_block);
631 if (ACPI_FAILURE(status)) {
632 goto unlock_and_exit;
633 }
634
629 /* Get the device_object attached to the node */ 635 /* Get the device_object attached to the node */
630 636
631 obj_desc = acpi_ns_get_attached_object(node); 637 obj_desc = acpi_ns_get_attached_object(node);
diff --git a/drivers/acpi/events/evxfregn.c b/drivers/acpi/events/evxfregn.c
index 6f28ea2db5ba..abf5caca9ae5 100644
--- a/drivers/acpi/events/evxfregn.c
+++ b/drivers/acpi/events/evxfregn.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c
index 1ce365d651d8..a29782fe3ecf 100644
--- a/drivers/acpi/executer/exconfig.c
+++ b/drivers/acpi/executer/exconfig.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -413,9 +413,9 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
413 (!ACPI_STRNCMP(table_ptr->signature, 413 (!ACPI_STRNCMP(table_ptr->signature,
414 acpi_gbl_table_data[ACPI_TABLE_SSDT].signature, 414 acpi_gbl_table_data[ACPI_TABLE_SSDT].signature,
415 acpi_gbl_table_data[ACPI_TABLE_SSDT].sig_length))) { 415 acpi_gbl_table_data[ACPI_TABLE_SSDT].sig_length))) {
416 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 416 ACPI_ERROR((AE_INFO,
417 "Table has invalid signature [%4.4s], must be SSDT or PSDT\n", 417 "Table has invalid signature [%4.4s], must be SSDT or PSDT",
418 table_ptr->signature)); 418 table_ptr->signature));
419 status = AE_BAD_SIGNATURE; 419 status = AE_BAD_SIGNATURE;
420 goto cleanup; 420 goto cleanup;
421 } 421 }
diff --git a/drivers/acpi/executer/exconvrt.c b/drivers/acpi/executer/exconvrt.c
index 04e5194989a6..e6d52e12d77a 100644
--- a/drivers/acpi/executer/exconvrt.c
+++ b/drivers/acpi/executer/exconvrt.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -504,18 +504,12 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
504 } 504 }
505 505
506 /* 506 /*
507 * Perform the conversion. 507 * Create a new string object and string buffer
508 * (-1 because of extra separator included in string_length from above) 508 * (-1 because of extra separator included in string_length from above)
509 */ 509 */
510 string_length--;
511 if (string_length > ACPI_MAX_STRING_CONVERSION) { /* ACPI limit */
512 return_ACPI_STATUS(AE_AML_STRING_LIMIT);
513 }
514
515 /* Create a new string object and string buffer */
516
517 return_desc = 510 return_desc =
518 acpi_ut_create_string_object((acpi_size) string_length); 511 acpi_ut_create_string_object((acpi_size)
512 (string_length - 1));
519 if (!return_desc) { 513 if (!return_desc) {
520 return_ACPI_STATUS(AE_NO_MEMORY); 514 return_ACPI_STATUS(AE_NO_MEMORY);
521 } 515 }
@@ -647,7 +641,9 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
647 break; 641 break;
648 642
649 default: 643 default:
650 ACPI_REPORT_ERROR(("Bad destination type during conversion: %X\n", destination_type)); 644 ACPI_ERROR((AE_INFO,
645 "Bad destination type during conversion: %X",
646 destination_type));
651 status = AE_AML_INTERNAL; 647 status = AE_AML_INTERNAL;
652 break; 648 break;
653 } 649 }
@@ -660,17 +656,13 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
660 break; 656 break;
661 657
662 default: 658 default:
663 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 659 ACPI_ERROR((AE_INFO,
664 "Unknown Target type ID 0x%X Op %s dest_type %s\n", 660 "Unknown Target type ID 0x%X aml_opcode %X dest_type %s",
665 GET_CURRENT_ARG_TYPE(walk_state->op_info-> 661 GET_CURRENT_ARG_TYPE(walk_state->op_info->
666 runtime_args), 662 runtime_args),
667 walk_state->op_info->name, 663 walk_state->opcode,
668 acpi_ut_get_type_name(destination_type))); 664 acpi_ut_get_type_name(destination_type)));
669 665 status = AE_AML_INTERNAL;
670 ACPI_REPORT_ERROR(("Bad Target Type (ARGI): %X\n",
671 GET_CURRENT_ARG_TYPE(walk_state->op_info->
672 runtime_args)))
673 status = AE_AML_INTERNAL;
674 } 666 }
675 667
676 /* 668 /*
diff --git a/drivers/acpi/executer/excreate.c b/drivers/acpi/executer/excreate.c
index 91c49188fb07..680575402835 100644
--- a/drivers/acpi/executer/excreate.c
+++ b/drivers/acpi/executer/excreate.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -300,8 +300,8 @@ acpi_ex_create_region(u8 * aml_start,
300 */ 300 */
301 if ((region_space >= ACPI_NUM_PREDEFINED_REGIONS) && 301 if ((region_space >= ACPI_NUM_PREDEFINED_REGIONS) &&
302 (region_space < ACPI_USER_REGION_BEGIN)) { 302 (region_space < ACPI_USER_REGION_BEGIN)) {
303 ACPI_REPORT_ERROR(("Invalid address_space type %X\n", 303 ACPI_ERROR((AE_INFO, "Invalid address_space type %X",
304 region_space)); 304 region_space));
305 return_ACPI_STATUS(AE_AML_INVALID_SPACE_ID); 305 return_ACPI_STATUS(AE_AML_INVALID_SPACE_ID);
306 } 306 }
307 307
diff --git a/drivers/acpi/executer/exdump.c b/drivers/acpi/executer/exdump.c
index bc2fa996047e..a7cca8d4f855 100644
--- a/drivers/acpi/executer/exdump.c
+++ b/drivers/acpi/executer/exdump.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -55,20 +55,386 @@ ACPI_MODULE_NAME("exdump")
55 */ 55 */
56#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) 56#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
57/* Local prototypes */ 57/* Local prototypes */
58#ifdef ACPI_FUTURE_USAGE
59static void acpi_ex_out_string(char *title, char *value); 58static void acpi_ex_out_string(char *title, char *value);
60 59
61static void acpi_ex_out_pointer(char *title, void *value); 60static void acpi_ex_out_pointer(char *title, void *value);
62 61
63static void acpi_ex_out_integer(char *title, u32 value);
64
65static void acpi_ex_out_address(char *title, acpi_physical_address value); 62static void acpi_ex_out_address(char *title, acpi_physical_address value);
66 63
67static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc); 64static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc);
68 65
69static void 66static void
70acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index); 67acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
71#endif /* ACPI_FUTURE_USAGE */ 68 u32 level, u32 index);
69
70/*******************************************************************************
71 *
72 * Object Descriptor info tables
73 *
74 * Note: The first table entry must be an INIT opcode and must contain
75 * the table length (number of table entries)
76 *
77 ******************************************************************************/
78
79static struct acpi_exdump_info acpi_ex_dump_integer[2] = {
80 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_integer), NULL},
81 {ACPI_EXD_UINT64, ACPI_EXD_OFFSET(integer.value), "Value"}
82};
83
84static struct acpi_exdump_info acpi_ex_dump_string[4] = {
85 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_string), NULL},
86 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(string.length), "Length"},
87 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(string.pointer), "Pointer"},
88 {ACPI_EXD_STRING, 0, NULL}
89};
90
91static struct acpi_exdump_info acpi_ex_dump_buffer[4] = {
92 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer), NULL},
93 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(buffer.length), "Length"},
94 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer.pointer), "Pointer"},
95 {ACPI_EXD_BUFFER, 0, NULL}
96};
97
98static struct acpi_exdump_info acpi_ex_dump_package[5] = {
99 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_package), NULL},
100 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(package.flags), "Flags"},
101 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(package.count), "Elements"},
102 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(package.elements), "Element List"},
103 {ACPI_EXD_PACKAGE, 0, NULL}
104};
105
106static struct acpi_exdump_info acpi_ex_dump_device[4] = {
107 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_device), NULL},
108 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.handler), "Handler"},
109 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.system_notify),
110 "System Notify"},
111 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.device_notify),
112 "Device Notify"}
113};
114
115static struct acpi_exdump_info acpi_ex_dump_event[2] = {
116 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_event), NULL},
117 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(event.semaphore), "Semaphore"}
118};
119
120static struct acpi_exdump_info acpi_ex_dump_method[8] = {
121 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_method), NULL},
122 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.param_count), "param_count"},
123 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.concurrency), "Concurrency"},
124 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.semaphore), "Semaphore"},
125 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.owner_id), "Owner Id"},
126 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.thread_count), "Thread Count"},
127 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(method.aml_length), "Aml Length"},
128 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.aml_start), "Aml Start"}
129};
130
131static struct acpi_exdump_info acpi_ex_dump_mutex[5] = {
132 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_mutex), NULL},
133 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.sync_level), "Sync Level"},
134 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread), "Owner Thread"},
135 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(mutex.acquisition_depth),
136 "Acquire Depth"},
137 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.semaphore), "Semaphore"}
138};
139
140static struct acpi_exdump_info acpi_ex_dump_region[7] = {
141 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region), NULL},
142 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.space_id), "Space Id"},
143 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.flags), "Flags"},
144 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(region.address), "Address"},
145 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(region.length), "Length"},
146 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(region.handler), "Handler"},
147 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(region.next), "Next"}
148};
149
150static struct acpi_exdump_info acpi_ex_dump_power[5] = {
151 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_power), NULL},
152 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.system_level),
153 "System Level"},
154 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.resource_order),
155 "Resource Order"},
156 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.system_notify),
157 "System Notify"},
158 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.device_notify),
159 "Device Notify"}
160};
161
162static struct acpi_exdump_info acpi_ex_dump_processor[7] = {
163 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_processor), NULL},
164 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(processor.proc_id), "Processor ID"},
165 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(processor.length), "Length"},
166 {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(processor.address), "Address"},
167 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.system_notify),
168 "System Notify"},
169 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.device_notify),
170 "Device Notify"},
171 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.handler), "Handler"}
172};
173
174static struct acpi_exdump_info acpi_ex_dump_thermal[4] = {
175 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_thermal), NULL},
176 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.system_notify),
177 "System Notify"},
178 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.device_notify),
179 "Device Notify"},
180 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.handler), "Handler"}
181};
182
183static struct acpi_exdump_info acpi_ex_dump_buffer_field[3] = {
184 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer_field), NULL},
185 {ACPI_EXD_FIELD, 0, NULL},
186 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer_field.buffer_obj),
187 "Buffer Object"}
188};
189
190static struct acpi_exdump_info acpi_ex_dump_region_field[3] = {
191 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region_field), NULL},
192 {ACPI_EXD_FIELD, 0, NULL},
193 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.region_obj), "Region Object"}
194};
195
196static struct acpi_exdump_info acpi_ex_dump_bank_field[5] = {
197 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL},
198 {ACPI_EXD_FIELD, 0, NULL},
199 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(bank_field.value), "Value"},
200 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.region_obj),
201 "Region Object"},
202 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.bank_obj), "Bank Object"}
203};
204
205static struct acpi_exdump_info acpi_ex_dump_index_field[5] = {
206 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL},
207 {ACPI_EXD_FIELD, 0, NULL},
208 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(index_field.value), "Value"},
209 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.index_obj),
210 "Index Object"},
211 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"}
212};
213
214static struct acpi_exdump_info acpi_ex_dump_reference[7] = {
215 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL},
216 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"},
217 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(reference.offset), "Offset"},
218 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"},
219 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.node), "Node"},
220 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"},
221 {ACPI_EXD_REFERENCE, 0, NULL}
222};
223
224static struct acpi_exdump_info acpi_ex_dump_address_handler[6] = {
225 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_address_handler),
226 NULL},
227 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(address_space.space_id), "Space Id"},
228 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.next), "Next"},
229 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.region_list),
230 "Region List"},
231 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.node), "Node"},
232 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.context), "Context"}
233};
234
235static struct acpi_exdump_info acpi_ex_dump_notify[3] = {
236 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_notify), NULL},
237 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.node), "Node"},
238 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.context), "Context"}
239};
240
241/* Miscellaneous tables */
242
243static struct acpi_exdump_info acpi_ex_dump_common[4] = {
244 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_common), NULL},
245 {ACPI_EXD_TYPE, 0, NULL},
246 {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(common.reference_count),
247 "Reference Count"},
248 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common.flags), "Flags"}
249};
250
251static struct acpi_exdump_info acpi_ex_dump_field_common[7] = {
252 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_field_common), NULL},
253 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.field_flags),
254 "Field Flags"},
255 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.access_byte_width),
256 "Access Byte Width"},
257 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.bit_length),
258 "Bit Length"},
259 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.start_field_bit_offset),
260 "Field Bit Offset"},
261 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.base_byte_offset),
262 "Base Byte Offset"},
263 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(common_field.node), "Parent Node"}
264};
265
266static struct acpi_exdump_info acpi_ex_dump_node[6] = {
267 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_node), NULL},
268 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET(flags), "Flags"},
269 {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET(owner_id), "Owner Id"},
270 {ACPI_EXD_UINT16, ACPI_EXD_NSOFFSET(reference_count),
271 "Reference Count"},
272 {ACPI_EXD_POINTER, ACPI_EXD_NSOFFSET(child), "Child List"},
273 {ACPI_EXD_POINTER, ACPI_EXD_NSOFFSET(peer), "Next Peer"}
274};
275
276/* Dispatch table, indexed by object type */
277
278static struct acpi_exdump_info *acpi_ex_dump_info[] = {
279 NULL,
280 acpi_ex_dump_integer,
281 acpi_ex_dump_string,
282 acpi_ex_dump_buffer,
283 acpi_ex_dump_package,
284 NULL,
285 acpi_ex_dump_device,
286 acpi_ex_dump_event,
287 acpi_ex_dump_method,
288 acpi_ex_dump_mutex,
289 acpi_ex_dump_region,
290 acpi_ex_dump_power,
291 acpi_ex_dump_processor,
292 acpi_ex_dump_thermal,
293 acpi_ex_dump_buffer_field,
294 NULL,
295 NULL,
296 acpi_ex_dump_region_field,
297 acpi_ex_dump_bank_field,
298 acpi_ex_dump_index_field,
299 acpi_ex_dump_reference,
300 NULL,
301 NULL,
302 acpi_ex_dump_notify,
303 acpi_ex_dump_address_handler,
304 NULL,
305 NULL,
306 NULL
307};
308
309/*******************************************************************************
310 *
311 * FUNCTION: acpi_ex_dump_object
312 *
313 * PARAMETERS: obj_desc - Descriptor to dump
314 * Info - Info table corresponding to this object
315 * type
316 *
317 * RETURN: None
318 *
319 * DESCRIPTION: Walk the info table for this object
320 *
321 ******************************************************************************/
322
323static void
324acpi_ex_dump_object(union acpi_operand_object *obj_desc,
325 struct acpi_exdump_info *info)
326{
327 u8 *target;
328 char *name;
329 u8 count;
330
331 if (!info) {
332 acpi_os_printf
333 ("ex_dump_object: Display not implemented for object type %s\n",
334 acpi_ut_get_object_type_name(obj_desc));
335 return;
336 }
337
338 /* First table entry must contain the table length (# of table entries) */
339
340 count = info->offset;
341
342 while (count) {
343 target = ACPI_ADD_PTR(u8, obj_desc, info->offset);
344 name = info->name;
345
346 switch (info->opcode) {
347 case ACPI_EXD_INIT:
348 break;
349
350 case ACPI_EXD_TYPE:
351 acpi_ex_out_string("Type",
352 acpi_ut_get_object_type_name
353 (obj_desc));
354 break;
355
356 case ACPI_EXD_UINT8:
357
358 acpi_os_printf("%20s : %2.2X\n", name, *target);
359 break;
360
361 case ACPI_EXD_UINT16:
362
363 acpi_os_printf("%20s : %4.4X\n", name,
364 ACPI_GET16(target));
365 break;
366
367 case ACPI_EXD_UINT32:
368
369 acpi_os_printf("%20s : %8.8X\n", name,
370 ACPI_GET32(target));
371 break;
372
373 case ACPI_EXD_UINT64:
374
375 acpi_os_printf("%20s : %8.8X%8.8X\n", "Value",
376 ACPI_FORMAT_UINT64(ACPI_GET64(target)));
377 break;
378
379 case ACPI_EXD_POINTER:
380
381 acpi_ex_out_pointer(name,
382 *ACPI_CAST_PTR(void *, target));
383 break;
384
385 case ACPI_EXD_ADDRESS:
386
387 acpi_ex_out_address(name,
388 *ACPI_CAST_PTR
389 (acpi_physical_address, target));
390 break;
391
392 case ACPI_EXD_STRING:
393
394 acpi_ut_print_string(obj_desc->string.pointer,
395 ACPI_UINT8_MAX);
396 acpi_os_printf("\n");
397 break;
398
399 case ACPI_EXD_BUFFER:
400
401 ACPI_DUMP_BUFFER(obj_desc->buffer.pointer,
402 obj_desc->buffer.length);
403 break;
404
405 case ACPI_EXD_PACKAGE:
406
407 /* Dump the package contents */
408
409 acpi_os_printf("\nPackage Contents:\n");
410 acpi_ex_dump_package_obj(obj_desc, 0, 0);
411 break;
412
413 case ACPI_EXD_FIELD:
414
415 acpi_ex_dump_object(obj_desc,
416 acpi_ex_dump_field_common);
417 break;
418
419 case ACPI_EXD_REFERENCE:
420
421 acpi_ex_out_string("Opcode",
422 (acpi_ps_get_opcode_info
423 (obj_desc->reference.opcode))->
424 name);
425 acpi_ex_dump_reference_obj(obj_desc);
426 break;
427
428 default:
429 acpi_os_printf("**** Invalid table opcode [%X] ****\n",
430 info->opcode);
431 return;
432 }
433
434 info++;
435 count--;
436 }
437}
72 438
73/******************************************************************************* 439/*******************************************************************************
74 * 440 *
@@ -214,7 +580,7 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
214 580
215 case ACPI_TYPE_BUFFER: 581 case ACPI_TYPE_BUFFER:
216 582
217 acpi_os_printf("Buffer len %X @ %p \n", 583 acpi_os_printf("Buffer len %X @ %p\n",
218 obj_desc->buffer.length, 584 obj_desc->buffer.length,
219 obj_desc->buffer.pointer); 585 obj_desc->buffer.pointer);
220 586
@@ -320,17 +686,17 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
320 686
321 case ACPI_TYPE_BUFFER_FIELD: 687 case ACPI_TYPE_BUFFER_FIELD:
322 688
323 acpi_os_printf("buffer_field: %X bits at byte %X bit %X of \n", 689 acpi_os_printf("buffer_field: %X bits at byte %X bit %X of\n",
324 obj_desc->buffer_field.bit_length, 690 obj_desc->buffer_field.bit_length,
325 obj_desc->buffer_field.base_byte_offset, 691 obj_desc->buffer_field.base_byte_offset,
326 obj_desc->buffer_field.start_field_bit_offset); 692 obj_desc->buffer_field.start_field_bit_offset);
327 693
328 if (!obj_desc->buffer_field.buffer_obj) { 694 if (!obj_desc->buffer_field.buffer_obj) {
329 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL* \n")); 695 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL*\n"));
330 } else 696 } else
331 if (ACPI_GET_OBJECT_TYPE(obj_desc->buffer_field.buffer_obj) 697 if (ACPI_GET_OBJECT_TYPE(obj_desc->buffer_field.buffer_obj)
332 != ACPI_TYPE_BUFFER) { 698 != ACPI_TYPE_BUFFER) {
333 acpi_os_printf("*not a Buffer* \n"); 699 acpi_os_printf("*not a Buffer*\n");
334 } else { 700 } else {
335 acpi_ex_dump_operand(obj_desc->buffer_field.buffer_obj, 701 acpi_ex_dump_operand(obj_desc->buffer_field.buffer_obj,
336 depth + 1); 702 depth + 1);
@@ -441,7 +807,6 @@ acpi_ex_dump_operands(union acpi_operand_object **operands,
441 return; 807 return;
442} 808}
443 809
444#ifdef ACPI_FUTURE_USAGE
445/******************************************************************************* 810/*******************************************************************************
446 * 811 *
447 * FUNCTION: acpi_ex_out* functions 812 * FUNCTION: acpi_ex_out* functions
@@ -465,11 +830,6 @@ static void acpi_ex_out_pointer(char *title, void *value)
465 acpi_os_printf("%20s : %p\n", title, value); 830 acpi_os_printf("%20s : %p\n", title, value);
466} 831}
467 832
468static void acpi_ex_out_integer(char *title, u32 value)
469{
470 acpi_os_printf("%20s : %.2X\n", title, value);
471}
472
473static void acpi_ex_out_address(char *title, acpi_physical_address value) 833static void acpi_ex_out_address(char *title, acpi_physical_address value)
474{ 834{
475 835
@@ -482,16 +842,16 @@ static void acpi_ex_out_address(char *title, acpi_physical_address value)
482 842
483/******************************************************************************* 843/*******************************************************************************
484 * 844 *
485 * FUNCTION: acpi_ex_dump_node 845 * FUNCTION: acpi_ex_dump_namespace_node
486 * 846 *
487 * PARAMETERS: *Node - Descriptor to dump 847 * PARAMETERS: Node - Descriptor to dump
488 * Flags - Force display if TRUE 848 * Flags - Force display if TRUE
489 * 849 *
490 * DESCRIPTION: Dumps the members of the given.Node 850 * DESCRIPTION: Dumps the members of the given.Node
491 * 851 *
492 ******************************************************************************/ 852 ******************************************************************************/
493 853
494void acpi_ex_dump_node(struct acpi_namespace_node *node, u32 flags) 854void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags)
495{ 855{
496 856
497 ACPI_FUNCTION_ENTRY(); 857 ACPI_FUNCTION_ENTRY();
@@ -506,19 +866,17 @@ void acpi_ex_dump_node(struct acpi_namespace_node *node, u32 flags)
506 866
507 acpi_os_printf("%20s : %4.4s\n", "Name", acpi_ut_get_node_name(node)); 867 acpi_os_printf("%20s : %4.4s\n", "Name", acpi_ut_get_node_name(node));
508 acpi_ex_out_string("Type", acpi_ut_get_type_name(node->type)); 868 acpi_ex_out_string("Type", acpi_ut_get_type_name(node->type));
509 acpi_ex_out_integer("Flags", node->flags);
510 acpi_ex_out_integer("Owner Id", node->owner_id);
511 acpi_ex_out_integer("Reference Count", node->reference_count);
512 acpi_ex_out_pointer("Attached Object", 869 acpi_ex_out_pointer("Attached Object",
513 acpi_ns_get_attached_object(node)); 870 acpi_ns_get_attached_object(node));
514 acpi_ex_out_pointer("child_list", node->child);
515 acpi_ex_out_pointer("next_peer", node->peer);
516 acpi_ex_out_pointer("Parent", acpi_ns_get_parent_node(node)); 871 acpi_ex_out_pointer("Parent", acpi_ns_get_parent_node(node));
872
873 acpi_ex_dump_object(ACPI_CAST_PTR(union acpi_operand_object, node),
874 acpi_ex_dump_node);
517} 875}
518 876
519/******************************************************************************* 877/*******************************************************************************
520 * 878 *
521 * FUNCTION: acpi_ex_dump_reference 879 * FUNCTION: acpi_ex_dump_reference_obj
522 * 880 *
523 * PARAMETERS: Object - Descriptor to dump 881 * PARAMETERS: Object - Descriptor to dump
524 * 882 *
@@ -526,14 +884,16 @@ void acpi_ex_dump_node(struct acpi_namespace_node *node, u32 flags)
526 * 884 *
527 ******************************************************************************/ 885 ******************************************************************************/
528 886
529static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc) 887static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
530{ 888{
531 struct acpi_buffer ret_buf; 889 struct acpi_buffer ret_buf;
532 acpi_status status; 890 acpi_status status;
533 891
892 ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER;
893
534 if (obj_desc->reference.opcode == AML_INT_NAMEPATH_OP) { 894 if (obj_desc->reference.opcode == AML_INT_NAMEPATH_OP) {
535 acpi_os_printf("Named Object %p ", obj_desc->reference.node); 895 acpi_os_printf("Named Object %p ", obj_desc->reference.node);
536 ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER; 896
537 status = 897 status =
538 acpi_ns_handle_to_pathname(obj_desc->reference.node, 898 acpi_ns_handle_to_pathname(obj_desc->reference.node,
539 &ret_buf); 899 &ret_buf);
@@ -551,9 +911,9 @@ static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc)
551 911
552/******************************************************************************* 912/*******************************************************************************
553 * 913 *
554 * FUNCTION: acpi_ex_dump_package 914 * FUNCTION: acpi_ex_dump_package_obj
555 * 915 *
556 * PARAMETERS: Object - Descriptor to dump 916 * PARAMETERS: obj_desc - Descriptor to dump
557 * Level - Indentation Level 917 * Level - Indentation Level
558 * Index - Package index for this object 918 * Index - Package index for this object
559 * 919 *
@@ -562,7 +922,8 @@ static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc)
562 ******************************************************************************/ 922 ******************************************************************************/
563 923
564static void 924static void
565acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index) 925acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
926 u32 level, u32 index)
566{ 927{
567 u32 i; 928 u32 i;
568 929
@@ -608,7 +969,8 @@ acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index)
608 acpi_os_printf("[Buffer] Length %.2X = ", 969 acpi_os_printf("[Buffer] Length %.2X = ",
609 obj_desc->buffer.length); 970 obj_desc->buffer.length);
610 if (obj_desc->buffer.length) { 971 if (obj_desc->buffer.length) {
611 acpi_ut_dump_buffer((u8 *) obj_desc->buffer.pointer, 972 acpi_ut_dump_buffer(ACPI_CAST_PTR
973 (u8, obj_desc->buffer.pointer),
612 obj_desc->buffer.length, 974 obj_desc->buffer.length,
613 DB_DWORD_DISPLAY, _COMPONENT); 975 DB_DWORD_DISPLAY, _COMPONENT);
614 } else { 976 } else {
@@ -618,19 +980,19 @@ acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index)
618 980
619 case ACPI_TYPE_PACKAGE: 981 case ACPI_TYPE_PACKAGE:
620 982
621 acpi_os_printf("[Package] Contains %d Elements: \n", 983 acpi_os_printf("[Package] Contains %d Elements:\n",
622 obj_desc->package.count); 984 obj_desc->package.count);
623 985
624 for (i = 0; i < obj_desc->package.count; i++) { 986 for (i = 0; i < obj_desc->package.count; i++) {
625 acpi_ex_dump_package(obj_desc->package.elements[i], 987 acpi_ex_dump_package_obj(obj_desc->package.elements[i],
626 level + 1, i); 988 level + 1, i);
627 } 989 }
628 break; 990 break;
629 991
630 case ACPI_TYPE_LOCAL_REFERENCE: 992 case ACPI_TYPE_LOCAL_REFERENCE:
631 993
632 acpi_os_printf("[Object Reference] "); 994 acpi_os_printf("[Object Reference] ");
633 acpi_ex_dump_reference(obj_desc); 995 acpi_ex_dump_reference_obj(obj_desc);
634 break; 996 break;
635 997
636 default: 998 default:
@@ -645,7 +1007,7 @@ acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index)
645 * 1007 *
646 * FUNCTION: acpi_ex_dump_object_descriptor 1008 * FUNCTION: acpi_ex_dump_object_descriptor
647 * 1009 *
648 * PARAMETERS: Object - Descriptor to dump 1010 * PARAMETERS: obj_desc - Descriptor to dump
649 * Flags - Force display if TRUE 1011 * Flags - Force display if TRUE
650 * 1012 *
651 * DESCRIPTION: Dumps the members of the object descriptor given. 1013 * DESCRIPTION: Dumps the members of the object descriptor given.
@@ -670,11 +1032,13 @@ acpi_ex_dump_object_descriptor(union acpi_operand_object *obj_desc, u32 flags)
670 } 1032 }
671 1033
672 if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) { 1034 if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) {
673 acpi_ex_dump_node((struct acpi_namespace_node *)obj_desc, 1035 acpi_ex_dump_namespace_node((struct acpi_namespace_node *)
674 flags); 1036 obj_desc, flags);
1037
675 acpi_os_printf("\nAttached Object (%p):\n", 1038 acpi_os_printf("\nAttached Object (%p):\n",
676 ((struct acpi_namespace_node *)obj_desc)-> 1039 ((struct acpi_namespace_node *)obj_desc)->
677 object); 1040 object);
1041
678 acpi_ex_dump_object_descriptor(((struct acpi_namespace_node *) 1042 acpi_ex_dump_object_descriptor(((struct acpi_namespace_node *)
679 obj_desc)->object, flags); 1043 obj_desc)->object, flags);
680 return_VOID; 1044 return_VOID;
@@ -687,233 +1051,18 @@ acpi_ex_dump_object_descriptor(union acpi_operand_object *obj_desc, u32 flags)
687 return_VOID; 1051 return_VOID;
688 } 1052 }
689 1053
690 /* Common Fields */ 1054 if (obj_desc->common.type > ACPI_TYPE_NS_NODE_MAX) {
691 1055 return_VOID;
692 acpi_ex_out_string("Type", acpi_ut_get_object_type_name(obj_desc)); 1056 }
693 acpi_ex_out_integer("Reference Count",
694 obj_desc->common.reference_count);
695 acpi_ex_out_integer("Flags", obj_desc->common.flags);
696
697 /* Object-specific Fields */
698
699 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
700 case ACPI_TYPE_INTEGER:
701
702 acpi_os_printf("%20s : %8.8X%8.8X\n", "Value",
703 ACPI_FORMAT_UINT64(obj_desc->integer.value));
704 break;
705
706 case ACPI_TYPE_STRING:
707
708 acpi_ex_out_integer("Length", obj_desc->string.length);
709
710 acpi_os_printf("%20s : %p ", "Pointer",
711 obj_desc->string.pointer);
712 acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX);
713 acpi_os_printf("\n");
714 break;
715
716 case ACPI_TYPE_BUFFER:
717
718 acpi_ex_out_integer("Length", obj_desc->buffer.length);
719 acpi_ex_out_pointer("Pointer", obj_desc->buffer.pointer);
720 ACPI_DUMP_BUFFER(obj_desc->buffer.pointer,
721 obj_desc->buffer.length);
722 break;
723
724 case ACPI_TYPE_PACKAGE:
725
726 acpi_ex_out_integer("Flags", obj_desc->package.flags);
727 acpi_ex_out_integer("Elements", obj_desc->package.count);
728 acpi_ex_out_pointer("Element List", obj_desc->package.elements);
729
730 /* Dump the package contents */
731
732 acpi_os_printf("\nPackage Contents:\n");
733 acpi_ex_dump_package(obj_desc, 0, 0);
734 break;
735
736 case ACPI_TYPE_DEVICE:
737
738 acpi_ex_out_pointer("Handler", obj_desc->device.handler);
739 acpi_ex_out_pointer("system_notify",
740 obj_desc->device.system_notify);
741 acpi_ex_out_pointer("device_notify",
742 obj_desc->device.device_notify);
743 break;
744
745 case ACPI_TYPE_EVENT:
746
747 acpi_ex_out_pointer("Semaphore", obj_desc->event.semaphore);
748 break;
749
750 case ACPI_TYPE_METHOD:
751
752 acpi_ex_out_integer("param_count",
753 obj_desc->method.param_count);
754 acpi_ex_out_integer("Concurrency",
755 obj_desc->method.concurrency);
756 acpi_ex_out_pointer("Semaphore", obj_desc->method.semaphore);
757 acpi_ex_out_integer("owner_id", obj_desc->method.owner_id);
758 acpi_ex_out_integer("aml_length", obj_desc->method.aml_length);
759 acpi_ex_out_pointer("aml_start", obj_desc->method.aml_start);
760 break;
761
762 case ACPI_TYPE_MUTEX:
763
764 acpi_ex_out_integer("sync_level", obj_desc->mutex.sync_level);
765 acpi_ex_out_pointer("owner_thread",
766 obj_desc->mutex.owner_thread);
767 acpi_ex_out_integer("acquire_depth",
768 obj_desc->mutex.acquisition_depth);
769 acpi_ex_out_pointer("Semaphore", obj_desc->mutex.semaphore);
770 break;
771
772 case ACPI_TYPE_REGION:
773
774 acpi_ex_out_integer("space_id", obj_desc->region.space_id);
775 acpi_ex_out_integer("Flags", obj_desc->region.flags);
776 acpi_ex_out_address("Address", obj_desc->region.address);
777 acpi_ex_out_integer("Length", obj_desc->region.length);
778 acpi_ex_out_pointer("Handler", obj_desc->region.handler);
779 acpi_ex_out_pointer("Next", obj_desc->region.next);
780 break;
781
782 case ACPI_TYPE_POWER:
783
784 acpi_ex_out_integer("system_level",
785 obj_desc->power_resource.system_level);
786 acpi_ex_out_integer("resource_order",
787 obj_desc->power_resource.resource_order);
788 acpi_ex_out_pointer("system_notify",
789 obj_desc->power_resource.system_notify);
790 acpi_ex_out_pointer("device_notify",
791 obj_desc->power_resource.device_notify);
792 break;
793
794 case ACPI_TYPE_PROCESSOR:
795
796 acpi_ex_out_integer("Processor ID",
797 obj_desc->processor.proc_id);
798 acpi_ex_out_integer("Length", obj_desc->processor.length);
799 acpi_ex_out_address("Address",
800 (acpi_physical_address) obj_desc->processor.
801 address);
802 acpi_ex_out_pointer("system_notify",
803 obj_desc->processor.system_notify);
804 acpi_ex_out_pointer("device_notify",
805 obj_desc->processor.device_notify);
806 acpi_ex_out_pointer("Handler", obj_desc->processor.handler);
807 break;
808
809 case ACPI_TYPE_THERMAL:
810
811 acpi_ex_out_pointer("system_notify",
812 obj_desc->thermal_zone.system_notify);
813 acpi_ex_out_pointer("device_notify",
814 obj_desc->thermal_zone.device_notify);
815 acpi_ex_out_pointer("Handler", obj_desc->thermal_zone.handler);
816 break;
817
818 case ACPI_TYPE_BUFFER_FIELD:
819 case ACPI_TYPE_LOCAL_REGION_FIELD:
820 case ACPI_TYPE_LOCAL_BANK_FIELD:
821 case ACPI_TYPE_LOCAL_INDEX_FIELD:
822
823 acpi_ex_out_integer("field_flags",
824 obj_desc->common_field.field_flags);
825 acpi_ex_out_integer("access_byte_width",
826 obj_desc->common_field.access_byte_width);
827 acpi_ex_out_integer("bit_length",
828 obj_desc->common_field.bit_length);
829 acpi_ex_out_integer("fld_bit_offset",
830 obj_desc->common_field.
831 start_field_bit_offset);
832 acpi_ex_out_integer("base_byte_offset",
833 obj_desc->common_field.base_byte_offset);
834 acpi_ex_out_pointer("parent_node", obj_desc->common_field.node);
835
836 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
837 case ACPI_TYPE_BUFFER_FIELD:
838 acpi_ex_out_pointer("buffer_obj",
839 obj_desc->buffer_field.buffer_obj);
840 break;
841
842 case ACPI_TYPE_LOCAL_REGION_FIELD:
843 acpi_ex_out_pointer("region_obj",
844 obj_desc->field.region_obj);
845 break;
846
847 case ACPI_TYPE_LOCAL_BANK_FIELD:
848 acpi_ex_out_integer("Value",
849 obj_desc->bank_field.value);
850 acpi_ex_out_pointer("region_obj",
851 obj_desc->bank_field.region_obj);
852 acpi_ex_out_pointer("bank_obj",
853 obj_desc->bank_field.bank_obj);
854 break;
855
856 case ACPI_TYPE_LOCAL_INDEX_FIELD:
857 acpi_ex_out_integer("Value",
858 obj_desc->index_field.value);
859 acpi_ex_out_pointer("Index",
860 obj_desc->index_field.index_obj);
861 acpi_ex_out_pointer("Data",
862 obj_desc->index_field.data_obj);
863 break;
864
865 default:
866 /* All object types covered above */
867 break;
868 }
869 break;
870
871 case ACPI_TYPE_LOCAL_REFERENCE:
872
873 acpi_ex_out_integer("target_type",
874 obj_desc->reference.target_type);
875 acpi_ex_out_string("Opcode",
876 (acpi_ps_get_opcode_info
877 (obj_desc->reference.opcode))->name);
878 acpi_ex_out_integer("Offset", obj_desc->reference.offset);
879 acpi_ex_out_pointer("obj_desc", obj_desc->reference.object);
880 acpi_ex_out_pointer("Node", obj_desc->reference.node);
881 acpi_ex_out_pointer("Where", obj_desc->reference.where);
882
883 acpi_ex_dump_reference(obj_desc);
884 break;
885
886 case ACPI_TYPE_LOCAL_ADDRESS_HANDLER:
887
888 acpi_ex_out_integer("space_id",
889 obj_desc->address_space.space_id);
890 acpi_ex_out_pointer("Next", obj_desc->address_space.next);
891 acpi_ex_out_pointer("region_list",
892 obj_desc->address_space.region_list);
893 acpi_ex_out_pointer("Node", obj_desc->address_space.node);
894 acpi_ex_out_pointer("Context", obj_desc->address_space.context);
895 break;
896 1057
897 case ACPI_TYPE_LOCAL_NOTIFY: 1058 /* Common Fields */
898 1059
899 acpi_ex_out_pointer("Node", obj_desc->notify.node); 1060 acpi_ex_dump_object(obj_desc, acpi_ex_dump_common);
900 acpi_ex_out_pointer("Context", obj_desc->notify.context);
901 break;
902 1061
903 case ACPI_TYPE_LOCAL_ALIAS: 1062 /* Object-specific fields */
904 case ACPI_TYPE_LOCAL_METHOD_ALIAS:
905 case ACPI_TYPE_LOCAL_EXTRA:
906 case ACPI_TYPE_LOCAL_DATA:
907 default:
908
909 acpi_os_printf
910 ("ex_dump_object_descriptor: Display not implemented for object type %s\n",
911 acpi_ut_get_object_type_name(obj_desc));
912 break;
913 }
914 1063
1064 acpi_ex_dump_object(obj_desc, acpi_ex_dump_info[obj_desc->common.type]);
915 return_VOID; 1065 return_VOID;
916} 1066}
917 1067
918#endif /* ACPI_FUTURE_USAGE */
919#endif 1068#endif
diff --git a/drivers/acpi/executer/exfield.c b/drivers/acpi/executer/exfield.c
index ab1ba399aa28..e259201ce9a0 100644
--- a/drivers/acpi/executer/exfield.c
+++ b/drivers/acpi/executer/exfield.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -249,13 +249,18 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
249 * Source must be a buffer of sufficient size (ACPI_SMBUS_BUFFER_SIZE). 249 * Source must be a buffer of sufficient size (ACPI_SMBUS_BUFFER_SIZE).
250 */ 250 */
251 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_BUFFER) { 251 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_BUFFER) {
252 ACPI_REPORT_ERROR(("SMBus write requires Buffer, found type %s\n", acpi_ut_get_object_type_name(source_desc))); 252 ACPI_ERROR((AE_INFO,
253 "SMBus write requires Buffer, found type %s",
254 acpi_ut_get_object_type_name(source_desc)));
253 255
254 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 256 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
255 } 257 }
256 258
257 if (source_desc->buffer.length < ACPI_SMBUS_BUFFER_SIZE) { 259 if (source_desc->buffer.length < ACPI_SMBUS_BUFFER_SIZE) {
258 ACPI_REPORT_ERROR(("SMBus write requires Buffer of length %X, found length %X\n", ACPI_SMBUS_BUFFER_SIZE, source_desc->buffer.length)); 260 ACPI_ERROR((AE_INFO,
261 "SMBus write requires Buffer of length %X, found length %X",
262 ACPI_SMBUS_BUFFER_SIZE,
263 source_desc->buffer.length));
259 264
260 return_ACPI_STATUS(AE_AML_BUFFER_LIMIT); 265 return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
261 } 266 }
diff --git a/drivers/acpi/executer/exfldio.c b/drivers/acpi/executer/exfldio.c
index ba6e08843c29..bd1af35f7fcf 100644
--- a/drivers/acpi/executer/exfldio.c
+++ b/drivers/acpi/executer/exfldio.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -94,10 +94,9 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
94 /* We must have a valid region */ 94 /* We must have a valid region */
95 95
96 if (ACPI_GET_OBJECT_TYPE(rgn_desc) != ACPI_TYPE_REGION) { 96 if (ACPI_GET_OBJECT_TYPE(rgn_desc) != ACPI_TYPE_REGION) {
97 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 97 ACPI_ERROR((AE_INFO, "Needed Region, found type %X (%s)",
98 "Needed Region, found type %X (%s)\n", 98 ACPI_GET_OBJECT_TYPE(rgn_desc),
99 ACPI_GET_OBJECT_TYPE(rgn_desc), 99 acpi_ut_get_object_type_name(rgn_desc)));
100 acpi_ut_get_object_type_name(rgn_desc)));
101 100
102 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 101 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
103 } 102 }
@@ -162,31 +161,28 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
162 * than the region itself. For example, a region of length one 161 * than the region itself. For example, a region of length one
163 * byte, and a field with Dword access specified. 162 * byte, and a field with Dword access specified.
164 */ 163 */
165 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 164 ACPI_ERROR((AE_INFO,
166 "Field [%4.4s] access width (%d bytes) too large for region [%4.4s] (length %X)\n", 165 "Field [%4.4s] access width (%d bytes) too large for region [%4.4s] (length %X)",
167 acpi_ut_get_node_name(obj_desc-> 166 acpi_ut_get_node_name(obj_desc->
168 common_field. 167 common_field.node),
169 node), 168 obj_desc->common_field.access_byte_width,
170 obj_desc->common_field. 169 acpi_ut_get_node_name(rgn_desc->region.
171 access_byte_width, 170 node),
172 acpi_ut_get_node_name(rgn_desc-> 171 rgn_desc->region.length));
173 region.node),
174 rgn_desc->region.length));
175 } 172 }
176 173
177 /* 174 /*
178 * Offset rounded up to next multiple of field width 175 * Offset rounded up to next multiple of field width
179 * exceeds region length, indicate an error 176 * exceeds region length, indicate an error
180 */ 177 */
181 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 178 ACPI_ERROR((AE_INFO,
182 "Field [%4.4s] Base+Offset+Width %X+%X+%X is beyond end of region [%4.4s] (length %X)\n", 179 "Field [%4.4s] Base+Offset+Width %X+%X+%X is beyond end of region [%4.4s] (length %X)",
183 acpi_ut_get_node_name(obj_desc->common_field. 180 acpi_ut_get_node_name(obj_desc->common_field.node),
184 node), 181 obj_desc->common_field.base_byte_offset,
185 obj_desc->common_field.base_byte_offset, 182 field_datum_byte_offset,
186 field_datum_byte_offset, 183 obj_desc->common_field.access_byte_width,
187 obj_desc->common_field.access_byte_width, 184 acpi_ut_get_node_name(rgn_desc->region.node),
188 acpi_ut_get_node_name(rgn_desc->region.node), 185 rgn_desc->region.length));
189 rgn_desc->region.length));
190 186
191 return_ACPI_STATUS(AE_AML_REGION_LIMIT); 187 return_ACPI_STATUS(AE_AML_REGION_LIMIT);
192 } 188 }
@@ -270,18 +266,17 @@ acpi_ex_access_region(union acpi_operand_object *obj_desc,
270 266
271 if (ACPI_FAILURE(status)) { 267 if (ACPI_FAILURE(status)) {
272 if (status == AE_NOT_IMPLEMENTED) { 268 if (status == AE_NOT_IMPLEMENTED) {
273 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 269 ACPI_ERROR((AE_INFO,
274 "Region %s(%X) not implemented\n", 270 "Region %s(%X) not implemented",
275 acpi_ut_get_region_name(rgn_desc-> 271 acpi_ut_get_region_name(rgn_desc->region.
276 region. 272 space_id),
277 space_id), 273 rgn_desc->region.space_id));
278 rgn_desc->region.space_id));
279 } else if (status == AE_NOT_EXIST) { 274 } else if (status == AE_NOT_EXIST) {
280 ACPI_REPORT_ERROR(("Region %s(%X) has no handler\n", 275 ACPI_ERROR((AE_INFO,
281 acpi_ut_get_region_name(rgn_desc-> 276 "Region %s(%X) has no handler",
282 region. 277 acpi_ut_get_region_name(rgn_desc->region.
283 space_id), 278 space_id),
284 rgn_desc->region.space_id)); 279 rgn_desc->region.space_id));
285 } 280 }
286 } 281 }
287 282
@@ -514,8 +509,8 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
514 509
515 default: 510 default:
516 511
517 ACPI_REPORT_ERROR(("Wrong object type in field I/O %X\n", 512 ACPI_ERROR((AE_INFO, "Wrong object type in field I/O %X",
518 ACPI_GET_OBJECT_TYPE(obj_desc))); 513 ACPI_GET_OBJECT_TYPE(obj_desc)));
519 status = AE_AML_INTERNAL; 514 status = AE_AML_INTERNAL;
520 break; 515 break;
521 } 516 }
@@ -618,11 +613,11 @@ acpi_ex_write_with_update_rule(union acpi_operand_object *obj_desc,
618 613
619 default: 614 default:
620 615
621 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 616 ACPI_ERROR((AE_INFO,
622 "write_with_update_rule: Unknown update_rule setting: %X\n", 617 "Unknown update_rule value: %X",
623 (obj_desc->common_field. 618 (obj_desc->common_field.
624 field_flags & 619 field_flags &
625 AML_FIELD_UPDATE_RULE_MASK))); 620 AML_FIELD_UPDATE_RULE_MASK)));
626 return_ACPI_STATUS(AE_AML_OPERAND_VALUE); 621 return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
627 } 622 }
628 } 623 }
@@ -677,10 +672,9 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
677 672
678 if (buffer_length < 673 if (buffer_length <
679 ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length)) { 674 ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length)) {
680 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 675 ACPI_ERROR((AE_INFO,
681 "Field size %X (bits) is too large for buffer (%X)\n", 676 "Field size %X (bits) is too large for buffer (%X)",
682 obj_desc->common_field.bit_length, 677 obj_desc->common_field.bit_length, buffer_length));
683 buffer_length));
684 678
685 return_ACPI_STATUS(AE_BUFFER_OVERFLOW); 679 return_ACPI_STATUS(AE_BUFFER_OVERFLOW);
686 } 680 }
@@ -792,10 +786,9 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
792 786
793 if (buffer_length < 787 if (buffer_length <
794 ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length)) { 788 ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length)) {
795 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 789 ACPI_ERROR((AE_INFO,
796 "Field size %X (bits) is too large for buffer (%X)\n", 790 "Field size %X (bits) is too large for buffer (%X)",
797 obj_desc->common_field.bit_length, 791 obj_desc->common_field.bit_length, buffer_length));
798 buffer_length));
799 792
800 return_ACPI_STATUS(AE_BUFFER_OVERFLOW); 793 return_ACPI_STATUS(AE_BUFFER_OVERFLOW);
801 } 794 }
diff --git a/drivers/acpi/executer/exmisc.c b/drivers/acpi/executer/exmisc.c
index a3f4d72bedc9..48c18d29222a 100644
--- a/drivers/acpi/executer/exmisc.c
+++ b/drivers/acpi/executer/exmisc.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -45,6 +45,7 @@
45#include <acpi/acpi.h> 45#include <acpi/acpi.h>
46#include <acpi/acinterp.h> 46#include <acpi/acinterp.h>
47#include <acpi/amlcode.h> 47#include <acpi/amlcode.h>
48#include <acpi/amlresrc.h>
48 49
49#define _COMPONENT ACPI_EXECUTER 50#define _COMPONENT ACPI_EXECUTER
50ACPI_MODULE_NAME("exmisc") 51ACPI_MODULE_NAME("exmisc")
@@ -97,7 +98,8 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
97 98
98 default: 99 default:
99 100
100 ACPI_REPORT_ERROR(("Unknown Reference opcode in get_reference %X\n", obj_desc->reference.opcode)); 101 ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X",
102 obj_desc->reference.opcode));
101 return_ACPI_STATUS(AE_AML_INTERNAL); 103 return_ACPI_STATUS(AE_AML_INTERNAL);
102 } 104 }
103 break; 105 break;
@@ -112,7 +114,8 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
112 114
113 default: 115 default:
114 116
115 ACPI_REPORT_ERROR(("Invalid descriptor type in get_reference: %X\n", ACPI_GET_DESCRIPTOR_TYPE(obj_desc))); 117 ACPI_ERROR((AE_INFO, "Invalid descriptor type %X",
118 ACPI_GET_DESCRIPTOR_TYPE(obj_desc)));
116 return_ACPI_STATUS(AE_TYPE); 119 return_ACPI_STATUS(AE_TYPE);
117 } 120 }
118 121
@@ -157,48 +160,65 @@ acpi_ex_concat_template(union acpi_operand_object *operand0,
157 union acpi_operand_object **actual_return_desc, 160 union acpi_operand_object **actual_return_desc,
158 struct acpi_walk_state *walk_state) 161 struct acpi_walk_state *walk_state)
159{ 162{
163 acpi_status status;
160 union acpi_operand_object *return_desc; 164 union acpi_operand_object *return_desc;
161 u8 *new_buf; 165 u8 *new_buf;
162 u8 *end_tag1; 166 u8 *end_tag;
163 u8 *end_tag2; 167 acpi_size length0;
164 acpi_size length1; 168 acpi_size length1;
165 acpi_size length2; 169 acpi_size new_length;
166 170
167 ACPI_FUNCTION_TRACE("ex_concat_template"); 171 ACPI_FUNCTION_TRACE("ex_concat_template");
168 172
169 /* Find the end_tags in each resource template */ 173 /*
174 * Find the end_tag descriptor in each resource template.
175 * Note1: returned pointers point TO the end_tag, not past it.
176 * Note2: zero-length buffers are allowed; treated like one end_tag
177 */
178
179 /* Get the length of the first resource template */
170 180
171 end_tag1 = acpi_ut_get_resource_end_tag(operand0); 181 status = acpi_ut_get_resource_end_tag(operand0, &end_tag);
172 end_tag2 = acpi_ut_get_resource_end_tag(operand1); 182 if (ACPI_FAILURE(status)) {
173 if (!end_tag1 || !end_tag2) { 183 return_ACPI_STATUS(status);
174 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
175 } 184 }
176 185
177 /* Compute the length of each part */ 186 length0 = ACPI_PTR_DIFF(end_tag, operand0->buffer.pointer);
187
188 /* Get the length of the second resource template */
189
190 status = acpi_ut_get_resource_end_tag(operand1, &end_tag);
191 if (ACPI_FAILURE(status)) {
192 return_ACPI_STATUS(status);
193 }
178 194
179 length1 = ACPI_PTR_DIFF(end_tag1, operand0->buffer.pointer); 195 length1 = ACPI_PTR_DIFF(end_tag, operand1->buffer.pointer);
180 length2 = ACPI_PTR_DIFF(end_tag2, operand1->buffer.pointer) + 2; /* Size of END_TAG */
181 196
182 /* Create a new buffer object for the result */ 197 /* Combine both lengths, minimum size will be 2 for end_tag */
183 198
184 return_desc = acpi_ut_create_buffer_object(length1 + length2); 199 new_length = length0 + length1 + sizeof(struct aml_resource_end_tag);
200
201 /* Create a new buffer object for the result (with one end_tag) */
202
203 return_desc = acpi_ut_create_buffer_object(new_length);
185 if (!return_desc) { 204 if (!return_desc) {
186 return_ACPI_STATUS(AE_NO_MEMORY); 205 return_ACPI_STATUS(AE_NO_MEMORY);
187 } 206 }
188 207
189 /* Copy the templates to the new descriptor */ 208 /*
190 209 * Copy the templates to the new buffer, 0 first, then 1 follows. One
210 * end_tag descriptor is copied from Operand1.
211 */
191 new_buf = return_desc->buffer.pointer; 212 new_buf = return_desc->buffer.pointer;
192 ACPI_MEMCPY(new_buf, operand0->buffer.pointer, length1); 213 ACPI_MEMCPY(new_buf, operand0->buffer.pointer, length0);
193 ACPI_MEMCPY(new_buf + length1, operand1->buffer.pointer, length2); 214 ACPI_MEMCPY(new_buf + length0, operand1->buffer.pointer, length1);
194 215
195 /* Compute the new checksum */ 216 /* Insert end_tag and set the checksum to zero, means "ignore checksum" */
196 217
197 new_buf[return_desc->buffer.length - 1] = 218 new_buf[new_length - 1] = 0;
198 acpi_ut_generate_checksum(return_desc->buffer.pointer, 219 new_buf[new_length - 2] = ACPI_RESOURCE_NAME_END_TAG | 1;
199 (return_desc->buffer.length - 1));
200 220
201 /* Return the completed template descriptor */ 221 /* Return the completed resource template */
202 222
203 *actual_return_desc = return_desc; 223 *actual_return_desc = return_desc;
204 return_ACPI_STATUS(AE_OK); 224 return_ACPI_STATUS(AE_OK);
@@ -229,7 +249,6 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
229 union acpi_operand_object *return_desc; 249 union acpi_operand_object *return_desc;
230 char *new_buf; 250 char *new_buf;
231 acpi_status status; 251 acpi_status status;
232 acpi_size new_length;
233 252
234 ACPI_FUNCTION_TRACE("ex_do_concatenate"); 253 ACPI_FUNCTION_TRACE("ex_do_concatenate");
235 254
@@ -256,8 +275,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
256 break; 275 break;
257 276
258 default: 277 default:
259 ACPI_REPORT_ERROR(("Concat - invalid obj type: %X\n", 278 ACPI_ERROR((AE_INFO, "Invalid object type: %X",
260 ACPI_GET_OBJECT_TYPE(operand0))); 279 ACPI_GET_OBJECT_TYPE(operand0)));
261 status = AE_AML_INTERNAL; 280 status = AE_AML_INTERNAL;
262 } 281 }
263 282
@@ -296,8 +315,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
296 315
297 /* Copy the first integer, LSB first */ 316 /* Copy the first integer, LSB first */
298 317
299 ACPI_MEMCPY(new_buf, 318 ACPI_MEMCPY(new_buf, &operand0->integer.value,
300 &operand0->integer.value,
301 acpi_gbl_integer_byte_width); 319 acpi_gbl_integer_byte_width);
302 320
303 /* Copy the second integer (LSB first) after the first */ 321 /* Copy the second integer (LSB first) after the first */
@@ -311,14 +329,11 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
311 329
312 /* Result of two Strings is a String */ 330 /* Result of two Strings is a String */
313 331
314 new_length = (acpi_size) operand0->string.length + 332 return_desc = acpi_ut_create_string_object((acpi_size)
315 (acpi_size) local_operand1->string.length; 333 (operand0->string.
316 if (new_length > ACPI_MAX_STRING_CONVERSION) { 334 length +
317 status = AE_AML_STRING_LIMIT; 335 local_operand1->
318 goto cleanup; 336 string.length));
319 }
320
321 return_desc = acpi_ut_create_string_object(new_length);
322 if (!return_desc) { 337 if (!return_desc) {
323 status = AE_NO_MEMORY; 338 status = AE_NO_MEMORY;
324 goto cleanup; 339 goto cleanup;
@@ -338,11 +353,10 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
338 /* Result of two Buffers is a Buffer */ 353 /* Result of two Buffers is a Buffer */
339 354
340 return_desc = acpi_ut_create_buffer_object((acpi_size) 355 return_desc = acpi_ut_create_buffer_object((acpi_size)
341 operand0->buffer. 356 (operand0->buffer.
342 length + 357 length +
343 (acpi_size) 358 local_operand1->
344 local_operand1-> 359 buffer.length));
345 buffer.length);
346 if (!return_desc) { 360 if (!return_desc) {
347 status = AE_NO_MEMORY; 361 status = AE_NO_MEMORY;
348 goto cleanup; 362 goto cleanup;
@@ -352,8 +366,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
352 366
353 /* Concatenate the buffers */ 367 /* Concatenate the buffers */
354 368
355 ACPI_MEMCPY(new_buf, 369 ACPI_MEMCPY(new_buf, operand0->buffer.pointer,
356 operand0->buffer.pointer, operand0->buffer.length); 370 operand0->buffer.length);
357 ACPI_MEMCPY(new_buf + operand0->buffer.length, 371 ACPI_MEMCPY(new_buf + operand0->buffer.length,
358 local_operand1->buffer.pointer, 372 local_operand1->buffer.pointer,
359 local_operand1->buffer.length); 373 local_operand1->buffer.length);
@@ -363,8 +377,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
363 377
364 /* Invalid object type, should not happen here */ 378 /* Invalid object type, should not happen here */
365 379
366 ACPI_REPORT_ERROR(("Concatenate - Invalid object type: %X\n", 380 ACPI_ERROR((AE_INFO, "Invalid object type: %X",
367 ACPI_GET_OBJECT_TYPE(operand0))); 381 ACPI_GET_OBJECT_TYPE(operand0)));
368 status = AE_AML_INTERNAL; 382 status = AE_AML_INTERNAL;
369 goto cleanup; 383 goto cleanup;
370 } 384 }
@@ -625,9 +639,8 @@ acpi_ex_do_logical_op(u16 opcode,
625 639
626 /* Lexicographic compare: compare the data bytes */ 640 /* Lexicographic compare: compare the data bytes */
627 641
628 compare = ACPI_MEMCMP((const char *)operand0->buffer.pointer, 642 compare = ACPI_MEMCMP(operand0->buffer.pointer,
629 (const char *)local_operand1->buffer. 643 local_operand1->buffer.pointer,
630 pointer,
631 (length0 > length1) ? length1 : length0); 644 (length0 > length1) ? length1 : length0);
632 645
633 switch (opcode) { 646 switch (opcode) {
diff --git a/drivers/acpi/executer/exmutex.c b/drivers/acpi/executer/exmutex.c
index ab47f6d8b5c0..f843b22e20b9 100644
--- a/drivers/acpi/executer/exmutex.c
+++ b/drivers/acpi/executer/exmutex.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -153,7 +153,9 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
153 /* Sanity check -- we must have a valid thread ID */ 153 /* Sanity check -- we must have a valid thread ID */
154 154
155 if (!walk_state->thread) { 155 if (!walk_state->thread) {
156 ACPI_REPORT_ERROR(("Cannot acquire Mutex [%4.4s], null thread info\n", acpi_ut_get_node_name(obj_desc->mutex.node))); 156 ACPI_ERROR((AE_INFO,
157 "Cannot acquire Mutex [%4.4s], null thread info",
158 acpi_ut_get_node_name(obj_desc->mutex.node)));
157 return_ACPI_STATUS(AE_AML_INTERNAL); 159 return_ACPI_STATUS(AE_AML_INTERNAL);
158 } 160 }
159 161
@@ -162,7 +164,9 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
162 * mutex. This mechanism provides some deadlock prevention 164 * mutex. This mechanism provides some deadlock prevention
163 */ 165 */
164 if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) { 166 if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) {
165 ACPI_REPORT_ERROR(("Cannot acquire Mutex [%4.4s], incorrect sync_level\n", acpi_ut_get_node_name(obj_desc->mutex.node))); 167 ACPI_ERROR((AE_INFO,
168 "Cannot acquire Mutex [%4.4s], incorrect sync_level",
169 acpi_ut_get_node_name(obj_desc->mutex.node)));
166 return_ACPI_STATUS(AE_AML_MUTEX_ORDER); 170 return_ACPI_STATUS(AE_AML_MUTEX_ORDER);
167 } 171 }
168 172
@@ -237,14 +241,18 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
237 /* The mutex must have been previously acquired in order to release it */ 241 /* The mutex must have been previously acquired in order to release it */
238 242
239 if (!obj_desc->mutex.owner_thread) { 243 if (!obj_desc->mutex.owner_thread) {
240 ACPI_REPORT_ERROR(("Cannot release Mutex [%4.4s], not acquired\n", acpi_ut_get_node_name(obj_desc->mutex.node))); 244 ACPI_ERROR((AE_INFO,
245 "Cannot release Mutex [%4.4s], not acquired",
246 acpi_ut_get_node_name(obj_desc->mutex.node)));
241 return_ACPI_STATUS(AE_AML_MUTEX_NOT_ACQUIRED); 247 return_ACPI_STATUS(AE_AML_MUTEX_NOT_ACQUIRED);
242 } 248 }
243 249
244 /* Sanity check -- we must have a valid thread ID */ 250 /* Sanity check -- we must have a valid thread ID */
245 251
246 if (!walk_state->thread) { 252 if (!walk_state->thread) {
247 ACPI_REPORT_ERROR(("Cannot release Mutex [%4.4s], null thread info\n", acpi_ut_get_node_name(obj_desc->mutex.node))); 253 ACPI_ERROR((AE_INFO,
254 "Cannot release Mutex [%4.4s], null thread info",
255 acpi_ut_get_node_name(obj_desc->mutex.node)));
248 return_ACPI_STATUS(AE_AML_INTERNAL); 256 return_ACPI_STATUS(AE_AML_INTERNAL);
249 } 257 }
250 258
@@ -255,7 +263,11 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
255 if ((obj_desc->mutex.owner_thread->thread_id != 263 if ((obj_desc->mutex.owner_thread->thread_id !=
256 walk_state->thread->thread_id) 264 walk_state->thread->thread_id)
257 && (obj_desc->mutex.semaphore != acpi_gbl_global_lock_semaphore)) { 265 && (obj_desc->mutex.semaphore != acpi_gbl_global_lock_semaphore)) {
258 ACPI_REPORT_ERROR(("Thread %X cannot release Mutex [%4.4s] acquired by thread %X\n", walk_state->thread->thread_id, acpi_ut_get_node_name(obj_desc->mutex.node), obj_desc->mutex.owner_thread->thread_id)); 266 ACPI_ERROR((AE_INFO,
267 "Thread %X cannot release Mutex [%4.4s] acquired by thread %X",
268 walk_state->thread->thread_id,
269 acpi_ut_get_node_name(obj_desc->mutex.node),
270 obj_desc->mutex.owner_thread->thread_id));
259 return_ACPI_STATUS(AE_AML_NOT_OWNER); 271 return_ACPI_STATUS(AE_AML_NOT_OWNER);
260 } 272 }
261 273
@@ -264,7 +276,9 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
264 * equal to the current sync level 276 * equal to the current sync level
265 */ 277 */
266 if (obj_desc->mutex.sync_level > walk_state->thread->current_sync_level) { 278 if (obj_desc->mutex.sync_level > walk_state->thread->current_sync_level) {
267 ACPI_REPORT_ERROR(("Cannot release Mutex [%4.4s], incorrect sync_level\n", acpi_ut_get_node_name(obj_desc->mutex.node))); 279 ACPI_ERROR((AE_INFO,
280 "Cannot release Mutex [%4.4s], incorrect sync_level",
281 acpi_ut_get_node_name(obj_desc->mutex.node)));
268 return_ACPI_STATUS(AE_AML_MUTEX_ORDER); 282 return_ACPI_STATUS(AE_AML_MUTEX_ORDER);
269 } 283 }
270 284
diff --git a/drivers/acpi/executer/exnames.c b/drivers/acpi/executer/exnames.c
index 239d8473e9a5..054fe5e1a314 100644
--- a/drivers/acpi/executer/exnames.c
+++ b/drivers/acpi/executer/exnames.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -99,7 +99,8 @@ static char *acpi_ex_allocate_name_string(u32 prefix_count, u32 num_name_segs)
99 */ 99 */
100 name_string = ACPI_MEM_ALLOCATE(size_needed); 100 name_string = ACPI_MEM_ALLOCATE(size_needed);
101 if (!name_string) { 101 if (!name_string) {
102 ACPI_REPORT_ERROR(("ex_allocate_name_string: Could not allocate size %d\n", size_needed)); 102 ACPI_ERROR((AE_INFO,
103 "Could not allocate size %d", size_needed));
103 return_PTR(NULL); 104 return_PTR(NULL);
104 } 105 }
105 106
@@ -167,8 +168,7 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
167 char_buf[0] = *aml_address; 168 char_buf[0] = *aml_address;
168 169
169 if ('0' <= char_buf[0] && char_buf[0] <= '9') { 170 if ('0' <= char_buf[0] && char_buf[0] <= '9') {
170 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "leading digit: %c\n", 171 ACPI_ERROR((AE_INFO, "Invalid leading digit: %c", char_buf[0]));
171 char_buf[0]));
172 return_ACPI_STATUS(AE_CTRL_PENDING); 172 return_ACPI_STATUS(AE_CTRL_PENDING);
173 } 173 }
174 174
@@ -191,10 +191,10 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
191 if (name_string) { 191 if (name_string) {
192 ACPI_STRCAT(name_string, char_buf); 192 ACPI_STRCAT(name_string, char_buf);
193 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 193 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
194 "Appended to - %s \n", name_string)); 194 "Appended to - %s\n", name_string));
195 } else { 195 } else {
196 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 196 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
197 "No Name string - %s \n", char_buf)); 197 "No Name string - %s\n", char_buf));
198 } 198 }
199 } else if (index == 0) { 199 } else if (index == 0) {
200 /* 200 /*
@@ -211,12 +211,12 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
211 * the required 4 211 * the required 4
212 */ 212 */
213 status = AE_AML_BAD_NAME; 213 status = AE_AML_BAD_NAME;
214 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 214 ACPI_ERROR((AE_INFO,
215 "Bad character %02x in name, at %p\n", 215 "Bad character %02x in name, at %p",
216 *aml_address, aml_address)); 216 *aml_address, aml_address));
217 } 217 }
218 218
219 *in_aml_address = (u8 *) aml_address; 219 *in_aml_address = ACPI_CAST_PTR(u8, aml_address);
220 return_ACPI_STATUS(status); 220 return_ACPI_STATUS(status);
221} 221}
222 222
@@ -412,8 +412,7 @@ acpi_ex_get_name_string(acpi_object_type data_type,
412 if (AE_CTRL_PENDING == status && has_prefix) { 412 if (AE_CTRL_PENDING == status && has_prefix) {
413 /* Ran out of segments after processing a prefix */ 413 /* Ran out of segments after processing a prefix */
414 414
415 ACPI_REPORT_ERROR(("ex_do_name: Malformed Name at %p\n", 415 ACPI_ERROR((AE_INFO, "Malformed Name at %p", name_string));
416 name_string));
417 status = AE_AML_BAD_NAME; 416 status = AE_AML_BAD_NAME;
418 } 417 }
419 418
diff --git a/drivers/acpi/executer/exoparg1.c b/drivers/acpi/executer/exoparg1.c
index 97e34542f5e4..23d0823bcd5e 100644
--- a/drivers/acpi/executer/exoparg1.c
+++ b/drivers/acpi/executer/exoparg1.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -111,7 +111,8 @@ acpi_status acpi_ex_opcode_0A_0T_1R(struct acpi_walk_state *walk_state)
111 111
112 default: /* Unknown opcode */ 112 default: /* Unknown opcode */
113 113
114 ACPI_REPORT_ERROR(("acpi_ex_opcode_0A_0T_1R: Unknown opcode %X\n", walk_state->opcode)); 114 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
115 walk_state->opcode));
115 status = AE_AML_BAD_OPCODE; 116 status = AE_AML_BAD_OPCODE;
116 break; 117 break;
117 } 118 }
@@ -188,7 +189,8 @@ acpi_status acpi_ex_opcode_1A_0T_0R(struct acpi_walk_state *walk_state)
188 189
189 default: /* Unknown opcode */ 190 default: /* Unknown opcode */
190 191
191 ACPI_REPORT_ERROR(("acpi_ex_opcode_1A_0T_0R: Unknown opcode %X\n", walk_state->opcode)); 192 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
193 walk_state->opcode));
192 status = AE_AML_BAD_OPCODE; 194 status = AE_AML_BAD_OPCODE;
193 break; 195 break;
194 } 196 }
@@ -227,7 +229,8 @@ acpi_status acpi_ex_opcode_1A_1T_0R(struct acpi_walk_state *walk_state)
227 229
228 default: /* Unknown opcode */ 230 default: /* Unknown opcode */
229 231
230 ACPI_REPORT_ERROR(("acpi_ex_opcode_1A_1T_0R: Unknown opcode %X\n", walk_state->opcode)); 232 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
233 walk_state->opcode));
231 status = AE_AML_BAD_OPCODE; 234 status = AE_AML_BAD_OPCODE;
232 goto cleanup; 235 goto cleanup;
233 } 236 }
@@ -346,9 +349,9 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
346 /* Check the range of the digit */ 349 /* Check the range of the digit */
347 350
348 if (temp32 > 9) { 351 if (temp32 > 9) {
349 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 352 ACPI_ERROR((AE_INFO,
350 "BCD digit too large (not decimal): 0x%X\n", 353 "BCD digit too large (not decimal): 0x%X",
351 temp32)); 354 temp32));
352 355
353 status = AE_AML_NUMERIC_OVERFLOW; 356 status = AE_AML_NUMERIC_OVERFLOW;
354 goto cleanup; 357 goto cleanup;
@@ -393,12 +396,10 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
393 /* Overflow if there is any data left in Digit */ 396 /* Overflow if there is any data left in Digit */
394 397
395 if (digit > 0) { 398 if (digit > 0) {
396 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 399 ACPI_ERROR((AE_INFO,
397 "Integer too large to convert to BCD: %8.8X%8.8X\n", 400 "Integer too large to convert to BCD: %8.8X%8.8X",
398 ACPI_FORMAT_UINT64(operand 401 ACPI_FORMAT_UINT64(operand[0]->
399 [0]-> 402 integer.value)));
400 integer.
401 value)));
402 status = AE_AML_NUMERIC_OVERFLOW; 403 status = AE_AML_NUMERIC_OVERFLOW;
403 goto cleanup; 404 goto cleanup;
404 } 405 }
@@ -525,15 +526,16 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
525 526
526 /* These are two obsolete opcodes */ 527 /* These are two obsolete opcodes */
527 528
528 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 529 ACPI_ERROR((AE_INFO,
529 "%s is obsolete and not implemented\n", 530 "%s is obsolete and not implemented",
530 acpi_ps_get_opcode_name(walk_state->opcode))); 531 acpi_ps_get_opcode_name(walk_state->opcode)));
531 status = AE_SUPPORT; 532 status = AE_SUPPORT;
532 goto cleanup; 533 goto cleanup;
533 534
534 default: /* Unknown opcode */ 535 default: /* Unknown opcode */
535 536
536 ACPI_REPORT_ERROR(("acpi_ex_opcode_1A_1T_1R: Unknown opcode %X\n", walk_state->opcode)); 537 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
538 walk_state->opcode));
537 status = AE_AML_BAD_OPCODE; 539 status = AE_AML_BAD_OPCODE;
538 goto cleanup; 540 goto cleanup;
539 } 541 }
@@ -639,11 +641,10 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
639 acpi_ex_resolve_operands(AML_LNOT_OP, &temp_desc, 641 acpi_ex_resolve_operands(AML_LNOT_OP, &temp_desc,
640 walk_state); 642 walk_state);
641 if (ACPI_FAILURE(status)) { 643 if (ACPI_FAILURE(status)) {
642 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 644 ACPI_EXCEPTION((AE_INFO, status,
643 "%s: bad operand(s) %s\n", 645 "While resolving operands for [%s]",
644 acpi_ps_get_opcode_name(walk_state-> 646 acpi_ps_get_opcode_name(walk_state->
645 opcode), 647 opcode)));
646 acpi_format_exception(status)));
647 648
648 goto cleanup; 649 goto cleanup;
649 } 650 }
@@ -742,9 +743,9 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
742 break; 743 break;
743 744
744 default: 745 default:
745 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 746 ACPI_ERROR((AE_INFO,
746 "size_of - Operand is not Buf/Int/Str/Pkg - found type %s\n", 747 "Operand is not Buf/Int/Str/Pkg - found type %s",
747 acpi_ut_get_type_name(type))); 748 acpi_ut_get_type_name(type)));
748 status = AE_AML_OPERAND_TYPE; 749 status = AE_AML_OPERAND_TYPE;
749 goto cleanup; 750 goto cleanup;
750 } 751 }
@@ -941,11 +942,10 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
941 942
942 default: 943 default:
943 944
944 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 945 ACPI_ERROR((AE_INFO,
945 "Unknown Index target_type %X in obj %p\n", 946 "Unknown Index target_type %X in obj %p",
946 operand[0]->reference. 947 operand[0]->reference.
947 target_type, 948 target_type, operand[0]));
948 operand[0]));
949 status = AE_AML_OPERAND_TYPE; 949 status = AE_AML_OPERAND_TYPE;
950 goto cleanup; 950 goto cleanup;
951 } 951 }
@@ -971,11 +971,10 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
971 break; 971 break;
972 972
973 default: 973 default:
974 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 974 ACPI_ERROR((AE_INFO,
975 "Unknown opcode in ref(%p) - %X\n", 975 "Unknown opcode in ref(%p) - %X",
976 operand[0], 976 operand[0],
977 operand[0]->reference. 977 operand[0]->reference.opcode));
978 opcode));
979 978
980 status = AE_TYPE; 979 status = AE_TYPE;
981 goto cleanup; 980 goto cleanup;
@@ -985,7 +984,8 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
985 984
986 default: 985 default:
987 986
988 ACPI_REPORT_ERROR(("acpi_ex_opcode_1A_0T_1R: Unknown opcode %X\n", walk_state->opcode)); 987 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
988 walk_state->opcode));
989 status = AE_AML_BAD_OPCODE; 989 status = AE_AML_BAD_OPCODE;
990 goto cleanup; 990 goto cleanup;
991 } 991 }
diff --git a/drivers/acpi/executer/exoparg2.c b/drivers/acpi/executer/exoparg2.c
index 8d70c6beef00..e263a5ddd405 100644
--- a/drivers/acpi/executer/exoparg2.c
+++ b/drivers/acpi/executer/exoparg2.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -111,9 +111,9 @@ acpi_status acpi_ex_opcode_2A_0T_0R(struct acpi_walk_state *walk_state)
111 /* Are notifies allowed on this object? */ 111 /* Are notifies allowed on this object? */
112 112
113 if (!acpi_ev_is_notify_object(node)) { 113 if (!acpi_ev_is_notify_object(node)) {
114 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 114 ACPI_ERROR((AE_INFO,
115 "Unexpected notify object type [%s]\n", 115 "Unexpected notify object type [%s]",
116 acpi_ut_get_type_name(node->type))); 116 acpi_ut_get_type_name(node->type)));
117 117
118 status = AE_AML_OPERAND_TYPE; 118 status = AE_AML_OPERAND_TYPE;
119 break; 119 break;
@@ -157,7 +157,8 @@ acpi_status acpi_ex_opcode_2A_0T_0R(struct acpi_walk_state *walk_state)
157 157
158 default: 158 default:
159 159
160 ACPI_REPORT_ERROR(("acpi_ex_opcode_2A_0T_0R: Unknown opcode %X\n", walk_state->opcode)); 160 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
161 walk_state->opcode));
161 status = AE_AML_BAD_OPCODE; 162 status = AE_AML_BAD_OPCODE;
162 } 163 }
163 164
@@ -221,7 +222,8 @@ acpi_status acpi_ex_opcode_2A_2T_1R(struct acpi_walk_state *walk_state)
221 222
222 default: 223 default:
223 224
224 ACPI_REPORT_ERROR(("acpi_ex_opcode_2A_2T_1R: Unknown opcode %X\n", walk_state->opcode)); 225 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
226 walk_state->opcode));
225 status = AE_AML_BAD_OPCODE; 227 status = AE_AML_BAD_OPCODE;
226 goto cleanup; 228 goto cleanup;
227 } 229 }
@@ -344,10 +346,6 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
344 (length < operand[1]->integer.value) && 346 (length < operand[1]->integer.value) &&
345 (operand[0]->buffer.pointer[length])) { 347 (operand[0]->buffer.pointer[length])) {
346 length++; 348 length++;
347 if (length > ACPI_MAX_STRING_CONVERSION) {
348 status = AE_AML_STRING_LIMIT;
349 goto cleanup;
350 }
351 } 349 }
352 350
353 /* Allocate a new string object */ 351 /* Allocate a new string object */
@@ -358,8 +356,10 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
358 goto cleanup; 356 goto cleanup;
359 } 357 }
360 358
361 /* Copy the raw buffer data with no transform. NULL terminated already */ 359 /*
362 360 * Copy the raw buffer data with no transform.
361 * (NULL terminated already)
362 */
363 ACPI_MEMCPY(return_desc->string.pointer, 363 ACPI_MEMCPY(return_desc->string.pointer,
364 operand[0]->buffer.pointer, length); 364 operand[0]->buffer.pointer, length);
365 break; 365 break;
@@ -391,10 +391,10 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
391 /* Object to be indexed is a Package */ 391 /* Object to be indexed is a Package */
392 392
393 if (index >= operand[0]->package.count) { 393 if (index >= operand[0]->package.count) {
394 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 394 ACPI_ERROR((AE_INFO,
395 "Index value (%X%8.8X) beyond package end (%X)\n", 395 "Index value (%X%8.8X) beyond package end (%X)",
396 ACPI_FORMAT_UINT64(index), 396 ACPI_FORMAT_UINT64(index),
397 operand[0]->package.count)); 397 operand[0]->package.count));
398 status = AE_AML_PACKAGE_LIMIT; 398 status = AE_AML_PACKAGE_LIMIT;
399 goto cleanup; 399 goto cleanup;
400 } 400 }
@@ -407,10 +407,10 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
407 /* Object to be indexed is a Buffer/String */ 407 /* Object to be indexed is a Buffer/String */
408 408
409 if (index >= operand[0]->buffer.length) { 409 if (index >= operand[0]->buffer.length) {
410 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 410 ACPI_ERROR((AE_INFO,
411 "Index value (%X%8.8X) beyond end of buffer (%X)\n", 411 "Index value (%X%8.8X) beyond end of buffer (%X)",
412 ACPI_FORMAT_UINT64(index), 412 ACPI_FORMAT_UINT64(index),
413 operand[0]->buffer.length)); 413 operand[0]->buffer.length));
414 status = AE_AML_BUFFER_LIMIT; 414 status = AE_AML_BUFFER_LIMIT;
415 goto cleanup; 415 goto cleanup;
416 } 416 }
@@ -442,7 +442,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
442 442
443 default: 443 default:
444 444
445 ACPI_REPORT_ERROR(("acpi_ex_opcode_2A_1T_1R: Unknown opcode %X\n", walk_state->opcode)); 445 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
446 walk_state->opcode));
446 status = AE_AML_BAD_OPCODE; 447 status = AE_AML_BAD_OPCODE;
447 break; 448 break;
448 } 449 }
@@ -546,7 +547,8 @@ acpi_status acpi_ex_opcode_2A_0T_1R(struct acpi_walk_state *walk_state)
546 547
547 default: 548 default:
548 549
549 ACPI_REPORT_ERROR(("acpi_ex_opcode_2A_0T_1R: Unknown opcode %X\n", walk_state->opcode)); 550 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
551 walk_state->opcode));
550 status = AE_AML_BAD_OPCODE; 552 status = AE_AML_BAD_OPCODE;
551 goto cleanup; 553 goto cleanup;
552 } 554 }
diff --git a/drivers/acpi/executer/exoparg3.c b/drivers/acpi/executer/exoparg3.c
index 483365777670..6a3a883cb8a3 100644
--- a/drivers/acpi/executer/exoparg3.c
+++ b/drivers/acpi/executer/exoparg3.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -119,7 +119,8 @@ acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state)
119 119
120 default: 120 default:
121 121
122 ACPI_REPORT_ERROR(("acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", walk_state->opcode)); 122 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
123 walk_state->opcode));
123 status = AE_AML_BAD_OPCODE; 124 status = AE_AML_BAD_OPCODE;
124 goto cleanup; 125 goto cleanup;
125 } 126 }
@@ -223,8 +224,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
223 goto cleanup; 224 goto cleanup;
224 } 225 }
225 226
226 if (length > 0) { 227 if (buffer) {
227 /* Copy the portion requested */ 228 /* We have a buffer, copy the portion requested */
228 229
229 ACPI_MEMCPY(buffer, operand[0]->string.pointer + index, 230 ACPI_MEMCPY(buffer, operand[0]->string.pointer + index,
230 length); 231 length);
@@ -242,7 +243,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
242 243
243 default: 244 default:
244 245
245 ACPI_REPORT_ERROR(("acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", walk_state->opcode)); 246 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
247 walk_state->opcode));
246 status = AE_AML_BAD_OPCODE; 248 status = AE_AML_BAD_OPCODE;
247 goto cleanup; 249 goto cleanup;
248 } 250 }
diff --git a/drivers/acpi/executer/exoparg6.c b/drivers/acpi/executer/exoparg6.c
index 5dee77139576..e043d924444f 100644
--- a/drivers/acpi/executer/exoparg6.c
+++ b/drivers/acpi/executer/exoparg6.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -234,8 +234,7 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state)
234 234
235 if ((operand[1]->integer.value > MAX_MATCH_OPERATOR) || 235 if ((operand[1]->integer.value > MAX_MATCH_OPERATOR) ||
236 (operand[3]->integer.value > MAX_MATCH_OPERATOR)) { 236 (operand[3]->integer.value > MAX_MATCH_OPERATOR)) {
237 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 237 ACPI_ERROR((AE_INFO, "Match operator out of range"));
238 "Match operator out of range\n"));
239 status = AE_AML_OPERAND_VALUE; 238 status = AE_AML_OPERAND_VALUE;
240 goto cleanup; 239 goto cleanup;
241 } 240 }
@@ -244,10 +243,10 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state)
244 243
245 index = operand[5]->integer.value; 244 index = operand[5]->integer.value;
246 if (index >= operand[0]->package.count) { 245 if (index >= operand[0]->package.count) {
247 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 246 ACPI_ERROR((AE_INFO,
248 "Index (%X%8.8X) beyond package end (%X)\n", 247 "Index (%X%8.8X) beyond package end (%X)",
249 ACPI_FORMAT_UINT64(index), 248 ACPI_FORMAT_UINT64(index),
250 operand[0]->package.count)); 249 operand[0]->package.count));
251 status = AE_AML_PACKAGE_LIMIT; 250 status = AE_AML_PACKAGE_LIMIT;
252 goto cleanup; 251 goto cleanup;
253 } 252 }
@@ -316,7 +315,8 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state)
316 315
317 default: 316 default:
318 317
319 ACPI_REPORT_ERROR(("acpi_ex_opcode_6A_0T_1R: Unknown opcode %X\n", walk_state->opcode)); 318 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
319 walk_state->opcode));
320 status = AE_AML_BAD_OPCODE; 320 status = AE_AML_BAD_OPCODE;
321 goto cleanup; 321 goto cleanup;
322 } 322 }
diff --git a/drivers/acpi/executer/exprep.c b/drivers/acpi/executer/exprep.c
index 7476c363e407..7719ae5d4f16 100644
--- a/drivers/acpi/executer/exprep.c
+++ b/drivers/acpi/executer/exprep.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -274,9 +274,8 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
274 default: 274 default:
275 /* Invalid field access type */ 275 /* Invalid field access type */
276 276
277 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 277 ACPI_ERROR((AE_INFO, "Unknown field access type %X", access));
278 "Unknown field access type %X\n", access)); 278 return_UINT32(0);
279 return_VALUE(0);
280 } 279 }
281 280
282 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_BUFFER_FIELD) { 281 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_BUFFER_FIELD) {
@@ -289,7 +288,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
289 } 288 }
290 289
291 *return_byte_alignment = byte_alignment; 290 *return_byte_alignment = byte_alignment;
292 return_VALUE(bit_length); 291 return_UINT32(bit_length);
293} 292}
294 293
295/******************************************************************************* 294/*******************************************************************************
@@ -422,15 +421,15 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
422 421
423 if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) { 422 if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) {
424 if (!info->region_node) { 423 if (!info->region_node) {
425 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null region_node\n")); 424 ACPI_ERROR((AE_INFO, "Null region_node"));
426 return_ACPI_STATUS(AE_AML_NO_OPERAND); 425 return_ACPI_STATUS(AE_AML_NO_OPERAND);
427 } 426 }
428 427
429 type = acpi_ns_get_type(info->region_node); 428 type = acpi_ns_get_type(info->region_node);
430 if (type != ACPI_TYPE_REGION) { 429 if (type != ACPI_TYPE_REGION) {
431 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 430 ACPI_ERROR((AE_INFO,
432 "Needed Region, found type %X (%s)\n", 431 "Needed Region, found type %X (%s)",
433 type, acpi_ut_get_type_name(type))); 432 type, acpi_ut_get_type_name(type)));
434 433
435 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 434 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
436 } 435 }
@@ -499,17 +498,17 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
499 498
500 case ACPI_TYPE_LOCAL_INDEX_FIELD: 499 case ACPI_TYPE_LOCAL_INDEX_FIELD:
501 500
501 /* Get the Index and Data registers */
502
502 obj_desc->index_field.index_obj = 503 obj_desc->index_field.index_obj =
503 acpi_ns_get_attached_object(info->register_node); 504 acpi_ns_get_attached_object(info->register_node);
504 obj_desc->index_field.data_obj = 505 obj_desc->index_field.data_obj =
505 acpi_ns_get_attached_object(info->data_register_node); 506 acpi_ns_get_attached_object(info->data_register_node);
506 obj_desc->index_field.value = (u32)
507 (info->field_bit_position /
508 ACPI_MUL_8(obj_desc->field.access_byte_width));
509 507
510 if (!obj_desc->index_field.data_obj 508 if (!obj_desc->index_field.data_obj
511 || !obj_desc->index_field.index_obj) { 509 || !obj_desc->index_field.index_obj) {
512 ACPI_REPORT_ERROR(("Null Index Object during field prep\n")); 510 ACPI_ERROR((AE_INFO,
511 "Null Index Object during field prep"));
513 acpi_ut_delete_object_desc(obj_desc); 512 acpi_ut_delete_object_desc(obj_desc);
514 return_ACPI_STATUS(AE_AML_INTERNAL); 513 return_ACPI_STATUS(AE_AML_INTERNAL);
515 } 514 }
@@ -519,6 +518,15 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
519 acpi_ut_add_reference(obj_desc->index_field.data_obj); 518 acpi_ut_add_reference(obj_desc->index_field.data_obj);
520 acpi_ut_add_reference(obj_desc->index_field.index_obj); 519 acpi_ut_add_reference(obj_desc->index_field.index_obj);
521 520
521 /*
522 * The value written to the Index register is the byte offset of the
523 * target field
524 * Note: may change code to: ACPI_DIV_8 (Info->field_bit_position)
525 */
526 obj_desc->index_field.value = (u32)
527 (info->field_bit_position /
528 ACPI_MUL_8(obj_desc->field.access_byte_width));
529
522 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 530 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
523 "index_field: bit_off %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n", 531 "index_field: bit_off %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n",
524 obj_desc->index_field.start_field_bit_offset, 532 obj_desc->index_field.start_field_bit_offset,
diff --git a/drivers/acpi/executer/exregion.c b/drivers/acpi/executer/exregion.c
index 9a2f5bea3afe..6a4cfdff606d 100644
--- a/drivers/acpi/executer/exregion.c
+++ b/drivers/acpi/executer/exregion.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -77,7 +77,7 @@ acpi_ex_system_memory_space_handler(u32 function,
77 struct acpi_mem_space_context *mem_info = region_context; 77 struct acpi_mem_space_context *mem_info = region_context;
78 u32 length; 78 u32 length;
79 acpi_size window_size; 79 acpi_size window_size;
80#ifndef ACPI_MISALIGNED_TRANSFERS 80#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
81 u32 remainder; 81 u32 remainder;
82#endif 82#endif
83 83
@@ -103,13 +103,12 @@ acpi_ex_system_memory_space_handler(u32 function,
103 break; 103 break;
104 104
105 default: 105 default:
106 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 106 ACPI_ERROR((AE_INFO, "Invalid system_memory width %d",
107 "Invalid system_memory width %d\n", 107 bit_width));
108 bit_width));
109 return_ACPI_STATUS(AE_AML_OPERAND_VALUE); 108 return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
110 } 109 }
111 110
112#ifndef ACPI_MISALIGNED_TRANSFERS 111#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
113 /* 112 /*
114 * Hardware does not support non-aligned data transfers, we must verify 113 * Hardware does not support non-aligned data transfers, we must verify
115 * the request. 114 * the request.
@@ -159,10 +158,10 @@ acpi_ex_system_memory_space_handler(u32 function,
159 (void **)&mem_info-> 158 (void **)&mem_info->
160 mapped_logical_address); 159 mapped_logical_address);
161 if (ACPI_FAILURE(status)) { 160 if (ACPI_FAILURE(status)) {
162 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 161 ACPI_ERROR((AE_INFO,
163 "Could not map memory at %8.8X%8.8X, size %X\n", 162 "Could not map memory at %8.8X%8.8X, size %X",
164 ACPI_FORMAT_UINT64(address), 163 ACPI_FORMAT_UINT64(address),
165 (u32) window_size)); 164 (u32) window_size));
166 mem_info->mapped_length = 0; 165 mem_info->mapped_length = 0;
167 return_ACPI_STATUS(status); 166 return_ACPI_STATUS(status);
168 } 167 }
@@ -199,20 +198,20 @@ acpi_ex_system_memory_space_handler(u32 function,
199 *value = 0; 198 *value = 0;
200 switch (bit_width) { 199 switch (bit_width) {
201 case 8: 200 case 8:
202 *value = (acpi_integer) * ((u8 *) logical_addr_ptr); 201 *value = (acpi_integer) ACPI_GET8(logical_addr_ptr);
203 break; 202 break;
204 203
205 case 16: 204 case 16:
206 *value = (acpi_integer) * ((u16 *) logical_addr_ptr); 205 *value = (acpi_integer) ACPI_GET16(logical_addr_ptr);
207 break; 206 break;
208 207
209 case 32: 208 case 32:
210 *value = (acpi_integer) * ((u32 *) logical_addr_ptr); 209 *value = (acpi_integer) ACPI_GET32(logical_addr_ptr);
211 break; 210 break;
212 211
213#if ACPI_MACHINE_WIDTH != 16 212#if ACPI_MACHINE_WIDTH != 16
214 case 64: 213 case 64:
215 *value = (acpi_integer) * ((u64 *) logical_addr_ptr); 214 *value = (acpi_integer) ACPI_GET64(logical_addr_ptr);
216 break; 215 break;
217#endif 216#endif
218 default: 217 default:
@@ -225,20 +224,20 @@ acpi_ex_system_memory_space_handler(u32 function,
225 224
226 switch (bit_width) { 225 switch (bit_width) {
227 case 8: 226 case 8:
228 *(u8 *) logical_addr_ptr = (u8) * value; 227 ACPI_SET8(logical_addr_ptr) = (u8) * value;
229 break; 228 break;
230 229
231 case 16: 230 case 16:
232 *(u16 *) logical_addr_ptr = (u16) * value; 231 ACPI_SET16(logical_addr_ptr) = (u16) * value;
233 break; 232 break;
234 233
235 case 32: 234 case 32:
236 *(u32 *) logical_addr_ptr = (u32) * value; 235 ACPI_SET32(logical_addr_ptr) = (u32) * value;
237 break; 236 break;
238 237
239#if ACPI_MACHINE_WIDTH != 16 238#if ACPI_MACHINE_WIDTH != 16
240 case 64: 239 case 64:
241 *(u64 *) logical_addr_ptr = (u64) * value; 240 ACPI_SET64(logical_addr_ptr) = (u64) * value;
242 break; 241 break;
243#endif 242#endif
244 243
diff --git a/drivers/acpi/executer/exresnte.c b/drivers/acpi/executer/exresnte.c
index ff5d8f97e8eb..01b26c80d22b 100644
--- a/drivers/acpi/executer/exresnte.c
+++ b/drivers/acpi/executer/exresnte.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -122,8 +122,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
122 } 122 }
123 123
124 if (!source_desc) { 124 if (!source_desc) {
125 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 125 ACPI_ERROR((AE_INFO, "No object attached to node %p", node));
126 "No object attached to node %p\n", node));
127 return_ACPI_STATUS(AE_AML_NO_OPERAND); 126 return_ACPI_STATUS(AE_AML_NO_OPERAND);
128 } 127 }
129 128
@@ -135,10 +134,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
135 case ACPI_TYPE_PACKAGE: 134 case ACPI_TYPE_PACKAGE:
136 135
137 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_PACKAGE) { 136 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_PACKAGE) {
138 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 137 ACPI_ERROR((AE_INFO, "Object not a Package, type %s",
139 "Object not a Package, type %s\n", 138 acpi_ut_get_object_type_name(source_desc)));
140 acpi_ut_get_object_type_name
141 (source_desc)));
142 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 139 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
143 } 140 }
144 141
@@ -154,10 +151,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
154 case ACPI_TYPE_BUFFER: 151 case ACPI_TYPE_BUFFER:
155 152
156 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_BUFFER) { 153 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_BUFFER) {
157 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 154 ACPI_ERROR((AE_INFO, "Object not a Buffer, type %s",
158 "Object not a Buffer, type %s\n", 155 acpi_ut_get_object_type_name(source_desc)));
159 acpi_ut_get_object_type_name
160 (source_desc)));
161 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 156 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
162 } 157 }
163 158
@@ -173,10 +168,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
173 case ACPI_TYPE_STRING: 168 case ACPI_TYPE_STRING:
174 169
175 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_STRING) { 170 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_STRING) {
176 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 171 ACPI_ERROR((AE_INFO, "Object not a String, type %s",
177 "Object not a String, type %s\n", 172 acpi_ut_get_object_type_name(source_desc)));
178 acpi_ut_get_object_type_name
179 (source_desc)));
180 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 173 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
181 } 174 }
182 175
@@ -189,10 +182,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
189 case ACPI_TYPE_INTEGER: 182 case ACPI_TYPE_INTEGER:
190 183
191 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_INTEGER) { 184 if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_INTEGER) {
192 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 185 ACPI_ERROR((AE_INFO, "Object not a Integer, type %s",
193 "Object not a Integer, type %s\n", 186 acpi_ut_get_object_type_name(source_desc)));
194 acpi_ut_get_object_type_name
195 (source_desc)));
196 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 187 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
197 } 188 }
198 189
@@ -236,9 +227,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
236 227
237 case ACPI_TYPE_ANY: 228 case ACPI_TYPE_ANY:
238 229
239 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 230 ACPI_ERROR((AE_INFO,
240 "Untyped entry %p, no attached object!\n", 231 "Untyped entry %p, no attached object!", node));
241 node));
242 232
243 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); /* Cannot be AE_TYPE */ 233 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); /* Cannot be AE_TYPE */
244 234
@@ -257,12 +247,11 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
257 default: 247 default:
258 /* No named references are allowed here */ 248 /* No named references are allowed here */
259 249
260 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 250 ACPI_ERROR((AE_INFO,
261 "Unsupported Reference opcode %X (%s)\n", 251 "Unsupported Reference opcode %X (%s)",
262 source_desc->reference.opcode, 252 source_desc->reference.opcode,
263 acpi_ps_get_opcode_name(source_desc-> 253 acpi_ps_get_opcode_name(source_desc->
264 reference. 254 reference.opcode)));
265 opcode)));
266 255
267 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 256 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
268 } 257 }
@@ -272,9 +261,9 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
272 261
273 /* Default case is for unknown types */ 262 /* Default case is for unknown types */
274 263
275 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 264 ACPI_ERROR((AE_INFO,
276 "Node %p - Unknown object type %X\n", 265 "Node %p - Unknown object type %X",
277 node, entry_type)); 266 node, entry_type));
278 267
279 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 268 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
280 269
diff --git a/drivers/acpi/executer/exresolv.c b/drivers/acpi/executer/exresolv.c
index 97eecbd3242d..1deed492fe88 100644
--- a/drivers/acpi/executer/exresolv.c
+++ b/drivers/acpi/executer/exresolv.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -81,7 +81,7 @@ acpi_ex_resolve_to_value(union acpi_operand_object **stack_ptr,
81 ACPI_FUNCTION_TRACE_PTR("ex_resolve_to_value", stack_ptr); 81 ACPI_FUNCTION_TRACE_PTR("ex_resolve_to_value", stack_ptr);
82 82
83 if (!stack_ptr || !*stack_ptr) { 83 if (!stack_ptr || !*stack_ptr) {
84 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Internal - null pointer\n")); 84 ACPI_ERROR((AE_INFO, "Internal - null pointer"));
85 return_ACPI_STATUS(AE_AML_NO_OPERAND); 85 return_ACPI_STATUS(AE_AML_NO_OPERAND);
86 } 86 }
87 87
@@ -97,8 +97,7 @@ acpi_ex_resolve_to_value(union acpi_operand_object **stack_ptr,
97 } 97 }
98 98
99 if (!*stack_ptr) { 99 if (!*stack_ptr) {
100 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 100 ACPI_ERROR((AE_INFO, "Internal - null pointer"));
101 "Internal - null pointer\n"));
102 return_ACPI_STATUS(AE_AML_NO_OPERAND); 101 return_ACPI_STATUS(AE_AML_NO_OPERAND);
103 } 102 }
104 } 103 }
@@ -228,9 +227,9 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
228 * A NULL object descriptor means an unitialized element of 227 * A NULL object descriptor means an unitialized element of
229 * the package, can't dereference it 228 * the package, can't dereference it
230 */ 229 */
231 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 230 ACPI_ERROR((AE_INFO,
232 "Attempt to deref an Index to NULL pkg element Idx=%p\n", 231 "Attempt to deref an Index to NULL pkg element Idx=%p",
233 stack_desc)); 232 stack_desc));
234 status = AE_AML_UNINITIALIZED_ELEMENT; 233 status = AE_AML_UNINITIALIZED_ELEMENT;
235 } 234 }
236 break; 235 break;
@@ -239,7 +238,10 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
239 238
240 /* Invalid reference object */ 239 /* Invalid reference object */
241 240
242 ACPI_REPORT_ERROR(("During resolve, Unknown target_type %X in Index/Reference obj %p\n", stack_desc->reference.target_type, stack_desc)); 241 ACPI_ERROR((AE_INFO,
242 "Unknown target_type %X in Index/Reference obj %p",
243 stack_desc->reference.target_type,
244 stack_desc));
243 status = AE_AML_INTERNAL; 245 status = AE_AML_INTERNAL;
244 break; 246 break;
245 } 247 }
@@ -264,7 +266,10 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
264 266
265 default: 267 default:
266 268
267 ACPI_REPORT_ERROR(("During resolve, Unknown Reference opcode %X (%s) in %p\n", opcode, acpi_ps_get_opcode_name(opcode), stack_desc)); 269 ACPI_ERROR((AE_INFO,
270 "Unknown Reference opcode %X (%s) in %p",
271 opcode, acpi_ps_get_opcode_name(opcode),
272 stack_desc));
268 status = AE_AML_INTERNAL; 273 status = AE_AML_INTERNAL;
269 break; 274 break;
270 } 275 }
@@ -386,7 +391,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
386 391
387 if (ACPI_GET_DESCRIPTOR_TYPE(node) != 392 if (ACPI_GET_DESCRIPTOR_TYPE(node) !=
388 ACPI_DESC_TYPE_NAMED) { 393 ACPI_DESC_TYPE_NAMED) {
389 ACPI_REPORT_ERROR(("acpi_ex_resolve_multiple: Not a NS node %p [%s]\n", node, acpi_ut_get_descriptor_name(node))); 394 ACPI_ERROR((AE_INFO, "Not a NS node %p [%s]",
395 node,
396 acpi_ut_get_descriptor_name(node)));
390 return_ACPI_STATUS(AE_AML_INTERNAL); 397 return_ACPI_STATUS(AE_AML_INTERNAL);
391 } 398 }
392 399
@@ -442,7 +449,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
442 449
443 if (ACPI_GET_DESCRIPTOR_TYPE(node) != 450 if (ACPI_GET_DESCRIPTOR_TYPE(node) !=
444 ACPI_DESC_TYPE_NAMED) { 451 ACPI_DESC_TYPE_NAMED) {
445 ACPI_REPORT_ERROR(("acpi_ex_resolve_multiple: Not a NS node %p [%s]\n", node, acpi_ut_get_descriptor_name(node))); 452 ACPI_ERROR((AE_INFO, "Not a NS node %p [%s]",
453 node,
454 acpi_ut_get_descriptor_name(node)));
446 return_ACPI_STATUS(AE_AML_INTERNAL); 455 return_ACPI_STATUS(AE_AML_INTERNAL);
447 } 456 }
448 457
@@ -511,7 +520,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
511 520
512 default: 521 default:
513 522
514 ACPI_REPORT_ERROR(("acpi_ex_resolve_multiple: Unknown Reference subtype %X\n", obj_desc->reference.opcode)); 523 ACPI_ERROR((AE_INFO,
524 "Unknown Reference subtype %X",
525 obj_desc->reference.opcode));
515 return_ACPI_STATUS(AE_AML_INTERNAL); 526 return_ACPI_STATUS(AE_AML_INTERNAL);
516 } 527 }
517 } 528 }
diff --git a/drivers/acpi/executer/exresop.c b/drivers/acpi/executer/exresop.c
index ff064e79ab90..a1c000f5a415 100644
--- a/drivers/acpi/executer/exresop.c
+++ b/drivers/acpi/executer/exresop.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -46,6 +46,7 @@
46#include <acpi/amlcode.h> 46#include <acpi/amlcode.h>
47#include <acpi/acparser.h> 47#include <acpi/acparser.h>
48#include <acpi/acinterp.h> 48#include <acpi/acinterp.h>
49#include <acpi/acnamesp.h>
49 50
50#define _COMPONENT ACPI_EXECUTER 51#define _COMPONENT ACPI_EXECUTER
51ACPI_MODULE_NAME("exresop") 52ACPI_MODULE_NAME("exresop")
@@ -73,7 +74,7 @@ static acpi_status
73acpi_ex_check_object_type(acpi_object_type type_needed, 74acpi_ex_check_object_type(acpi_object_type type_needed,
74 acpi_object_type this_type, void *object) 75 acpi_object_type this_type, void *object)
75{ 76{
76 ACPI_FUNCTION_NAME("ex_check_object_type"); 77 ACPI_FUNCTION_ENTRY();
77 78
78 if (type_needed == ACPI_TYPE_ANY) { 79 if (type_needed == ACPI_TYPE_ANY) {
79 /* All types OK, so we don't perform any typechecks */ 80 /* All types OK, so we don't perform any typechecks */
@@ -95,10 +96,10 @@ acpi_ex_check_object_type(acpi_object_type type_needed,
95 } 96 }
96 97
97 if (type_needed != this_type) { 98 if (type_needed != this_type) {
98 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 99 ACPI_ERROR((AE_INFO,
99 "Needed [%s], found [%s] %p\n", 100 "Needed type [%s], found [%s] %p",
100 acpi_ut_get_type_name(type_needed), 101 acpi_ut_get_type_name(type_needed),
101 acpi_ut_get_type_name(this_type), object)); 102 acpi_ut_get_type_name(this_type), object));
102 103
103 return (AE_AML_OPERAND_TYPE); 104 return (AE_AML_OPERAND_TYPE);
104 } 105 }
@@ -151,13 +152,13 @@ acpi_ex_resolve_operands(u16 opcode,
151 152
152 arg_types = op_info->runtime_args; 153 arg_types = op_info->runtime_args;
153 if (arg_types == ARGI_INVALID_OPCODE) { 154 if (arg_types == ARGI_INVALID_OPCODE) {
154 ACPI_REPORT_ERROR(("resolve_operands: %X is not a valid AML opcode\n", opcode)); 155 ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", opcode));
155 156
156 return_ACPI_STATUS(AE_AML_INTERNAL); 157 return_ACPI_STATUS(AE_AML_INTERNAL);
157 } 158 }
158 159
159 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 160 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
160 "Opcode %X [%s] required_operand_types=%8.8X \n", 161 "Opcode %X [%s] required_operand_types=%8.8X\n",
161 opcode, op_info->name, arg_types)); 162 opcode, op_info->name, arg_types));
162 163
163 /* 164 /*
@@ -169,7 +170,8 @@ acpi_ex_resolve_operands(u16 opcode,
169 */ 170 */
170 while (GET_CURRENT_ARG_TYPE(arg_types)) { 171 while (GET_CURRENT_ARG_TYPE(arg_types)) {
171 if (!stack_ptr || !*stack_ptr) { 172 if (!stack_ptr || !*stack_ptr) {
172 ACPI_REPORT_ERROR(("resolve_operands: Null stack entry at %p\n", stack_ptr)); 173 ACPI_ERROR((AE_INFO, "Null stack entry at %p",
174 stack_ptr));
173 175
174 return_ACPI_STATUS(AE_AML_INTERNAL); 176 return_ACPI_STATUS(AE_AML_INTERNAL);
175 } 177 }
@@ -187,6 +189,22 @@ acpi_ex_resolve_operands(u16 opcode,
187 189
188 object_type = 190 object_type =
189 ((struct acpi_namespace_node *)obj_desc)->type; 191 ((struct acpi_namespace_node *)obj_desc)->type;
192
193 /*
194 * Resolve an alias object. The construction of these objects
195 * guarantees that there is only one level of alias indirection;
196 * thus, the attached object is always the aliased namespace node
197 */
198 if (object_type == ACPI_TYPE_LOCAL_ALIAS) {
199 obj_desc =
200 acpi_ns_get_attached_object((struct
201 acpi_namespace_node
202 *)obj_desc);
203 *stack_ptr = obj_desc;
204 object_type =
205 ((struct acpi_namespace_node *)obj_desc)->
206 type;
207 }
190 break; 208 break;
191 209
192 case ACPI_DESC_TYPE_OPERAND: 210 case ACPI_DESC_TYPE_OPERAND:
@@ -198,9 +216,9 @@ acpi_ex_resolve_operands(u16 opcode,
198 /* Check for bad acpi_object_type */ 216 /* Check for bad acpi_object_type */
199 217
200 if (!acpi_ut_valid_object_type(object_type)) { 218 if (!acpi_ut_valid_object_type(object_type)) {
201 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 219 ACPI_ERROR((AE_INFO,
202 "Bad operand object type [%X]\n", 220 "Bad operand object type [%X]",
203 object_type)); 221 object_type));
204 222
205 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 223 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
206 } 224 }
@@ -238,13 +256,10 @@ acpi_ex_resolve_operands(u16 opcode,
238 break; 256 break;
239 257
240 default: 258 default:
241 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 259 ACPI_ERROR((AE_INFO,
242 "Operand is a Reference, Unknown Reference Opcode %X [%s]\n", 260 "Operand is a Reference, Unknown Reference Opcode: %X",
243 obj_desc->reference. 261 obj_desc->reference.
244 opcode, 262 opcode));
245 (acpi_ps_get_opcode_info
246 (obj_desc->reference.
247 opcode))->name));
248 263
249 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 264 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
250 } 265 }
@@ -255,11 +270,10 @@ acpi_ex_resolve_operands(u16 opcode,
255 270
256 /* Invalid descriptor */ 271 /* Invalid descriptor */
257 272
258 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 273 ACPI_ERROR((AE_INFO,
259 "Invalid descriptor %p [%s]\n", 274 "Invalid descriptor %p [%s]",
260 obj_desc, 275 obj_desc,
261 acpi_ut_get_descriptor_name 276 acpi_ut_get_descriptor_name(obj_desc)));
262 (obj_desc)));
263 277
264 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 278 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
265 } 279 }
@@ -417,11 +431,10 @@ acpi_ex_resolve_operands(u16 opcode,
417 acpi_ex_convert_to_integer(obj_desc, stack_ptr, 16); 431 acpi_ex_convert_to_integer(obj_desc, stack_ptr, 16);
418 if (ACPI_FAILURE(status)) { 432 if (ACPI_FAILURE(status)) {
419 if (status == AE_TYPE) { 433 if (status == AE_TYPE) {
420 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 434 ACPI_ERROR((AE_INFO,
421 "Needed [Integer/String/Buffer], found [%s] %p\n", 435 "Needed [Integer/String/Buffer], found [%s] %p",
422 acpi_ut_get_object_type_name 436 acpi_ut_get_object_type_name
423 (obj_desc), 437 (obj_desc), obj_desc));
424 obj_desc));
425 438
426 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 439 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
427 } 440 }
@@ -444,11 +457,10 @@ acpi_ex_resolve_operands(u16 opcode,
444 status = acpi_ex_convert_to_buffer(obj_desc, stack_ptr); 457 status = acpi_ex_convert_to_buffer(obj_desc, stack_ptr);
445 if (ACPI_FAILURE(status)) { 458 if (ACPI_FAILURE(status)) {
446 if (status == AE_TYPE) { 459 if (status == AE_TYPE) {
447 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 460 ACPI_ERROR((AE_INFO,
448 "Needed [Integer/String/Buffer], found [%s] %p\n", 461 "Needed [Integer/String/Buffer], found [%s] %p",
449 acpi_ut_get_object_type_name 462 acpi_ut_get_object_type_name
450 (obj_desc), 463 (obj_desc), obj_desc));
451 obj_desc));
452 464
453 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 465 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
454 } 466 }
@@ -472,11 +484,10 @@ acpi_ex_resolve_operands(u16 opcode,
472 ACPI_IMPLICIT_CONVERT_HEX); 484 ACPI_IMPLICIT_CONVERT_HEX);
473 if (ACPI_FAILURE(status)) { 485 if (ACPI_FAILURE(status)) {
474 if (status == AE_TYPE) { 486 if (status == AE_TYPE) {
475 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 487 ACPI_ERROR((AE_INFO,
476 "Needed [Integer/String/Buffer], found [%s] %p\n", 488 "Needed [Integer/String/Buffer], found [%s] %p",
477 acpi_ut_get_object_type_name 489 acpi_ut_get_object_type_name
478 (obj_desc), 490 (obj_desc), obj_desc));
479 obj_desc));
480 491
481 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 492 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
482 } 493 }
@@ -502,10 +513,10 @@ acpi_ex_resolve_operands(u16 opcode,
502 break; 513 break;
503 514
504 default: 515 default:
505 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 516 ACPI_ERROR((AE_INFO,
506 "Needed [Integer/String/Buffer], found [%s] %p\n", 517 "Needed [Integer/String/Buffer], found [%s] %p",
507 acpi_ut_get_object_type_name 518 acpi_ut_get_object_type_name
508 (obj_desc), obj_desc)); 519 (obj_desc), obj_desc));
509 520
510 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 521 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
511 } 522 }
@@ -539,10 +550,10 @@ acpi_ex_resolve_operands(u16 opcode,
539 break; 550 break;
540 551
541 default: 552 default:
542 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 553 ACPI_ERROR((AE_INFO,
543 "Needed [Integer/String/Buffer], found [%s] %p\n", 554 "Needed [Integer/String/Buffer], found [%s] %p",
544 acpi_ut_get_object_type_name 555 acpi_ut_get_object_type_name
545 (obj_desc), obj_desc)); 556 (obj_desc), obj_desc));
546 557
547 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 558 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
548 } 559 }
@@ -566,10 +577,10 @@ acpi_ex_resolve_operands(u16 opcode,
566 break; 577 break;
567 578
568 default: 579 default:
569 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 580 ACPI_ERROR((AE_INFO,
570 "Needed [Buffer/String/Package/Reference], found [%s] %p\n", 581 "Needed [Buffer/String/Package/Reference], found [%s] %p",
571 acpi_ut_get_object_type_name 582 acpi_ut_get_object_type_name
572 (obj_desc), obj_desc)); 583 (obj_desc), obj_desc));
573 584
574 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 585 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
575 } 586 }
@@ -588,10 +599,10 @@ acpi_ex_resolve_operands(u16 opcode,
588 break; 599 break;
589 600
590 default: 601 default:
591 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 602 ACPI_ERROR((AE_INFO,
592 "Needed [Buffer/String/Package], found [%s] %p\n", 603 "Needed [Buffer/String/Package], found [%s] %p",
593 acpi_ut_get_object_type_name 604 acpi_ut_get_object_type_name
594 (obj_desc), obj_desc)); 605 (obj_desc), obj_desc));
595 606
596 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 607 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
597 } 608 }
@@ -611,10 +622,10 @@ acpi_ex_resolve_operands(u16 opcode,
611 break; 622 break;
612 623
613 default: 624 default:
614 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 625 ACPI_ERROR((AE_INFO,
615 "Needed [Region/region_field], found [%s] %p\n", 626 "Needed [Region/region_field], found [%s] %p",
616 acpi_ut_get_object_type_name 627 acpi_ut_get_object_type_name
617 (obj_desc), obj_desc)); 628 (obj_desc), obj_desc));
618 629
619 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 630 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
620 } 631 }
@@ -656,10 +667,10 @@ acpi_ex_resolve_operands(u16 opcode,
656 break; 667 break;
657 } 668 }
658 669
659 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 670 ACPI_ERROR((AE_INFO,
660 "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p\n", 671 "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p",
661 acpi_ut_get_object_type_name 672 acpi_ut_get_object_type_name
662 (obj_desc), obj_desc)); 673 (obj_desc), obj_desc));
663 674
664 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 675 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
665 } 676 }
@@ -669,9 +680,9 @@ acpi_ex_resolve_operands(u16 opcode,
669 680
670 /* Unknown type */ 681 /* Unknown type */
671 682
672 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 683 ACPI_ERROR((AE_INFO,
673 "Internal - Unknown ARGI (required operand) type %X\n", 684 "Internal - Unknown ARGI (required operand) type %X",
674 this_arg_type)); 685 this_arg_type));
675 686
676 return_ACPI_STATUS(AE_BAD_PARAMETER); 687 return_ACPI_STATUS(AE_BAD_PARAMETER);
677 } 688 }
diff --git a/drivers/acpi/executer/exstore.c b/drivers/acpi/executer/exstore.c
index a7d8eea305c2..3f020c0e2b95 100644
--- a/drivers/acpi/executer/exstore.c
+++ b/drivers/acpi/executer/exstore.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -250,7 +250,7 @@ acpi_ex_store(union acpi_operand_object *source_desc,
250 /* Validate parameters */ 250 /* Validate parameters */
251 251
252 if (!source_desc || !dest_desc) { 252 if (!source_desc || !dest_desc) {
253 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null parameter\n")); 253 ACPI_ERROR((AE_INFO, "Null parameter"));
254 return_ACPI_STATUS(AE_AML_NO_OPERAND); 254 return_ACPI_STATUS(AE_AML_NO_OPERAND);
255 } 255 }
256 256
@@ -290,10 +290,10 @@ acpi_ex_store(union acpi_operand_object *source_desc,
290 290
291 /* Destination is not a Reference object */ 291 /* Destination is not a Reference object */
292 292
293 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 293 ACPI_ERROR((AE_INFO,
294 "Target is not a Reference or Constant object - %s [%p]\n", 294 "Target is not a Reference or Constant object - %s [%p]",
295 acpi_ut_get_object_type_name(dest_desc), 295 acpi_ut_get_object_type_name(dest_desc),
296 dest_desc)); 296 dest_desc));
297 297
298 ACPI_DUMP_STACK_ENTRY(source_desc); 298 ACPI_DUMP_STACK_ENTRY(source_desc);
299 ACPI_DUMP_STACK_ENTRY(dest_desc); 299 ACPI_DUMP_STACK_ENTRY(dest_desc);
@@ -360,8 +360,8 @@ acpi_ex_store(union acpi_operand_object *source_desc,
360 360
361 default: 361 default:
362 362
363 ACPI_REPORT_ERROR(("ex_store: Unknown Reference opcode %X\n", 363 ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X",
364 ref_desc->reference.opcode)); 364 ref_desc->reference.opcode));
365 ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_ERROR); 365 ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_ERROR);
366 366
367 status = AE_AML_INTERNAL; 367 status = AE_AML_INTERNAL;
@@ -490,10 +490,9 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
490 490
491 /* All other types are invalid */ 491 /* All other types are invalid */
492 492
493 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 493 ACPI_ERROR((AE_INFO,
494 "Source must be Integer/Buffer/String type, not %s\n", 494 "Source must be Integer/Buffer/String type, not %s",
495 acpi_ut_get_object_type_name 495 acpi_ut_get_object_type_name(source_desc)));
496 (source_desc)));
497 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 496 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
498 } 497 }
499 498
@@ -503,8 +502,8 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
503 break; 502 break;
504 503
505 default: 504 default:
506 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 505 ACPI_ERROR((AE_INFO,
507 "Target is not a Package or buffer_field\n")); 506 "Target is not a Package or buffer_field"));
508 status = AE_AML_OPERAND_TYPE; 507 status = AE_AML_OPERAND_TYPE;
509 break; 508 break;
510 } 509 }
diff --git a/drivers/acpi/executer/exstoren.c b/drivers/acpi/executer/exstoren.c
index 382f63c14ea1..42967baf760d 100644
--- a/drivers/acpi/executer/exstoren.c
+++ b/drivers/acpi/executer/exstoren.c
@@ -7,7 +7,7 @@
7 *****************************************************************************/ 7 *****************************************************************************/
8 8
9/* 9/*
10 * Copyright (C) 2000 - 2005, R. Byron Moore 10 * Copyright (C) 2000 - 2006, R. Byron Moore
11 * All rights reserved. 11 * All rights reserved.
12 * 12 *
13 * Redistribution and use in source and binary forms, with or without 13 * Redistribution and use in source and binary forms, with or without
@@ -123,11 +123,10 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
123 && (source_desc->reference.opcode == AML_LOAD_OP))) { 123 && (source_desc->reference.opcode == AML_LOAD_OP))) {
124 /* Conversion successful but still not a valid type */ 124 /* Conversion successful but still not a valid type */
125 125
126 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 126 ACPI_ERROR((AE_INFO,
127 "Cannot assign type %s to %s (must be type Int/Str/Buf)\n", 127 "Cannot assign type %s to %s (must be type Int/Str/Buf)",
128 acpi_ut_get_object_type_name 128 acpi_ut_get_object_type_name(source_desc),
129 (source_desc), 129 acpi_ut_get_type_name(target_type)));
130 acpi_ut_get_type_name(target_type)));
131 status = AE_AML_OPERAND_TYPE; 130 status = AE_AML_OPERAND_TYPE;
132 } 131 }
133 break; 132 break;
@@ -135,9 +134,11 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
135 case ACPI_TYPE_LOCAL_ALIAS: 134 case ACPI_TYPE_LOCAL_ALIAS:
136 case ACPI_TYPE_LOCAL_METHOD_ALIAS: 135 case ACPI_TYPE_LOCAL_METHOD_ALIAS:
137 136
138 /* Aliases are resolved by acpi_ex_prep_operands */ 137 /*
139 138 * All aliases should have been resolved earlier, during the
140 ACPI_REPORT_ERROR(("Store into Alias - should never happen\n")); 139 * operand resolution phase.
140 */
141 ACPI_ERROR((AE_INFO, "Store into an unresolved Alias object"));
141 status = AE_AML_INTERNAL; 142 status = AE_AML_INTERNAL;
142 break; 143 break;
143 144
@@ -280,9 +281,8 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc,
280 /* 281 /*
281 * All other types come here. 282 * All other types come here.
282 */ 283 */
283 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 284 ACPI_WARNING((AE_INFO, "Store into type %s not implemented",
284 "Store into type %s not implemented\n", 285 acpi_ut_get_object_type_name(dest_desc)));
285 acpi_ut_get_object_type_name(dest_desc)));
286 286
287 status = AE_NOT_IMPLEMENTED; 287 status = AE_NOT_IMPLEMENTED;
288 break; 288 break;
diff --git a/drivers/acpi/executer/exstorob.c b/drivers/acpi/executer/exstorob.c
index c4ff654a6697..6ab707087750 100644
--- a/drivers/acpi/executer/exstorob.c
+++ b/drivers/acpi/executer/exstorob.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -71,7 +71,7 @@ acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc,
71 71
72 /* We know that source_desc is a buffer by now */ 72 /* We know that source_desc is a buffer by now */
73 73
74 buffer = (u8 *) source_desc->buffer.pointer; 74 buffer = ACPI_CAST_PTR(u8, source_desc->buffer.pointer);
75 length = source_desc->buffer.length; 75 length = source_desc->buffer.length;
76 76
77 /* 77 /*
@@ -160,7 +160,7 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
160 160
161 /* We know that source_desc is a string by now */ 161 /* We know that source_desc is a string by now */
162 162
163 buffer = (u8 *) source_desc->string.pointer; 163 buffer = ACPI_CAST_PTR(u8, source_desc->string.pointer);
164 length = source_desc->string.length; 164 length = source_desc->string.length;
165 165
166 /* 166 /*
diff --git a/drivers/acpi/executer/exsystem.c b/drivers/acpi/executer/exsystem.c
index 8a88b841237d..ea9144f42e1f 100644
--- a/drivers/acpi/executer/exsystem.c
+++ b/drivers/acpi/executer/exsystem.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -129,8 +129,8 @@ acpi_status acpi_ex_system_do_stall(u32 how_long)
129 * (ACPI specifies 100 usec as max, but this gives some slack in 129 * (ACPI specifies 100 usec as max, but this gives some slack in
130 * order to support existing BIOSs) 130 * order to support existing BIOSs)
131 */ 131 */
132 ACPI_REPORT_ERROR(("Stall: Time parameter is too large (%d)\n", 132 ACPI_ERROR((AE_INFO, "Time parameter is too large (%d)",
133 how_long)); 133 how_long));
134 status = AE_AML_OPERAND_VALUE; 134 status = AE_AML_OPERAND_VALUE;
135 } else { 135 } else {
136 acpi_os_stall(how_long); 136 acpi_os_stall(how_long);
diff --git a/drivers/acpi/executer/exutils.c b/drivers/acpi/executer/exutils.c
index 1ee79d8c8f88..f73a61aeb7ec 100644
--- a/drivers/acpi/executer/exutils.c
+++ b/drivers/acpi/executer/exutils.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -91,7 +91,7 @@ acpi_status acpi_ex_enter_interpreter(void)
91 91
92 status = acpi_ut_acquire_mutex(ACPI_MTX_EXECUTE); 92 status = acpi_ut_acquire_mutex(ACPI_MTX_EXECUTE);
93 if (ACPI_FAILURE(status)) { 93 if (ACPI_FAILURE(status)) {
94 ACPI_REPORT_ERROR(("Could not acquire interpreter mutex\n")); 94 ACPI_ERROR((AE_INFO, "Could not acquire interpreter mutex"));
95 } 95 }
96 96
97 return_ACPI_STATUS(status); 97 return_ACPI_STATUS(status);
@@ -127,7 +127,7 @@ void acpi_ex_exit_interpreter(void)
127 127
128 status = acpi_ut_release_mutex(ACPI_MTX_EXECUTE); 128 status = acpi_ut_release_mutex(ACPI_MTX_EXECUTE);
129 if (ACPI_FAILURE(status)) { 129 if (ACPI_FAILURE(status)) {
130 ACPI_REPORT_ERROR(("Could not release interpreter mutex\n")); 130 ACPI_ERROR((AE_INFO, "Could not release interpreter mutex"));
131 } 131 }
132 132
133 return_VOID; 133 return_VOID;
@@ -200,13 +200,12 @@ u8 acpi_ex_acquire_global_lock(u32 field_flags)
200 if (ACPI_SUCCESS(status)) { 200 if (ACPI_SUCCESS(status)) {
201 locked = TRUE; 201 locked = TRUE;
202 } else { 202 } else {
203 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 203 ACPI_EXCEPTION((AE_INFO, status,
204 "Could not acquire Global Lock, %s\n", 204 "Could not acquire Global Lock"));
205 acpi_format_exception(status)));
206 } 205 }
207 } 206 }
208 207
209 return_VALUE(locked); 208 return_UINT8(locked);
210} 209}
211 210
212/******************************************************************************* 211/*******************************************************************************
@@ -237,7 +236,8 @@ void acpi_ex_release_global_lock(u8 locked_by_me)
237 if (ACPI_FAILURE(status)) { 236 if (ACPI_FAILURE(status)) {
238 /* Report the error, but there isn't much else we can do */ 237 /* Report the error, but there isn't much else we can do */
239 238
240 ACPI_REPORT_ERROR(("Could not release ACPI Global Lock, %s\n", acpi_format_exception(status))); 239 ACPI_EXCEPTION((AE_INFO, status,
240 "Could not release ACPI Global Lock"));
241 } 241 }
242 } 242 }
243 243
@@ -268,7 +268,7 @@ static u32 acpi_ex_digits_needed(acpi_integer value, u32 base)
268 /* acpi_integer is unsigned, so we don't worry about a '-' prefix */ 268 /* acpi_integer is unsigned, so we don't worry about a '-' prefix */
269 269
270 if (value == 0) { 270 if (value == 0) {
271 return_VALUE(1); 271 return_UINT32(1);
272 } 272 }
273 273
274 current_value = value; 274 current_value = value;
@@ -282,7 +282,7 @@ static u32 acpi_ex_digits_needed(acpi_integer value, u32 base)
282 num_digits++; 282 num_digits++;
283 } 283 }
284 284
285 return_VALUE(num_digits); 285 return_UINT32(num_digits);
286} 286}
287 287
288/******************************************************************************* 288/*******************************************************************************
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
index aa993715d644..8daef57b994c 100644
--- a/drivers/acpi/glue.c
+++ b/drivers/acpi/glue.c
@@ -99,15 +99,15 @@ do_root_bridge_busnr_callback(struct acpi_resource *resource, void *data)
99 unsigned long *busnr = (unsigned long *)data; 99 unsigned long *busnr = (unsigned long *)data;
100 struct acpi_resource_address64 address; 100 struct acpi_resource_address64 address;
101 101
102 if (resource->id != ACPI_RSTYPE_ADDRESS16 && 102 if (resource->type != ACPI_RESOURCE_TYPE_ADDRESS16 &&
103 resource->id != ACPI_RSTYPE_ADDRESS32 && 103 resource->type != ACPI_RESOURCE_TYPE_ADDRESS32 &&
104 resource->id != ACPI_RSTYPE_ADDRESS64) 104 resource->type != ACPI_RESOURCE_TYPE_ADDRESS64)
105 return AE_OK; 105 return AE_OK;
106 106
107 acpi_resource_to_address64(resource, &address); 107 acpi_resource_to_address64(resource, &address);
108 if ((address.address_length > 0) && 108 if ((address.address_length > 0) &&
109 (address.resource_type == ACPI_BUS_NUMBER_RANGE)) 109 (address.resource_type == ACPI_BUS_NUMBER_RANGE))
110 *busnr = address.min_address_range; 110 *busnr = address.minimum;
111 111
112 return AE_OK; 112 return AE_OK;
113} 113}
diff --git a/drivers/acpi/hardware/hwacpi.c b/drivers/acpi/hardware/hwacpi.c
index 1bb3463d7040..ea2f13271ff1 100644
--- a/drivers/acpi/hardware/hwacpi.c
+++ b/drivers/acpi/hardware/hwacpi.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -68,8 +68,7 @@ acpi_status acpi_hw_initialize(void)
68 /* We must have the ACPI tables by the time we get here */ 68 /* We must have the ACPI tables by the time we get here */
69 69
70 if (!acpi_gbl_FADT) { 70 if (!acpi_gbl_FADT) {
71 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No FADT is present\n")); 71 ACPI_ERROR((AE_INFO, "No FADT is present"));
72
73 return_ACPI_STATUS(AE_NO_ACPI_TABLES); 72 return_ACPI_STATUS(AE_NO_ACPI_TABLES);
74 } 73 }
75 74
@@ -108,7 +107,8 @@ acpi_status acpi_hw_set_mode(u32 mode)
108 * system does not support mode transition. 107 * system does not support mode transition.
109 */ 108 */
110 if (!acpi_gbl_FADT->smi_cmd) { 109 if (!acpi_gbl_FADT->smi_cmd) {
111 ACPI_REPORT_ERROR(("No SMI_CMD in FADT, mode transition failed.\n")); 110 ACPI_ERROR((AE_INFO,
111 "No SMI_CMD in FADT, mode transition failed"));
112 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE); 112 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
113 } 113 }
114 114
@@ -120,7 +120,8 @@ acpi_status acpi_hw_set_mode(u32 mode)
120 * transitions are not supported. 120 * transitions are not supported.
121 */ 121 */
122 if (!acpi_gbl_FADT->acpi_enable && !acpi_gbl_FADT->acpi_disable) { 122 if (!acpi_gbl_FADT->acpi_enable && !acpi_gbl_FADT->acpi_disable) {
123 ACPI_REPORT_ERROR(("No ACPI mode transition supported in this system (enable/disable both zero)\n")); 123 ACPI_ERROR((AE_INFO,
124 "No ACPI mode transition supported in this system (enable/disable both zero)"));
124 return_ACPI_STATUS(AE_OK); 125 return_ACPI_STATUS(AE_OK);
125 } 126 }
126 127
@@ -154,8 +155,8 @@ acpi_status acpi_hw_set_mode(u32 mode)
154 } 155 }
155 156
156 if (ACPI_FAILURE(status)) { 157 if (ACPI_FAILURE(status)) {
157 ACPI_REPORT_ERROR(("Could not write mode change, %s\n", 158 ACPI_EXCEPTION((AE_INFO, status,
158 acpi_format_exception(status))); 159 "Could not write ACPI mode change"));
159 return_ACPI_STATUS(status); 160 return_ACPI_STATUS(status);
160 } 161 }
161 162
@@ -175,7 +176,7 @@ acpi_status acpi_hw_set_mode(u32 mode)
175 retry--; 176 retry--;
176 } 177 }
177 178
178 ACPI_REPORT_ERROR(("Hardware never changed modes\n")); 179 ACPI_ERROR((AE_INFO, "Hardware did not change modes"));
179 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE); 180 return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
180} 181}
181 182
@@ -204,18 +205,18 @@ u32 acpi_hw_get_mode(void)
204 * system does not support mode transition. 205 * system does not support mode transition.
205 */ 206 */
206 if (!acpi_gbl_FADT->smi_cmd) { 207 if (!acpi_gbl_FADT->smi_cmd) {
207 return_VALUE(ACPI_SYS_MODE_ACPI); 208 return_UINT32(ACPI_SYS_MODE_ACPI);
208 } 209 }
209 210
210 status = 211 status =
211 acpi_get_register(ACPI_BITREG_SCI_ENABLE, &value, ACPI_MTX_LOCK); 212 acpi_get_register(ACPI_BITREG_SCI_ENABLE, &value, ACPI_MTX_LOCK);
212 if (ACPI_FAILURE(status)) { 213 if (ACPI_FAILURE(status)) {
213 return_VALUE(ACPI_SYS_MODE_LEGACY); 214 return_UINT32(ACPI_SYS_MODE_LEGACY);
214 } 215 }
215 216
216 if (value) { 217 if (value) {
217 return_VALUE(ACPI_SYS_MODE_ACPI); 218 return_UINT32(ACPI_SYS_MODE_ACPI);
218 } else { 219 } else {
219 return_VALUE(ACPI_SYS_MODE_LEGACY); 220 return_UINT32(ACPI_SYS_MODE_LEGACY);
220 } 221 }
221} 222}
diff --git a/drivers/acpi/hardware/hwgpe.c b/drivers/acpi/hardware/hwgpe.c
index 5c8e5dfd024e..d84942d22dd5 100644
--- a/drivers/acpi/hardware/hwgpe.c
+++ b/drivers/acpi/hardware/hwgpe.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/hardware/hwregs.c b/drivers/acpi/hardware/hwregs.c
index 536a7aea80c9..e1fe75498415 100644
--- a/drivers/acpi/hardware/hwregs.c
+++ b/drivers/acpi/hardware/hwregs.c
@@ -7,7 +7,7 @@
7 ******************************************************************************/ 7 ******************************************************************************/
8 8
9/* 9/*
10 * Copyright (C) 2000 - 2005, R. Byron Moore 10 * Copyright (C) 2000 - 2006, R. Byron Moore
11 * All rights reserved. 11 * All rights reserved.
12 * 12 *
13 * Redistribution and use in source and binary forms, with or without 13 * Redistribution and use in source and binary forms, with or without
@@ -144,7 +144,8 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 * sleep_type_a, u8 * sleep_type_b)
144 144
145 info.parameters = NULL; 145 info.parameters = NULL;
146 info.return_object = NULL; 146 info.return_object = NULL;
147 sleep_state_name = (char *)acpi_gbl_sleep_state_names[sleep_state]; 147 sleep_state_name =
148 ACPI_CAST_PTR(char, acpi_gbl_sleep_state_names[sleep_state]);
148 149
149 status = acpi_ns_evaluate_by_name(sleep_state_name, &info); 150 status = acpi_ns_evaluate_by_name(sleep_state_name, &info);
150 if (ACPI_FAILURE(status)) { 151 if (ACPI_FAILURE(status)) {
@@ -159,15 +160,16 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 * sleep_type_a, u8 * sleep_type_b)
159 /* Must have a return object */ 160 /* Must have a return object */
160 161
161 if (!info.return_object) { 162 if (!info.return_object) {
162 ACPI_REPORT_ERROR(("No Sleep State object returned from [%s]\n", 163 ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]",
163 sleep_state_name)); 164 sleep_state_name));
164 status = AE_NOT_EXIST; 165 status = AE_NOT_EXIST;
165 } 166 }
166 167
167 /* It must be of type Package */ 168 /* It must be of type Package */
168 169
169 else if (ACPI_GET_OBJECT_TYPE(info.return_object) != ACPI_TYPE_PACKAGE) { 170 else if (ACPI_GET_OBJECT_TYPE(info.return_object) != ACPI_TYPE_PACKAGE) {
170 ACPI_REPORT_ERROR(("Sleep State return object is not a Package\n")); 171 ACPI_ERROR((AE_INFO,
172 "Sleep State return object is not a Package"));
171 status = AE_AML_OPERAND_TYPE; 173 status = AE_AML_OPERAND_TYPE;
172 } 174 }
173 175
@@ -179,7 +181,8 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 * sleep_type_a, u8 * sleep_type_b)
179 * one per sleep type (A/B). 181 * one per sleep type (A/B).
180 */ 182 */
181 else if (info.return_object->package.count < 2) { 183 else if (info.return_object->package.count < 2) {
182 ACPI_REPORT_ERROR(("Sleep State return package does not have at least two elements\n")); 184 ACPI_ERROR((AE_INFO,
185 "Sleep State return package does not have at least two elements"));
183 status = AE_AML_NO_OPERAND; 186 status = AE_AML_NO_OPERAND;
184 } 187 }
185 188
@@ -189,7 +192,12 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 * sleep_type_a, u8 * sleep_type_b)
189 != ACPI_TYPE_INTEGER) || 192 != ACPI_TYPE_INTEGER) ||
190 (ACPI_GET_OBJECT_TYPE(info.return_object->package.elements[1]) 193 (ACPI_GET_OBJECT_TYPE(info.return_object->package.elements[1])
191 != ACPI_TYPE_INTEGER)) { 194 != ACPI_TYPE_INTEGER)) {
192 ACPI_REPORT_ERROR(("Sleep State return package elements are not both Integers (%s, %s)\n", acpi_ut_get_object_type_name(info.return_object->package.elements[0]), acpi_ut_get_object_type_name(info.return_object->package.elements[1]))); 195 ACPI_ERROR((AE_INFO,
196 "Sleep State return package elements are not both Integers (%s, %s)",
197 acpi_ut_get_object_type_name(info.return_object->
198 package.elements[0]),
199 acpi_ut_get_object_type_name(info.return_object->
200 package.elements[1])));
193 status = AE_AML_OPERAND_TYPE; 201 status = AE_AML_OPERAND_TYPE;
194 } else { 202 } else {
195 /* Valid _Sx_ package size, type, and value */ 203 /* Valid _Sx_ package size, type, and value */
@@ -201,12 +209,11 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 * sleep_type_a, u8 * sleep_type_b)
201 } 209 }
202 210
203 if (ACPI_FAILURE(status)) { 211 if (ACPI_FAILURE(status)) {
204 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 212 ACPI_EXCEPTION((AE_INFO, status,
205 "%s While evaluating sleep_state [%s], bad Sleep object %p type %s\n", 213 "While evaluating sleep_state [%s], bad Sleep object %p type %s",
206 acpi_format_exception(status), 214 sleep_state_name, info.return_object,
207 sleep_state_name, info.return_object, 215 acpi_ut_get_object_type_name(info.
208 acpi_ut_get_object_type_name(info. 216 return_object)));
209 return_object)));
210 } 217 }
211 218
212 acpi_ut_remove_reference(info.return_object); 219 acpi_ut_remove_reference(info.return_object);
@@ -229,12 +236,11 @@ EXPORT_SYMBOL(acpi_get_sleep_type_data);
229 236
230struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id) 237struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id)
231{ 238{
232 ACPI_FUNCTION_NAME("hw_get_bit_register_info"); 239 ACPI_FUNCTION_ENTRY();
233 240
234 if (register_id > ACPI_BITREG_MAX) { 241 if (register_id > ACPI_BITREG_MAX) {
235 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 242 ACPI_ERROR((AE_INFO, "Invalid bit_register ID: %X",
236 "Invalid bit_register ID: %X\n", 243 register_id));
237 register_id));
238 return (NULL); 244 return (NULL);
239 } 245 }
240 246
@@ -334,8 +340,8 @@ acpi_status acpi_set_register(u32 register_id, u32 value, u32 flags)
334 340
335 bit_reg_info = acpi_hw_get_bit_register_info(register_id); 341 bit_reg_info = acpi_hw_get_bit_register_info(register_id);
336 if (!bit_reg_info) { 342 if (!bit_reg_info) {
337 ACPI_REPORT_ERROR(("Bad ACPI HW register_id: %X\n", 343 ACPI_ERROR((AE_INFO, "Bad ACPI HW register_id: %X",
338 register_id)); 344 register_id));
339 return_ACPI_STATUS(AE_BAD_PARAMETER); 345 return_ACPI_STATUS(AE_BAD_PARAMETER);
340 } 346 }
341 347
@@ -569,8 +575,7 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value)
569 break; 575 break;
570 576
571 default: 577 default:
572 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown Register ID: %X\n", 578 ACPI_ERROR((AE_INFO, "Unknown Register ID: %X", register_id));
573 register_id));
574 status = AE_BAD_PARAMETER; 579 status = AE_BAD_PARAMETER;
575 break; 580 break;
576 } 581 }
@@ -765,9 +770,9 @@ acpi_hw_low_level_read(u32 width, u32 * value, struct acpi_generic_address *reg)
765 break; 770 break;
766 771
767 default: 772 default:
768 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 773 ACPI_ERROR((AE_INFO,
769 "Unsupported address space: %X\n", 774 "Unsupported address space: %X",
770 reg->address_space_id)); 775 reg->address_space_id));
771 return (AE_BAD_PARAMETER); 776 return (AE_BAD_PARAMETER);
772 } 777 }
773 778
@@ -836,9 +841,9 @@ acpi_hw_low_level_write(u32 width, u32 value, struct acpi_generic_address * reg)
836 break; 841 break;
837 842
838 default: 843 default:
839 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 844 ACPI_ERROR((AE_INFO,
840 "Unsupported address space: %X\n", 845 "Unsupported address space: %X",
841 reg->address_space_id)); 846 reg->address_space_id));
842 return (AE_BAD_PARAMETER); 847 return (AE_BAD_PARAMETER);
843 } 848 }
844 849
diff --git a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c
index 34519069050c..89269272fd62 100644
--- a/drivers/acpi/hardware/hwsleep.c
+++ b/drivers/acpi/hardware/hwsleep.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -199,8 +199,8 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
199 199
200 status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL); 200 status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
201 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 201 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
202 ACPI_REPORT_ERROR(("Method _SST failed, %s\n", 202 ACPI_EXCEPTION((AE_INFO, status,
203 acpi_format_exception(status))); 203 "While executing method _SST"));
204 } 204 }
205 205
206 return_ACPI_STATUS(AE_OK); 206 return_ACPI_STATUS(AE_OK);
@@ -232,9 +232,8 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
232 232
233 if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) || 233 if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) ||
234 (acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) { 234 (acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) {
235 ACPI_REPORT_ERROR(("Sleep values out of range: A=%X B=%X\n", 235 ACPI_ERROR((AE_INFO, "Sleep values out of range: A=%X B=%X",
236 acpi_gbl_sleep_type_a, 236 acpi_gbl_sleep_type_a, acpi_gbl_sleep_type_b));
237 acpi_gbl_sleep_type_b));
238 return_ACPI_STATUS(AE_AML_OPERAND_VALUE); 237 return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
239 } 238 }
240 239
@@ -533,21 +532,18 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
533 arg.integer.value = ACPI_SST_WAKING; 532 arg.integer.value = ACPI_SST_WAKING;
534 status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL); 533 status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
535 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 534 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
536 ACPI_REPORT_ERROR(("Method _SST failed, %s\n", 535 ACPI_EXCEPTION((AE_INFO, status, "During Method _SST"));
537 acpi_format_exception(status)));
538 } 536 }
539 537
540 arg.integer.value = sleep_state; 538 arg.integer.value = sleep_state;
541 status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL); 539 status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL);
542 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 540 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
543 ACPI_REPORT_ERROR(("Method _BFS failed, %s\n", 541 ACPI_EXCEPTION((AE_INFO, status, "During Method _BFS"));
544 acpi_format_exception(status)));
545 } 542 }
546 543
547 status = acpi_evaluate_object(NULL, METHOD_NAME__WAK, &arg_list, NULL); 544 status = acpi_evaluate_object(NULL, METHOD_NAME__WAK, &arg_list, NULL);
548 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 545 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
549 ACPI_REPORT_ERROR(("Method _WAK failed, %s\n", 546 ACPI_EXCEPTION((AE_INFO, status, "During Method _WAK"));
550 acpi_format_exception(status)));
551 } 547 }
552 /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */ 548 /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */
553 549
@@ -582,8 +578,7 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
582 arg.integer.value = ACPI_SST_WORKING; 578 arg.integer.value = ACPI_SST_WORKING;
583 status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL); 579 status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
584 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 580 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
585 ACPI_REPORT_ERROR(("Method _SST failed, %s\n", 581 ACPI_EXCEPTION((AE_INFO, status, "During Method _SST"));
586 acpi_format_exception(status)));
587 } 582 }
588 583
589 return_ACPI_STATUS(status); 584 return_ACPI_STATUS(status);
diff --git a/drivers/acpi/hardware/hwtimer.c b/drivers/acpi/hardware/hwtimer.c
index aff6dc141784..fc10b7cb456f 100644
--- a/drivers/acpi/hardware/hwtimer.c
+++ b/drivers/acpi/hardware/hwtimer.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/motherboard.c b/drivers/acpi/motherboard.c
index e928e8c2c6ec..468244147ec1 100644
--- a/drivers/acpi/motherboard.c
+++ b/drivers/acpi/motherboard.c
@@ -54,36 +54,36 @@ static acpi_status acpi_reserve_io_ranges(struct acpi_resource *res, void *data)
54 54
55 ACPI_FUNCTION_TRACE("acpi_reserve_io_ranges"); 55 ACPI_FUNCTION_TRACE("acpi_reserve_io_ranges");
56 56
57 if (res->id == ACPI_RSTYPE_IO) { 57 if (res->type == ACPI_RESOURCE_TYPE_IO) {
58 struct acpi_resource_io *io_res = &res->data.io; 58 struct acpi_resource_io *io_res = &res->data.io;
59 59
60 if (io_res->min_base_address != io_res->max_base_address) 60 if (io_res->minimum != io_res->maximum)
61 return_VALUE(AE_OK); 61 return_VALUE(AE_OK);
62 if (IS_RESERVED_ADDR 62 if (IS_RESERVED_ADDR
63 (io_res->min_base_address, io_res->range_length)) { 63 (io_res->minimum, io_res->address_length)) {
64 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 64 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
65 "Motherboard resources 0x%08x - 0x%08x\n", 65 "Motherboard resources 0x%08x - 0x%08x\n",
66 io_res->min_base_address, 66 io_res->minimum,
67 io_res->min_base_address + 67 io_res->minimum +
68 io_res->range_length)); 68 io_res->address_length));
69 requested_res = 69 requested_res =
70 request_region(io_res->min_base_address, 70 request_region(io_res->minimum,
71 io_res->range_length, "motherboard"); 71 io_res->address_length, "motherboard");
72 } 72 }
73 } else if (res->id == ACPI_RSTYPE_FIXED_IO) { 73 } else if (res->type == ACPI_RESOURCE_TYPE_FIXED_IO) {
74 struct acpi_resource_fixed_io *fixed_io_res = 74 struct acpi_resource_fixed_io *fixed_io_res =
75 &res->data.fixed_io; 75 &res->data.fixed_io;
76 76
77 if (IS_RESERVED_ADDR 77 if (IS_RESERVED_ADDR
78 (fixed_io_res->base_address, fixed_io_res->range_length)) { 78 (fixed_io_res->address, fixed_io_res->address_length)) {
79 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 79 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
80 "Motherboard resources 0x%08x - 0x%08x\n", 80 "Motherboard resources 0x%08x - 0x%08x\n",
81 fixed_io_res->base_address, 81 fixed_io_res->address,
82 fixed_io_res->base_address + 82 fixed_io_res->address +
83 fixed_io_res->range_length)); 83 fixed_io_res->address_length));
84 requested_res = 84 requested_res =
85 request_region(fixed_io_res->base_address, 85 request_region(fixed_io_res->address,
86 fixed_io_res->range_length, 86 fixed_io_res->address_length,
87 "motherboard"); 87 "motherboard");
88 } 88 }
89 } else { 89 } else {
diff --git a/drivers/acpi/namespace/nsaccess.c b/drivers/acpi/namespace/nsaccess.c
index edfbe34600f5..1149bc18fb35 100644
--- a/drivers/acpi/namespace/nsaccess.c
+++ b/drivers/acpi/namespace/nsaccess.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -110,10 +110,9 @@ acpi_status acpi_ns_root_initialize(void)
110 ACPI_NS_NO_UPSEARCH, NULL, &new_node); 110 ACPI_NS_NO_UPSEARCH, NULL, &new_node);
111 111
112 if (ACPI_FAILURE(status) || (!new_node)) { /* Must be on same line for code converter */ 112 if (ACPI_FAILURE(status) || (!new_node)) { /* Must be on same line for code converter */
113 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 113 ACPI_EXCEPTION((AE_INFO, status,
114 "Could not create predefined name %s, %s\n", 114 "Could not create predefined name %s",
115 init_val->name, 115 init_val->name));
116 acpi_format_exception(status)));
117 } 116 }
118 117
119 /* 118 /*
@@ -124,9 +123,9 @@ acpi_status acpi_ns_root_initialize(void)
124 if (init_val->val) { 123 if (init_val->val) {
125 status = acpi_os_predefined_override(init_val, &val); 124 status = acpi_os_predefined_override(init_val, &val);
126 if (ACPI_FAILURE(status)) { 125 if (ACPI_FAILURE(status)) {
127 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 126 ACPI_ERROR((AE_INFO,
128 "Could not override predefined %s\n", 127 "Could not override predefined %s",
129 init_val->name)); 128 init_val->name));
130 } 129 }
131 130
132 if (!val) { 131 if (!val) {
@@ -233,7 +232,9 @@ acpi_status acpi_ns_root_initialize(void)
233 232
234 default: 233 default:
235 234
236 ACPI_REPORT_ERROR(("Unsupported initial type value %X\n", init_val->type)); 235 ACPI_ERROR((AE_INFO,
236 "Unsupported initial type value %X",
237 init_val->type));
237 acpi_ut_remove_reference(obj_desc); 238 acpi_ut_remove_reference(obj_desc);
238 obj_desc = NULL; 239 obj_desc = NULL;
239 continue; 240 continue;
@@ -339,7 +340,9 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
339 prefix_node = scope_info->scope.node; 340 prefix_node = scope_info->scope.node;
340 if (ACPI_GET_DESCRIPTOR_TYPE(prefix_node) != 341 if (ACPI_GET_DESCRIPTOR_TYPE(prefix_node) !=
341 ACPI_DESC_TYPE_NAMED) { 342 ACPI_DESC_TYPE_NAMED) {
342 ACPI_REPORT_ERROR(("ns_lookup: %p is not a namespace node [%s]\n", prefix_node, acpi_ut_get_descriptor_name(prefix_node))); 343 ACPI_ERROR((AE_INFO, "%p is not a namespace node [%s]",
344 prefix_node,
345 acpi_ut_get_descriptor_name(prefix_node)));
343 return_ACPI_STATUS(AE_AML_INTERNAL); 346 return_ACPI_STATUS(AE_AML_INTERNAL);
344 } 347 }
345 348
@@ -429,7 +432,8 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
429 if (!this_node) { 432 if (!this_node) {
430 /* Current scope has no parent scope */ 433 /* Current scope has no parent scope */
431 434
432 ACPI_REPORT_ERROR(("ACPI path has too many parent prefixes (^) - reached beyond root node\n")); 435 ACPI_ERROR((AE_INFO,
436 "ACPI path has too many parent prefixes (^) - reached beyond root node"));
433 return_ACPI_STATUS(AE_NOT_FOUND); 437 return_ACPI_STATUS(AE_NOT_FOUND);
434 } 438 }
435 } 439 }
@@ -498,7 +502,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
498 path++; 502 path++;
499 503
500 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 504 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
501 "Multi Pathname (%d Segments, Flags=%X) \n", 505 "Multi Pathname (%d Segments, Flags=%X)\n",
502 num_segments, flags)); 506 num_segments, flags));
503 break; 507 break;
504 508
@@ -600,7 +604,12 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
600 (this_node->type != type_to_check_for)) { 604 (this_node->type != type_to_check_for)) {
601 /* Complain about a type mismatch */ 605 /* Complain about a type mismatch */
602 606
603 ACPI_REPORT_WARNING(("ns_lookup: Type mismatch on %4.4s (%s), searching for (%s)\n", (char *)&simple_name, acpi_ut_get_type_name(this_node->type), acpi_ut_get_type_name(type_to_check_for))); 607 ACPI_WARNING((AE_INFO,
608 "ns_lookup: Type mismatch on %4.4s (%s), searching for (%s)",
609 ACPI_CAST_PTR(char, &simple_name),
610 acpi_ut_get_type_name(this_node->type),
611 acpi_ut_get_type_name
612 (type_to_check_for)));
604 } 613 }
605 614
606 /* 615 /*
diff --git a/drivers/acpi/namespace/nsalloc.c b/drivers/acpi/namespace/nsalloc.c
index cc7a85f8cfe6..9b871f38b61b 100644
--- a/drivers/acpi/namespace/nsalloc.c
+++ b/drivers/acpi/namespace/nsalloc.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -272,9 +272,8 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
272 /* Grandchildren should have all been deleted already */ 272 /* Grandchildren should have all been deleted already */
273 273
274 if (child_node->child) { 274 if (child_node->child) {
275 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 275 ACPI_ERROR((AE_INFO, "Found a grandchild! P=%p C=%p",
276 "Found a grandchild! P=%p C=%p\n", 276 parent_node, child_node));
277 parent_node, child_node));
278 } 277 }
279 278
280 /* Now we can free this child object */ 279 /* Now we can free this child object */
@@ -302,7 +301,9 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
302 /* There should be only one reference remaining on this node */ 301 /* There should be only one reference remaining on this node */
303 302
304 if (child_node->reference_count != 1) { 303 if (child_node->reference_count != 1) {
305 ACPI_REPORT_WARNING(("Existing references (%d) on node being deleted (%p)\n", child_node->reference_count, child_node)); 304 ACPI_WARNING((AE_INFO,
305 "Existing references (%d) on node being deleted (%p)",
306 child_node->reference_count, child_node));
306 } 307 }
307 308
308 /* Now we can delete the node */ 309 /* Now we can delete the node */
diff --git a/drivers/acpi/namespace/nsdump.c b/drivers/acpi/namespace/nsdump.c
index 9faf1d5c86ed..a2807317a84b 100644
--- a/drivers/acpi/namespace/nsdump.c
+++ b/drivers/acpi/namespace/nsdump.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -198,12 +198,13 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
198 /* Check the node type and name */ 198 /* Check the node type and name */
199 199
200 if (type > ACPI_TYPE_LOCAL_MAX) { 200 if (type > ACPI_TYPE_LOCAL_MAX) {
201 ACPI_REPORT_WARNING(("Invalid ACPI Type %08X\n", type)); 201 ACPI_WARNING((AE_INFO, "Invalid ACPI Object Type %08X",
202 type));
202 } 203 }
203 204
204 if (!acpi_ut_valid_acpi_name(this_node->name.integer)) { 205 if (!acpi_ut_valid_acpi_name(this_node->name.integer)) {
205 ACPI_REPORT_WARNING(("Invalid ACPI Name %08X\n", 206 ACPI_WARNING((AE_INFO, "Invalid ACPI Name %08X",
206 this_node->name.integer)); 207 this_node->name.integer));
207 } 208 }
208 209
209 acpi_os_printf("%4.4s", acpi_ut_get_node_name(this_node)); 210 acpi_os_printf("%4.4s", acpi_ut_get_node_name(this_node));
@@ -212,7 +213,9 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
212 /* 213 /*
213 * Now we can print out the pertinent information 214 * Now we can print out the pertinent information
214 */ 215 */
215 acpi_os_printf(" %-12s %p ", acpi_ut_get_type_name(type), this_node); 216 acpi_os_printf(" %-12s %p %2.2X ",
217 acpi_ut_get_type_name(type), this_node,
218 this_node->owner_id);
216 219
217 dbg_level = acpi_dbg_level; 220 dbg_level = acpi_dbg_level;
218 acpi_dbg_level = 0; 221 acpi_dbg_level = 0;
diff --git a/drivers/acpi/namespace/nsdumpdv.c b/drivers/acpi/namespace/nsdumpdv.c
index 55de883943d6..aff899a935e3 100644
--- a/drivers/acpi/namespace/nsdumpdv.c
+++ b/drivers/acpi/namespace/nsdumpdv.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/namespace/nseval.c b/drivers/acpi/namespace/nseval.c
index 0191c7d92824..19d7b94d40c3 100644
--- a/drivers/acpi/namespace/nseval.c
+++ b/drivers/acpi/namespace/nseval.c
@@ -6,7 +6,7 @@
6 ******************************************************************************/ 6 ******************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -373,8 +373,7 @@ acpi_ns_execute_control_method(struct acpi_parameter_info *info)
373 373
374 info->obj_desc = acpi_ns_get_attached_object(info->node); 374 info->obj_desc = acpi_ns_get_attached_object(info->node);
375 if (!info->obj_desc) { 375 if (!info->obj_desc) {
376 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 376 ACPI_ERROR((AE_INFO, "No attached method object"));
377 "No attached method object\n"));
378 377
379 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 378 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
380 return_ACPI_STATUS(AE_NULL_OBJECT); 379 return_ACPI_STATUS(AE_NULL_OBJECT);
diff --git a/drivers/acpi/namespace/nsinit.c b/drivers/acpi/namespace/nsinit.c
index 0a08d2f04a06..9f929e479fd8 100644
--- a/drivers/acpi/namespace/nsinit.c
+++ b/drivers/acpi/namespace/nsinit.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -93,8 +93,7 @@ acpi_status acpi_ns_initialize_objects(void)
93 ACPI_UINT32_MAX, acpi_ns_init_one_object, 93 ACPI_UINT32_MAX, acpi_ns_init_one_object,
94 &info, NULL); 94 &info, NULL);
95 if (ACPI_FAILURE(status)) { 95 if (ACPI_FAILURE(status)) {
96 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "walk_namespace failed! %s\n", 96 ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace"));
97 acpi_format_exception(status)));
98 } 97 }
99 98
100 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, 99 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
@@ -159,12 +158,11 @@ acpi_status acpi_ns_initialize_devices(void)
159 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 158 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
160 159
161 if (ACPI_FAILURE(status)) { 160 if (ACPI_FAILURE(status)) {
162 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "walk_namespace failed! %s\n", 161 ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace"));
163 acpi_format_exception(status)));
164 } 162 }
165 163
166 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, 164 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
167 "\n%hd Devices found containing: %hd _STA, %hd _INI methods\n", 165 "\n%hd Devices found - executed %hd _STA, %hd _INI methods\n",
168 info.device_count, info.num_STA, info.num_INI)); 166 info.device_count, info.num_STA, info.num_INI));
169 167
170 return_ACPI_STATUS(status); 168 return_ACPI_STATUS(status);
@@ -289,12 +287,10 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
289 } 287 }
290 288
291 if (ACPI_FAILURE(status)) { 289 if (ACPI_FAILURE(status)) {
292 ACPI_DEBUG_PRINT_RAW((ACPI_DB_ERROR, "\n")); 290 ACPI_EXCEPTION((AE_INFO, status,
293 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 291 "Could not execute arguments for [%4.4s] (%s)",
294 "Could not execute arguments for [%4.4s] (%s), %s\n", 292 acpi_ut_get_node_name(node),
295 acpi_ut_get_node_name(node), 293 acpi_ut_get_type_name(type)));
296 acpi_ut_get_type_name(type),
297 acpi_format_exception(status)));
298 } 294 }
299 295
300 /* 296 /*
@@ -336,23 +332,22 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
336 struct acpi_parameter_info pinfo; 332 struct acpi_parameter_info pinfo;
337 u32 flags; 333 u32 flags;
338 acpi_status status; 334 acpi_status status;
335 struct acpi_namespace_node *ini_node;
336 struct acpi_namespace_node *device_node;
339 337
340 ACPI_FUNCTION_TRACE("ns_init_one_device"); 338 ACPI_FUNCTION_TRACE("ns_init_one_device");
341 339
342 pinfo.parameters = NULL; 340 device_node = acpi_ns_map_handle_to_node(obj_handle);
343 pinfo.parameter_type = ACPI_PARAM_ARGS; 341 if (!device_node) {
344
345 pinfo.node = acpi_ns_map_handle_to_node(obj_handle);
346 if (!pinfo.node) {
347 return_ACPI_STATUS(AE_BAD_PARAMETER); 342 return_ACPI_STATUS(AE_BAD_PARAMETER);
348 } 343 }
349 344
350 /* 345 /*
351 * We will run _STA/_INI on Devices, Processors and thermal_zones only 346 * We will run _STA/_INI on Devices, Processors and thermal_zones only
352 */ 347 */
353 if ((pinfo.node->type != ACPI_TYPE_DEVICE) && 348 if ((device_node->type != ACPI_TYPE_DEVICE) &&
354 (pinfo.node->type != ACPI_TYPE_PROCESSOR) && 349 (device_node->type != ACPI_TYPE_PROCESSOR) &&
355 (pinfo.node->type != ACPI_TYPE_THERMAL)) { 350 (device_node->type != ACPI_TYPE_THERMAL)) {
356 return_ACPI_STATUS(AE_OK); 351 return_ACPI_STATUS(AE_OK);
357 } 352 }
358 353
@@ -364,57 +359,69 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
364 info->device_count++; 359 info->device_count++;
365 360
366 /* 361 /*
367 * Run _STA to determine if we can run _INI on the device. 362 * Check if the _INI method exists for this device -
363 * if _INI does not exist, there is no need to run _STA
364 * No _INI means device requires no initialization
365 */
366 status = acpi_ns_search_node(*ACPI_CAST_PTR(u32, METHOD_NAME__INI),
367 device_node, ACPI_TYPE_METHOD, &ini_node);
368 if (ACPI_FAILURE(status)) {
369 /* No _INI method found - move on to next device */
370
371 return_ACPI_STATUS(AE_OK);
372 }
373
374 /*
375 * Run _STA to determine if we can run _INI on the device -
376 * the device must be present before _INI can be run.
377 * However, _STA is not required - assume device present if no _STA
368 */ 378 */
369 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD, 379 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD,
370 pinfo.node, 380 device_node,
371 METHOD_NAME__STA)); 381 METHOD_NAME__STA));
372 status = acpi_ut_execute_STA(pinfo.node, &flags);
373 382
383 pinfo.node = device_node;
384 pinfo.parameters = NULL;
385 pinfo.parameter_type = ACPI_PARAM_ARGS;
386
387 status = acpi_ut_execute_STA(pinfo.node, &flags);
374 if (ACPI_FAILURE(status)) { 388 if (ACPI_FAILURE(status)) {
375 if (pinfo.node->type == ACPI_TYPE_DEVICE) { 389 /* Ignore error and move on to next device */
376 /* Ignore error and move on to next device */
377 390
378 return_ACPI_STATUS(AE_OK); 391 return_ACPI_STATUS(AE_OK);
379 } 392 }
380 393
381 /* _STA is not required for Processor or thermal_zone objects */ 394 if (flags != ACPI_UINT32_MAX) {
382 } else {
383 info->num_STA++; 395 info->num_STA++;
396 }
384 397
385 if (!(flags & 0x01)) { 398 if (!(flags & ACPI_STA_DEVICE_PRESENT)) {
386 /* Don't look at children of a not present device */ 399 /* Don't look at children of a not present device */
387 400
388 return_ACPI_STATUS(AE_CTRL_DEPTH); 401 return_ACPI_STATUS(AE_CTRL_DEPTH);
389 }
390 } 402 }
391 403
392 /* 404 /*
393 * The device is present. Run _INI. 405 * The device is present and _INI exists. Run the _INI method.
406 * (We already have the _INI node from above)
394 */ 407 */
395 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD, 408 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD,
396 pinfo.node, 409 pinfo.node,
397 METHOD_NAME__INI)); 410 METHOD_NAME__INI));
398 status = acpi_ns_evaluate_relative(METHOD_NAME__INI, &pinfo);
399 if (ACPI_FAILURE(status)) {
400 /* No _INI (AE_NOT_FOUND) means device requires no initialization */
401 411
402 if (status != AE_NOT_FOUND) { 412 pinfo.node = ini_node;
403 /* Ignore error and move on to next device */ 413 status = acpi_ns_evaluate_by_handle(&pinfo);
414 if (ACPI_FAILURE(status)) {
415 /* Ignore error and move on to next device */
404 416
405#ifdef ACPI_DEBUG_OUTPUT 417#ifdef ACPI_DEBUG_OUTPUT
406 char *scope_name = 418 char *scope_name = acpi_ns_get_external_pathname(ini_node);
407 acpi_ns_get_external_pathname(pinfo.node);
408 419
409 ACPI_DEBUG_PRINT((ACPI_DB_WARN, "%s._INI failed: %s\n", 420 ACPI_WARNING((AE_INFO, "%s._INI failed: %s",
410 scope_name, 421 scope_name, acpi_format_exception(status)));
411 acpi_format_exception(status)));
412 422
413 ACPI_MEM_FREE(scope_name); 423 ACPI_MEM_FREE(scope_name);
414#endif 424#endif
415 }
416
417 status = AE_OK;
418 } else { 425 } else {
419 /* Delete any return object (especially if implicit_return is enabled) */ 426 /* Delete any return object (especially if implicit_return is enabled) */
420 427
@@ -434,5 +441,5 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
434 acpi_gbl_init_handler(pinfo.node, ACPI_INIT_DEVICE_INI); 441 acpi_gbl_init_handler(pinfo.node, ACPI_INIT_DEVICE_INI);
435 } 442 }
436 443
437 return_ACPI_STATUS(status); 444 return_ACPI_STATUS(AE_OK);
438} 445}
diff --git a/drivers/acpi/namespace/nsload.c b/drivers/acpi/namespace/nsload.c
index c28849de465a..4e0b0524c188 100644
--- a/drivers/acpi/namespace/nsload.c
+++ b/drivers/acpi/namespace/nsload.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -92,7 +92,7 @@ acpi_ns_load_table(struct acpi_table_desc *table_desc,
92 /* Check validity of the AML start and length */ 92 /* Check validity of the AML start and length */
93 93
94 if (!table_desc->aml_start) { 94 if (!table_desc->aml_start) {
95 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null AML pointer\n")); 95 ACPI_ERROR((AE_INFO, "Null AML pointer"));
96 return_ACPI_STATUS(AE_BAD_PARAMETER); 96 return_ACPI_STATUS(AE_BAD_PARAMETER);
97 } 97 }
98 98
@@ -102,8 +102,8 @@ acpi_ns_load_table(struct acpi_table_desc *table_desc,
102 /* Ignore table if there is no AML contained within */ 102 /* Ignore table if there is no AML contained within */
103 103
104 if (!table_desc->aml_length) { 104 if (!table_desc->aml_length) {
105 ACPI_REPORT_WARNING(("Zero-length AML block in table [%4.4s]\n", 105 ACPI_WARNING((AE_INFO, "Zero-length AML block in table [%4.4s]",
106 table_desc->pointer->signature)); 106 table_desc->pointer->signature));
107 return_ACPI_STATUS(AE_OK); 107 return_ACPI_STATUS(AE_OK);
108 } 108 }
109 109
@@ -263,7 +263,7 @@ acpi_status acpi_ns_load_namespace(void)
263 /* There must be at least a DSDT installed */ 263 /* There must be at least a DSDT installed */
264 264
265 if (acpi_gbl_DSDT == NULL) { 265 if (acpi_gbl_DSDT == NULL) {
266 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "DSDT is not in memory\n")); 266 ACPI_ERROR((AE_INFO, "DSDT is not in memory"));
267 return_ACPI_STATUS(AE_NO_ACPI_TABLES); 267 return_ACPI_STATUS(AE_NO_ACPI_TABLES);
268 } 268 }
269 269
diff --git a/drivers/acpi/namespace/nsnames.c b/drivers/acpi/namespace/nsnames.c
index d5e8dea61c27..639f653b4b6b 100644
--- a/drivers/acpi/namespace/nsnames.c
+++ b/drivers/acpi/namespace/nsnames.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -75,7 +75,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
75 acpi_size index; 75 acpi_size index;
76 struct acpi_namespace_node *parent_node; 76 struct acpi_namespace_node *parent_node;
77 77
78 ACPI_FUNCTION_NAME("ns_build_external_path"); 78 ACPI_FUNCTION_ENTRY();
79 79
80 /* Special case for root */ 80 /* Special case for root */
81 81
@@ -110,9 +110,9 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
110 name_buffer[index] = AML_ROOT_PREFIX; 110 name_buffer[index] = AML_ROOT_PREFIX;
111 111
112 if (index != 0) { 112 if (index != 0) {
113 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 113 ACPI_ERROR((AE_INFO,
114 "Could not construct pathname; index=%X, size=%X, Path=%s\n", 114 "Could not construct pathname; index=%X, size=%X, Path=%s",
115 (u32) index, (u32) size, &name_buffer[size])); 115 (u32) index, (u32) size, &name_buffer[size]));
116 } 116 }
117 117
118 return; 118 return;
@@ -148,7 +148,7 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
148 148
149 name_buffer = ACPI_MEM_CALLOCATE(size); 149 name_buffer = ACPI_MEM_CALLOCATE(size);
150 if (!name_buffer) { 150 if (!name_buffer) {
151 ACPI_REPORT_ERROR(("ns_get_table_pathname: allocation failure\n")); 151 ACPI_ERROR((AE_INFO, "Allocation failure"));
152 return_PTR(NULL); 152 return_PTR(NULL);
153 } 153 }
154 154
@@ -241,7 +241,7 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
241 241
242 acpi_ns_build_external_path(node, required_size, buffer->pointer); 242 acpi_ns_build_external_path(node, required_size, buffer->pointer);
243 243
244 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X] \n", 244 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n",
245 (char *)buffer->pointer, (u32) required_size)); 245 (char *)buffer->pointer, (u32) required_size));
246 return_ACPI_STATUS(AE_OK); 246 return_ACPI_STATUS(AE_OK);
247} 247}
diff --git a/drivers/acpi/namespace/nsobject.c b/drivers/acpi/namespace/nsobject.c
index fc9be946ebed..10ae6292bca4 100644
--- a/drivers/acpi/namespace/nsobject.c
+++ b/drivers/acpi/namespace/nsobject.c
@@ -6,7 +6,7 @@
6 ******************************************************************************/ 6 ******************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -84,22 +84,23 @@ acpi_ns_attach_object(struct acpi_namespace_node *node,
84 if (!node) { 84 if (!node) {
85 /* Invalid handle */ 85 /* Invalid handle */
86 86
87 ACPI_REPORT_ERROR(("ns_attach_object: Null named_obj handle\n")); 87 ACPI_ERROR((AE_INFO, "Null named_obj handle"));
88 return_ACPI_STATUS(AE_BAD_PARAMETER); 88 return_ACPI_STATUS(AE_BAD_PARAMETER);
89 } 89 }
90 90
91 if (!object && (ACPI_TYPE_ANY != type)) { 91 if (!object && (ACPI_TYPE_ANY != type)) {
92 /* Null object */ 92 /* Null object */
93 93
94 ACPI_REPORT_ERROR(("ns_attach_object: Null object, but type not ACPI_TYPE_ANY\n")); 94 ACPI_ERROR((AE_INFO,
95 "Null object, but type not ACPI_TYPE_ANY"));
95 return_ACPI_STATUS(AE_BAD_PARAMETER); 96 return_ACPI_STATUS(AE_BAD_PARAMETER);
96 } 97 }
97 98
98 if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) { 99 if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
99 /* Not a name handle */ 100 /* Not a name handle */
100 101
101 ACPI_REPORT_ERROR(("ns_attach_object: Invalid handle %p [%s]\n", 102 ACPI_ERROR((AE_INFO, "Invalid handle %p [%s]",
102 node, acpi_ut_get_descriptor_name(node))); 103 node, acpi_ut_get_descriptor_name(node)));
103 return_ACPI_STATUS(AE_BAD_PARAMETER); 104 return_ACPI_STATUS(AE_BAD_PARAMETER);
104 } 105 }
105 106
@@ -254,7 +255,7 @@ union acpi_operand_object *acpi_ns_get_attached_object(struct
254 ACPI_FUNCTION_TRACE_PTR("ns_get_attached_object", node); 255 ACPI_FUNCTION_TRACE_PTR("ns_get_attached_object", node);
255 256
256 if (!node) { 257 if (!node) {
257 ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Null Node ptr\n")); 258 ACPI_WARNING((AE_INFO, "Null Node ptr"));
258 return_PTR(NULL); 259 return_PTR(NULL);
259 } 260 }
260 261
diff --git a/drivers/acpi/namespace/nsparse.c b/drivers/acpi/namespace/nsparse.c
index 433442a9ec74..232be4303653 100644
--- a/drivers/acpi/namespace/nsparse.c
+++ b/drivers/acpi/namespace/nsparse.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/namespace/nssearch.c b/drivers/acpi/namespace/nssearch.c
index 50a3ca5470ed..d64b78952f24 100644
--- a/drivers/acpi/namespace/nssearch.c
+++ b/drivers/acpi/namespace/nssearch.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -99,8 +99,8 @@ acpi_ns_search_node(u32 target_name,
99 if (scope_name) { 99 if (scope_name) {
100 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 100 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
101 "Searching %s (%p) For [%4.4s] (%s)\n", 101 "Searching %s (%p) For [%4.4s] (%s)\n",
102 scope_name, node, 102 scope_name, node, ACPI_CAST_PTR(char,
103 (char *)&target_name, 103 &target_name),
104 acpi_ut_get_type_name(type))); 104 acpi_ut_get_type_name(type)));
105 105
106 ACPI_MEM_FREE(scope_name); 106 ACPI_MEM_FREE(scope_name);
@@ -131,7 +131,7 @@ acpi_ns_search_node(u32 target_name,
131 */ 131 */
132 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 132 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
133 "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n", 133 "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
134 (char *)&target_name, 134 ACPI_CAST_PTR(char, &target_name),
135 acpi_ut_get_type_name(next_node-> 135 acpi_ut_get_type_name(next_node->
136 type), 136 type),
137 next_node, 137 next_node,
@@ -160,7 +160,8 @@ acpi_ns_search_node(u32 target_name,
160 160
161 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 161 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
162 "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n", 162 "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n",
163 (char *)&target_name, acpi_ut_get_type_name(type), 163 ACPI_CAST_PTR(char, &target_name),
164 acpi_ut_get_type_name(type),
164 acpi_ut_get_node_name(node), node, node->child)); 165 acpi_ut_get_node_name(node), node, node->child));
165 166
166 return_ACPI_STATUS(AE_NOT_FOUND); 167 return_ACPI_STATUS(AE_NOT_FOUND);
@@ -210,14 +211,14 @@ acpi_ns_search_parent_tree(u32 target_name,
210 */ 211 */
211 if (!parent_node) { 212 if (!parent_node) {
212 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "[%4.4s] has no parent\n", 213 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "[%4.4s] has no parent\n",
213 (char *)&target_name)); 214 ACPI_CAST_PTR(char, &target_name)));
214 return_ACPI_STATUS(AE_NOT_FOUND); 215 return_ACPI_STATUS(AE_NOT_FOUND);
215 } 216 }
216 217
217 if (acpi_ns_local(type)) { 218 if (acpi_ns_local(type)) {
218 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 219 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
219 "[%4.4s] type [%s] must be local to this scope (no parent search)\n", 220 "[%4.4s] type [%s] must be local to this scope (no parent search)\n",
220 (char *)&target_name, 221 ACPI_CAST_PTR(char, &target_name),
221 acpi_ut_get_type_name(type))); 222 acpi_ut_get_type_name(type)));
222 return_ACPI_STATUS(AE_NOT_FOUND); 223 return_ACPI_STATUS(AE_NOT_FOUND);
223 } 224 }
@@ -227,7 +228,7 @@ acpi_ns_search_parent_tree(u32 target_name,
227 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 228 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
228 "Searching parent [%4.4s] for [%4.4s]\n", 229 "Searching parent [%4.4s] for [%4.4s]\n",
229 acpi_ut_get_node_name(parent_node), 230 acpi_ut_get_node_name(parent_node),
230 (char *)&target_name)); 231 ACPI_CAST_PTR(char, &target_name)));
231 232
232 /* 233 /*
233 * Search parents until target is found or we have backed up to the root 234 * Search parents until target is found or we have backed up to the root
@@ -297,18 +298,17 @@ acpi_ns_search_and_enter(u32 target_name,
297 /* Parameter validation */ 298 /* Parameter validation */
298 299
299 if (!node || !target_name || !return_node) { 300 if (!node || !target_name || !return_node) {
300 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 301 ACPI_ERROR((AE_INFO,
301 "Null param: Node %p Name %X return_node %p\n", 302 "Null param: Node %p Name %X return_node %p",
302 node, target_name, return_node)); 303 node, target_name, return_node));
303
304 ACPI_REPORT_ERROR(("ns_search_and_enter: Null parameter\n"));
305 return_ACPI_STATUS(AE_BAD_PARAMETER); 304 return_ACPI_STATUS(AE_BAD_PARAMETER);
306 } 305 }
307 306
308 /* Name must consist of printable characters */ 307 /* Name must consist of printable characters */
309 308
310 if (!acpi_ut_valid_acpi_name(target_name)) { 309 if (!acpi_ut_valid_acpi_name(target_name)) {
311 ACPI_REPORT_ERROR(("ns_search_and_enter: Bad character in ACPI Name: %X\n", target_name)); 310 ACPI_ERROR((AE_INFO, "Bad character in ACPI Name: %X",
311 target_name));
312 return_ACPI_STATUS(AE_BAD_CHARACTER); 312 return_ACPI_STATUS(AE_BAD_CHARACTER);
313 } 313 }
314 314
@@ -360,7 +360,7 @@ acpi_ns_search_and_enter(u32 target_name,
360 if (interpreter_mode == ACPI_IMODE_EXECUTE) { 360 if (interpreter_mode == ACPI_IMODE_EXECUTE) {
361 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 361 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
362 "%4.4s Not found in %p [Not adding]\n", 362 "%4.4s Not found in %p [Not adding]\n",
363 (char *)&target_name, node)); 363 ACPI_CAST_PTR(char, &target_name), node));
364 364
365 return_ACPI_STATUS(AE_NOT_FOUND); 365 return_ACPI_STATUS(AE_NOT_FOUND);
366 } 366 }
diff --git a/drivers/acpi/namespace/nsutils.c b/drivers/acpi/namespace/nsutils.c
index ebec036423c9..3e7cad549a38 100644
--- a/drivers/acpi/namespace/nsutils.c
+++ b/drivers/acpi/namespace/nsutils.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -63,7 +63,6 @@ acpi_name acpi_ns_find_parent_name(struct acpi_namespace_node *node_to_search);
63 * 63 *
64 * PARAMETERS: module_name - Caller's module name (for error output) 64 * PARAMETERS: module_name - Caller's module name (for error output)
65 * line_number - Caller's line number (for error output) 65 * line_number - Caller's line number (for error output)
66 * component_id - Caller's component ID (for error output)
67 * internal_name - Name or path of the namespace node 66 * internal_name - Name or path of the namespace node
68 * lookup_status - Exception code from NS lookup 67 * lookup_status - Exception code from NS lookup
69 * 68 *
@@ -76,19 +75,17 @@ acpi_name acpi_ns_find_parent_name(struct acpi_namespace_node *node_to_search);
76void 75void
77acpi_ns_report_error(char *module_name, 76acpi_ns_report_error(char *module_name,
78 u32 line_number, 77 u32 line_number,
79 u32 component_id,
80 char *internal_name, acpi_status lookup_status) 78 char *internal_name, acpi_status lookup_status)
81{ 79{
82 acpi_status status; 80 acpi_status status;
83 char *name = NULL; 81 char *name = NULL;
84 82
85 acpi_os_printf("%8s-%04d: *** Error: Looking up ", 83 acpi_ut_report_error(module_name, line_number);
86 module_name, line_number);
87 84
88 if (lookup_status == AE_BAD_CHARACTER) { 85 if (lookup_status == AE_BAD_CHARACTER) {
89 /* There is a non-ascii character in the name */ 86 /* There is a non-ascii character in the name */
90 87
91 acpi_os_printf("[0x%4.4X] (NON-ASCII)\n", 88 acpi_os_printf("[0x%4.4X] (NON-ASCII)",
92 *(ACPI_CAST_PTR(u32, internal_name))); 89 *(ACPI_CAST_PTR(u32, internal_name)));
93 } else { 90 } else {
94 /* Convert path to external format */ 91 /* Convert path to external format */
@@ -109,7 +106,7 @@ acpi_ns_report_error(char *module_name,
109 } 106 }
110 } 107 }
111 108
112 acpi_os_printf(" in namespace, %s\n", 109 acpi_os_printf(" Namespace lookup failure, %s\n",
113 acpi_format_exception(lookup_status)); 110 acpi_format_exception(lookup_status));
114} 111}
115 112
@@ -119,10 +116,9 @@ acpi_ns_report_error(char *module_name,
119 * 116 *
120 * PARAMETERS: module_name - Caller's module name (for error output) 117 * PARAMETERS: module_name - Caller's module name (for error output)
121 * line_number - Caller's line number (for error output) 118 * line_number - Caller's line number (for error output)
122 * component_id - Caller's component ID (for error output)
123 * Message - Error message to use on failure 119 * Message - Error message to use on failure
124 * prefix_node - Prefix relative to the path 120 * prefix_node - Prefix relative to the path
125 * Path - Path to the node 121 * Path - Path to the node (optional)
126 * method_status - Execution status 122 * method_status - Execution status
127 * 123 *
128 * RETURN: None 124 * RETURN: None
@@ -134,7 +130,6 @@ acpi_ns_report_error(char *module_name,
134void 130void
135acpi_ns_report_method_error(char *module_name, 131acpi_ns_report_method_error(char *module_name,
136 u32 line_number, 132 u32 line_number,
137 u32 component_id,
138 char *message, 133 char *message,
139 struct acpi_namespace_node *prefix_node, 134 struct acpi_namespace_node *prefix_node,
140 char *path, acpi_status method_status) 135 char *path, acpi_status method_status)
@@ -142,17 +137,16 @@ acpi_ns_report_method_error(char *module_name,
142 acpi_status status; 137 acpi_status status;
143 struct acpi_namespace_node *node = prefix_node; 138 struct acpi_namespace_node *node = prefix_node;
144 139
140 acpi_ut_report_error(module_name, line_number);
141
145 if (path) { 142 if (path) {
146 status = acpi_ns_get_node_by_path(path, prefix_node, 143 status = acpi_ns_get_node_by_path(path, prefix_node,
147 ACPI_NS_NO_UPSEARCH, &node); 144 ACPI_NS_NO_UPSEARCH, &node);
148 if (ACPI_FAILURE(status)) { 145 if (ACPI_FAILURE(status)) {
149 acpi_os_printf 146 acpi_os_printf("[Could not get node by pathname]");
150 ("report_method_error: Could not get node\n");
151 return;
152 } 147 }
153 } 148 }
154 149
155 acpi_os_printf("%8s-%04d: *** Error: ", module_name, line_number);
156 acpi_ns_print_node_pathname(node, message); 150 acpi_ns_print_node_pathname(node, message);
157 acpi_os_printf(", %s\n", acpi_format_exception(method_status)); 151 acpi_os_printf(", %s\n", acpi_format_exception(method_status));
158} 152}
@@ -248,11 +242,11 @@ acpi_object_type acpi_ns_get_type(struct acpi_namespace_node * node)
248 ACPI_FUNCTION_TRACE("ns_get_type"); 242 ACPI_FUNCTION_TRACE("ns_get_type");
249 243
250 if (!node) { 244 if (!node) {
251 ACPI_REPORT_WARNING(("ns_get_type: Null Node input pointer\n")); 245 ACPI_WARNING((AE_INFO, "Null Node parameter"));
252 return_VALUE(ACPI_TYPE_ANY); 246 return_UINT32(ACPI_TYPE_ANY);
253 } 247 }
254 248
255 return_VALUE((acpi_object_type) node->type); 249 return_UINT32((acpi_object_type) node->type);
256} 250}
257 251
258/******************************************************************************* 252/*******************************************************************************
@@ -275,11 +269,11 @@ u32 acpi_ns_local(acpi_object_type type)
275 if (!acpi_ut_valid_object_type(type)) { 269 if (!acpi_ut_valid_object_type(type)) {
276 /* Type code out of range */ 270 /* Type code out of range */
277 271
278 ACPI_REPORT_WARNING(("ns_local: Invalid Object Type\n")); 272 ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type));
279 return_VALUE(ACPI_NS_NORMAL); 273 return_UINT32(ACPI_NS_NORMAL);
280 } 274 }
281 275
282 return_VALUE((u32) acpi_gbl_ns_properties[type] & ACPI_NS_LOCAL); 276 return_UINT32((u32) acpi_gbl_ns_properties[type] & ACPI_NS_LOCAL);
283} 277}
284 278
285/******************************************************************************* 279/*******************************************************************************
@@ -627,7 +621,7 @@ acpi_ns_externalize_name(u32 internal_name_length,
627 * with internal_name (invalid format). 621 * with internal_name (invalid format).
628 */ 622 */
629 if (required_length > internal_name_length) { 623 if (required_length > internal_name_length) {
630 ACPI_REPORT_ERROR(("ns_externalize_name: Invalid internal name\n")); 624 ACPI_ERROR((AE_INFO, "Invalid internal name"));
631 return_ACPI_STATUS(AE_BAD_PATHNAME); 625 return_ACPI_STATUS(AE_BAD_PATHNAME);
632 } 626 }
633 627
@@ -803,12 +797,11 @@ u32 acpi_ns_opens_scope(acpi_object_type type)
803 if (!acpi_ut_valid_object_type(type)) { 797 if (!acpi_ut_valid_object_type(type)) {
804 /* type code out of range */ 798 /* type code out of range */
805 799
806 ACPI_REPORT_WARNING(("ns_opens_scope: Invalid Object Type %X\n", 800 ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type));
807 type)); 801 return_UINT32(ACPI_NS_NORMAL);
808 return_VALUE(ACPI_NS_NORMAL);
809 } 802 }
810 803
811 return_VALUE(((u32) acpi_gbl_ns_properties[type]) & ACPI_NS_NEWSCOPE); 804 return_UINT32(((u32) acpi_gbl_ns_properties[type]) & ACPI_NS_NEWSCOPE);
812} 805}
813 806
814/******************************************************************************* 807/*******************************************************************************
diff --git a/drivers/acpi/namespace/nswalk.c b/drivers/acpi/namespace/nswalk.c
index 5f164c0df33b..fcab1e784b81 100644
--- a/drivers/acpi/namespace/nswalk.c
+++ b/drivers/acpi/namespace/nswalk.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c
index c07b046659ff..a95f636dc35d 100644
--- a/drivers/acpi/namespace/nsxfeval.c
+++ b/drivers/acpi/namespace/nsxfeval.c
@@ -6,7 +6,7 @@
6 ******************************************************************************/ 6 ******************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -112,8 +112,7 @@ acpi_evaluate_object_typed(acpi_handle handle,
112 if (return_buffer->length == 0) { 112 if (return_buffer->length == 0) {
113 /* Error because caller specifically asked for a return value */ 113 /* Error because caller specifically asked for a return value */
114 114
115 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No return value\n")); 115 ACPI_ERROR((AE_INFO, "No return value"));
116
117 return_ACPI_STATUS(AE_NULL_OBJECT); 116 return_ACPI_STATUS(AE_NULL_OBJECT);
118 } 117 }
119 118
@@ -125,11 +124,11 @@ acpi_evaluate_object_typed(acpi_handle handle,
125 124
126 /* Return object type does not match requested type */ 125 /* Return object type does not match requested type */
127 126
128 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 127 ACPI_ERROR((AE_INFO,
129 "Incorrect return type [%s] requested [%s]\n", 128 "Incorrect return type [%s] requested [%s]",
130 acpi_ut_get_type_name(((union acpi_object *) 129 acpi_ut_get_type_name(((union acpi_object *)return_buffer->
131 return_buffer->pointer)->type), 130 pointer)->type),
132 acpi_ut_get_type_name(return_type))); 131 acpi_ut_get_type_name(return_type)));
133 132
134 if (must_free) { 133 if (must_free) {
135 /* Caller used ACPI_ALLOCATE_BUFFER, free the return buffer */ 134 /* Caller used ACPI_ALLOCATE_BUFFER, free the return buffer */
@@ -236,11 +235,11 @@ acpi_evaluate_object(acpi_handle handle,
236 * qualified names above, this is an error 235 * qualified names above, this is an error
237 */ 236 */
238 if (!pathname) { 237 if (!pathname) {
239 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 238 ACPI_ERROR((AE_INFO,
240 "Both Handle and Pathname are NULL\n")); 239 "Both Handle and Pathname are NULL"));
241 } else { 240 } else {
242 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 241 ACPI_ERROR((AE_INFO,
243 "Handle is NULL and Pathname is relative\n")); 242 "Handle is NULL and Pathname is relative"));
244 } 243 }
245 244
246 status = AE_BAD_PARAMETER; 245 status = AE_BAD_PARAMETER;
@@ -399,7 +398,7 @@ acpi_walk_namespace(acpi_object_type type,
399 398
400 /* Parameter validation */ 399 /* Parameter validation */
401 400
402 if ((type > ACPI_TYPE_EXTERNAL_MAX) || (!max_depth) || (!user_function)) { 401 if ((type > ACPI_TYPE_LOCAL_MAX) || (!max_depth) || (!user_function)) {
403 return_ACPI_STATUS(AE_BAD_PARAMETER); 402 return_ACPI_STATUS(AE_BAD_PARAMETER);
404 } 403 }
405 404
@@ -473,8 +472,8 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
473 return (AE_CTRL_DEPTH); 472 return (AE_CTRL_DEPTH);
474 } 473 }
475 474
476 if (!(flags & 0x01)) { 475 if (!(flags & ACPI_STA_DEVICE_PRESENT)) {
477 /* Don't return at the device or children of the device if not there */ 476 /* Don't examine children of the device if not present */
478 477
479 return (AE_CTRL_DEPTH); 478 return (AE_CTRL_DEPTH);
480 } 479 }
diff --git a/drivers/acpi/namespace/nsxfname.c b/drivers/acpi/namespace/nsxfname.c
index 6b5f8d4481d1..8cd8675a47c0 100644
--- a/drivers/acpi/namespace/nsxfname.c
+++ b/drivers/acpi/namespace/nsxfname.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -300,8 +300,7 @@ acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer)
300 300
301 status = acpi_ut_execute_CID(node, &cid_list); 301 status = acpi_ut_execute_CID(node, &cid_list);
302 if (ACPI_SUCCESS(status)) { 302 if (ACPI_SUCCESS(status)) {
303 size += ((acpi_size) cid_list->count - 1) * 303 size += cid_list->size;
304 sizeof(struct acpi_compatible_id);
305 info->valid |= ACPI_VALID_CID; 304 info->valid |= ACPI_VALID_CID;
306 } 305 }
307 306
diff --git a/drivers/acpi/namespace/nsxfobj.c b/drivers/acpi/namespace/nsxfobj.c
index 0856d42e6909..a0332595677a 100644
--- a/drivers/acpi/namespace/nsxfobj.c
+++ b/drivers/acpi/namespace/nsxfobj.c
@@ -6,7 +6,7 @@
6 ******************************************************************************/ 6 ******************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 20c9a37643c7..ac5bbaedac1b 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -838,7 +838,7 @@ acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout)
838 static const int quantum_ms = 1000 / HZ; 838 static const int quantum_ms = 1000 / HZ;
839 839
840 ret = down_trylock(sem); 840 ret = down_trylock(sem);
841 for (i = timeout; (i > 0 && ret < 0); i -= quantum_ms) { 841 for (i = timeout; (i > 0 && ret != 0); i -= quantum_ms) {
842 schedule_timeout_interruptible(1); 842 schedule_timeout_interruptible(1);
843 ret = down_trylock(sem); 843 ret = down_trylock(sem);
844 } 844 }
@@ -1060,13 +1060,11 @@ EXPORT_SYMBOL(max_cstate);
1060 * Acquire a spinlock. 1060 * Acquire a spinlock.
1061 * 1061 *
1062 * handle is a pointer to the spinlock_t. 1062 * handle is a pointer to the spinlock_t.
1063 * flags is *not* the result of save_flags - it is an ACPI-specific flag variable
1064 * that indicates whether we are at interrupt level.
1065 */ 1063 */
1066 1064
1067unsigned long acpi_os_acquire_lock(acpi_handle handle) 1065acpi_cpu_flags acpi_os_acquire_lock(acpi_handle handle)
1068{ 1066{
1069 unsigned long flags; 1067 acpi_cpu_flags flags;
1070 spin_lock_irqsave((spinlock_t *) handle, flags); 1068 spin_lock_irqsave((spinlock_t *) handle, flags);
1071 return flags; 1069 return flags;
1072} 1070}
@@ -1075,7 +1073,7 @@ unsigned long acpi_os_acquire_lock(acpi_handle handle)
1075 * Release a spinlock. See above. 1073 * Release a spinlock. See above.
1076 */ 1074 */
1077 1075
1078void acpi_os_release_lock(acpi_handle handle, unsigned long flags) 1076void acpi_os_release_lock(acpi_handle handle, acpi_cpu_flags flags)
1079{ 1077{
1080 spin_unlock_irqrestore((spinlock_t *) handle, flags); 1078 spin_unlock_irqrestore((spinlock_t *) handle, flags);
1081} 1079}
diff --git a/drivers/acpi/parser/psargs.c b/drivers/acpi/parser/psargs.c
index 5858188f94a6..de573be52718 100644
--- a/drivers/acpi/parser/psargs.c
+++ b/drivers/acpi/parser/psargs.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -45,6 +45,7 @@
45#include <acpi/acparser.h> 45#include <acpi/acparser.h>
46#include <acpi/amlcode.h> 46#include <acpi/amlcode.h>
47#include <acpi/acnamesp.h> 47#include <acpi/acnamesp.h>
48#include <acpi/acdispat.h>
48 49
49#define _COMPONENT ACPI_PARSER 50#define _COMPONENT ACPI_PARSER
50ACPI_MODULE_NAME("psargs") 51ACPI_MODULE_NAME("psargs")
@@ -62,61 +63,51 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
62 * 63 *
63 * PARAMETERS: parser_state - Current parser state object 64 * PARAMETERS: parser_state - Current parser state object
64 * 65 *
65 * RETURN: Decoded package length. On completion, the AML pointer points 66 * RETURN: Decoded package length. On completion, the AML pointer points
66 * past the length byte or bytes. 67 * past the length byte or bytes.
67 * 68 *
68 * DESCRIPTION: Decode and return a package length field 69 * DESCRIPTION: Decode and return a package length field.
70 * Note: Largest package length is 28 bits, from ACPI specification
69 * 71 *
70 ******************************************************************************/ 72 ******************************************************************************/
71 73
72static u32 74static u32
73acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state) 75acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state)
74{ 76{
75 u32 encoded_length; 77 u8 *aml = parser_state->aml;
76 u32 length = 0; 78 u32 package_length = 0;
79 acpi_native_uint byte_count;
80 u8 byte_zero_mask = 0x3F; /* Default [0:5] */
77 81
78 ACPI_FUNCTION_TRACE("ps_get_next_package_length"); 82 ACPI_FUNCTION_TRACE("ps_get_next_package_length");
79 83
80 encoded_length = (u32) ACPI_GET8(parser_state->aml); 84 /*
81 parser_state->aml++; 85 * Byte 0 bits [6:7] contain the number of additional bytes
82 86 * used to encode the package length, either 0,1,2, or 3
83 switch (encoded_length >> 6) { /* bits 6-7 contain encoding scheme */ 87 */
84 case 0: /* 1-byte encoding (bits 0-5) */ 88 byte_count = (aml[0] >> 6);
85 89 parser_state->aml += (byte_count + 1);
86 length = (encoded_length & 0x3F);
87 break;
88
89 case 1: /* 2-byte encoding (next byte + bits 0-3) */
90
91 length = ((ACPI_GET8(parser_state->aml) << 04) |
92 (encoded_length & 0x0F));
93 parser_state->aml++;
94 break;
95
96 case 2: /* 3-byte encoding (next 2 bytes + bits 0-3) */
97
98 length = ((ACPI_GET8(parser_state->aml + 1) << 12) |
99 (ACPI_GET8(parser_state->aml) << 04) |
100 (encoded_length & 0x0F));
101 parser_state->aml += 2;
102 break;
103 90
104 case 3: /* 4-byte encoding (next 3 bytes + bits 0-3) */ 91 /* Get bytes 3, 2, 1 as needed */
105 92
106 length = ((ACPI_GET8(parser_state->aml + 2) << 20) | 93 while (byte_count) {
107 (ACPI_GET8(parser_state->aml + 1) << 12) | 94 /*
108 (ACPI_GET8(parser_state->aml) << 04) | 95 * Final bit positions for the package length bytes:
109 (encoded_length & 0x0F)); 96 * Byte3->[20:27]
110 parser_state->aml += 3; 97 * Byte2->[12:19]
111 break; 98 * Byte1->[04:11]
112 99 * Byte0->[00:03]
113 default: 100 */
101 package_length |= (aml[byte_count] << ((byte_count << 3) - 4));
114 102
115 /* Can't get here, only 2 bits / 4 cases */ 103 byte_zero_mask = 0x0F; /* Use bits [0:3] of byte 0 */
116 break; 104 byte_count--;
117 } 105 }
118 106
119 return_VALUE(length); 107 /* Byte 0 is a special case, either bits [0:3] or [0:5] are used */
108
109 package_length |= (aml[0] & byte_zero_mask);
110 return_UINT32(package_length);
120} 111}
121 112
122/******************************************************************************* 113/*******************************************************************************
@@ -135,16 +126,15 @@ acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state)
135u8 *acpi_ps_get_next_package_end(struct acpi_parse_state *parser_state) 126u8 *acpi_ps_get_next_package_end(struct acpi_parse_state *parser_state)
136{ 127{
137 u8 *start = parser_state->aml; 128 u8 *start = parser_state->aml;
138 acpi_native_uint length; 129 u32 package_length;
139 130
140 ACPI_FUNCTION_TRACE("ps_get_next_package_end"); 131 ACPI_FUNCTION_TRACE("ps_get_next_package_end");
141 132
142 /* Function below changes parser_state->Aml */ 133 /* Function below updates parser_state->Aml */
143 134
144 length = 135 package_length = acpi_ps_get_next_package_length(parser_state);
145 (acpi_native_uint) acpi_ps_get_next_package_length(parser_state);
146 136
147 return_PTR(start + length); /* end of package */ 137 return_PTR(start + package_length); /* end of package */
148} 138}
149 139
150/******************************************************************************* 140/*******************************************************************************
@@ -169,17 +159,15 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
169 159
170 ACPI_FUNCTION_TRACE("ps_get_next_namestring"); 160 ACPI_FUNCTION_TRACE("ps_get_next_namestring");
171 161
172 /* Handle multiple prefix characters */ 162 /* Point past any namestring prefix characters (backslash or carat) */
173
174 while (acpi_ps_is_prefix_char(ACPI_GET8(end))) {
175 /* Include prefix '\\' or '^' */
176 163
164 while (acpi_ps_is_prefix_char(*end)) {
177 end++; 165 end++;
178 } 166 }
179 167
180 /* Decode the path */ 168 /* Decode the path prefix character */
181 169
182 switch (ACPI_GET8(end)) { 170 switch (*end) {
183 case 0: 171 case 0:
184 172
185 /* null_name */ 173 /* null_name */
@@ -199,9 +187,9 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
199 187
200 case AML_MULTI_NAME_PREFIX_OP: 188 case AML_MULTI_NAME_PREFIX_OP:
201 189
202 /* Multiple name segments, 4 chars each */ 190 /* Multiple name segments, 4 chars each, count in next byte */
203 191
204 end += 2 + ((acpi_size) ACPI_GET8(end + 1) * ACPI_NAME_SIZE); 192 end += 2 + (*(end + 1) * ACPI_NAME_SIZE);
205 break; 193 break;
206 194
207 default: 195 default:
@@ -212,7 +200,7 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
212 break; 200 break;
213 } 201 }
214 202
215 parser_state->aml = (u8 *) end; 203 parser_state->aml = end;
216 return_PTR((char *)start); 204 return_PTR((char *)start);
217} 205}
218 206
@@ -224,7 +212,7 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
224 * Arg - Where the namepath will be stored 212 * Arg - Where the namepath will be stored
225 * arg_count - If the namepath points to a control method 213 * arg_count - If the namepath points to a control method
226 * the method's argument is returned here. 214 * the method's argument is returned here.
227 * method_call - Whether the namepath can possibly be the 215 * possible_method_call - Whether the namepath can possibly be the
228 * start of a method call 216 * start of a method call
229 * 217 *
230 * RETURN: Status 218 * RETURN: Status
@@ -240,11 +228,11 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
240acpi_status 228acpi_status
241acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state, 229acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
242 struct acpi_parse_state *parser_state, 230 struct acpi_parse_state *parser_state,
243 union acpi_parse_object *arg, u8 method_call) 231 union acpi_parse_object *arg, u8 possible_method_call)
244{ 232{
245 char *path; 233 char *path;
246 union acpi_parse_object *name_op; 234 union acpi_parse_object *name_op;
247 acpi_status status = AE_OK; 235 acpi_status status;
248 union acpi_operand_object *method_desc; 236 union acpi_operand_object *method_desc;
249 struct acpi_namespace_node *node; 237 struct acpi_namespace_node *node;
250 union acpi_generic_state scope_info; 238 union acpi_generic_state scope_info;
@@ -252,115 +240,129 @@ acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
252 ACPI_FUNCTION_TRACE("ps_get_next_namepath"); 240 ACPI_FUNCTION_TRACE("ps_get_next_namepath");
253 241
254 path = acpi_ps_get_next_namestring(parser_state); 242 path = acpi_ps_get_next_namestring(parser_state);
243 acpi_ps_init_op(arg, AML_INT_NAMEPATH_OP);
255 244
256 /* Null path case is allowed */ 245 /* Null path case is allowed, just exit */
257 246
258 if (path) { 247 if (!path) {
259 /* 248 arg->common.value.name = path;
260 * Lookup the name in the internal namespace 249 return_ACPI_STATUS(AE_OK);
261 */ 250 }
262 scope_info.scope.node = NULL;
263 node = parser_state->start_node;
264 if (node) {
265 scope_info.scope.node = node;
266 }
267 251
268 /* 252 /* Setup search scope info */
269 * Lookup object. We don't want to add anything new to the namespace
270 * here, however. So we use MODE_EXECUTE. Allow searching of the
271 * parent tree, but don't open a new scope -- we just want to lookup the
272 * object (MUST BE mode EXECUTE to perform upsearch)
273 */
274 status = acpi_ns_lookup(&scope_info, path, ACPI_TYPE_ANY,
275 ACPI_IMODE_EXECUTE,
276 ACPI_NS_SEARCH_PARENT |
277 ACPI_NS_DONT_OPEN_SCOPE, NULL, &node);
278 if (ACPI_SUCCESS(status) && method_call) {
279 if (node->type == ACPI_TYPE_METHOD) {
280 /* This name is actually a control method invocation */
281
282 method_desc = acpi_ns_get_attached_object(node);
283 ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
284 "Control Method - %p Desc %p Path=%p\n",
285 node, method_desc, path));
286
287 name_op = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP);
288 if (!name_op) {
289 return_ACPI_STATUS(AE_NO_MEMORY);
290 }
291 253
292 /* Change arg into a METHOD CALL and attach name to it */ 254 scope_info.scope.node = NULL;
255 node = parser_state->start_node;
256 if (node) {
257 scope_info.scope.node = node;
258 }
293 259
294 acpi_ps_init_op(arg, AML_INT_METHODCALL_OP); 260 /*
295 name_op->common.value.name = path; 261 * Lookup the name in the internal namespace. We don't want to add
262 * anything new to the namespace here, however, so we use MODE_EXECUTE.
263 * Allow searching of the parent tree, but don't open a new scope -
264 * we just want to lookup the object (must be mode EXECUTE to perform
265 * the upsearch)
266 */
267 status =
268 acpi_ns_lookup(&scope_info, path, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
269 ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
270 NULL, &node);
296 271
297 /* Point METHODCALL/NAME to the METHOD Node */ 272 /*
273 * If this name is a control method invocation, we must
274 * setup the method call
275 */
276 if (ACPI_SUCCESS(status) &&
277 possible_method_call && (node->type == ACPI_TYPE_METHOD)) {
278 /* This name is actually a control method invocation */
298 279
299 name_op->common.node = node; 280 method_desc = acpi_ns_get_attached_object(node);
300 acpi_ps_append_arg(arg, name_op); 281 ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
282 "Control Method - %p Desc %p Path=%p\n", node,
283 method_desc, path));
301 284
302 if (!method_desc) { 285 name_op = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP);
303 ACPI_REPORT_ERROR(("ps_get_next_namepath: Control Method %p has no attached object\n", node)); 286 if (!name_op) {
304 return_ACPI_STATUS(AE_AML_INTERNAL); 287 return_ACPI_STATUS(AE_NO_MEMORY);
305 } 288 }
306 289
307 ACPI_DEBUG_PRINT((ACPI_DB_PARSE, 290 /* Change Arg into a METHOD CALL and attach name to it */
308 "Control Method - %p Args %X\n",
309 node,
310 method_desc->method.
311 param_count));
312 291
313 /* Get the number of arguments to expect */ 292 acpi_ps_init_op(arg, AML_INT_METHODCALL_OP);
293 name_op->common.value.name = path;
314 294
315 walk_state->arg_count = 295 /* Point METHODCALL/NAME to the METHOD Node */
316 method_desc->method.param_count;
317 return_ACPI_STATUS(AE_OK);
318 }
319 296
320 /* 297 name_op->common.node = node;
321 * Else this is normal named object reference. 298 acpi_ps_append_arg(arg, name_op);
322 * Just init the NAMEPATH object with the pathname.
323 * (See code below)
324 */
325 }
326 299
327 if (ACPI_FAILURE(status)) { 300 if (!method_desc) {
328 /* 301 ACPI_ERROR((AE_INFO,
329 * 1) Any error other than NOT_FOUND is always severe 302 "Control Method %p has no attached object",
330 * 2) NOT_FOUND is only important if we are executing a method. 303 node));
331 * 3) If executing a cond_ref_of opcode, NOT_FOUND is ok. 304 return_ACPI_STATUS(AE_AML_INTERNAL);
332 */
333 if ((((walk_state->
334 parse_flags & ACPI_PARSE_MODE_MASK) ==
335 ACPI_PARSE_EXECUTE) && (status == AE_NOT_FOUND)
336 && (walk_state->op->common.aml_opcode !=
337 AML_COND_REF_OF_OP))
338 || (status != AE_NOT_FOUND)) {
339 ACPI_REPORT_NSERROR(path, status);
340
341 acpi_os_printf
342 ("search_node %p start_node %p return_node %p\n",
343 scope_info.scope.node,
344 parser_state->start_node, node);
345
346 } else {
347 /*
348 * We got a NOT_FOUND during table load or we encountered
349 * a cond_ref_of(x) where the target does not exist.
350 * Either case is ok
351 */
352 status = AE_OK;
353 }
354 } 305 }
306
307 ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
308 "Control Method - %p Args %X\n",
309 node, method_desc->method.param_count));
310
311 /* Get the number of arguments to expect */
312
313 walk_state->arg_count = method_desc->method.param_count;
314 return_ACPI_STATUS(AE_OK);
355 } 315 }
356 316
357 /* 317 /*
358 * Regardless of success/failure above, 318 * Special handling if the name was not found during the lookup -
359 * Just initialize the Op with the pathname. 319 * some not_found cases are allowed
360 */ 320 */
361 acpi_ps_init_op(arg, AML_INT_NAMEPATH_OP); 321 if (status == AE_NOT_FOUND) {
362 arg->common.value.name = path; 322 /* 1) not_found is ok during load pass 1/2 (allow forward references) */
323
324 if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) !=
325 ACPI_PARSE_EXECUTE) {
326 status = AE_OK;
327 }
328
329 /* 2) not_found during a cond_ref_of(x) is ok by definition */
330
331 else if (walk_state->op->common.aml_opcode ==
332 AML_COND_REF_OF_OP) {
333 status = AE_OK;
334 }
335
336 /*
337 * 3) not_found while building a Package is ok at this point, we
338 * may flag as an error later if slack mode is not enabled.
339 * (Some ASL code depends on allowing this behavior)
340 */
341 else if ((arg->common.parent) &&
342 ((arg->common.parent->common.aml_opcode ==
343 AML_PACKAGE_OP)
344 || (arg->common.parent->common.aml_opcode ==
345 AML_VAR_PACKAGE_OP))) {
346 status = AE_OK;
347 }
348 }
349
350 /* Final exception check (may have been changed from code above) */
363 351
352 if (ACPI_FAILURE(status)) {
353 ACPI_ERROR_NAMESPACE(path, status);
354
355 if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) ==
356 ACPI_PARSE_EXECUTE) {
357 /* Report a control method execution error */
358
359 status = acpi_ds_method_error(status, walk_state);
360 }
361 }
362
363 /* Save the namepath */
364
365 arg->common.value.name = path;
364 return_ACPI_STATUS(status); 366 return_ACPI_STATUS(status);
365} 367}
366 368
@@ -382,59 +384,63 @@ void
382acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state, 384acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state,
383 u32 arg_type, union acpi_parse_object *arg) 385 u32 arg_type, union acpi_parse_object *arg)
384{ 386{
387 u32 length;
388 u16 opcode;
389 u8 *aml = parser_state->aml;
385 390
386 ACPI_FUNCTION_TRACE_U32("ps_get_next_simple_arg", arg_type); 391 ACPI_FUNCTION_TRACE_U32("ps_get_next_simple_arg", arg_type);
387 392
388 switch (arg_type) { 393 switch (arg_type) {
389 case ARGP_BYTEDATA: 394 case ARGP_BYTEDATA:
390 395
391 acpi_ps_init_op(arg, AML_BYTE_OP); 396 /* Get 1 byte from the AML stream */
392 arg->common.value.integer = (u32) ACPI_GET8(parser_state->aml); 397
393 parser_state->aml++; 398 opcode = AML_BYTE_OP;
399 arg->common.value.integer = (acpi_integer) * aml;
400 length = 1;
394 break; 401 break;
395 402
396 case ARGP_WORDDATA: 403 case ARGP_WORDDATA:
397 404
398 acpi_ps_init_op(arg, AML_WORD_OP);
399
400 /* Get 2 bytes from the AML stream */ 405 /* Get 2 bytes from the AML stream */
401 406
402 ACPI_MOVE_16_TO_32(&arg->common.value.integer, 407 opcode = AML_WORD_OP;
403 parser_state->aml); 408 ACPI_MOVE_16_TO_64(&arg->common.value.integer, aml);
404 parser_state->aml += 2; 409 length = 2;
405 break; 410 break;
406 411
407 case ARGP_DWORDDATA: 412 case ARGP_DWORDDATA:
408 413
409 acpi_ps_init_op(arg, AML_DWORD_OP);
410
411 /* Get 4 bytes from the AML stream */ 414 /* Get 4 bytes from the AML stream */
412 415
413 ACPI_MOVE_32_TO_32(&arg->common.value.integer, 416 opcode = AML_DWORD_OP;
414 parser_state->aml); 417 ACPI_MOVE_32_TO_64(&arg->common.value.integer, aml);
415 parser_state->aml += 4; 418 length = 4;
416 break; 419 break;
417 420
418 case ARGP_QWORDDATA: 421 case ARGP_QWORDDATA:
419 422
420 acpi_ps_init_op(arg, AML_QWORD_OP);
421
422 /* Get 8 bytes from the AML stream */ 423 /* Get 8 bytes from the AML stream */
423 424
424 ACPI_MOVE_64_TO_64(&arg->common.value.integer, 425 opcode = AML_QWORD_OP;
425 parser_state->aml); 426 ACPI_MOVE_64_TO_64(&arg->common.value.integer, aml);
426 parser_state->aml += 8; 427 length = 8;
427 break; 428 break;
428 429
429 case ARGP_CHARLIST: 430 case ARGP_CHARLIST:
430 431
431 acpi_ps_init_op(arg, AML_STRING_OP); 432 /* Get a pointer to the string, point past the string */
432 arg->common.value.string = (char *)parser_state->aml; 433
434 opcode = AML_STRING_OP;
435 arg->common.value.string = ACPI_CAST_PTR(char, aml);
433 436
434 while (ACPI_GET8(parser_state->aml) != '\0') { 437 /* Find the null terminator */
435 parser_state->aml++; 438
439 length = 0;
440 while (aml[length]) {
441 length++;
436 } 442 }
437 parser_state->aml++; 443 length++;
438 break; 444 break;
439 445
440 case ARGP_NAME: 446 case ARGP_NAME:
@@ -443,14 +449,16 @@ acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state,
443 acpi_ps_init_op(arg, AML_INT_NAMEPATH_OP); 449 acpi_ps_init_op(arg, AML_INT_NAMEPATH_OP);
444 arg->common.value.name = 450 arg->common.value.name =
445 acpi_ps_get_next_namestring(parser_state); 451 acpi_ps_get_next_namestring(parser_state);
446 break; 452 return_VOID;
447 453
448 default: 454 default:
449 455
450 ACPI_REPORT_ERROR(("Invalid arg_type %X\n", arg_type)); 456 ACPI_ERROR((AE_INFO, "Invalid arg_type %X", arg_type));
451 break; 457 return_VOID;
452 } 458 }
453 459
460 acpi_ps_init_op(arg, opcode);
461 parser_state->aml += length;
454 return_VOID; 462 return_VOID;
455} 463}
456 464
@@ -540,7 +548,7 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
540 * access_type is first operand, access_attribute is second 548 * access_type is first operand, access_attribute is second
541 */ 549 */
542 field->common.value.integer = 550 field->common.value.integer =
543 (ACPI_GET8(parser_state->aml) << 8); 551 (((u32) ACPI_GET8(parser_state->aml) << 8));
544 parser_state->aml++; 552 parser_state->aml++;
545 field->common.value.integer |= ACPI_GET8(parser_state->aml); 553 field->common.value.integer |= ACPI_GET8(parser_state->aml);
546 parser_state->aml++; 554 parser_state->aml++;
@@ -703,7 +711,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
703 711
704 default: 712 default:
705 713
706 ACPI_REPORT_ERROR(("Invalid arg_type: %X\n", arg_type)); 714 ACPI_ERROR((AE_INFO, "Invalid arg_type: %X", arg_type));
707 status = AE_AML_OPERAND_TYPE; 715 status = AE_AML_OPERAND_TYPE;
708 break; 716 break;
709 } 717 }
diff --git a/drivers/acpi/parser/psloop.c b/drivers/acpi/parser/psloop.c
index 088d33999d90..00b072e15d19 100644
--- a/drivers/acpi/parser/psloop.c
+++ b/drivers/acpi/parser/psloop.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -123,16 +123,12 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
123 && ((status & AE_CODE_MASK) != 123 && ((status & AE_CODE_MASK) !=
124 AE_CODE_CONTROL)) { 124 AE_CODE_CONTROL)) {
125 if (status == AE_AML_NO_RETURN_VALUE) { 125 if (status == AE_AML_NO_RETURN_VALUE) {
126 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 126 ACPI_EXCEPTION((AE_INFO, status,
127 "Invoked method did not return a value, %s\n", 127 "Invoked method did not return a value"));
128 acpi_format_exception
129 (status)));
130 128
131 } 129 }
132 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 130 ACPI_EXCEPTION((AE_INFO, status,
133 "get_predicate Failed, %s\n", 131 "get_predicate Failed"));
134 acpi_format_exception
135 (status)));
136 return_ACPI_STATUS(status); 132 return_ACPI_STATUS(status);
137 } 133 }
138 134
@@ -190,11 +186,11 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
190 186
191 /* The opcode is unrecognized. Just skip unknown opcodes */ 187 /* The opcode is unrecognized. Just skip unknown opcodes */
192 188
193 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 189 ACPI_ERROR((AE_INFO,
194 "Found unknown opcode %X at AML address %p offset %X, ignoring\n", 190 "Found unknown opcode %X at AML address %p offset %X, ignoring",
195 walk_state->opcode, 191 walk_state->opcode,
196 parser_state->aml, 192 parser_state->aml,
197 walk_state->aml_offset)); 193 walk_state->aml_offset));
198 194
199 ACPI_DUMP_BUFFER(parser_state->aml, 128); 195 ACPI_DUMP_BUFFER(parser_state->aml, 128);
200 196
@@ -281,10 +277,8 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
281 walk_state->descending_callback(walk_state, 277 walk_state->descending_callback(walk_state,
282 &op); 278 &op);
283 if (ACPI_FAILURE(status)) { 279 if (ACPI_FAILURE(status)) {
284 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 280 ACPI_EXCEPTION((AE_INFO, status,
285 "During name lookup/catalog, %s\n", 281 "During name lookup/catalog"));
286 acpi_format_exception
287 (status)));
288 goto close_this_op; 282 goto close_this_op;
289 } 283 }
290 284
@@ -704,6 +698,15 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
704 acpi_ps_pop_scope(parser_state, &op, 698 acpi_ps_pop_scope(parser_state, &op,
705 &walk_state->arg_types, 699 &walk_state->arg_types,
706 &walk_state->arg_count); 700 &walk_state->arg_count);
701
702 if (op->common.aml_opcode != AML_WHILE_OP) {
703 status2 =
704 acpi_ds_result_stack_pop
705 (walk_state);
706 if (ACPI_FAILURE(status2)) {
707 return_ACPI_STATUS(status2);
708 }
709 }
707 } 710 }
708 711
709 /* Close this iteration of the While loop */ 712 /* Close this iteration of the While loop */
diff --git a/drivers/acpi/parser/psopcode.c b/drivers/acpi/parser/psopcode.c
index 229ae86afe8b..11d6351ab8b2 100644
--- a/drivers/acpi/parser/psopcode.c
+++ b/drivers/acpi/parser/psopcode.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -747,7 +747,7 @@ const struct acpi_opcode_info *acpi_ps_get_opcode_info(u16 opcode)
747 747
748 /* Unknown AML opcode */ 748 /* Unknown AML opcode */
749 749
750 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 750 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
751 "Unknown AML opcode [%4.4X]\n", opcode)); 751 "Unknown AML opcode [%4.4X]\n", opcode));
752 752
753 return (&acpi_gbl_aml_op_info[_UNK]); 753 return (&acpi_gbl_aml_op_info[_UNK]);
diff --git a/drivers/acpi/parser/psparse.c b/drivers/acpi/parser/psparse.c
index 76d4d640d83c..a9f3229f4106 100644
--- a/drivers/acpi/parser/psparse.c
+++ b/drivers/acpi/parser/psparse.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -333,7 +333,6 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
333 333
334 switch (callback_status) { 334 switch (callback_status) {
335 case AE_CTRL_TERMINATE: 335 case AE_CTRL_TERMINATE:
336
337 /* 336 /*
338 * A control method was terminated via a RETURN statement. 337 * A control method was terminated via a RETURN statement.
339 * The walk of this method is complete. 338 * The walk of this method is complete.
@@ -346,13 +345,19 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
346 345
347 parser_state->aml = walk_state->aml_last_while; 346 parser_state->aml = walk_state->aml_last_while;
348 walk_state->control_state->common.value = FALSE; 347 walk_state->control_state->common.value = FALSE;
349 status = AE_CTRL_BREAK; 348 status = acpi_ds_result_stack_pop(walk_state);
349 if (ACPI_SUCCESS(status)) {
350 status = AE_CTRL_BREAK;
351 }
350 break; 352 break;
351 353
352 case AE_CTRL_CONTINUE: 354 case AE_CTRL_CONTINUE:
353 355
354 parser_state->aml = walk_state->aml_last_while; 356 parser_state->aml = walk_state->aml_last_while;
355 status = AE_CTRL_CONTINUE; 357 status = acpi_ds_result_stack_pop(walk_state);
358 if (ACPI_SUCCESS(status)) {
359 status = AE_CTRL_CONTINUE;
360 }
356 break; 361 break;
357 362
358 case AE_CTRL_PENDING: 363 case AE_CTRL_PENDING:
@@ -369,16 +374,18 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
369#endif 374#endif
370 375
371 case AE_CTRL_TRUE: 376 case AE_CTRL_TRUE:
372
373 /* 377 /*
374 * Predicate of an IF was true, and we are at the matching ELSE. 378 * Predicate of an IF was true, and we are at the matching ELSE.
375 * Just close out this package 379 * Just close out this package
376 */ 380 */
377 parser_state->aml = acpi_ps_get_next_package_end(parser_state); 381 parser_state->aml = acpi_ps_get_next_package_end(parser_state);
382 status = acpi_ds_result_stack_pop(walk_state);
383 if (ACPI_SUCCESS(status)) {
384 status = AE_CTRL_PENDING;
385 }
378 break; 386 break;
379 387
380 case AE_CTRL_FALSE: 388 case AE_CTRL_FALSE:
381
382 /* 389 /*
383 * Either an IF/WHILE Predicate was false or we encountered a BREAK 390 * Either an IF/WHILE Predicate was false or we encountered a BREAK
384 * opcode. In both cases, we do not execute the rest of the 391 * opcode. In both cases, we do not execute the rest of the
@@ -503,22 +510,23 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
503 } else if (status == AE_CTRL_TERMINATE) { 510 } else if (status == AE_CTRL_TERMINATE) {
504 status = AE_OK; 511 status = AE_OK;
505 } else if ((status != AE_OK) && (walk_state->method_desc)) { 512 } else if ((status != AE_OK) && (walk_state->method_desc)) {
506 ACPI_REPORT_METHOD_ERROR("Method execution failed", 513 /* Either the method parse or actual execution failed */
507 walk_state->method_node, NULL,
508 status);
509
510 /* Ensure proper cleanup */
511 514
512 walk_state->parse_flags |= ACPI_PARSE_EXECUTE; 515 ACPI_ERROR_METHOD("Method parse/execution failed",
516 walk_state->method_node, NULL,
517 status);
513 518
514 /* Check for possible multi-thread reentrancy problem */ 519 /* Check for possible multi-thread reentrancy problem */
515 520
516 if ((status == AE_ALREADY_EXISTS) && 521 if ((status == AE_ALREADY_EXISTS) &&
517 (!walk_state->method_desc->method.semaphore)) { 522 (!walk_state->method_desc->method.semaphore)) {
518 /* 523 /*
519 * This method is marked not_serialized, but it tried to create 524 * Method tried to create an object twice. The probable cause is
525 * that the method cannot handle reentrancy.
526 *
527 * The method is marked not_serialized, but it tried to create
520 * a named object, causing the second thread entrance to fail. 528 * a named object, causing the second thread entrance to fail.
521 * We will workaround this by marking the method permanently 529 * Workaround this problem by marking the method permanently
522 * as Serialized. 530 * as Serialized.
523 */ 531 */
524 walk_state->method_desc->method.method_flags |= 532 walk_state->method_desc->method.method_flags |=
@@ -536,15 +544,23 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
536 acpi_ds_scope_stack_clear(walk_state); 544 acpi_ds_scope_stack_clear(walk_state);
537 545
538 /* 546 /*
539 * If we just returned from the execution of a control method, 547 * If we just returned from the execution of a control method or if we
540 * there's lots of cleanup to do 548 * encountered an error during the method parse phase, there's lots of
549 * cleanup to do
541 */ 550 */
542 if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) == 551 if (((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) ==
543 ACPI_PARSE_EXECUTE) { 552 ACPI_PARSE_EXECUTE) || (ACPI_FAILURE(status))) {
544 if (walk_state->method_desc) { 553 if (walk_state->method_desc) {
545 /* Decrement the thread count on the method parse tree */ 554 /* Decrement the thread count on the method parse tree */
546 555
547 walk_state->method_desc->method.thread_count--; 556 if (walk_state->method_desc->method.
557 thread_count) {
558 walk_state->method_desc->method.
559 thread_count--;
560 } else {
561 ACPI_ERROR((AE_INFO,
562 "Invalid zero thread count in method"));
563 }
548 } 564 }
549 565
550 acpi_ds_terminate_control_method(walk_state); 566 acpi_ds_terminate_control_method(walk_state);
@@ -553,7 +569,6 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
553 /* Delete this walk state and all linked control states */ 569 /* Delete this walk state and all linked control states */
554 570
555 acpi_ps_cleanup_scope(&walk_state->parser_state); 571 acpi_ps_cleanup_scope(&walk_state->parser_state);
556
557 previous_walk_state = walk_state; 572 previous_walk_state = walk_state;
558 573
559 ACPI_DEBUG_PRINT((ACPI_DB_PARSE, 574 ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
diff --git a/drivers/acpi/parser/psscope.c b/drivers/acpi/parser/psscope.c
index 1c953b6f1af1..bc6047caccd9 100644
--- a/drivers/acpi/parser/psscope.c
+++ b/drivers/acpi/parser/psscope.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/parser/pstree.c b/drivers/acpi/parser/pstree.c
index f0e755884eea..dd6f16726fc4 100644
--- a/drivers/acpi/parser/pstree.c
+++ b/drivers/acpi/parser/pstree.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -132,7 +132,8 @@ acpi_ps_append_arg(union acpi_parse_object *op, union acpi_parse_object *arg)
132 if (op_info->class == AML_CLASS_UNKNOWN) { 132 if (op_info->class == AML_CLASS_UNKNOWN) {
133 /* Invalid opcode */ 133 /* Invalid opcode */
134 134
135 ACPI_REPORT_ERROR(("ps_append_arg: Invalid AML Opcode: 0x%2.2X\n", op->common.aml_opcode)); 135 ACPI_ERROR((AE_INFO, "Invalid AML Opcode: 0x%2.2X",
136 op->common.aml_opcode));
136 return; 137 return;
137 } 138 }
138 139
diff --git a/drivers/acpi/parser/psutils.c b/drivers/acpi/parser/psutils.c
index 2075efbb4324..3e07cb9cb748 100644
--- a/drivers/acpi/parser/psutils.c
+++ b/drivers/acpi/parser/psutils.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/parser/pswalk.c b/drivers/acpi/parser/pswalk.c
index 08f2321b6ded..06f05bfd7612 100644
--- a/drivers/acpi/parser/pswalk.c
+++ b/drivers/acpi/parser/pswalk.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/parser/psxface.c b/drivers/acpi/parser/psxface.c
index 4dcbd443160e..2dd48cbb7c02 100644
--- a/drivers/acpi/parser/psxface.c
+++ b/drivers/acpi/parser/psxface.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -50,6 +50,10 @@
50ACPI_MODULE_NAME("psxface") 50ACPI_MODULE_NAME("psxface")
51 51
52/* Local Prototypes */ 52/* Local Prototypes */
53static void acpi_ps_start_trace(struct acpi_parameter_info *info);
54
55static void acpi_ps_stop_trace(struct acpi_parameter_info *info);
56
53static acpi_status acpi_ps_execute_pass(struct acpi_parameter_info *info); 57static acpi_status acpi_ps_execute_pass(struct acpi_parameter_info *info);
54 58
55static void 59static void
@@ -57,6 +61,136 @@ acpi_ps_update_parameter_list(struct acpi_parameter_info *info, u16 action);
57 61
58/******************************************************************************* 62/*******************************************************************************
59 * 63 *
64 * FUNCTION: acpi_debug_trace
65 *
66 * PARAMETERS: method_name - Valid ACPI name string
67 * debug_level - Optional level mask. 0 to use default
68 * debug_layer - Optional layer mask. 0 to use default
69 * Flags - bit 1: one shot(1) or persistent(0)
70 *
71 * RETURN: Status
72 *
73 * DESCRIPTION: External interface to enable debug tracing during control
74 * method execution
75 *
76 ******************************************************************************/
77
78acpi_status
79acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags)
80{
81 acpi_status status;
82
83 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
84 if (ACPI_FAILURE(status)) {
85 return (status);
86 }
87
88 /* TBDs: Validate name, allow full path or just nameseg */
89
90 acpi_gbl_trace_method_name = *ACPI_CAST_PTR(u32, name);
91 acpi_gbl_trace_flags = flags;
92
93 if (debug_level) {
94 acpi_gbl_trace_dbg_level = debug_level;
95 }
96 if (debug_layer) {
97 acpi_gbl_trace_dbg_layer = debug_layer;
98 }
99
100 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
101 return (AE_OK);
102}
103
104/*******************************************************************************
105 *
106 * FUNCTION: acpi_ps_start_trace
107 *
108 * PARAMETERS: Info - Method info struct
109 *
110 * RETURN: None
111 *
112 * DESCRIPTION: Start control method execution trace
113 *
114 ******************************************************************************/
115
116static void acpi_ps_start_trace(struct acpi_parameter_info *info)
117{
118 acpi_status status;
119
120 ACPI_FUNCTION_ENTRY();
121
122 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
123 if (ACPI_FAILURE(status)) {
124 return;
125 }
126
127 if ((!acpi_gbl_trace_method_name) ||
128 (acpi_gbl_trace_method_name != info->node->name.integer)) {
129 goto exit;
130 }
131
132 acpi_gbl_original_dbg_level = acpi_dbg_level;
133 acpi_gbl_original_dbg_layer = acpi_dbg_layer;
134
135 acpi_dbg_level = 0x00FFFFFF;
136 acpi_dbg_layer = ACPI_UINT32_MAX;
137
138 if (acpi_gbl_trace_dbg_level) {
139 acpi_dbg_level = acpi_gbl_trace_dbg_level;
140 }
141 if (acpi_gbl_trace_dbg_layer) {
142 acpi_dbg_layer = acpi_gbl_trace_dbg_layer;
143 }
144
145 exit:
146 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
147}
148
149/*******************************************************************************
150 *
151 * FUNCTION: acpi_ps_stop_trace
152 *
153 * PARAMETERS: Info - Method info struct
154 *
155 * RETURN: None
156 *
157 * DESCRIPTION: Stop control method execution trace
158 *
159 ******************************************************************************/
160
161static void acpi_ps_stop_trace(struct acpi_parameter_info *info)
162{
163 acpi_status status;
164
165 ACPI_FUNCTION_ENTRY();
166
167 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
168 if (ACPI_FAILURE(status)) {
169 return;
170 }
171
172 if ((!acpi_gbl_trace_method_name) ||
173 (acpi_gbl_trace_method_name != info->node->name.integer)) {
174 goto exit;
175 }
176
177 /* Disable further tracing if type is one-shot */
178
179 if (acpi_gbl_trace_flags & 1) {
180 acpi_gbl_trace_method_name = 0;
181 acpi_gbl_trace_dbg_level = 0;
182 acpi_gbl_trace_dbg_layer = 0;
183 }
184
185 acpi_dbg_level = acpi_gbl_original_dbg_level;
186 acpi_dbg_layer = acpi_gbl_original_dbg_layer;
187
188 exit:
189 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
190}
191
192/*******************************************************************************
193 *
60 * FUNCTION: acpi_ps_execute_method 194 * FUNCTION: acpi_ps_execute_method
61 * 195 *
62 * PARAMETERS: Info - Method info block, contains: 196 * PARAMETERS: Info - Method info block, contains:
@@ -104,6 +238,10 @@ acpi_status acpi_ps_execute_method(struct acpi_parameter_info *info)
104 */ 238 */
105 acpi_ps_update_parameter_list(info, REF_INCREMENT); 239 acpi_ps_update_parameter_list(info, REF_INCREMENT);
106 240
241 /* Begin tracing if requested */
242
243 acpi_ps_start_trace(info);
244
107 /* 245 /*
108 * 1) Perform the first pass parse of the method to enter any 246 * 1) Perform the first pass parse of the method to enter any
109 * named objects that it creates into the namespace 247 * named objects that it creates into the namespace
@@ -129,6 +267,10 @@ acpi_status acpi_ps_execute_method(struct acpi_parameter_info *info)
129 status = acpi_ps_execute_pass(info); 267 status = acpi_ps_execute_pass(info);
130 268
131 cleanup: 269 cleanup:
270 /* End optional tracing */
271
272 acpi_ps_stop_trace(info);
273
132 /* Take away the extra reference that we gave the parameters above */ 274 /* Take away the extra reference that we gave the parameters above */
133 275
134 acpi_ps_update_parameter_list(info, REF_DECREMENT); 276 acpi_ps_update_parameter_list(info, REF_DECREMENT);
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index e567c03b238e..65aee79b3971 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -258,7 +258,7 @@ typedef int (*irq_lookup_func) (struct acpi_prt_entry *, int *, int *, char **);
258 258
259static int 259static int
260acpi_pci_allocate_irq(struct acpi_prt_entry *entry, 260acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
261 int *edge_level, int *active_high_low, char **link) 261 int *triggering, int *polarity, char **link)
262{ 262{
263 int irq; 263 int irq;
264 264
@@ -266,8 +266,8 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
266 266
267 if (entry->link.handle) { 267 if (entry->link.handle) {
268 irq = acpi_pci_link_allocate_irq(entry->link.handle, 268 irq = acpi_pci_link_allocate_irq(entry->link.handle,
269 entry->link.index, edge_level, 269 entry->link.index, triggering,
270 active_high_low, link); 270 polarity, link);
271 if (irq < 0) { 271 if (irq < 0) {
272 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 272 ACPI_DEBUG_PRINT((ACPI_DB_WARN,
273 "Invalid IRQ link routing entry\n")); 273 "Invalid IRQ link routing entry\n"));
@@ -275,8 +275,8 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
275 } 275 }
276 } else { 276 } else {
277 irq = entry->link.index; 277 irq = entry->link.index;
278 *edge_level = ACPI_LEVEL_SENSITIVE; 278 *triggering = ACPI_LEVEL_SENSITIVE;
279 *active_high_low = ACPI_ACTIVE_LOW; 279 *polarity = ACPI_ACTIVE_LOW;
280 } 280 }
281 281
282 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found IRQ %d\n", irq)); 282 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found IRQ %d\n", irq));
@@ -285,7 +285,7 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
285 285
286static int 286static int
287acpi_pci_free_irq(struct acpi_prt_entry *entry, 287acpi_pci_free_irq(struct acpi_prt_entry *entry,
288 int *edge_level, int *active_high_low, char **link) 288 int *triggering, int *polarity, char **link)
289{ 289{
290 int irq; 290 int irq;
291 291
@@ -307,8 +307,8 @@ static int
307acpi_pci_irq_lookup(struct pci_bus *bus, 307acpi_pci_irq_lookup(struct pci_bus *bus,
308 int device, 308 int device,
309 int pin, 309 int pin,
310 int *edge_level, 310 int *triggering,
311 int *active_high_low, char **link, irq_lookup_func func) 311 int *polarity, char **link, irq_lookup_func func)
312{ 312{
313 struct acpi_prt_entry *entry = NULL; 313 struct acpi_prt_entry *entry = NULL;
314 int segment = pci_domain_nr(bus); 314 int segment = pci_domain_nr(bus);
@@ -327,7 +327,7 @@ acpi_pci_irq_lookup(struct pci_bus *bus,
327 return_VALUE(-1); 327 return_VALUE(-1);
328 } 328 }
329 329
330 ret = func(entry, edge_level, active_high_low, link); 330 ret = func(entry, triggering, polarity, link);
331 return_VALUE(ret); 331 return_VALUE(ret);
332} 332}
333 333
@@ -339,8 +339,8 @@ acpi_pci_irq_lookup(struct pci_bus *bus,
339static int 339static int
340acpi_pci_irq_derive(struct pci_dev *dev, 340acpi_pci_irq_derive(struct pci_dev *dev,
341 int pin, 341 int pin,
342 int *edge_level, 342 int *triggering,
343 int *active_high_low, char **link, irq_lookup_func func) 343 int *polarity, char **link, irq_lookup_func func)
344{ 344{
345 struct pci_dev *bridge = dev; 345 struct pci_dev *bridge = dev;
346 int irq = -1; 346 int irq = -1;
@@ -374,7 +374,7 @@ acpi_pci_irq_derive(struct pci_dev *dev,
374 } 374 }
375 375
376 irq = acpi_pci_irq_lookup(bridge->bus, PCI_SLOT(bridge->devfn), 376 irq = acpi_pci_irq_lookup(bridge->bus, PCI_SLOT(bridge->devfn),
377 pin, edge_level, active_high_low, 377 pin, triggering, polarity,
378 link, func); 378 link, func);
379 } 379 }
380 380
@@ -401,8 +401,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
401{ 401{
402 int irq = 0; 402 int irq = 0;
403 u8 pin = 0; 403 u8 pin = 0;
404 int edge_level = ACPI_LEVEL_SENSITIVE; 404 int triggering = ACPI_LEVEL_SENSITIVE;
405 int active_high_low = ACPI_ACTIVE_LOW; 405 int polarity = ACPI_ACTIVE_LOW;
406 char *link = NULL; 406 char *link = NULL;
407 int rc; 407 int rc;
408 408
@@ -431,7 +431,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
431 * values override any BIOS-assigned IRQs set during boot. 431 * values override any BIOS-assigned IRQs set during boot.
432 */ 432 */
433 irq = acpi_pci_irq_lookup(dev->bus, PCI_SLOT(dev->devfn), pin, 433 irq = acpi_pci_irq_lookup(dev->bus, PCI_SLOT(dev->devfn), pin,
434 &edge_level, &active_high_low, &link, 434 &triggering, &polarity, &link,
435 acpi_pci_allocate_irq); 435 acpi_pci_allocate_irq);
436 436
437 /* 437 /*
@@ -439,8 +439,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
439 * device's parent bridge. 439 * device's parent bridge.
440 */ 440 */
441 if (irq < 0) 441 if (irq < 0)
442 irq = acpi_pci_irq_derive(dev, pin, &edge_level, 442 irq = acpi_pci_irq_derive(dev, pin, &triggering,
443 &active_high_low, &link, 443 &polarity, &link,
444 acpi_pci_allocate_irq); 444 acpi_pci_allocate_irq);
445 445
446 /* 446 /*
@@ -462,7 +462,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
462 } 462 }
463 } 463 }
464 464
465 rc = acpi_register_gsi(irq, edge_level, active_high_low); 465 rc = acpi_register_gsi(irq, triggering, polarity);
466 if (rc < 0) { 466 if (rc < 0) {
467 printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: failed " 467 printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: failed "
468 "to register GSI\n", pci_name(dev), ('A' + pin)); 468 "to register GSI\n", pci_name(dev), ('A' + pin));
@@ -477,8 +477,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
477 printk("Link [%s] -> ", link); 477 printk("Link [%s] -> ", link);
478 478
479 printk("GSI %u (%s, %s) -> IRQ %d\n", irq, 479 printk("GSI %u (%s, %s) -> IRQ %d\n", irq,
480 (edge_level == ACPI_LEVEL_SENSITIVE) ? "level" : "edge", 480 (triggering == ACPI_LEVEL_SENSITIVE) ? "level" : "edge",
481 (active_high_low == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq); 481 (polarity == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq);
482 482
483 return_VALUE(0); 483 return_VALUE(0);
484} 484}
@@ -494,8 +494,8 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
494{ 494{
495 int gsi = 0; 495 int gsi = 0;
496 u8 pin = 0; 496 u8 pin = 0;
497 int edge_level = ACPI_LEVEL_SENSITIVE; 497 int triggering = ACPI_LEVEL_SENSITIVE;
498 int active_high_low = ACPI_ACTIVE_LOW; 498 int polarity = ACPI_ACTIVE_LOW;
499 499
500 ACPI_FUNCTION_TRACE("acpi_pci_irq_disable"); 500 ACPI_FUNCTION_TRACE("acpi_pci_irq_disable");
501 501
@@ -511,7 +511,7 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
511 * First we check the PCI IRQ routing table (PRT) for an IRQ. 511 * First we check the PCI IRQ routing table (PRT) for an IRQ.
512 */ 512 */
513 gsi = acpi_pci_irq_lookup(dev->bus, PCI_SLOT(dev->devfn), pin, 513 gsi = acpi_pci_irq_lookup(dev->bus, PCI_SLOT(dev->devfn), pin,
514 &edge_level, &active_high_low, NULL, 514 &triggering, &polarity, NULL,
515 acpi_pci_free_irq); 515 acpi_pci_free_irq);
516 /* 516 /*
517 * If no PRT entry was found, we'll try to derive an IRQ from the 517 * If no PRT entry was found, we'll try to derive an IRQ from the
@@ -519,7 +519,7 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
519 */ 519 */
520 if (gsi < 0) 520 if (gsi < 0)
521 gsi = acpi_pci_irq_derive(dev, pin, 521 gsi = acpi_pci_irq_derive(dev, pin,
522 &edge_level, &active_high_low, NULL, 522 &triggering, &polarity, NULL,
523 acpi_pci_free_irq); 523 acpi_pci_free_irq);
524 if (gsi < 0) 524 if (gsi < 0)
525 return_VOID; 525 return_VOID;
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index 78927c0f1551..07bc6dfe662b 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -70,8 +70,8 @@ static struct acpi_driver acpi_pci_link_driver = {
70 */ 70 */
71struct acpi_pci_link_irq { 71struct acpi_pci_link_irq {
72 u8 active; /* Current IRQ */ 72 u8 active; /* Current IRQ */
73 u8 edge_level; /* All IRQs */ 73 u8 triggering; /* All IRQs */
74 u8 active_high_low; /* All IRQs */ 74 u8 polarity; /* All IRQs */
75 u8 resource_type; 75 u8 resource_type;
76 u8 possible_count; 76 u8 possible_count;
77 u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE]; 77 u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
@@ -108,19 +108,19 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
108 108
109 ACPI_FUNCTION_TRACE("acpi_pci_link_check_possible"); 109 ACPI_FUNCTION_TRACE("acpi_pci_link_check_possible");
110 110
111 switch (resource->id) { 111 switch (resource->type) {
112 case ACPI_RSTYPE_START_DPF: 112 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
113 return_ACPI_STATUS(AE_OK); 113 return_ACPI_STATUS(AE_OK);
114 case ACPI_RSTYPE_IRQ: 114 case ACPI_RESOURCE_TYPE_IRQ:
115 { 115 {
116 struct acpi_resource_irq *p = &resource->data.irq; 116 struct acpi_resource_irq *p = &resource->data.irq;
117 if (!p || !p->number_of_interrupts) { 117 if (!p || !p->interrupt_count) {
118 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 118 ACPI_DEBUG_PRINT((ACPI_DB_WARN,
119 "Blank IRQ resource\n")); 119 "Blank IRQ resource\n"));
120 return_ACPI_STATUS(AE_OK); 120 return_ACPI_STATUS(AE_OK);
121 } 121 }
122 for (i = 0; 122 for (i = 0;
123 (i < p->number_of_interrupts 123 (i < p->interrupt_count
124 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) { 124 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
125 if (!p->interrupts[i]) { 125 if (!p->interrupts[i]) {
126 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 126 ACPI_DEBUG_PRINT((ACPI_DB_WARN,
@@ -131,22 +131,22 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
131 link->irq.possible[i] = p->interrupts[i]; 131 link->irq.possible[i] = p->interrupts[i];
132 link->irq.possible_count++; 132 link->irq.possible_count++;
133 } 133 }
134 link->irq.edge_level = p->edge_level; 134 link->irq.triggering = p->triggering;
135 link->irq.active_high_low = p->active_high_low; 135 link->irq.polarity = p->polarity;
136 link->irq.resource_type = ACPI_RSTYPE_IRQ; 136 link->irq.resource_type = ACPI_RESOURCE_TYPE_IRQ;
137 break; 137 break;
138 } 138 }
139 case ACPI_RSTYPE_EXT_IRQ: 139 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
140 { 140 {
141 struct acpi_resource_ext_irq *p = 141 struct acpi_resource_extended_irq *p =
142 &resource->data.extended_irq; 142 &resource->data.extended_irq;
143 if (!p || !p->number_of_interrupts) { 143 if (!p || !p->interrupt_count) {
144 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 144 ACPI_DEBUG_PRINT((ACPI_DB_WARN,
145 "Blank EXT IRQ resource\n")); 145 "Blank EXT IRQ resource\n"));
146 return_ACPI_STATUS(AE_OK); 146 return_ACPI_STATUS(AE_OK);
147 } 147 }
148 for (i = 0; 148 for (i = 0;
149 (i < p->number_of_interrupts 149 (i < p->interrupt_count
150 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) { 150 && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
151 if (!p->interrupts[i]) { 151 if (!p->interrupts[i]) {
152 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 152 ACPI_DEBUG_PRINT((ACPI_DB_WARN,
@@ -157,9 +157,9 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
157 link->irq.possible[i] = p->interrupts[i]; 157 link->irq.possible[i] = p->interrupts[i];
158 link->irq.possible_count++; 158 link->irq.possible_count++;
159 } 159 }
160 link->irq.edge_level = p->edge_level; 160 link->irq.triggering = p->triggering;
161 link->irq.active_high_low = p->active_high_low; 161 link->irq.polarity = p->polarity;
162 link->irq.resource_type = ACPI_RSTYPE_EXT_IRQ; 162 link->irq.resource_type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
163 break; 163 break;
164 } 164 }
165 default: 165 default:
@@ -201,11 +201,11 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
201 201
202 ACPI_FUNCTION_TRACE("acpi_pci_link_check_current"); 202 ACPI_FUNCTION_TRACE("acpi_pci_link_check_current");
203 203
204 switch (resource->id) { 204 switch (resource->type) {
205 case ACPI_RSTYPE_IRQ: 205 case ACPI_RESOURCE_TYPE_IRQ:
206 { 206 {
207 struct acpi_resource_irq *p = &resource->data.irq; 207 struct acpi_resource_irq *p = &resource->data.irq;
208 if (!p || !p->number_of_interrupts) { 208 if (!p || !p->interrupt_count) {
209 /* 209 /*
210 * IRQ descriptors may have no IRQ# bits set, 210 * IRQ descriptors may have no IRQ# bits set,
211 * particularly those those w/ _STA disabled 211 * particularly those those w/ _STA disabled
@@ -217,11 +217,11 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
217 *irq = p->interrupts[0]; 217 *irq = p->interrupts[0];
218 break; 218 break;
219 } 219 }
220 case ACPI_RSTYPE_EXT_IRQ: 220 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
221 { 221 {
222 struct acpi_resource_ext_irq *p = 222 struct acpi_resource_extended_irq *p =
223 &resource->data.extended_irq; 223 &resource->data.extended_irq;
224 if (!p || !p->number_of_interrupts) { 224 if (!p || !p->interrupt_count) {
225 /* 225 /*
226 * extended IRQ descriptors must 226 * extended IRQ descriptors must
227 * return at least 1 IRQ 227 * return at least 1 IRQ
@@ -233,8 +233,10 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
233 *irq = p->interrupts[0]; 233 *irq = p->interrupts[0];
234 break; 234 break;
235 } 235 }
236 break;
236 default: 237 default:
237 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Resource isn't an IRQ\n")); 238 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Resource %d isn't an IRQ\n", resource->type));
239 case ACPI_RESOURCE_TYPE_END_TAG:
238 return_ACPI_STATUS(AE_OK); 240 return_ACPI_STATUS(AE_OK);
239 } 241 }
240 return_ACPI_STATUS(AE_CTRL_TERMINATE); 242 return_ACPI_STATUS(AE_CTRL_TERMINATE);
@@ -325,36 +327,36 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
325 buffer.pointer = resource; 327 buffer.pointer = resource;
326 328
327 switch (link->irq.resource_type) { 329 switch (link->irq.resource_type) {
328 case ACPI_RSTYPE_IRQ: 330 case ACPI_RESOURCE_TYPE_IRQ:
329 resource->res.id = ACPI_RSTYPE_IRQ; 331 resource->res.type = ACPI_RESOURCE_TYPE_IRQ;
330 resource->res.length = sizeof(struct acpi_resource); 332 resource->res.length = sizeof(struct acpi_resource);
331 resource->res.data.irq.edge_level = link->irq.edge_level; 333 resource->res.data.irq.triggering = link->irq.triggering;
332 resource->res.data.irq.active_high_low = 334 resource->res.data.irq.polarity =
333 link->irq.active_high_low; 335 link->irq.polarity;
334 if (link->irq.edge_level == ACPI_EDGE_SENSITIVE) 336 if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
335 resource->res.data.irq.shared_exclusive = 337 resource->res.data.irq.sharable =
336 ACPI_EXCLUSIVE; 338 ACPI_EXCLUSIVE;
337 else 339 else
338 resource->res.data.irq.shared_exclusive = ACPI_SHARED; 340 resource->res.data.irq.sharable = ACPI_SHARED;
339 resource->res.data.irq.number_of_interrupts = 1; 341 resource->res.data.irq.interrupt_count = 1;
340 resource->res.data.irq.interrupts[0] = irq; 342 resource->res.data.irq.interrupts[0] = irq;
341 break; 343 break;
342 344
343 case ACPI_RSTYPE_EXT_IRQ: 345 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
344 resource->res.id = ACPI_RSTYPE_EXT_IRQ; 346 resource->res.type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
345 resource->res.length = sizeof(struct acpi_resource); 347 resource->res.length = sizeof(struct acpi_resource);
346 resource->res.data.extended_irq.producer_consumer = 348 resource->res.data.extended_irq.producer_consumer =
347 ACPI_CONSUMER; 349 ACPI_CONSUMER;
348 resource->res.data.extended_irq.edge_level = 350 resource->res.data.extended_irq.triggering =
349 link->irq.edge_level; 351 link->irq.triggering;
350 resource->res.data.extended_irq.active_high_low = 352 resource->res.data.extended_irq.polarity =
351 link->irq.active_high_low; 353 link->irq.polarity;
352 if (link->irq.edge_level == ACPI_EDGE_SENSITIVE) 354 if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
353 resource->res.data.irq.shared_exclusive = 355 resource->res.data.irq.sharable =
354 ACPI_EXCLUSIVE; 356 ACPI_EXCLUSIVE;
355 else 357 else
356 resource->res.data.irq.shared_exclusive = ACPI_SHARED; 358 resource->res.data.irq.sharable = ACPI_SHARED;
357 resource->res.data.extended_irq.number_of_interrupts = 1; 359 resource->res.data.extended_irq.interrupt_count = 1;
358 resource->res.data.extended_irq.interrupts[0] = irq; 360 resource->res.data.extended_irq.interrupts[0] = irq;
359 /* ignore resource_source, it's optional */ 361 /* ignore resource_source, it's optional */
360 break; 362 break;
@@ -364,7 +366,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
364 goto end; 366 goto end;
365 367
366 } 368 }
367 resource->end.id = ACPI_RSTYPE_END_TAG; 369 resource->end.type = ACPI_RESOURCE_TYPE_END_TAG;
368 370
369 /* Attempt to set the resource */ 371 /* Attempt to set the resource */
370 status = acpi_set_current_resources(link->handle, &buffer); 372 status = acpi_set_current_resources(link->handle, &buffer);
@@ -613,7 +615,7 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
613int 615int
614acpi_pci_link_allocate_irq(acpi_handle handle, 616acpi_pci_link_allocate_irq(acpi_handle handle,
615 int index, 617 int index,
616 int *edge_level, int *active_high_low, char **name) 618 int *triggering, int *polarity, char **name)
617{ 619{
618 int result = 0; 620 int result = 0;
619 struct acpi_device *device = NULL; 621 struct acpi_device *device = NULL;
@@ -653,10 +655,10 @@ acpi_pci_link_allocate_irq(acpi_handle handle,
653 link->refcnt++; 655 link->refcnt++;
654 up(&acpi_link_lock); 656 up(&acpi_link_lock);
655 657
656 if (edge_level) 658 if (triggering)
657 *edge_level = link->irq.edge_level; 659 *triggering = link->irq.triggering;
658 if (active_high_low) 660 if (polarity)
659 *active_high_low = link->irq.active_high_low; 661 *polarity = link->irq.polarity;
660 if (name) 662 if (name)
661 *name = acpi_device_bid(link->device); 663 *name = acpi_device_bid(link->device);
662 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 664 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
index 0fd9988c283d..4c313eab6313 100644
--- a/drivers/acpi/pci_root.c
+++ b/drivers/acpi/pci_root.c
@@ -122,15 +122,15 @@ get_root_bridge_busnr_callback(struct acpi_resource *resource, void *data)
122 int *busnr = (int *)data; 122 int *busnr = (int *)data;
123 struct acpi_resource_address64 address; 123 struct acpi_resource_address64 address;
124 124
125 if (resource->id != ACPI_RSTYPE_ADDRESS16 && 125 if (resource->type != ACPI_RESOURCE_TYPE_ADDRESS16 &&
126 resource->id != ACPI_RSTYPE_ADDRESS32 && 126 resource->type != ACPI_RESOURCE_TYPE_ADDRESS32 &&
127 resource->id != ACPI_RSTYPE_ADDRESS64) 127 resource->type != ACPI_RESOURCE_TYPE_ADDRESS64)
128 return AE_OK; 128 return AE_OK;
129 129
130 acpi_resource_to_address64(resource, &address); 130 acpi_resource_to_address64(resource, &address);
131 if ((address.address_length > 0) && 131 if ((address.address_length > 0) &&
132 (address.resource_type == ACPI_BUS_NUMBER_RANGE)) 132 (address.resource_type == ACPI_BUS_NUMBER_RANGE))
133 *busnr = address.min_address_range; 133 *busnr = address.minimum;
134 134
135 return AE_OK; 135 return AE_OK;
136} 136}
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
index 1278aca96fe3..99a3a28594da 100644
--- a/drivers/acpi/processor_core.c
+++ b/drivers/acpi/processor_core.c
@@ -253,31 +253,21 @@ static int acpi_processor_errata(struct acpi_processor *pr)
253 * _PDC is required for a BIOS-OS handshake for most of the newer 253 * _PDC is required for a BIOS-OS handshake for most of the newer
254 * ACPI processor features. 254 * ACPI processor features.
255 */ 255 */
256 256static int acpi_processor_set_pdc(struct acpi_processor *pr)
257int acpi_processor_set_pdc(struct acpi_processor *pr,
258 struct acpi_object_list *pdc_in)
259{ 257{
258 struct acpi_object_list *pdc_in = pr->pdc;
260 acpi_status status = AE_OK; 259 acpi_status status = AE_OK;
261 u32 arg0_buf[3];
262 union acpi_object arg0 = { ACPI_TYPE_BUFFER };
263 struct acpi_object_list no_object = { 1, &arg0 };
264 struct acpi_object_list *pdc;
265 260
266 ACPI_FUNCTION_TRACE("acpi_processor_set_pdc"); 261 ACPI_FUNCTION_TRACE("acpi_processor_set_pdc");
267 262
268 arg0.buffer.length = 12; 263 if (!pdc_in)
269 arg0.buffer.pointer = (u8 *) arg0_buf; 264 return_VALUE(status);
270 arg0_buf[0] = ACPI_PDC_REVISION_ID;
271 arg0_buf[1] = 0;
272 arg0_buf[2] = 0;
273
274 pdc = (pdc_in) ? pdc_in : &no_object;
275 265
276 status = acpi_evaluate_object(pr->handle, "_PDC", pdc, NULL); 266 status = acpi_evaluate_object(pr->handle, "_PDC", pdc_in, NULL);
277 267
278 if ((ACPI_FAILURE(status)) && (pdc_in)) 268 if (ACPI_FAILURE(status))
279 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 269 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
280 "Error evaluating _PDC, using legacy perf. control...\n")); 270 "Could not evaluate _PDC, using legacy perf. control...\n"));
281 271
282 return_VALUE(status); 272 return_VALUE(status);
283} 273}
@@ -357,7 +347,6 @@ static int acpi_processor_add_fs(struct acpi_device *device)
357 ACPI_PROCESSOR_FILE_THROTTLING)); 347 ACPI_PROCESSOR_FILE_THROTTLING));
358 else { 348 else {
359 entry->proc_fops = &acpi_processor_throttling_fops; 349 entry->proc_fops = &acpi_processor_throttling_fops;
360 entry->proc_fops->write = acpi_processor_write_throttling;
361 entry->data = acpi_driver_data(device); 350 entry->data = acpi_driver_data(device);
362 entry->owner = THIS_MODULE; 351 entry->owner = THIS_MODULE;
363 } 352 }
@@ -372,7 +361,6 @@ static int acpi_processor_add_fs(struct acpi_device *device)
372 ACPI_PROCESSOR_FILE_LIMIT)); 361 ACPI_PROCESSOR_FILE_LIMIT));
373 else { 362 else {
374 entry->proc_fops = &acpi_processor_limit_fops; 363 entry->proc_fops = &acpi_processor_limit_fops;
375 entry->proc_fops->write = acpi_processor_write_limit;
376 entry->data = acpi_driver_data(device); 364 entry->data = acpi_driver_data(device);
377 entry->owner = THIS_MODULE; 365 entry->owner = THIS_MODULE;
378 } 366 }
@@ -589,6 +577,10 @@ static int acpi_processor_start(struct acpi_device *device)
589 "Error installing device notify handler\n")); 577 "Error installing device notify handler\n"));
590 } 578 }
591 579
580 /* _PDC call should be done before doing anything else (if reqd.). */
581 arch_acpi_processor_init_pdc(pr);
582 acpi_processor_set_pdc(pr);
583
592 acpi_processor_power_init(pr, device); 584 acpi_processor_power_init(pr, device);
593 585
594 if (pr->flags.throttling) { 586 if (pr->flags.throttling) {
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index cc049338e418..be2dae52f6fa 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -95,22 +95,57 @@ static int set_max_cstate(struct dmi_system_id *id)
95} 95}
96 96
97static struct dmi_system_id __initdata processor_power_dmi_table[] = { 97static struct dmi_system_id __initdata processor_power_dmi_table[] = {
98 {set_max_cstate, "IBM ThinkPad R40e", { 98 { set_max_cstate, "IBM ThinkPad R40e", {
99 DMI_MATCH(DMI_BIOS_VENDOR, 99 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
100 "IBM"), 100 DMI_MATCH(DMI_BIOS_VERSION,"1SET60WW")}, (void *)1},
101 DMI_MATCH(DMI_BIOS_VERSION, 101 { set_max_cstate, "IBM ThinkPad R40e", {
102 "1SET60WW")}, 102 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
103 (void *)1}, 103 DMI_MATCH(DMI_BIOS_VERSION,"1SET43WW") }, (void*)1},
104 {set_max_cstate, "Medion 41700", { 104 { set_max_cstate, "IBM ThinkPad R40e", {
105 DMI_MATCH(DMI_BIOS_VENDOR, 105 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
106 "Phoenix Technologies LTD"), 106 DMI_MATCH(DMI_BIOS_VERSION,"1SET45WW") }, (void*)1},
107 DMI_MATCH(DMI_BIOS_VERSION, 107 { set_max_cstate, "IBM ThinkPad R40e", {
108 "R01-A1J")}, (void *)1}, 108 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
109 {set_max_cstate, "Clevo 5600D", { 109 DMI_MATCH(DMI_BIOS_VERSION,"1SET47WW") }, (void*)1},
110 DMI_MATCH(DMI_BIOS_VENDOR, 110 { set_max_cstate, "IBM ThinkPad R40e", {
111 "Phoenix Technologies LTD"), 111 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
112 DMI_MATCH(DMI_BIOS_VERSION, 112 DMI_MATCH(DMI_BIOS_VERSION,"1SET50WW") }, (void*)1},
113 "SHE845M0.86C.0013.D.0302131307")}, 113 { set_max_cstate, "IBM ThinkPad R40e", {
114 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
115 DMI_MATCH(DMI_BIOS_VERSION,"1SET52WW") }, (void*)1},
116 { set_max_cstate, "IBM ThinkPad R40e", {
117 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
118 DMI_MATCH(DMI_BIOS_VERSION,"1SET55WW") }, (void*)1},
119 { set_max_cstate, "IBM ThinkPad R40e", {
120 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
121 DMI_MATCH(DMI_BIOS_VERSION,"1SET56WW") }, (void*)1},
122 { set_max_cstate, "IBM ThinkPad R40e", {
123 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
124 DMI_MATCH(DMI_BIOS_VERSION,"1SET59WW") }, (void*)1},
125 { set_max_cstate, "IBM ThinkPad R40e", {
126 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
127 DMI_MATCH(DMI_BIOS_VERSION,"1SET60WW") }, (void*)1},
128 { set_max_cstate, "IBM ThinkPad R40e", {
129 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
130 DMI_MATCH(DMI_BIOS_VERSION,"1SET61WW") }, (void*)1},
131 { set_max_cstate, "IBM ThinkPad R40e", {
132 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
133 DMI_MATCH(DMI_BIOS_VERSION,"1SET62WW") }, (void*)1},
134 { set_max_cstate, "IBM ThinkPad R40e", {
135 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
136 DMI_MATCH(DMI_BIOS_VERSION,"1SET64WW") }, (void*)1},
137 { set_max_cstate, "IBM ThinkPad R40e", {
138 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
139 DMI_MATCH(DMI_BIOS_VERSION,"1SET65WW") }, (void*)1},
140 { set_max_cstate, "IBM ThinkPad R40e", {
141 DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
142 DMI_MATCH(DMI_BIOS_VERSION,"1SET68WW") }, (void*)1},
143 { set_max_cstate, "Medion 41700", {
144 DMI_MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),
145 DMI_MATCH(DMI_BIOS_VERSION,"R01-A1J")}, (void *)1},
146 { set_max_cstate, "Clevo 5600D", {
147 DMI_MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),
148 DMI_MATCH(DMI_BIOS_VERSION,"SHE845M0.86C.0013.D.0302131307")},
114 (void *)2}, 149 (void *)2},
115 {}, 150 {},
116}; 151};
@@ -550,18 +585,10 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
550 if (!pr->pblk) 585 if (!pr->pblk)
551 return_VALUE(-ENODEV); 586 return_VALUE(-ENODEV);
552 587
553 memset(pr->power.states, 0, sizeof(pr->power.states));
554
555 /* if info is obtained from pblk/fadt, type equals state */ 588 /* if info is obtained from pblk/fadt, type equals state */
556 pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
557 pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2; 589 pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2;
558 pr->power.states[ACPI_STATE_C3].type = ACPI_STATE_C3; 590 pr->power.states[ACPI_STATE_C3].type = ACPI_STATE_C3;
559 591
560 /* the C0 state only exists as a filler in our array,
561 * and all processors need to support C1 */
562 pr->power.states[ACPI_STATE_C0].valid = 1;
563 pr->power.states[ACPI_STATE_C1].valid = 1;
564
565#ifndef CONFIG_HOTPLUG_CPU 592#ifndef CONFIG_HOTPLUG_CPU
566 /* 593 /*
567 * Check for P_LVL2_UP flag before entering C2 and above on 594 * Check for P_LVL2_UP flag before entering C2 and above on
@@ -591,12 +618,11 @@ static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr)
591{ 618{
592 ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_default_c1"); 619 ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_default_c1");
593 620
621 /* Zero initialize all the C-states info. */
594 memset(pr->power.states, 0, sizeof(pr->power.states)); 622 memset(pr->power.states, 0, sizeof(pr->power.states));
595 623
596 /* if info is obtained from pblk/fadt, type equals state */ 624 /* set the first C-State to C1 */
597 pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1; 625 pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
598 pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2;
599 pr->power.states[ACPI_STATE_C3].type = ACPI_STATE_C3;
600 626
601 /* the C0 state only exists as a filler in our array, 627 /* the C0 state only exists as a filler in our array,
602 * and all processors need to support C1 */ 628 * and all processors need to support C1 */
@@ -610,6 +636,7 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
610{ 636{
611 acpi_status status = 0; 637 acpi_status status = 0;
612 acpi_integer count; 638 acpi_integer count;
639 int current_count;
613 int i; 640 int i;
614 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 641 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
615 union acpi_object *cst; 642 union acpi_object *cst;
@@ -619,10 +646,12 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
619 if (nocst) 646 if (nocst)
620 return_VALUE(-ENODEV); 647 return_VALUE(-ENODEV);
621 648
622 pr->power.count = 0; 649 current_count = 1;
623 for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++) 650
624 memset(&(pr->power.states[i]), 0, 651 /* Zero initialize C2 onwards and prepare for fresh CST lookup */
625 sizeof(struct acpi_processor_cx)); 652 for (i = 2; i < ACPI_PROCESSOR_MAX_POWER; i++)
653 memset(&(pr->power.states[i]), 0,
654 sizeof(struct acpi_processor_cx));
626 655
627 status = acpi_evaluate_object(pr->handle, "_CST", NULL, &buffer); 656 status = acpi_evaluate_object(pr->handle, "_CST", NULL, &buffer);
628 if (ACPI_FAILURE(status)) { 657 if (ACPI_FAILURE(status)) {
@@ -650,16 +679,6 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
650 goto end; 679 goto end;
651 } 680 }
652 681
653 /* We support up to ACPI_PROCESSOR_MAX_POWER. */
654 if (count > ACPI_PROCESSOR_MAX_POWER) {
655 printk(KERN_WARNING
656 "Limiting number of power states to max (%d)\n",
657 ACPI_PROCESSOR_MAX_POWER);
658 printk(KERN_WARNING
659 "Please increase ACPI_PROCESSOR_MAX_POWER if needed.\n");
660 count = ACPI_PROCESSOR_MAX_POWER;
661 }
662
663 /* Tell driver that at least _CST is supported. */ 682 /* Tell driver that at least _CST is supported. */
664 pr->flags.has_cst = 1; 683 pr->flags.has_cst = 1;
665 684
@@ -703,7 +722,7 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
703 (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO)) 722 (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO))
704 continue; 723 continue;
705 724
706 if ((cx.type < ACPI_STATE_C1) || (cx.type > ACPI_STATE_C3)) 725 if ((cx.type < ACPI_STATE_C2) || (cx.type > ACPI_STATE_C3))
707 continue; 726 continue;
708 727
709 obj = (union acpi_object *)&(element->package.elements[2]); 728 obj = (union acpi_object *)&(element->package.elements[2]);
@@ -718,15 +737,28 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
718 737
719 cx.power = obj->integer.value; 738 cx.power = obj->integer.value;
720 739
721 (pr->power.count)++; 740 current_count++;
722 memcpy(&(pr->power.states[pr->power.count]), &cx, sizeof(cx)); 741 memcpy(&(pr->power.states[current_count]), &cx, sizeof(cx));
742
743 /*
744 * We support total ACPI_PROCESSOR_MAX_POWER - 1
745 * (From 1 through ACPI_PROCESSOR_MAX_POWER - 1)
746 */
747 if (current_count >= (ACPI_PROCESSOR_MAX_POWER - 1)) {
748 printk(KERN_WARNING
749 "Limiting number of power states to max (%d)\n",
750 ACPI_PROCESSOR_MAX_POWER);
751 printk(KERN_WARNING
752 "Please increase ACPI_PROCESSOR_MAX_POWER if needed.\n");
753 break;
754 }
723 } 755 }
724 756
725 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d power states\n", 757 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d power states\n",
726 pr->power.count)); 758 current_count));
727 759
728 /* Validate number of power states discovered */ 760 /* Validate number of power states discovered */
729 if (pr->power.count < 2) 761 if (current_count < 2)
730 status = -EFAULT; 762 status = -EFAULT;
731 763
732 end: 764 end:
@@ -892,12 +924,13 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr)
892 /* NOTE: the idle thread may not be running while calling 924 /* NOTE: the idle thread may not be running while calling
893 * this function */ 925 * this function */
894 926
927 /* Adding C1 state */
928 acpi_processor_get_power_info_default_c1(pr);
895 result = acpi_processor_get_power_info_cst(pr); 929 result = acpi_processor_get_power_info_cst(pr);
896 if (result == -ENODEV) 930 if (result == -ENODEV)
897 result = acpi_processor_get_power_info_fadt(pr); 931 acpi_processor_get_power_info_fadt(pr);
898 932
899 if ((result) || (acpi_processor_power_verify(pr) < 2)) 933 pr->power.count = acpi_processor_power_verify(pr);
900 result = acpi_processor_get_power_info_default_c1(pr);
901 934
902 /* 935 /*
903 * Set Default Policy 936 * Set Default Policy
@@ -1066,8 +1099,6 @@ int acpi_processor_power_init(struct acpi_processor *pr,
1066 } 1099 }
1067 } 1100 }
1068 1101
1069 acpi_processor_power_init_pdc(&(pr->power), pr->id);
1070 acpi_processor_set_pdc(pr, pr->power.pdc);
1071 acpi_processor_get_power_info(pr); 1102 acpi_processor_get_power_info(pr);
1072 1103
1073 /* 1104 /*
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c
index 22c7bb66c200..abbdb37a7f5f 100644
--- a/drivers/acpi/processor_perflib.c
+++ b/drivers/acpi/processor_perflib.c
@@ -315,8 +315,6 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr)
315 if (!pr || !pr->performance || !pr->handle) 315 if (!pr || !pr->performance || !pr->handle)
316 return_VALUE(-EINVAL); 316 return_VALUE(-EINVAL);
317 317
318 acpi_processor_set_pdc(pr, pr->performance->pdc);
319
320 status = acpi_get_handle(pr->handle, "_PCT", &handle); 318 status = acpi_get_handle(pr->handle, "_PCT", &handle);
321 if (ACPI_FAILURE(status)) { 319 if (ACPI_FAILURE(status)) {
322 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 320 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
@@ -520,8 +518,8 @@ static void acpi_cpufreq_add_file(struct acpi_processor *pr)
520 "Unable to create '%s' fs entry\n", 518 "Unable to create '%s' fs entry\n",
521 ACPI_PROCESSOR_FILE_PERFORMANCE)); 519 ACPI_PROCESSOR_FILE_PERFORMANCE));
522 else { 520 else {
521 acpi_processor_perf_fops.write = acpi_processor_write_performance;
523 entry->proc_fops = &acpi_processor_perf_fops; 522 entry->proc_fops = &acpi_processor_perf_fops;
524 entry->proc_fops->write = acpi_processor_write_performance;
525 entry->data = acpi_driver_data(device); 523 entry->data = acpi_driver_data(device);
526 entry->owner = THIS_MODULE; 524 entry->owner = THIS_MODULE;
527 } 525 }
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c
index dc9817cfb882..f99ad05cd6a2 100644
--- a/drivers/acpi/processor_thermal.c
+++ b/drivers/acpi/processor_thermal.c
@@ -348,9 +348,9 @@ static int acpi_processor_limit_open_fs(struct inode *inode, struct file *file)
348 PDE(inode)->data); 348 PDE(inode)->data);
349} 349}
350 350
351ssize_t acpi_processor_write_limit(struct file * file, 351static ssize_t acpi_processor_write_limit(struct file * file,
352 const char __user * buffer, 352 const char __user * buffer,
353 size_t count, loff_t * data) 353 size_t count, loff_t * data)
354{ 354{
355 int result = 0; 355 int result = 0;
356 struct seq_file *m = (struct seq_file *)file->private_data; 356 struct seq_file *m = (struct seq_file *)file->private_data;
@@ -394,6 +394,7 @@ ssize_t acpi_processor_write_limit(struct file * file,
394struct file_operations acpi_processor_limit_fops = { 394struct file_operations acpi_processor_limit_fops = {
395 .open = acpi_processor_limit_open_fs, 395 .open = acpi_processor_limit_open_fs,
396 .read = seq_read, 396 .read = seq_read,
397 .write = acpi_processor_write_limit,
397 .llseek = seq_lseek, 398 .llseek = seq_lseek,
398 .release = single_release, 399 .release = single_release,
399}; 400};
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c
index 74a52d4e79ae..b966549ec000 100644
--- a/drivers/acpi/processor_throttling.c
+++ b/drivers/acpi/processor_throttling.c
@@ -306,9 +306,9 @@ static int acpi_processor_throttling_open_fs(struct inode *inode,
306 PDE(inode)->data); 306 PDE(inode)->data);
307} 307}
308 308
309ssize_t acpi_processor_write_throttling(struct file * file, 309static ssize_t acpi_processor_write_throttling(struct file * file,
310 const char __user * buffer, 310 const char __user * buffer,
311 size_t count, loff_t * data) 311 size_t count, loff_t * data)
312{ 312{
313 int result = 0; 313 int result = 0;
314 struct seq_file *m = (struct seq_file *)file->private_data; 314 struct seq_file *m = (struct seq_file *)file->private_data;
@@ -337,6 +337,7 @@ ssize_t acpi_processor_write_throttling(struct file * file,
337struct file_operations acpi_processor_throttling_fops = { 337struct file_operations acpi_processor_throttling_fops = {
338 .open = acpi_processor_throttling_open_fs, 338 .open = acpi_processor_throttling_open_fs,
339 .read = seq_read, 339 .read = seq_read,
340 .write = acpi_processor_write_throttling,
340 .llseek = seq_lseek, 341 .llseek = seq_lseek,
341 .release = single_release, 342 .release = single_release,
342}; 343};
diff --git a/drivers/acpi/resources/Makefile b/drivers/acpi/resources/Makefile
index 2130b74170c3..8de4f69dfa09 100644
--- a/drivers/acpi/resources/Makefile
+++ b/drivers/acpi/resources/Makefile
@@ -2,7 +2,7 @@
2# Makefile for all Linux ACPI interpreter subdirectories 2# Makefile for all Linux ACPI interpreter subdirectories
3# 3#
4 4
5obj-y := rsaddr.o rscreate.o rsio.o rslist.o rsmisc.o rsxface.o \ 5obj-y := rsaddr.o rscreate.o rsinfo.o rsio.o rslist.o rsmisc.o rsxface.o \
6 rscalc.o rsirq.o rsmemory.o rsutils.o 6 rscalc.o rsirq.o rsmemory.o rsutils.o
7 7
8obj-$(ACPI_FUTURE_USAGE) += rsdump.o 8obj-$(ACPI_FUTURE_USAGE) += rsdump.o
diff --git a/drivers/acpi/resources/rsaddr.c b/drivers/acpi/resources/rsaddr.c
index 23b54baa0cb2..8fa3213ce000 100644
--- a/drivers/acpi/resources/rsaddr.c
+++ b/drivers/acpi/resources/rsaddr.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -47,1072 +47,334 @@
47#define _COMPONENT ACPI_RESOURCES 47#define _COMPONENT ACPI_RESOURCES
48ACPI_MODULE_NAME("rsaddr") 48ACPI_MODULE_NAME("rsaddr")
49 49
50/* Local prototypes */
51static void
52acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags);
53
54static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource);
55
56static void
57acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags);
58
59static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource);
60
61/******************************************************************************* 50/*******************************************************************************
62 * 51 *
63 * FUNCTION: acpi_rs_decode_general_flags 52 * acpi_rs_convert_address16 - All WORD (16-bit) address resources
64 *
65 * PARAMETERS: Resource - Address resource data struct
66 * Flags - Actual flag byte
67 *
68 * RETURN: Decoded flag bits in resource struct
69 *
70 * DESCRIPTION: Decode a general flag byte to an address resource struct
71 * 53 *
72 ******************************************************************************/ 54 ******************************************************************************/
55struct acpi_rsconvert_info acpi_rs_convert_address16[5] = {
56 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS16,
57 ACPI_RS_SIZE(struct acpi_resource_address16),
58 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address16)},
73 59
74static void 60 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS16,
75acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags) 61 sizeof(struct aml_resource_address16),
76{ 62 0},
77 ACPI_FUNCTION_ENTRY();
78
79 /* Producer / Consumer - flag bit[0] */
80
81 resource->address.producer_consumer = (u32) (flags & 0x01);
82 63
83 /* Decode (_DEC) - flag bit[1] */ 64 /* Resource Type, General Flags, and Type-Specific Flags */
84 65
85 resource->address.decode = (u32) ((flags >> 1) & 0x01); 66 {ACPI_RSC_ADDRESS, 0, 0, 0},
86 67
87 /* Min Address Fixed (_MIF) - flag bit[2] */ 68 /*
69 * These fields are contiguous in both the source and destination:
70 * Address Granularity
71 * Address Range Minimum
72 * Address Range Maximum
73 * Address Translation Offset
74 * Address Length
75 */
76 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.address16.granularity),
77 AML_OFFSET(address16.granularity),
78 5},
88 79
89 resource->address.min_address_fixed = (u32) ((flags >> 2) & 0x01); 80 /* Optional resource_source (Index and String) */
90 81
91 /* Max Address Fixed (_MAF) - flag bit[3] */ 82 {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address16.resource_source),
92 83 0,
93 resource->address.max_address_fixed = (u32) ((flags >> 3) & 0x01); 84 sizeof(struct aml_resource_address16)}
94} 85};
95 86
96/******************************************************************************* 87/*******************************************************************************
97 * 88 *
98 * FUNCTION: acpi_rs_encode_general_flags 89 * acpi_rs_convert_address32 - All DWORD (32-bit) address resources
99 *
100 * PARAMETERS: Resource - Address resource data struct
101 *
102 * RETURN: Encoded general flag byte
103 *
104 * DESCRIPTION: Construct a general flag byte from an address resource struct
105 * 90 *
106 ******************************************************************************/ 91 ******************************************************************************/
107 92
108static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource) 93struct acpi_rsconvert_info acpi_rs_convert_address32[5] = {
109{ 94 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS32,
110 u8 flags; 95 ACPI_RS_SIZE(struct acpi_resource_address32),
111 96 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address32)},
112 ACPI_FUNCTION_ENTRY();
113
114 /* Producer / Consumer - flag bit[0] */
115
116 flags = (u8) (resource->address.producer_consumer & 0x01);
117
118 /* Decode (_DEC) - flag bit[1] */
119
120 flags |= (u8) ((resource->address.decode & 0x01) << 1);
121
122 /* Min Address Fixed (_MIF) - flag bit[2] */
123
124 flags |= (u8) ((resource->address.min_address_fixed & 0x01) << 2);
125 97
126 /* Max Address Fixed (_MAF) - flag bit[3] */ 98 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS32,
99 sizeof(struct aml_resource_address32),
100 0},
127 101
128 flags |= (u8) ((resource->address.max_address_fixed & 0x01) << 3); 102 /* Resource Type, General Flags, and Type-Specific Flags */
129 103
130 return (flags); 104 {ACPI_RSC_ADDRESS, 0, 0, 0},
131}
132
133/*******************************************************************************
134 *
135 * FUNCTION: acpi_rs_decode_specific_flags
136 *
137 * PARAMETERS: Resource - Address resource data struct
138 * Flags - Actual flag byte
139 *
140 * RETURN: Decoded flag bits in attribute struct
141 *
142 * DESCRIPTION: Decode a type-specific flag byte to an attribute struct.
143 * Type-specific flags are only defined for the Memory and IO
144 * resource types.
145 *
146 ******************************************************************************/
147 105
148static void 106 /*
149acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags) 107 * These fields are contiguous in both the source and destination:
150{ 108 * Address Granularity
151 ACPI_FUNCTION_ENTRY(); 109 * Address Range Minimum
152 110 * Address Range Maximum
153 if (resource->address.resource_type == ACPI_MEMORY_RANGE) { 111 * Address Translation Offset
154 /* Write Status (_RW) - flag bit[0] */ 112 * Address Length
155 113 */
156 resource->address.attribute.memory.read_write_attribute = 114 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.address32.granularity),
157 (u16) (flags & 0x01); 115 AML_OFFSET(address32.granularity),
158 116 5},
159 /* Memory Attributes (_MEM) - flag bits[2:1] */
160
161 resource->address.attribute.memory.cache_attribute =
162 (u16) ((flags >> 1) & 0x03);
163 } else if (resource->address.resource_type == ACPI_IO_RANGE) {
164 /* Ranges (_RNG) - flag bits[1:0] */
165
166 resource->address.attribute.io.range_attribute =
167 (u16) (flags & 0x03);
168 117
169 /* Translations (_TTP and _TRS) - flag bits[5:4] */ 118 /* Optional resource_source (Index and String) */
170 119
171 resource->address.attribute.io.translation_attribute = 120 {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address32.resource_source),
172 (u16) ((flags >> 4) & 0x03); 121 0,
173 } 122 sizeof(struct aml_resource_address32)}
174} 123};
175 124
176/******************************************************************************* 125/*******************************************************************************
177 * 126 *
178 * FUNCTION: acpi_rs_encode_specific_flags 127 * acpi_rs_convert_address64 - All QWORD (64-bit) address resources
179 *
180 * PARAMETERS: Resource - Address resource data struct
181 *
182 * RETURN: Encoded type-specific flag byte
183 *
184 * DESCRIPTION: Construct a type-specific flag byte from an attribute struct.
185 * Type-specific flags are only defined for the Memory and IO
186 * resource types.
187 * 128 *
188 ******************************************************************************/ 129 ******************************************************************************/
189 130
190static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource) 131struct acpi_rsconvert_info acpi_rs_convert_address64[5] = {
191{ 132 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS64,
192 u8 flags = 0; 133 ACPI_RS_SIZE(struct acpi_resource_address64),
193 134 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address64)},
194 ACPI_FUNCTION_ENTRY();
195
196 if (resource->address.resource_type == ACPI_MEMORY_RANGE) {
197 /* Write Status (_RW) - flag bit[0] */
198 135
199 flags = (u8) 136 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS64,
200 (resource->address.attribute.memory. 137 sizeof(struct aml_resource_address64),
201 read_write_attribute & 0x01); 138 0},
202 139
203 /* Memory Attributes (_MEM) - flag bits[2:1] */ 140 /* Resource Type, General Flags, and Type-Specific Flags */
204 141
205 flags |= (u8) 142 {ACPI_RSC_ADDRESS, 0, 0, 0},
206 ((resource->address.attribute.memory.
207 cache_attribute & 0x03) << 1);
208 } else if (resource->address.resource_type == ACPI_IO_RANGE) {
209 /* Ranges (_RNG) - flag bits[1:0] */
210 143
211 flags = (u8) 144 /*
212 (resource->address.attribute.io.range_attribute & 0x03); 145 * These fields are contiguous in both the source and destination:
146 * Address Granularity
147 * Address Range Minimum
148 * Address Range Maximum
149 * Address Translation Offset
150 * Address Length
151 */
152 {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.address64.granularity),
153 AML_OFFSET(address64.granularity),
154 5},
213 155
214 /* Translations (_TTP and _TRS) - flag bits[5:4] */ 156 /* Optional resource_source (Index and String) */
215 157
216 flags |= (u8) 158 {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address64.resource_source),
217 ((resource->address.attribute.io. 159 0,
218 translation_attribute & 0x03) << 4); 160 sizeof(struct aml_resource_address64)}
219 } 161};
220
221 return (flags);
222}
223 162
224/******************************************************************************* 163/*******************************************************************************
225 * 164 *
226 * FUNCTION: acpi_rs_address16_resource 165 * acpi_rs_convert_ext_address64 - All Extended (64-bit) address resources
227 *
228 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
229 * stream
230 * bytes_consumed - Pointer to where the number of bytes
231 * consumed the byte_stream_buffer is
232 * returned
233 * output_buffer - Pointer to the return data buffer
234 * structure_size - Pointer to where the number of bytes
235 * in the return data struct is returned
236 *
237 * RETURN: Status
238 *
239 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
240 * structure pointed to by the output_buffer. Return the
241 * number of bytes consumed from the byte stream.
242 * 166 *
243 ******************************************************************************/ 167 ******************************************************************************/
244 168
245acpi_status 169struct acpi_rsconvert_info acpi_rs_convert_ext_address64[5] = {
246acpi_rs_address16_resource(u8 * byte_stream_buffer, 170 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
247 acpi_size * bytes_consumed, 171 ACPI_RS_SIZE(struct acpi_resource_extended_address64),
248 u8 ** output_buffer, acpi_size * structure_size) 172 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_address64)},
249{
250 u32 index;
251 u16 temp16;
252 u8 temp8;
253 u8 *temp_ptr;
254 u8 *buffer = byte_stream_buffer;
255 struct acpi_resource *output_struct = (void *)*output_buffer;
256 acpi_size struct_size =
257 ACPI_SIZEOF_RESOURCE(struct acpi_resource_address16);
258
259 ACPI_FUNCTION_TRACE("rs_address16_resource");
260
261 /* Get the Descriptor Length field */
262
263 buffer += 1;
264 ACPI_MOVE_16_TO_16(&temp16, buffer);
265
266 /* Validate minimum descriptor length */
267
268 if (temp16 < 13) {
269 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
270 }
271
272 *bytes_consumed = temp16 + 3;
273 output_struct->id = ACPI_RSTYPE_ADDRESS16;
274
275 /* Get the Resource Type (Byte3) */
276 173
277 buffer += 2; 174 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64,
278 temp8 = *buffer; 175 sizeof(struct aml_resource_extended_address64),
176 0},
279 177
280 /* Values 0-2 and 0xC0-0xFF are valid */ 178 /* Resource Type, General Flags, and Type-Specific Flags */
281 179
282 if ((temp8 > 2) && (temp8 < 0xC0)) { 180 {ACPI_RSC_ADDRESS, 0, 0, 0},
283 return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
284 }
285
286 output_struct->data.address16.resource_type = temp8;
287
288 /* Get the General Flags (Byte4) */
289
290 buffer += 1;
291 acpi_rs_decode_general_flags(&output_struct->data, *buffer);
292
293 /* Get the Type Specific Flags (Byte5) */
294
295 buffer += 1;
296 acpi_rs_decode_specific_flags(&output_struct->data, *buffer);
297
298 /* Get Granularity (Bytes 6-7) */
299
300 buffer += 1;
301 ACPI_MOVE_16_TO_32(&output_struct->data.address16.granularity, buffer);
302
303 /* Get min_address_range (Bytes 8-9) */
304 181
305 buffer += 2; 182 /* Revision ID */
306 ACPI_MOVE_16_TO_32(&output_struct->data.address16.min_address_range,
307 buffer);
308
309 /* Get max_address_range (Bytes 10-11) */
310
311 buffer += 2;
312 ACPI_MOVE_16_TO_32(&output_struct->data.address16.max_address_range,
313 buffer);
314
315 /* Get address_translation_offset (Bytes 12-13) */
316
317 buffer += 2;
318 ACPI_MOVE_16_TO_32(&output_struct->data.address16.
319 address_translation_offset, buffer);
320
321 /* Get address_length (Bytes 14-15) */
322
323 buffer += 2;
324 ACPI_MOVE_16_TO_32(&output_struct->data.address16.address_length,
325 buffer);
326
327 /* Resource Source Index (if present) */
328
329 buffer += 2;
330 183
184 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.ext_address64.revision_iD),
185 AML_OFFSET(ext_address64.revision_iD),
186 1},
331 /* 187 /*
332 * This will leave us pointing to the Resource Source Index 188 * These fields are contiguous in both the source and destination:
333 * If it is present, then save it off and calculate the 189 * Address Granularity
334 * pointer to where the null terminated string goes: 190 * Address Range Minimum
335 * Each Interrupt takes 32-bits + the 5 bytes of the 191 * Address Range Maximum
336 * stream that are default. 192 * Address Translation Offset
337 * 193 * Address Length
338 * Note: Some resource descriptors will have an additional null, so 194 * Type-Specific Attribute
339 * we add 1 to the length.
340 */ 195 */
341 if (*bytes_consumed > (16 + 1)) { 196 {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.ext_address64.granularity),
342 /* Dereference the Index */ 197 AML_OFFSET(ext_address64.granularity),
343 198 6}
344 output_struct->data.address16.resource_source.index = 199};
345 (u32) * buffer;
346
347 /* Point to the String */
348
349 buffer += 1;
350
351 /* Point the String pointer to the end of this structure */
352
353 output_struct->data.address16.resource_source.string_ptr =
354 (char *)((u8 *) output_struct + struct_size);
355
356 temp_ptr = (u8 *)
357 output_struct->data.address16.resource_source.string_ptr;
358
359 /* Copy the resource_source string into the buffer */
360
361 index = 0;
362 while (*buffer) {
363 *temp_ptr = *buffer;
364
365 temp_ptr++;
366 buffer++;
367 index++;
368 }
369
370 /* Add the terminating null and set the string length */
371
372 *temp_ptr = 0;
373 output_struct->data.address16.resource_source.string_length =
374 index + 1;
375
376 /*
377 * In order for the struct_size to fall on a 32-bit boundary,
378 * calculate the length of the string and expand the
379 * struct_size to the next 32-bit boundary.
380 */
381 temp8 = (u8) (index + 1);
382 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
383 } else {
384 output_struct->data.address16.resource_source.index = 0;
385 output_struct->data.address16.resource_source.string_length = 0;
386 output_struct->data.address16.resource_source.string_ptr = NULL;
387 }
388
389 /* Set the Length parameter */
390
391 output_struct->length = (u32) struct_size;
392
393 /* Return the final size of the structure */
394
395 *structure_size = struct_size;
396 return_ACPI_STATUS(AE_OK);
397}
398 200
399/******************************************************************************* 201/*******************************************************************************
400 * 202 *
401 * FUNCTION: acpi_rs_address16_stream 203 * acpi_rs_convert_general_flags - Flags common to all address descriptors
402 *
403 * PARAMETERS: linked_list - Pointer to the resource linked list
404 * output_buffer - Pointer to the user's return buffer
405 * bytes_consumed - Pointer to where the number of bytes
406 * used in the output_buffer is returned
407 *
408 * RETURN: Status
409 *
410 * DESCRIPTION: Take the linked list resource structure and fills in the
411 * the appropriate bytes in a byte stream
412 * 204 *
413 ******************************************************************************/ 205 ******************************************************************************/
414 206
415acpi_status 207static struct acpi_rsconvert_info acpi_rs_convert_general_flags[6] = {
416acpi_rs_address16_stream(struct acpi_resource *linked_list, 208 {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.flags),
417 u8 ** output_buffer, acpi_size * bytes_consumed) 209 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_general_flags)},
418{
419 u8 *buffer = *output_buffer;
420 u8 *length_field;
421 acpi_size actual_bytes;
422
423 ACPI_FUNCTION_TRACE("rs_address16_stream");
424
425 /* Set the Descriptor Type field */
426
427 *buffer = ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE;
428 buffer += 1;
429
430 /* Save a pointer to the Length field - to be filled in later */
431
432 length_field = buffer;
433 buffer += 2;
434
435 /* Set the Resource Type (Memory, Io, bus_number) */
436
437 *buffer = (u8) (linked_list->data.address16.resource_type & 0x03);
438 buffer += 1;
439
440 /* Set the general flags */
441
442 *buffer = acpi_rs_encode_general_flags(&linked_list->data);
443 buffer += 1;
444
445 /* Set the type specific flags */
446
447 *buffer = acpi_rs_encode_specific_flags(&linked_list->data);
448 buffer += 1;
449
450 /* Set the address space granularity */
451
452 ACPI_MOVE_32_TO_16(buffer, &linked_list->data.address16.granularity);
453 buffer += 2;
454
455 /* Set the address range minimum */
456 210
457 ACPI_MOVE_32_TO_16(buffer, 211 /* Resource Type (Memory, Io, bus_number, etc.) */
458 &linked_list->data.address16.min_address_range);
459 buffer += 2;
460 212
461 /* Set the address range maximum */ 213 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.address.resource_type),
214 AML_OFFSET(address.resource_type),
215 1},
462 216
463 ACPI_MOVE_32_TO_16(buffer, 217 /* General Flags - Consume, Decode, min_fixed, max_fixed */
464 &linked_list->data.address16.max_address_range);
465 buffer += 2;
466 218
467 /* Set the address translation offset */ 219 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.producer_consumer),
220 AML_OFFSET(address.flags),
221 0},
468 222
469 ACPI_MOVE_32_TO_16(buffer, 223 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.decode),
470 &linked_list->data.address16. 224 AML_OFFSET(address.flags),
471 address_translation_offset); 225 1},
472 buffer += 2;
473 226
474 /* Set the address length */ 227 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.min_address_fixed),
228 AML_OFFSET(address.flags),
229 2},
475 230
476 ACPI_MOVE_32_TO_16(buffer, &linked_list->data.address16.address_length); 231 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.max_address_fixed),
477 buffer += 2; 232 AML_OFFSET(address.flags),
478 233 3}
479 /* Resource Source Index and Resource Source are optional */ 234};
480
481 if (linked_list->data.address16.resource_source.string_length) {
482 *buffer =
483 (u8) linked_list->data.address16.resource_source.index;
484 buffer += 1;
485
486 /* Copy the resource_source string */
487
488 ACPI_STRCPY((char *)buffer,
489 linked_list->data.address16.resource_source.
490 string_ptr);
491
492 /*
493 * Buffer needs to be set to the length of the string + one for the
494 * terminating null
495 */
496 buffer +=
497 (acpi_size) (ACPI_STRLEN
498 (linked_list->data.address16.resource_source.
499 string_ptr) + 1);
500 }
501
502 /* Return the number of bytes consumed in this operation */
503
504 actual_bytes = ACPI_PTR_DIFF(buffer, *output_buffer);
505 *bytes_consumed = actual_bytes;
506
507 /*
508 * Set the length field to the number of bytes consumed
509 * minus the header size (3 bytes)
510 */
511 actual_bytes -= 3;
512 ACPI_MOVE_SIZE_TO_16(length_field, &actual_bytes);
513 return_ACPI_STATUS(AE_OK);
514}
515 235
516/******************************************************************************* 236/*******************************************************************************
517 * 237 *
518 * FUNCTION: acpi_rs_address32_resource 238 * acpi_rs_convert_mem_flags - Flags common to Memory address descriptors
519 *
520 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
521 * stream
522 * bytes_consumed - Pointer to where the number of bytes
523 * consumed the byte_stream_buffer is
524 * returned
525 * output_buffer - Pointer to the return data buffer
526 * structure_size - Pointer to where the number of bytes
527 * in the return data struct is returned
528 *
529 * RETURN: Status
530 *
531 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
532 * structure pointed to by the output_buffer. Return the
533 * number of bytes consumed from the byte stream.
534 * 239 *
535 ******************************************************************************/ 240 ******************************************************************************/
536 241
537acpi_status 242static struct acpi_rsconvert_info acpi_rs_convert_mem_flags[5] = {
538acpi_rs_address32_resource(u8 * byte_stream_buffer, 243 {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
539 acpi_size * bytes_consumed, 244 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_mem_flags)},
540 u8 ** output_buffer, acpi_size * structure_size)
541{
542 u16 temp16;
543 u8 temp8;
544 u8 *temp_ptr;
545 u32 index;
546 u8 *buffer = byte_stream_buffer;
547 struct acpi_resource *output_struct = (void *)*output_buffer;
548 acpi_size struct_size =
549 ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32);
550 245
551 ACPI_FUNCTION_TRACE("rs_address32_resource"); 246 /* Memory-specific flags */
552 247
553 /* Get the Descriptor Length field */ 248 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.write_protect),
249 AML_OFFSET(address.specific_flags),
250 0},
554 251
555 buffer += 1; 252 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.caching),
556 ACPI_MOVE_16_TO_16(&temp16, buffer); 253 AML_OFFSET(address.specific_flags),
254 1},
557 255
558 /* Validate minimum descriptor length */ 256 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.range_type),
257 AML_OFFSET(address.specific_flags),
258 3},
559 259
560 if (temp16 < 23) { 260 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.translation),
561 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH); 261 AML_OFFSET(address.specific_flags),
562 } 262 5}
563 263};
564 *bytes_consumed = temp16 + 3;
565 output_struct->id = ACPI_RSTYPE_ADDRESS32;
566
567 /* Get the Resource Type (Byte3) */
568
569 buffer += 2;
570 temp8 = *buffer;
571
572 /* Values 0-2 and 0xC0-0xFF are valid */
573
574 if ((temp8 > 2) && (temp8 < 0xC0)) {
575 return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
576 }
577
578 output_struct->data.address32.resource_type = temp8;
579
580 /* Get the General Flags (Byte4) */
581
582 buffer += 1;
583 acpi_rs_decode_general_flags(&output_struct->data, *buffer);
584
585 /* Get the Type Specific Flags (Byte5) */
586
587 buffer += 1;
588 acpi_rs_decode_specific_flags(&output_struct->data, *buffer);
589
590 /* Get Granularity (Bytes 6-9) */
591
592 buffer += 1;
593 ACPI_MOVE_32_TO_32(&output_struct->data.address32.granularity, buffer);
594
595 /* Get min_address_range (Bytes 10-13) */
596
597 buffer += 4;
598 ACPI_MOVE_32_TO_32(&output_struct->data.address32.min_address_range,
599 buffer);
600
601 /* Get max_address_range (Bytes 14-17) */
602
603 buffer += 4;
604 ACPI_MOVE_32_TO_32(&output_struct->data.address32.max_address_range,
605 buffer);
606
607 /* Get address_translation_offset (Bytes 18-21) */
608
609 buffer += 4;
610 ACPI_MOVE_32_TO_32(&output_struct->data.address32.
611 address_translation_offset, buffer);
612
613 /* Get address_length (Bytes 22-25) */
614
615 buffer += 4;
616 ACPI_MOVE_32_TO_32(&output_struct->data.address32.address_length,
617 buffer);
618
619 /* Resource Source Index (if present) */
620
621 buffer += 4;
622
623 /*
624 * This will leave us pointing to the Resource Source Index
625 * If it is present, then save it off and calculate the
626 * pointer to where the null terminated string goes:
627 *
628 * Note: Some resource descriptors will have an additional null, so
629 * we add 1 to the length.
630 */
631 if (*bytes_consumed > (26 + 1)) {
632 /* Dereference the Index */
633
634 output_struct->data.address32.resource_source.index =
635 (u32) * buffer;
636
637 /* Point to the String */
638
639 buffer += 1;
640
641 /* Point the String pointer to the end of this structure */
642
643 output_struct->data.address32.resource_source.string_ptr =
644 (char *)((u8 *) output_struct + struct_size);
645
646 temp_ptr = (u8 *)
647 output_struct->data.address32.resource_source.string_ptr;
648
649 /* Copy the resource_source string into the buffer */
650
651 index = 0;
652 while (*buffer) {
653 *temp_ptr = *buffer;
654
655 temp_ptr++;
656 buffer++;
657 index++;
658 }
659
660 /* Add the terminating null and set the string length */
661
662 *temp_ptr = 0;
663 output_struct->data.address32.resource_source.string_length =
664 index + 1;
665
666 /*
667 * In order for the struct_size to fall on a 32-bit boundary,
668 * calculate the length of the string and expand the
669 * struct_size to the next 32-bit boundary.
670 */
671 temp8 = (u8) (index + 1);
672 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
673 } else {
674 output_struct->data.address32.resource_source.index = 0;
675 output_struct->data.address32.resource_source.string_length = 0;
676 output_struct->data.address32.resource_source.string_ptr = NULL;
677 }
678
679 /* Set the Length parameter */
680
681 output_struct->length = (u32) struct_size;
682
683 /* Return the final size of the structure */
684
685 *structure_size = struct_size;
686 return_ACPI_STATUS(AE_OK);
687}
688 264
689/******************************************************************************* 265/*******************************************************************************
690 * 266 *
691 * FUNCTION: acpi_rs_address32_stream 267 * acpi_rs_convert_io_flags - Flags common to I/O address descriptors
692 *
693 * PARAMETERS: linked_list - Pointer to the resource linked list
694 * output_buffer - Pointer to the user's return buffer
695 * bytes_consumed - Pointer to where the number of bytes
696 * used in the output_buffer is returned
697 *
698 * RETURN: Status
699 *
700 * DESCRIPTION: Take the linked list resource structure and fills in the
701 * the appropriate bytes in a byte stream
702 * 268 *
703 ******************************************************************************/ 269 ******************************************************************************/
704 270
705acpi_status 271static struct acpi_rsconvert_info acpi_rs_convert_io_flags[4] = {
706acpi_rs_address32_stream(struct acpi_resource *linked_list, 272 {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
707 u8 ** output_buffer, acpi_size * bytes_consumed) 273 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io_flags)},
708{
709 u8 *buffer;
710 u16 *length_field;
711
712 ACPI_FUNCTION_TRACE("rs_address32_stream");
713
714 buffer = *output_buffer;
715
716 /* Set the Descriptor Type field */
717
718 *buffer = ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE;
719 buffer += 1;
720
721 /* Save a pointer to the Length field - to be filled in later */
722
723 length_field = ACPI_CAST_PTR(u16, buffer);
724 buffer += 2;
725
726 /* Set the Resource Type (Memory, Io, bus_number) */
727
728 *buffer = (u8) (linked_list->data.address32.resource_type & 0x03);
729 buffer += 1;
730
731 /* Set the general flags */
732
733 *buffer = acpi_rs_encode_general_flags(&linked_list->data);
734 buffer += 1;
735
736 /* Set the type specific flags */
737
738 *buffer = acpi_rs_encode_specific_flags(&linked_list->data);
739 buffer += 1;
740
741 /* Set the address space granularity */
742
743 ACPI_MOVE_32_TO_32(buffer, &linked_list->data.address32.granularity);
744 buffer += 4;
745
746 /* Set the address range minimum */
747
748 ACPI_MOVE_32_TO_32(buffer,
749 &linked_list->data.address32.min_address_range);
750 buffer += 4;
751
752 /* Set the address range maximum */
753
754 ACPI_MOVE_32_TO_32(buffer,
755 &linked_list->data.address32.max_address_range);
756 buffer += 4;
757
758 /* Set the address translation offset */
759
760 ACPI_MOVE_32_TO_32(buffer,
761 &linked_list->data.address32.
762 address_translation_offset);
763 buffer += 4;
764
765 /* Set the address length */
766
767 ACPI_MOVE_32_TO_32(buffer, &linked_list->data.address32.address_length);
768 buffer += 4;
769 274
770 /* Resource Source Index and Resource Source are optional */ 275 /* I/O-specific flags */
771 276
772 if (linked_list->data.address32.resource_source.string_length) { 277 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.io.range_type),
773 *buffer = 278 AML_OFFSET(address.specific_flags),
774 (u8) linked_list->data.address32.resource_source.index; 279 0},
775 buffer += 1;
776 280
777 /* Copy the resource_source string */ 281 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.io.translation),
282 AML_OFFSET(address.specific_flags),
283 4},
778 284
779 ACPI_STRCPY((char *)buffer, 285 {ACPI_RSC_1BITFLAG,
780 linked_list->data.address32.resource_source. 286 ACPI_RS_OFFSET(data.address.info.io.translation_type),
781 string_ptr); 287 AML_OFFSET(address.specific_flags),
782 288 5}
783 /* 289};
784 * Buffer needs to be set to the length of the string + one for the
785 * terminating null
786 */
787 buffer +=
788 (acpi_size) (ACPI_STRLEN
789 (linked_list->data.address32.resource_source.
790 string_ptr) + 1);
791 }
792
793 /* Return the number of bytes consumed in this operation */
794
795 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
796
797 /*
798 * Set the length field to the number of bytes consumed
799 * minus the header size (3 bytes)
800 */
801 *length_field = (u16) (*bytes_consumed - 3);
802 return_ACPI_STATUS(AE_OK);
803}
804 290
805/******************************************************************************* 291/*******************************************************************************
806 * 292 *
807 * FUNCTION: acpi_rs_address64_resource 293 * FUNCTION: acpi_rs_get_address_common
808 * 294 *
809 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte 295 * PARAMETERS: Resource - Pointer to the internal resource struct
810 * stream 296 * Aml - Pointer to the AML resource descriptor
811 * bytes_consumed - Pointer to where the number of bytes
812 * consumed the byte_stream_buffer is
813 * returned
814 * output_buffer - Pointer to the return data buffer
815 * structure_size - Pointer to where the number of bytes
816 * in the return data struct is returned
817 * 297 *
818 * RETURN: Status 298 * RETURN: TRUE if the resource_type field is OK, FALSE otherwise
819 * 299 *
820 * DESCRIPTION: Take the resource byte stream and fill out the appropriate 300 * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor
821 * structure pointed to by the output_buffer. Return the 301 * to an internal resource descriptor
822 * number of bytes consumed from the byte stream.
823 * 302 *
824 ******************************************************************************/ 303 ******************************************************************************/
825 304
826acpi_status 305u8
827acpi_rs_address64_resource(u8 * byte_stream_buffer, 306acpi_rs_get_address_common(struct acpi_resource *resource,
828 acpi_size * bytes_consumed, 307 union aml_resource *aml)
829 u8 ** output_buffer, acpi_size * structure_size)
830{ 308{
831 u16 temp16; 309 ACPI_FUNCTION_ENTRY();
832 u8 temp8;
833 u8 resource_type;
834 u8 *temp_ptr;
835 u32 index;
836 u8 *buffer = byte_stream_buffer;
837 struct acpi_resource *output_struct = (void *)*output_buffer;
838 acpi_size struct_size =
839 ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64);
840
841 ACPI_FUNCTION_TRACE("rs_address64_resource");
842
843 /* Get the Descriptor Type */
844
845 resource_type = *buffer;
846
847 /* Get the Descriptor Length field */
848
849 buffer += 1;
850 ACPI_MOVE_16_TO_16(&temp16, buffer);
851
852 /* Validate minimum descriptor length */
853
854 if (temp16 < 43) {
855 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
856 }
857
858 *bytes_consumed = temp16 + 3;
859 output_struct->id = ACPI_RSTYPE_ADDRESS64;
860
861 /* Get the Resource Type (Byte3) */
862
863 buffer += 2;
864 temp8 = *buffer;
865
866 /* Values 0-2 and 0xC0-0xFF are valid */
867
868 if ((temp8 > 2) && (temp8 < 0xC0)) {
869 return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
870 }
871
872 output_struct->data.address64.resource_type = temp8;
873
874 /* Get the General Flags (Byte4) */
875
876 buffer += 1;
877 acpi_rs_decode_general_flags(&output_struct->data, *buffer);
878
879 /* Get the Type Specific Flags (Byte5) */
880
881 buffer += 1;
882 acpi_rs_decode_specific_flags(&output_struct->data, *buffer);
883 310
884 if (resource_type == ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE) { 311 /* Validate the Resource Type */
885 /* Move past revision_id and Reserved byte */
886 312
887 buffer += 2; 313 if ((aml->address.resource_type > 2)
314 && (aml->address.resource_type < 0xC0)) {
315 return (FALSE);
888 } 316 }
889 317
890 /* Get Granularity (Bytes 6-13) or (Bytes 8-15) */ 318 /* Get the Resource Type and General Flags */
891
892 buffer += 1;
893 ACPI_MOVE_64_TO_64(&output_struct->data.address64.granularity, buffer);
894
895 /* Get min_address_range (Bytes 14-21) or (Bytes 16-23) */
896
897 buffer += 8;
898 ACPI_MOVE_64_TO_64(&output_struct->data.address64.min_address_range,
899 buffer);
900
901 /* Get max_address_range (Bytes 22-29) or (Bytes 24-31) */
902
903 buffer += 8;
904 ACPI_MOVE_64_TO_64(&output_struct->data.address64.max_address_range,
905 buffer);
906
907 /* Get address_translation_offset (Bytes 30-37) or (Bytes 32-39) */
908
909 buffer += 8;
910 ACPI_MOVE_64_TO_64(&output_struct->data.address64.
911 address_translation_offset, buffer);
912 319
913 /* Get address_length (Bytes 38-45) or (Bytes 40-47) */ 320 (void)acpi_rs_convert_aml_to_resource(resource, aml,
321 acpi_rs_convert_general_flags);
914 322
915 buffer += 8; 323 /* Get the Type-Specific Flags (Memory and I/O descriptors only) */
916 ACPI_MOVE_64_TO_64(&output_struct->data.address64.address_length,
917 buffer);
918 324
919 output_struct->data.address64.resource_source.index = 0; 325 if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
920 output_struct->data.address64.resource_source.string_length = 0; 326 (void)acpi_rs_convert_aml_to_resource(resource, aml,
921 output_struct->data.address64.resource_source.string_ptr = NULL; 327 acpi_rs_convert_mem_flags);
922 328 } else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
923 if (resource_type == ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE) { 329 (void)acpi_rs_convert_aml_to_resource(resource, aml,
924 /* Get type_specific_attribute (Bytes 48-55) */ 330 acpi_rs_convert_io_flags);
925
926 buffer += 8;
927 ACPI_MOVE_64_TO_64(&output_struct->data.address64.
928 type_specific_attributes, buffer);
929 } else { 331 } else {
930 output_struct->data.address64.type_specific_attributes = 0; 332 /* Generic resource type, just grab the type_specific byte */
931
932 /* Resource Source Index (if present) */
933
934 buffer += 8;
935
936 /*
937 * This will leave us pointing to the Resource Source Index
938 * If it is present, then save it off and calculate the
939 * pointer to where the null terminated string goes:
940 * Each Interrupt takes 32-bits + the 5 bytes of the
941 * stream that are default.
942 *
943 * Note: Some resource descriptors will have an additional null, so
944 * we add 1 to the length.
945 */
946 if (*bytes_consumed > (46 + 1)) {
947 /* Dereference the Index */
948
949 output_struct->data.address64.resource_source.index =
950 (u32) * buffer;
951
952 /* Point to the String */
953
954 buffer += 1;
955
956 /* Point the String pointer to the end of this structure */
957
958 output_struct->data.address64.resource_source.
959 string_ptr =
960 (char *)((u8 *) output_struct + struct_size);
961
962 temp_ptr = (u8 *)
963 output_struct->data.address64.resource_source.
964 string_ptr;
965
966 /* Copy the resource_source string into the buffer */
967
968 index = 0;
969 while (*buffer) {
970 *temp_ptr = *buffer;
971
972 temp_ptr++;
973 buffer++;
974 index++;
975 }
976
977 /*
978 * Add the terminating null and set the string length
979 */
980 *temp_ptr = 0;
981 output_struct->data.address64.resource_source.
982 string_length = index + 1;
983
984 /*
985 * In order for the struct_size to fall on a 32-bit boundary,
986 * calculate the length of the string and expand the
987 * struct_size to the next 32-bit boundary.
988 */
989 temp8 = (u8) (index + 1);
990 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
991 }
992 }
993
994 /* Set the Length parameter */
995
996 output_struct->length = (u32) struct_size;
997 333
998 /* Return the final size of the structure */ 334 resource->data.address.info.type_specific =
335 aml->address.specific_flags;
336 }
999 337
1000 *structure_size = struct_size; 338 return (TRUE);
1001 return_ACPI_STATUS(AE_OK);
1002} 339}
1003 340
1004/******************************************************************************* 341/*******************************************************************************
1005 * 342 *
1006 * FUNCTION: acpi_rs_address64_stream 343 * FUNCTION: acpi_rs_set_address_common
1007 * 344 *
1008 * PARAMETERS: linked_list - Pointer to the resource linked list 345 * PARAMETERS: Aml - Pointer to the AML resource descriptor
1009 * output_buffer - Pointer to the user's return buffer 346 * Resource - Pointer to the internal resource struct
1010 * bytes_consumed - Pointer to where the number of bytes
1011 * used in the output_buffer is returned
1012 * 347 *
1013 * RETURN: Status 348 * RETURN: None
1014 * 349 *
1015 * DESCRIPTION: Take the linked list resource structure and fills in the 350 * DESCRIPTION: Convert common flag fields from a resource descriptor to an
1016 * the appropriate bytes in a byte stream 351 * AML descriptor
1017 * 352 *
1018 ******************************************************************************/ 353 ******************************************************************************/
1019 354
1020acpi_status 355void
1021acpi_rs_address64_stream(struct acpi_resource *linked_list, 356acpi_rs_set_address_common(union aml_resource *aml,
1022 u8 ** output_buffer, acpi_size * bytes_consumed) 357 struct acpi_resource *resource)
1023{ 358{
1024 u8 *buffer; 359 ACPI_FUNCTION_ENTRY();
1025 u16 *length_field;
1026
1027 ACPI_FUNCTION_TRACE("rs_address64_stream");
1028
1029 buffer = *output_buffer;
1030
1031 /* Set the Descriptor Type field */
1032
1033 *buffer = ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE;
1034 buffer += 1;
1035
1036 /* Save a pointer to the Length field - to be filled in later */
1037
1038 length_field = ACPI_CAST_PTR(u16, buffer);
1039 buffer += 2;
1040
1041 /* Set the Resource Type (Memory, Io, bus_number) */
1042
1043 *buffer = (u8) (linked_list->data.address64.resource_type & 0x03);
1044 buffer += 1;
1045
1046 /* Set the general flags */
1047
1048 *buffer = acpi_rs_encode_general_flags(&linked_list->data);
1049 buffer += 1;
1050
1051 /* Set the type specific flags */
1052
1053 *buffer = acpi_rs_encode_specific_flags(&linked_list->data);
1054 buffer += 1;
1055
1056 /* Set the address space granularity */
1057
1058 ACPI_MOVE_64_TO_64(buffer, &linked_list->data.address64.granularity);
1059 buffer += 8;
1060
1061 /* Set the address range minimum */
1062
1063 ACPI_MOVE_64_TO_64(buffer,
1064 &linked_list->data.address64.min_address_range);
1065 buffer += 8;
1066
1067 /* Set the address range maximum */
1068
1069 ACPI_MOVE_64_TO_64(buffer,
1070 &linked_list->data.address64.max_address_range);
1071 buffer += 8;
1072
1073 /* Set the address translation offset */
1074
1075 ACPI_MOVE_64_TO_64(buffer,
1076 &linked_list->data.address64.
1077 address_translation_offset);
1078 buffer += 8;
1079
1080 /* Set the address length */
1081
1082 ACPI_MOVE_64_TO_64(buffer, &linked_list->data.address64.address_length);
1083 buffer += 8;
1084 360
1085 /* Resource Source Index and Resource Source are optional */ 361 /* Set the Resource Type and General Flags */
1086 362
1087 if (linked_list->data.address64.resource_source.string_length) { 363 (void)acpi_rs_convert_resource_to_aml(resource, aml,
1088 *buffer = 364 acpi_rs_convert_general_flags);
1089 (u8) linked_list->data.address64.resource_source.index;
1090 buffer += 1;
1091 365
1092 /* Copy the resource_source string */ 366 /* Set the Type-Specific Flags (Memory and I/O descriptors only) */
1093 367
1094 ACPI_STRCPY((char *)buffer, 368 if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
1095 linked_list->data.address64.resource_source. 369 (void)acpi_rs_convert_resource_to_aml(resource, aml,
1096 string_ptr); 370 acpi_rs_convert_mem_flags);
371 } else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
372 (void)acpi_rs_convert_resource_to_aml(resource, aml,
373 acpi_rs_convert_io_flags);
374 } else {
375 /* Generic resource type, just copy the type_specific byte */
1097 376
1098 /* 377 aml->address.specific_flags =
1099 * Buffer needs to be set to the length of the string + one for the 378 resource->data.address.info.type_specific;
1100 * terminating null
1101 */
1102 buffer +=
1103 (acpi_size) (ACPI_STRLEN
1104 (linked_list->data.address64.resource_source.
1105 string_ptr) + 1);
1106 } 379 }
1107
1108 /* Return the number of bytes consumed in this operation */
1109
1110 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
1111
1112 /*
1113 * Set the length field to the number of bytes consumed
1114 * minus the header size (3 bytes)
1115 */
1116 *length_field = (u16) (*bytes_consumed - 3);
1117 return_ACPI_STATUS(AE_OK);
1118} 380}
diff --git a/drivers/acpi/resources/rscalc.c b/drivers/acpi/resources/rscalc.c
index 378f58390fc1..7d6481d9fbec 100644
--- a/drivers/acpi/resources/rscalc.c
+++ b/drivers/acpi/resources/rscalc.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -49,652 +49,433 @@
49#define _COMPONENT ACPI_RESOURCES 49#define _COMPONENT ACPI_RESOURCES
50ACPI_MODULE_NAME("rscalc") 50ACPI_MODULE_NAME("rscalc")
51 51
52/* Local prototypes */
53static u8 acpi_rs_count_set_bits(u16 bit_field);
54
55static acpi_rs_length
56acpi_rs_struct_option_length(struct acpi_resource_source *resource_source);
57
58static u32
59acpi_rs_stream_option_length(u32 resource_length, u32 minimum_total_length);
60
52/******************************************************************************* 61/*******************************************************************************
53 * 62 *
54 * FUNCTION: acpi_rs_get_byte_stream_length 63 * FUNCTION: acpi_rs_count_set_bits
55 * 64 *
56 * PARAMETERS: linked_list - Pointer to the resource linked list 65 * PARAMETERS: bit_field - Field in which to count bits
57 * size_needed - u32 pointer of the size buffer needed
58 * to properly return the parsed data
59 * 66 *
60 * RETURN: Status 67 * RETURN: Number of bits set within the field
61 * 68 *
62 * DESCRIPTION: Takes the resource byte stream and parses it once, calculating 69 * DESCRIPTION: Count the number of bits set in a resource field. Used for
63 * the size buffer needed to hold the linked list that conveys 70 * (Short descriptor) interrupt and DMA lists.
64 * the resource data.
65 * 71 *
66 ******************************************************************************/ 72 ******************************************************************************/
67acpi_status
68acpi_rs_get_byte_stream_length(struct acpi_resource *linked_list,
69 acpi_size * size_needed)
70{
71 acpi_size byte_stream_size_needed = 0;
72 acpi_size segment_size;
73 u8 done = FALSE;
74
75 ACPI_FUNCTION_TRACE("rs_get_byte_stream_length");
76
77 while (!done) {
78 /* Init the variable that will hold the size to add to the total. */
79
80 segment_size = 0;
81
82 switch (linked_list->id) {
83 case ACPI_RSTYPE_IRQ:
84 /*
85 * IRQ Resource
86 * For an IRQ Resource, Byte 3, although optional, will always be
87 * created - it holds IRQ information.
88 */
89 segment_size = 4;
90 break;
91
92 case ACPI_RSTYPE_DMA:
93 /*
94 * DMA Resource
95 * For this resource the size is static
96 */
97 segment_size = 3;
98 break;
99
100 case ACPI_RSTYPE_START_DPF:
101 /*
102 * Start Dependent Functions Resource
103 * For a start_dependent_functions Resource, Byte 1, although
104 * optional, will always be created.
105 */
106 segment_size = 2;
107 break;
108
109 case ACPI_RSTYPE_END_DPF:
110 /*
111 * End Dependent Functions Resource
112 * For this resource the size is static
113 */
114 segment_size = 1;
115 break;
116
117 case ACPI_RSTYPE_IO:
118 /*
119 * IO Port Resource
120 * For this resource the size is static
121 */
122 segment_size = 8;
123 break;
124 73
125 case ACPI_RSTYPE_FIXED_IO: 74static u8 acpi_rs_count_set_bits(u16 bit_field)
126 /* 75{
127 * Fixed IO Port Resource 76 u8 bits_set;
128 * For this resource the size is static
129 */
130 segment_size = 4;
131 break;
132
133 case ACPI_RSTYPE_VENDOR:
134 /*
135 * Vendor Defined Resource
136 * For a Vendor Specific resource, if the Length is between 1 and 7
137 * it will be created as a Small Resource data type, otherwise it
138 * is a Large Resource data type.
139 */
140 if (linked_list->data.vendor_specific.length > 7) {
141 segment_size = 3;
142 } else {
143 segment_size = 1;
144 }
145 segment_size +=
146 linked_list->data.vendor_specific.length;
147 break;
148
149 case ACPI_RSTYPE_END_TAG:
150 /*
151 * End Tag
152 * For this resource the size is static
153 */
154 segment_size = 2;
155 done = TRUE;
156 break;
157
158 case ACPI_RSTYPE_MEM24:
159 /*
160 * 24-Bit Memory Resource
161 * For this resource the size is static
162 */
163 segment_size = 12;
164 break;
165 77
166 case ACPI_RSTYPE_MEM32: 78 ACPI_FUNCTION_ENTRY();
167 /*
168 * 32-Bit Memory Range Resource
169 * For this resource the size is static
170 */
171 segment_size = 20;
172 break;
173 79
174 case ACPI_RSTYPE_FIXED_MEM32: 80 for (bits_set = 0; bit_field; bits_set++) {
175 /* 81 /* Zero the least significant bit that is set */
176 * 32-Bit Fixed Memory Resource
177 * For this resource the size is static
178 */
179 segment_size = 12;
180 break;
181 82
182 case ACPI_RSTYPE_ADDRESS16: 83 bit_field &= (bit_field - 1);
183 /* 84 }
184 * 16-Bit Address Resource
185 * The base size of this byte stream is 16. If a Resource Source
186 * string is not NULL, add 1 for the Index + the length of the null
187 * terminated string Resource Source + 1 for the null.
188 */
189 segment_size = 16;
190
191 if (linked_list->data.address16.resource_source.
192 string_ptr) {
193 segment_size +=
194 linked_list->data.address16.resource_source.
195 string_length;
196 segment_size++;
197 }
198 break;
199 85
200 case ACPI_RSTYPE_ADDRESS32: 86 return (bits_set);
201 /* 87}
202 * 32-Bit Address Resource
203 * The base size of this byte stream is 26. If a Resource
204 * Source string is not NULL, add 1 for the Index + the
205 * length of the null terminated string Resource Source +
206 * 1 for the null.
207 */
208 segment_size = 26;
209
210 if (linked_list->data.address32.resource_source.
211 string_ptr) {
212 segment_size +=
213 linked_list->data.address32.resource_source.
214 string_length;
215 segment_size++;
216 }
217 break;
218 88
219 case ACPI_RSTYPE_ADDRESS64: 89/*******************************************************************************
220 /* 90 *
221 * 64-Bit Address Resource 91 * FUNCTION: acpi_rs_struct_option_length
222 * The base size of this byte stream is 46. If a resource_source 92 *
223 * string is not NULL, add 1 for the Index + the length of the null 93 * PARAMETERS: resource_source - Pointer to optional descriptor field
224 * terminated string Resource Source + 1 for the null. 94 *
225 */ 95 * RETURN: Status
226 segment_size = 46; 96 *
227 97 * DESCRIPTION: Common code to handle optional resource_source_index and
228 if (linked_list->data.address64.resource_source. 98 * resource_source fields in some Large descriptors. Used during
229 string_ptr) { 99 * list-to-stream conversion
230 segment_size += 100 *
231 linked_list->data.address64.resource_source. 101 ******************************************************************************/
232 string_length;
233 segment_size++;
234 }
235 break;
236 102
237 case ACPI_RSTYPE_EXT_IRQ: 103static acpi_rs_length
238 /* 104acpi_rs_struct_option_length(struct acpi_resource_source *resource_source)
239 * Extended IRQ Resource 105{
240 * The base size of this byte stream is 9. This is for an Interrupt 106 ACPI_FUNCTION_ENTRY();
241 * table length of 1. For each additional interrupt, add 4.
242 * If a Resource Source string is not NULL, add 1 for the
243 * Index + the length of the null terminated string
244 * Resource Source + 1 for the null.
245 */
246 segment_size = 9 + (((acpi_size)
247 linked_list->data.extended_irq.
248 number_of_interrupts - 1) * 4);
249
250 if (linked_list->data.extended_irq.resource_source.
251 string_ptr) {
252 segment_size +=
253 linked_list->data.extended_irq.
254 resource_source.string_length;
255 segment_size++;
256 }
257 break;
258 107
259 default: 108 /*
109 * If the resource_source string is valid, return the size of the string
110 * (string_length includes the NULL terminator) plus the size of the
111 * resource_source_index (1).
112 */
113 if (resource_source->string_ptr) {
114 return ((acpi_rs_length) (resource_source->string_length + 1));
115 }
260 116
261 /* If we get here, everything is out of sync, exit with error */ 117 return (0);
118}
262 119
263 return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE); 120/*******************************************************************************
121 *
122 * FUNCTION: acpi_rs_stream_option_length
123 *
124 * PARAMETERS: resource_length - Length from the resource header
125 * minimum_total_length - Minimum length of this resource, before
126 * any optional fields. Includes header size
127 *
128 * RETURN: Length of optional string (0 if no string present)
129 *
130 * DESCRIPTION: Common code to handle optional resource_source_index and
131 * resource_source fields in some Large descriptors. Used during
132 * stream-to-list conversion
133 *
134 ******************************************************************************/
264 135
265 } /* switch (linked_list->Id) */ 136static u32
137acpi_rs_stream_option_length(u32 resource_length,
138 u32 minimum_aml_resource_length)
139{
140 u32 string_length = 0;
266 141
267 /* Update the total */ 142 ACPI_FUNCTION_ENTRY();
268 143
269 byte_stream_size_needed += segment_size; 144 /*
145 * The resource_source_index and resource_source are optional elements of some
146 * Large-type resource descriptors.
147 */
270 148
271 /* Point to the next object */ 149 /*
150 * If the length of the actual resource descriptor is greater than the ACPI
151 * spec-defined minimum length, it means that a resource_source_index exists
152 * and is followed by a (required) null terminated string. The string length
153 * (including the null terminator) is the resource length minus the minimum
154 * length, minus one byte for the resource_source_index itself.
155 */
156 if (resource_length > minimum_aml_resource_length) {
157 /* Compute the length of the optional string */
272 158
273 linked_list = ACPI_PTR_ADD(struct acpi_resource, 159 string_length =
274 linked_list, linked_list->length); 160 resource_length - minimum_aml_resource_length - 1;
275 } 161 }
276 162
277 /* This is the data the caller needs */ 163 /* Round up length to 32 bits for internal structure alignment */
278 164
279 *size_needed = byte_stream_size_needed; 165 return (ACPI_ROUND_UP_to_32_bITS(string_length));
280 return_ACPI_STATUS(AE_OK);
281} 166}
282 167
283/******************************************************************************* 168/*******************************************************************************
284 * 169 *
285 * FUNCTION: acpi_rs_get_list_length 170 * FUNCTION: acpi_rs_get_aml_length
286 * 171 *
287 * PARAMETERS: byte_stream_buffer - Pointer to the resource byte stream 172 * PARAMETERS: Resource - Pointer to the resource linked list
288 * byte_stream_buffer_length - Size of byte_stream_buffer 173 * size_needed - Where the required size is returned
289 * size_needed - u32 pointer of the size buffer
290 * needed to properly return the
291 * parsed data
292 * 174 *
293 * RETURN: Status 175 * RETURN: Status
294 * 176 *
295 * DESCRIPTION: Takes the resource byte stream and parses it once, calculating 177 * DESCRIPTION: Takes a linked list of internal resource descriptors and
296 * the size buffer needed to hold the linked list that conveys 178 * calculates the size buffer needed to hold the corresponding
297 * the resource data. 179 * external resource byte stream.
298 * 180 *
299 ******************************************************************************/ 181 ******************************************************************************/
300 182
301acpi_status 183acpi_status
302acpi_rs_get_list_length(u8 * byte_stream_buffer, 184acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed)
303 u32 byte_stream_buffer_length, acpi_size * size_needed)
304{ 185{
305 u32 buffer_size = 0; 186 acpi_size aml_size_needed = 0;
306 u32 bytes_parsed = 0; 187 acpi_rs_length total_size;
307 u8 number_of_interrupts = 0;
308 u8 number_of_channels = 0;
309 u8 resource_type;
310 u32 structure_size;
311 u32 bytes_consumed;
312 u8 *buffer;
313 u8 temp8;
314 u16 temp16;
315 u8 index;
316 u8 additional_bytes;
317
318 ACPI_FUNCTION_TRACE("rs_get_list_length");
319 188
320 while (bytes_parsed < byte_stream_buffer_length) { 189 ACPI_FUNCTION_TRACE("rs_get_aml_length");
321 /* The next byte in the stream is the resource type */
322 190
323 resource_type = acpi_rs_get_resource_type(*byte_stream_buffer); 191 /* Traverse entire list of internal resource descriptors */
324 192
325 switch (resource_type) { 193 while (resource) {
326 case ACPI_RDESC_TYPE_MEMORY_24: 194 /* Validate the descriptor type */
327 /*
328 * 24-Bit Memory Resource
329 */
330 bytes_consumed = 12;
331
332 structure_size =
333 ACPI_SIZEOF_RESOURCE(struct acpi_resource_mem24);
334 break;
335 195
336 case ACPI_RDESC_TYPE_LARGE_VENDOR: 196 if (resource->type > ACPI_RESOURCE_TYPE_MAX) {
337 /* 197 return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
338 * Vendor Defined Resource 198 }
339 */
340 buffer = byte_stream_buffer;
341 ++buffer;
342
343 ACPI_MOVE_16_TO_16(&temp16, buffer);
344 bytes_consumed = temp16 + 3;
345
346 /* Ensure a 32-bit boundary for the structure */
347 199
348 temp16 = (u16) ACPI_ROUND_UP_to_32_bITS(temp16); 200 /* Get the base size of the (external stream) resource descriptor */
349 201
350 structure_size = 202 total_size = acpi_gbl_aml_resource_sizes[resource->type];
351 ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor) +
352 (temp16 * sizeof(u8));
353 break;
354 203
355 case ACPI_RDESC_TYPE_MEMORY_32: 204 /*
205 * Augment the base size for descriptors with optional and/or
206 * variable-length fields
207 */
208 switch (resource->type) {
209 case ACPI_RESOURCE_TYPE_VENDOR:
356 /* 210 /*
357 * 32-Bit Memory Range Resource 211 * Vendor Defined Resource:
212 * For a Vendor Specific resource, if the Length is between 1 and 7
213 * it will be created as a Small Resource data type, otherwise it
214 * is a Large Resource data type.
358 */ 215 */
359 bytes_consumed = 20; 216 if (resource->data.vendor.byte_length > 7) {
217 /* Base size of a Large resource descriptor */
360 218
361 structure_size = 219 total_size =
362 ACPI_SIZEOF_RESOURCE(struct acpi_resource_mem32); 220 sizeof(struct aml_resource_large_header);
363 break; 221 }
364 222
365 case ACPI_RDESC_TYPE_FIXED_MEMORY_32: 223 /* Add the size of the vendor-specific data */
366 /*
367 * 32-Bit Fixed Memory Resource
368 */
369 bytes_consumed = 12;
370 224
371 structure_size = 225 total_size = (acpi_rs_length)
372 ACPI_SIZEOF_RESOURCE(struct 226 (total_size + resource->data.vendor.byte_length);
373 acpi_resource_fixed_mem32);
374 break; 227 break;
375 228
376 case ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE: 229 case ACPI_RESOURCE_TYPE_END_TAG:
377 /* 230 /*
378 * 64-Bit Address Resource 231 * End Tag:
232 * We are done -- return the accumulated total size.
379 */ 233 */
380 buffer = byte_stream_buffer; 234 *size_needed = aml_size_needed + total_size;
381 235
382 ++buffer; 236 /* Normal exit */
383 ACPI_MOVE_16_TO_16(&temp16, buffer);
384 237
385 bytes_consumed = temp16 + 3; 238 return_ACPI_STATUS(AE_OK);
386 structure_size =
387 ACPI_SIZEOF_RESOURCE(struct
388 acpi_resource_address64);
389 break;
390 239
391 case ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE: 240 case ACPI_RESOURCE_TYPE_ADDRESS16:
392 /* 241 /*
393 * 64-Bit Address Resource 242 * 16-Bit Address Resource:
243 * Add the size of the optional resource_source info
394 */ 244 */
395 buffer = byte_stream_buffer; 245 total_size = (acpi_rs_length)
396 246 (total_size +
397 ++buffer; 247 acpi_rs_struct_option_length(&resource->data.
398 ACPI_MOVE_16_TO_16(&temp16, buffer); 248 address16.
399 249 resource_source));
400 bytes_consumed = temp16 + 3; 250 break;
401 251
252 case ACPI_RESOURCE_TYPE_ADDRESS32:
402 /* 253 /*
403 * Resource Source Index and Resource Source are optional elements. 254 * 32-Bit Address Resource:
404 * Check the length of the Bytestream. If it is greater than 43, 255 * Add the size of the optional resource_source info
405 * that means that an Index exists and is followed by a null
406 * terminated string. Therefore, set the temp variable to the
407 * length minus the minimum byte stream length plus the byte for
408 * the Index to determine the size of the NULL terminated string.
409 */ 256 */
410 if (43 < temp16) { 257 total_size = (acpi_rs_length)
411 temp8 = (u8) (temp16 - 44); 258 (total_size +
412 } else { 259 acpi_rs_struct_option_length(&resource->data.
413 temp8 = 0; 260 address32.
414 } 261 resource_source));
415
416 /* Ensure a 64-bit boundary for the structure */
417
418 temp8 = (u8) ACPI_ROUND_UP_to_64_bITS(temp8);
419
420 structure_size =
421 ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64)
422 + (temp8 * sizeof(u8));
423 break; 262 break;
424 263
425 case ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE: 264 case ACPI_RESOURCE_TYPE_ADDRESS64:
426 /* 265 /*
427 * 32-Bit Address Resource 266 * 64-Bit Address Resource:
267 * Add the size of the optional resource_source info
428 */ 268 */
429 buffer = byte_stream_buffer; 269 total_size = (acpi_rs_length)
430 270 (total_size +
431 ++buffer; 271 acpi_rs_struct_option_length(&resource->data.
432 ACPI_MOVE_16_TO_16(&temp16, buffer); 272 address64.
433 273 resource_source));
434 bytes_consumed = temp16 + 3; 274 break;
435 275
276 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
436 /* 277 /*
437 * Resource Source Index and Resource Source are optional elements. 278 * Extended IRQ Resource:
438 * Check the length of the Bytestream. If it is greater than 23, 279 * Add the size of each additional optional interrupt beyond the
439 * that means that an Index exists and is followed by a null 280 * required 1 (4 bytes for each u32 interrupt number)
440 * terminated string. Therefore, set the temp variable to the
441 * length minus the minimum byte stream length plus the byte for
442 * the Index to determine the size of the NULL terminated string.
443 */ 281 */
444 if (23 < temp16) { 282 total_size = (acpi_rs_length)
445 temp8 = (u8) (temp16 - 24); 283 (total_size +
446 } else { 284 ((resource->data.extended_irq.interrupt_count -
447 temp8 = 0; 285 1) * 4) +
448 } 286 /* Add the size of the optional resource_source info */
449 287 acpi_rs_struct_option_length(&resource->data.
450 /* Ensure a 32-bit boundary for the structure */ 288 extended_irq.
451 289 resource_source));
452 temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8); 290 break;
453 291
454 structure_size = 292 default:
455 ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32)
456 + (temp8 * sizeof(u8));
457 break; 293 break;
294 }
458 295
459 case ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE: 296 /* Update the total */
460 /*
461 * 16-Bit Address Resource
462 */
463 buffer = byte_stream_buffer;
464 297
465 ++buffer; 298 aml_size_needed += total_size;
466 ACPI_MOVE_16_TO_16(&temp16, buffer);
467 299
468 bytes_consumed = temp16 + 3; 300 /* Point to the next object */
469 301
470 /* 302 resource =
471 * Resource Source Index and Resource Source are optional elements. 303 ACPI_ADD_PTR(struct acpi_resource, resource,
472 * Check the length of the Bytestream. If it is greater than 13, 304 resource->length);
473 * that means that an Index exists and is followed by a null 305 }
474 * terminated string. Therefore, set the temp variable to the
475 * length minus the minimum byte stream length plus the byte for
476 * the Index to determine the size of the NULL terminated string.
477 */
478 if (13 < temp16) {
479 temp8 = (u8) (temp16 - 14);
480 } else {
481 temp8 = 0;
482 }
483 306
484 /* Ensure a 32-bit boundary for the structure */ 307 /* Did not find an end_tag resource descriptor */
485 308
486 temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8); 309 return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
310}
487 311
488 structure_size = 312/*******************************************************************************
489 ACPI_SIZEOF_RESOURCE(struct acpi_resource_address16) 313 *
490 + (temp8 * sizeof(u8)); 314 * FUNCTION: acpi_rs_get_list_length
491 break; 315 *
316 * PARAMETERS: aml_buffer - Pointer to the resource byte stream
317 * aml_buffer_length - Size of aml_buffer
318 * size_needed - Where the size needed is returned
319 *
320 * RETURN: Status
321 *
322 * DESCRIPTION: Takes an external resource byte stream and calculates the size
323 * buffer needed to hold the corresponding internal resource
324 * descriptor linked list.
325 *
326 ******************************************************************************/
492 327
493 case ACPI_RDESC_TYPE_EXTENDED_XRUPT: 328acpi_status
494 /* 329acpi_rs_get_list_length(u8 * aml_buffer,
495 * Extended IRQ 330 u32 aml_buffer_length, acpi_size * size_needed)
496 */ 331{
497 buffer = byte_stream_buffer; 332 acpi_status status;
333 u8 *end_aml;
334 u8 *buffer;
335 u32 buffer_size = 0;
336 u16 temp16;
337 u16 resource_length;
338 u32 extra_struct_bytes;
339 u8 resource_index;
340 u8 minimum_aml_resource_length;
498 341
499 ++buffer; 342 ACPI_FUNCTION_TRACE("rs_get_list_length");
500 ACPI_MOVE_16_TO_16(&temp16, buffer);
501 343
502 bytes_consumed = temp16 + 3; 344 end_aml = aml_buffer + aml_buffer_length;
503 345
504 /* 346 /* Walk the list of AML resource descriptors */
505 * Point past the length field and the Interrupt vector flags to
506 * save off the Interrupt table length to the Temp8 variable.
507 */
508 buffer += 3;
509 temp8 = *buffer;
510 347
511 /* 348 while (aml_buffer < end_aml) {
512 * To compensate for multiple interrupt numbers, add 4 bytes for 349 /* Validate the Resource Type and Resource Length */
513 * each additional interrupts greater than 1
514 */
515 additional_bytes = (u8) ((temp8 - 1) * 4);
516 350
517 /* 351 status = acpi_ut_validate_resource(aml_buffer, &resource_index);
518 * Resource Source Index and Resource Source are optional elements. 352 if (ACPI_FAILURE(status)) {
519 * Check the length of the Bytestream. If it is greater than 9, 353 return_ACPI_STATUS(status);
520 * that means that an Index exists and is followed by a null 354 }
521 * terminated string. Therefore, set the temp variable to the
522 * length minus the minimum byte stream length plus the byte for
523 * the Index to determine the size of the NULL terminated string.
524 */
525 if (9 + additional_bytes < temp16) {
526 temp8 = (u8) (temp16 - (9 + additional_bytes));
527 } else {
528 temp8 = 0;
529 }
530 355
531 /* Ensure a 32-bit boundary for the structure */ 356 /* Get the resource length and base (minimum) AML size */
532 357
533 temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8); 358 resource_length = acpi_ut_get_resource_length(aml_buffer);
359 minimum_aml_resource_length =
360 acpi_gbl_resource_aml_sizes[resource_index];
534 361
535 structure_size = 362 /*
536 ACPI_SIZEOF_RESOURCE(struct acpi_resource_ext_irq) + 363 * Augment the size for descriptors with optional
537 (additional_bytes * sizeof(u8)) + 364 * and/or variable length fields
538 (temp8 * sizeof(u8)); 365 */
539 break; 366 extra_struct_bytes = 0;
367 buffer =
368 aml_buffer + acpi_ut_get_resource_header_length(aml_buffer);
540 369
541 case ACPI_RDESC_TYPE_IRQ_FORMAT: 370 switch (acpi_ut_get_resource_type(aml_buffer)) {
371 case ACPI_RESOURCE_NAME_IRQ:
542 /* 372 /*
543 * IRQ Resource. 373 * IRQ Resource:
544 * Determine if it there are two or three trailing bytes 374 * Get the number of bits set in the 16-bit IRQ mask
545 */ 375 */
546 buffer = byte_stream_buffer;
547 temp8 = *buffer;
548
549 if (temp8 & 0x01) {
550 bytes_consumed = 4;
551 } else {
552 bytes_consumed = 3;
553 }
554
555 /* Point past the descriptor */
556
557 ++buffer;
558
559 /* Look at the number of bits set */
560
561 ACPI_MOVE_16_TO_16(&temp16, buffer); 376 ACPI_MOVE_16_TO_16(&temp16, buffer);
562 377 extra_struct_bytes = acpi_rs_count_set_bits(temp16);
563 for (index = 0; index < 16; index++) {
564 if (temp16 & 0x1) {
565 ++number_of_interrupts;
566 }
567
568 temp16 >>= 1;
569 }
570
571 structure_size =
572 ACPI_SIZEOF_RESOURCE(struct acpi_resource_io) +
573 (number_of_interrupts * sizeof(u32));
574 break; 378 break;
575 379
576 case ACPI_RDESC_TYPE_DMA_FORMAT: 380 case ACPI_RESOURCE_NAME_DMA:
577 /* 381 /*
578 * DMA Resource 382 * DMA Resource:
383 * Get the number of bits set in the 8-bit DMA mask
579 */ 384 */
580 buffer = byte_stream_buffer; 385 extra_struct_bytes = acpi_rs_count_set_bits(*buffer);
581 bytes_consumed = 3;
582
583 /* Point past the descriptor */
584
585 ++buffer;
586
587 /* Look at the number of bits set */
588
589 temp8 = *buffer;
590
591 for (index = 0; index < 8; index++) {
592 if (temp8 & 0x1) {
593 ++number_of_channels;
594 }
595
596 temp8 >>= 1;
597 }
598
599 structure_size =
600 ACPI_SIZEOF_RESOURCE(struct acpi_resource_dma) +
601 (number_of_channels * sizeof(u32));
602 break; 386 break;
603 387
604 case ACPI_RDESC_TYPE_START_DEPENDENT: 388 case ACPI_RESOURCE_NAME_VENDOR_SMALL:
605 /* 389 /*
606 * Start Dependent Functions Resource 390 * Vendor Resource:
607 * Determine if it there are two or three trailing bytes 391 * Ensure a 32-bit boundary for the structure
608 */ 392 */
609 buffer = byte_stream_buffer; 393 extra_struct_bytes =
610 temp8 = *buffer; 394 ACPI_ROUND_UP_to_32_bITS(resource_length) -
611 395 resource_length;
612 if (temp8 & 0x01) {
613 bytes_consumed = 2;
614 } else {
615 bytes_consumed = 1;
616 }
617
618 structure_size =
619 ACPI_SIZEOF_RESOURCE(struct
620 acpi_resource_start_dpf);
621 break; 396 break;
622 397
623 case ACPI_RDESC_TYPE_END_DEPENDENT: 398 case ACPI_RESOURCE_NAME_END_TAG:
624 /* 399 /*
625 * End Dependent Functions Resource 400 * End Tag: This is the normal exit, add size of end_tag
626 */ 401 */
627 bytes_consumed = 1; 402 *size_needed = buffer_size + ACPI_RS_SIZE_MIN;
628 structure_size = ACPI_RESOURCE_LENGTH; 403 return_ACPI_STATUS(AE_OK);
629 break;
630 404
631 case ACPI_RDESC_TYPE_IO_PORT: 405 case ACPI_RESOURCE_NAME_VENDOR_LARGE:
632 /* 406 /*
633 * IO Port Resource 407 * Vendor Resource:
408 * Add vendor data and ensure a 32-bit boundary for the structure
634 */ 409 */
635 bytes_consumed = 8; 410 extra_struct_bytes =
636 structure_size = 411 ACPI_ROUND_UP_to_32_bITS(resource_length) -
637 ACPI_SIZEOF_RESOURCE(struct acpi_resource_io); 412 resource_length;
638 break; 413 break;
639 414
640 case ACPI_RDESC_TYPE_FIXED_IO_PORT: 415 case ACPI_RESOURCE_NAME_ADDRESS32:
416 case ACPI_RESOURCE_NAME_ADDRESS16:
641 /* 417 /*
642 * Fixed IO Port Resource 418 * 32-Bit or 16-bit Address Resource:
419 * Add the size of any optional data (resource_source)
643 */ 420 */
644 bytes_consumed = 4; 421 extra_struct_bytes =
645 structure_size = 422 acpi_rs_stream_option_length(resource_length,
646 ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_io); 423 minimum_aml_resource_length);
647 break; 424 break;
648 425
649 case ACPI_RDESC_TYPE_SMALL_VENDOR: 426 case ACPI_RESOURCE_NAME_EXTENDED_IRQ:
650 /* 427 /*
651 * Vendor Specific Resource 428 * Extended IRQ:
429 * Point past the interrupt_vector_flags to get the
430 * interrupt_table_length.
652 */ 431 */
653 buffer = byte_stream_buffer; 432 buffer++;
654 433
655 temp8 = *buffer; 434 extra_struct_bytes =
656 temp8 = (u8) (temp8 & 0x7); 435 /*
657 bytes_consumed = temp8 + 1; 436 * Add 4 bytes for each additional interrupt. Note: at
658 437 * least one interrupt is required and is included in
659 /* Ensure a 32-bit boundary for the structure */ 438 * the minimum descriptor size
660 439 */
661 temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8); 440 ((*buffer - 1) * sizeof(u32)) +
662 structure_size = 441 /* Add the size of any optional data (resource_source) */
663 ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor) + 442 acpi_rs_stream_option_length(resource_length -
664 (temp8 * sizeof(u8)); 443 extra_struct_bytes,
444 minimum_aml_resource_length);
665 break; 445 break;
666 446
667 case ACPI_RDESC_TYPE_END_TAG: 447 case ACPI_RESOURCE_NAME_ADDRESS64:
668 /* 448 /*
669 * End Tag 449 * 64-Bit Address Resource:
450 * Add the size of any optional data (resource_source)
451 * Ensure a 64-bit boundary for the structure
670 */ 452 */
671 bytes_consumed = 2; 453 extra_struct_bytes =
672 structure_size = ACPI_RESOURCE_LENGTH; 454 ACPI_ROUND_UP_to_64_bITS
673 byte_stream_buffer_length = bytes_parsed; 455 (acpi_rs_stream_option_length
456 (resource_length, minimum_aml_resource_length));
674 break; 457 break;
675 458
676 default: 459 default:
677 /* 460 break;
678 * If we get here, everything is out of sync,
679 * exit with an error
680 */
681 return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
682 } 461 }
683 462
684 /* Update the return value and counter */ 463 /* Update the required buffer size for the internal descriptor structs */
685
686 buffer_size += (u32) ACPI_ALIGN_RESOURCE_SIZE(structure_size);
687 bytes_parsed += bytes_consumed;
688 464
689 /* Set the byte stream to point to the next resource */ 465 temp16 = (u16) (acpi_gbl_resource_struct_sizes[resource_index] +
466 extra_struct_bytes);
467 buffer_size += (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(temp16);
690 468
691 byte_stream_buffer += bytes_consumed; 469 /*
470 * Point to the next resource within the stream
471 * using the size of the header plus the length contained in the header
472 */
473 aml_buffer += acpi_ut_get_descriptor_length(aml_buffer);
692 } 474 }
693 475
694 /* This is the data the caller needs */ 476 /* Did not find an end_tag resource descriptor */
695 477
696 *size_needed = buffer_size; 478 return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
697 return_ACPI_STATUS(AE_OK);
698} 479}
699 480
700/******************************************************************************* 481/*******************************************************************************
@@ -760,13 +541,13 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
760 541
761 for (table_index = 0; table_index < 4 && !name_found; 542 for (table_index = 0; table_index < 4 && !name_found;
762 table_index++) { 543 table_index++) {
763 if ((ACPI_TYPE_STRING == 544 if (*sub_object_list && /* Null object allowed */
764 ACPI_GET_OBJECT_TYPE(*sub_object_list)) 545 ((ACPI_TYPE_STRING ==
765 || 546 ACPI_GET_OBJECT_TYPE(*sub_object_list)) ||
766 ((ACPI_TYPE_LOCAL_REFERENCE == 547 ((ACPI_TYPE_LOCAL_REFERENCE ==
767 ACPI_GET_OBJECT_TYPE(*sub_object_list)) 548 ACPI_GET_OBJECT_TYPE(*sub_object_list)) &&
768 && ((*sub_object_list)->reference.opcode == 549 ((*sub_object_list)->reference.opcode ==
769 AML_INT_NAMEPATH_OP))) { 550 AML_INT_NAMEPATH_OP)))) {
770 name_found = TRUE; 551 name_found = TRUE;
771 } else { 552 } else {
772 /* Look at the next element */ 553 /* Look at the next element */
diff --git a/drivers/acpi/resources/rscreate.c b/drivers/acpi/resources/rscreate.c
index 0911526b7ad8..8c128dea3252 100644
--- a/drivers/acpi/resources/rscreate.c
+++ b/drivers/acpi/resources/rscreate.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -53,10 +53,10 @@ ACPI_MODULE_NAME("rscreate")
53 * 53 *
54 * FUNCTION: acpi_rs_create_resource_list 54 * FUNCTION: acpi_rs_create_resource_list
55 * 55 *
56 * PARAMETERS: byte_stream_buffer - Pointer to the resource byte stream 56 * PARAMETERS: aml_buffer - Pointer to the resource byte stream
57 * output_buffer - Pointer to the user's buffer 57 * output_buffer - Pointer to the user's buffer
58 * 58 *
59 * RETURN: Status - AE_OK if okay, else a valid acpi_status code 59 * RETURN: Status: AE_OK if okay, else a valid acpi_status code
60 * If output_buffer is not large enough, output_buffer_length 60 * If output_buffer is not large enough, output_buffer_length
61 * indicates how large output_buffer should be, else it 61 * indicates how large output_buffer should be, else it
62 * indicates how may u8 elements of output_buffer are valid. 62 * indicates how may u8 elements of output_buffer are valid.
@@ -67,33 +67,30 @@ ACPI_MODULE_NAME("rscreate")
67 * 67 *
68 ******************************************************************************/ 68 ******************************************************************************/
69acpi_status 69acpi_status
70acpi_rs_create_resource_list(union acpi_operand_object *byte_stream_buffer, 70acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,
71 struct acpi_buffer *output_buffer) 71 struct acpi_buffer *output_buffer)
72{ 72{
73 73
74 acpi_status status; 74 acpi_status status;
75 u8 *byte_stream_start; 75 u8 *aml_start;
76 acpi_size list_size_needed = 0; 76 acpi_size list_size_needed = 0;
77 u32 byte_stream_buffer_length; 77 u32 aml_buffer_length;
78 78
79 ACPI_FUNCTION_TRACE("rs_create_resource_list"); 79 ACPI_FUNCTION_TRACE("rs_create_resource_list");
80 80
81 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "byte_stream_buffer = %p\n", 81 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "aml_buffer = %p\n", aml_buffer));
82 byte_stream_buffer));
83 82
84 /* Params already validated, so we don't re-validate here */ 83 /* Params already validated, so we don't re-validate here */
85 84
86 byte_stream_buffer_length = byte_stream_buffer->buffer.length; 85 aml_buffer_length = aml_buffer->buffer.length;
87 byte_stream_start = byte_stream_buffer->buffer.pointer; 86 aml_start = aml_buffer->buffer.pointer;
88 87
89 /* 88 /*
90 * Pass the byte_stream_buffer into a module that can calculate 89 * Pass the aml_buffer into a module that can calculate
91 * the buffer size needed for the linked list 90 * the buffer size needed for the linked list
92 */ 91 */
93 status = 92 status = acpi_rs_get_list_length(aml_start, aml_buffer_length,
94 acpi_rs_get_list_length(byte_stream_start, 93 &list_size_needed);
95 byte_stream_buffer_length,
96 &list_size_needed);
97 94
98 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Status=%X list_size_needed=%X\n", 95 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Status=%X list_size_needed=%X\n",
99 status, (u32) list_size_needed)); 96 status, (u32) list_size_needed));
@@ -110,10 +107,8 @@ acpi_rs_create_resource_list(union acpi_operand_object *byte_stream_buffer,
110 107
111 /* Do the conversion */ 108 /* Do the conversion */
112 109
113 status = 110 status = acpi_rs_convert_aml_to_resources(aml_start, aml_buffer_length,
114 acpi_rs_byte_stream_to_list(byte_stream_start, 111 output_buffer->pointer);
115 byte_stream_buffer_length,
116 output_buffer->pointer);
117 if (ACPI_FAILURE(status)) { 112 if (ACPI_FAILURE(status)) {
118 return_ACPI_STATUS(status); 113 return_ACPI_STATUS(status);
119 } 114 }
@@ -212,21 +207,20 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
212 /* Each element of the top-level package must also be a package */ 207 /* Each element of the top-level package must also be a package */
213 208
214 if (ACPI_GET_OBJECT_TYPE(*top_object_list) != ACPI_TYPE_PACKAGE) { 209 if (ACPI_GET_OBJECT_TYPE(*top_object_list) != ACPI_TYPE_PACKAGE) {
215 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 210 ACPI_ERROR((AE_INFO,
216 "(PRT[%X]) Need sub-package, found %s\n", 211 "(PRT[%X]) Need sub-package, found %s",
217 index, 212 index,
218 acpi_ut_get_object_type_name 213 acpi_ut_get_object_type_name
219 (*top_object_list))); 214 (*top_object_list)));
220 return_ACPI_STATUS(AE_AML_OPERAND_TYPE); 215 return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
221 } 216 }
222 217
223 /* Each sub-package must be of length 4 */ 218 /* Each sub-package must be of length 4 */
224 219
225 if ((*top_object_list)->package.count != 4) { 220 if ((*top_object_list)->package.count != 4) {
226 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 221 ACPI_ERROR((AE_INFO,
227 "(PRT[%X]) Need package of length 4, found length %d\n", 222 "(PRT[%X]) Need package of length 4, found length %d",
228 index, 223 index, (*top_object_list)->package.count));
229 (*top_object_list)->package.count));
230 return_ACPI_STATUS(AE_AML_PACKAGE_LIMIT); 224 return_ACPI_STATUS(AE_AML_PACKAGE_LIMIT);
231 } 225 }
232 226
@@ -243,11 +237,10 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
243 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { 237 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
244 user_prt->address = obj_desc->integer.value; 238 user_prt->address = obj_desc->integer.value;
245 } else { 239 } else {
246 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 240 ACPI_ERROR((AE_INFO,
247 "(PRT[%X].Address) Need Integer, found %s\n", 241 "(PRT[%X].Address) Need Integer, found %s",
248 index, 242 index,
249 acpi_ut_get_object_type_name 243 acpi_ut_get_object_type_name(obj_desc)));
250 (obj_desc)));
251 return_ACPI_STATUS(AE_BAD_DATA); 244 return_ACPI_STATUS(AE_BAD_DATA);
252 } 245 }
253 246
@@ -257,76 +250,83 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
257 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { 250 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
258 user_prt->pin = (u32) obj_desc->integer.value; 251 user_prt->pin = (u32) obj_desc->integer.value;
259 } else { 252 } else {
260 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 253 ACPI_ERROR((AE_INFO,
261 "(PRT[%X].Pin) Need Integer, found %s\n", 254 "(PRT[%X].Pin) Need Integer, found %s",
262 index, 255 index,
263 acpi_ut_get_object_type_name 256 acpi_ut_get_object_type_name(obj_desc)));
264 (obj_desc)));
265 return_ACPI_STATUS(AE_BAD_DATA); 257 return_ACPI_STATUS(AE_BAD_DATA);
266 } 258 }
267 259
268 /* 3) Third subobject: Dereference the PRT.source_name */ 260 /*
269 261 * 3) Third subobject: Dereference the PRT.source_name
262 * The name may be unresolved (slack mode), so allow a null object
263 */
270 obj_desc = sub_object_list[2]; 264 obj_desc = sub_object_list[2];
271 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { 265 if (obj_desc) {
272 case ACPI_TYPE_LOCAL_REFERENCE: 266 switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
273 267 case ACPI_TYPE_LOCAL_REFERENCE:
274 if (obj_desc->reference.opcode != AML_INT_NAMEPATH_OP) { 268
275 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 269 if (obj_desc->reference.opcode !=
276 "(PRT[%X].Source) Need name, found reference op %X\n", 270 AML_INT_NAMEPATH_OP) {
277 index, 271 ACPI_ERROR((AE_INFO,
278 obj_desc->reference.opcode)); 272 "(PRT[%X].Source) Need name, found reference op %X",
273 index,
274 obj_desc->reference.
275 opcode));
276 return_ACPI_STATUS(AE_BAD_DATA);
277 }
278
279 node = obj_desc->reference.node;
280
281 /* Use *remaining* length of the buffer as max for pathname */
282
283 path_buffer.length = output_buffer->length -
284 (u32) ((u8 *) user_prt->source -
285 (u8 *) output_buffer->pointer);
286 path_buffer.pointer = user_prt->source;
287
288 status =
289 acpi_ns_handle_to_pathname((acpi_handle)
290 node,
291 &path_buffer);
292
293 /* +1 to include null terminator */
294
295 user_prt->length +=
296 (u32) ACPI_STRLEN(user_prt->source) + 1;
297 break;
298
299 case ACPI_TYPE_STRING:
300
301 ACPI_STRCPY(user_prt->source,
302 obj_desc->string.pointer);
303
304 /*
305 * Add to the Length field the length of the string
306 * (add 1 for terminator)
307 */
308 user_prt->length += obj_desc->string.length + 1;
309 break;
310
311 case ACPI_TYPE_INTEGER:
312 /*
313 * If this is a number, then the Source Name is NULL, since the
314 * entire buffer was zeroed out, we can leave this alone.
315 *
316 * Add to the Length field the length of the u32 NULL
317 */
318 user_prt->length += sizeof(u32);
319 break;
320
321 default:
322
323 ACPI_ERROR((AE_INFO,
324 "(PRT[%X].Source) Need Ref/String/Integer, found %s",
325 index,
326 acpi_ut_get_object_type_name
327 (obj_desc)));
279 return_ACPI_STATUS(AE_BAD_DATA); 328 return_ACPI_STATUS(AE_BAD_DATA);
280 } 329 }
281
282 node = obj_desc->reference.node;
283
284 /* Use *remaining* length of the buffer as max for pathname */
285
286 path_buffer.length = output_buffer->length -
287 (u32) ((u8 *) user_prt->source -
288 (u8 *) output_buffer->pointer);
289 path_buffer.pointer = user_prt->source;
290
291 status =
292 acpi_ns_handle_to_pathname((acpi_handle) node,
293 &path_buffer);
294
295 /* +1 to include null terminator */
296
297 user_prt->length +=
298 (u32) ACPI_STRLEN(user_prt->source) + 1;
299 break;
300
301 case ACPI_TYPE_STRING:
302
303 ACPI_STRCPY(user_prt->source, obj_desc->string.pointer);
304
305 /*
306 * Add to the Length field the length of the string
307 * (add 1 for terminator)
308 */
309 user_prt->length += obj_desc->string.length + 1;
310 break;
311
312 case ACPI_TYPE_INTEGER:
313 /*
314 * If this is a number, then the Source Name is NULL, since the
315 * entire buffer was zeroed out, we can leave this alone.
316 *
317 * Add to the Length field the length of the u32 NULL
318 */
319 user_prt->length += sizeof(u32);
320 break;
321
322 default:
323
324 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
325 "(PRT[%X].Source) Need Ref/String/Integer, found %s\n",
326 index,
327 acpi_ut_get_object_type_name
328 (obj_desc)));
329 return_ACPI_STATUS(AE_BAD_DATA);
330 } 330 }
331 331
332 /* Now align the current length */ 332 /* Now align the current length */
@@ -340,11 +340,10 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
340 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { 340 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
341 user_prt->source_index = (u32) obj_desc->integer.value; 341 user_prt->source_index = (u32) obj_desc->integer.value;
342 } else { 342 } else {
343 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 343 ACPI_ERROR((AE_INFO,
344 "(PRT[%X].source_index) Need Integer, found %s\n", 344 "(PRT[%X].source_index) Need Integer, found %s",
345 index, 345 index,
346 acpi_ut_get_object_type_name 346 acpi_ut_get_object_type_name(obj_desc)));
347 (obj_desc)));
348 return_ACPI_STATUS(AE_BAD_DATA); 347 return_ACPI_STATUS(AE_BAD_DATA);
349 } 348 }
350 349
@@ -360,7 +359,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
360 359
361/******************************************************************************* 360/*******************************************************************************
362 * 361 *
363 * FUNCTION: acpi_rs_create_byte_stream 362 * FUNCTION: acpi_rs_create_aml_resources
364 * 363 *
365 * PARAMETERS: linked_list_buffer - Pointer to the resource linked list 364 * PARAMETERS: linked_list_buffer - Pointer to the resource linked list
366 * output_buffer - Pointer to the user's buffer 365 * output_buffer - Pointer to the user's buffer
@@ -377,13 +376,13 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
377 ******************************************************************************/ 376 ******************************************************************************/
378 377
379acpi_status 378acpi_status
380acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer, 379acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer,
381 struct acpi_buffer *output_buffer) 380 struct acpi_buffer *output_buffer)
382{ 381{
383 acpi_status status; 382 acpi_status status;
384 acpi_size byte_stream_size_needed = 0; 383 acpi_size aml_size_needed = 0;
385 384
386 ACPI_FUNCTION_TRACE("rs_create_byte_stream"); 385 ACPI_FUNCTION_TRACE("rs_create_aml_resources");
387 386
388 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "linked_list_buffer = %p\n", 387 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "linked_list_buffer = %p\n",
389 linked_list_buffer)); 388 linked_list_buffer));
@@ -394,11 +393,10 @@ acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer,
394 * Pass the linked_list_buffer into a module that calculates 393 * Pass the linked_list_buffer into a module that calculates
395 * the buffer size needed for the byte stream. 394 * the buffer size needed for the byte stream.
396 */ 395 */
397 status = acpi_rs_get_byte_stream_length(linked_list_buffer, 396 status = acpi_rs_get_aml_length(linked_list_buffer, &aml_size_needed);
398 &byte_stream_size_needed);
399 397
400 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "byte_stream_size_needed=%X, %s\n", 398 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "aml_size_needed=%X, %s\n",
401 (u32) byte_stream_size_needed, 399 (u32) aml_size_needed,
402 acpi_format_exception(status))); 400 acpi_format_exception(status)));
403 if (ACPI_FAILURE(status)) { 401 if (ACPI_FAILURE(status)) {
404 return_ACPI_STATUS(status); 402 return_ACPI_STATUS(status);
@@ -406,8 +404,7 @@ acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer,
406 404
407 /* Validate/Allocate/Clear caller buffer */ 405 /* Validate/Allocate/Clear caller buffer */
408 406
409 status = 407 status = acpi_ut_initialize_buffer(output_buffer, aml_size_needed);
410 acpi_ut_initialize_buffer(output_buffer, byte_stream_size_needed);
411 if (ACPI_FAILURE(status)) { 408 if (ACPI_FAILURE(status)) {
412 return_ACPI_STATUS(status); 409 return_ACPI_STATUS(status);
413 } 410 }
@@ -415,9 +412,9 @@ acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer,
415 /* Do the conversion */ 412 /* Do the conversion */
416 413
417 status = 414 status =
418 acpi_rs_list_to_byte_stream(linked_list_buffer, 415 acpi_rs_convert_resources_to_aml(linked_list_buffer,
419 byte_stream_size_needed, 416 aml_size_needed,
420 output_buffer->pointer); 417 output_buffer->pointer);
421 if (ACPI_FAILURE(status)) { 418 if (ACPI_FAILURE(status)) {
422 return_ACPI_STATUS(status); 419 return_ACPI_STATUS(status);
423 } 420 }
diff --git a/drivers/acpi/resources/rsdump.c b/drivers/acpi/resources/rsdump.c
index 75bd34d1783f..e7de061cf883 100644
--- a/drivers/acpi/resources/rsdump.c
+++ b/drivers/acpi/resources/rsdump.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -49,1063 +49,720 @@ ACPI_MODULE_NAME("rsdump")
49 49
50#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) 50#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
51/* Local prototypes */ 51/* Local prototypes */
52static void acpi_rs_dump_irq(union acpi_resource_data *data); 52static void acpi_rs_out_string(char *title, char *value);
53 53
54static void acpi_rs_dump_address16(union acpi_resource_data *data); 54static void acpi_rs_out_integer8(char *title, u8 value);
55 55
56static void acpi_rs_dump_address32(union acpi_resource_data *data); 56static void acpi_rs_out_integer16(char *title, u16 value);
57 57
58static void acpi_rs_dump_address64(union acpi_resource_data *data); 58static void acpi_rs_out_integer32(char *title, u32 value);
59 59
60static void acpi_rs_dump_dma(union acpi_resource_data *data); 60static void acpi_rs_out_integer64(char *title, u64 value);
61 61
62static void acpi_rs_dump_io(union acpi_resource_data *data); 62static void acpi_rs_out_title(char *title);
63 63
64static void acpi_rs_dump_extended_irq(union acpi_resource_data *data); 64static void acpi_rs_dump_byte_list(u16 length, u8 * data);
65 65
66static void acpi_rs_dump_fixed_io(union acpi_resource_data *data); 66static void acpi_rs_dump_dword_list(u8 length, u32 * data);
67 67
68static void acpi_rs_dump_fixed_memory32(union acpi_resource_data *data); 68static void acpi_rs_dump_short_byte_list(u8 length, u8 * data);
69 69
70static void acpi_rs_dump_memory24(union acpi_resource_data *data); 70static void
71acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source);
71 72
72static void acpi_rs_dump_memory32(union acpi_resource_data *data); 73static void acpi_rs_dump_address_common(union acpi_resource_data *resource);
73 74
74static void acpi_rs_dump_start_depend_fns(union acpi_resource_data *data); 75static void
76acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table);
75 77
76static void acpi_rs_dump_vendor_specific(union acpi_resource_data *data); 78#define ACPI_RSD_OFFSET(f) (u8) ACPI_OFFSET (union acpi_resource_data,f)
79#define ACPI_PRT_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_pci_routing_table,f)
80#define ACPI_RSD_TABLE_SIZE(name) (sizeof(name) / sizeof (struct acpi_rsdump_info))
77 81
78/******************************************************************************* 82/*******************************************************************************
79 * 83 *
80 * FUNCTION: acpi_rs_dump_irq 84 * Resource Descriptor info tables
81 * 85 *
82 * PARAMETERS: Data - pointer to the resource structure to dump. 86 * Note: The first table entry must be a Title or Literal and must contain
83 * 87 * the table length (number of table entries)
84 * RETURN: None
85 *
86 * DESCRIPTION: Prints out the various members of the Data structure type.
87 * 88 *
88 ******************************************************************************/ 89 ******************************************************************************/
89 90
90static void acpi_rs_dump_irq(union acpi_resource_data *data) 91struct acpi_rsdump_info acpi_rs_dump_irq[6] = {
91{ 92 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_irq), "IRQ", NULL},
92 struct acpi_resource_irq *irq_data = (struct acpi_resource_irq *)data; 93 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.triggering), "Triggering",
93 u8 index = 0; 94 acpi_gbl_HEdecode},
94 95 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.polarity), "Polarity",
95 ACPI_FUNCTION_ENTRY(); 96 acpi_gbl_LLdecode},
96 97 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.sharable), "Sharing",
97 acpi_os_printf("IRQ Resource\n"); 98 acpi_gbl_SHRdecode},
99 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.interrupt_count),
100 "Interrupt Count", NULL},
101 {ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(irq.interrupts[0]),
102 "Interrupt List", NULL}
103};
104
105struct acpi_rsdump_info acpi_rs_dump_dma[6] = {
106 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_dma), "DMA", NULL},
107 {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.type), "Speed",
108 acpi_gbl_TYPdecode},
109 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(dma.bus_master), "Mastering",
110 acpi_gbl_BMdecode},
111 {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.transfer), "Transfer Type",
112 acpi_gbl_SIZdecode},
113 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(dma.channel_count), "Channel Count",
114 NULL},
115 {ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(dma.channels[0]), "Channel List",
116 NULL}
117};
118
119struct acpi_rsdump_info acpi_rs_dump_start_dpf[3] = {
120 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_start_dpf),
121 "Start-Dependent-Functions", NULL},
122 {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.compatibility_priority),
123 "Compatibility Priority", acpi_gbl_config_decode},
124 {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.performance_robustness),
125 "Performance/Robustness", acpi_gbl_config_decode}
126};
127
128struct acpi_rsdump_info acpi_rs_dump_end_dpf[1] = {
129 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_dpf),
130 "End-Dependent-Functions", NULL}
131};
132
133struct acpi_rsdump_info acpi_rs_dump_io[6] = {
134 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io), "I/O", NULL},
135 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(io.io_decode), "Address Decoding",
136 acpi_gbl_io_decode},
137 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.minimum), "Address Minimum", NULL},
138 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.maximum), "Address Maximum", NULL},
139 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.alignment), "Alignment", NULL},
140 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.address_length), "Address Length",
141 NULL}
142};
143
144struct acpi_rsdump_info acpi_rs_dump_fixed_io[3] = {
145 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_io),
146 "Fixed I/O", NULL},
147 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_io.address), "Address", NULL},
148 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_io.address_length),
149 "Address Length", NULL}
150};
151
152struct acpi_rsdump_info acpi_rs_dump_vendor[3] = {
153 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_vendor),
154 "Vendor Specific", NULL},
155 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(vendor.byte_length), "Length", NULL},
156 {ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET(vendor.byte_data[0]), "Vendor Data",
157 NULL}
158};
159
160struct acpi_rsdump_info acpi_rs_dump_end_tag[1] = {
161 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_tag), "end_tag",
162 NULL}
163};
164
165struct acpi_rsdump_info acpi_rs_dump_memory24[6] = {
166 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory24),
167 "24-Bit Memory Range", NULL},
168 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory24.write_protect),
169 "Write Protect", acpi_gbl_RWdecode},
170 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.minimum), "Address Minimum",
171 NULL},
172 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.maximum), "Address Maximum",
173 NULL},
174 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.alignment), "Alignment",
175 NULL},
176 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.address_length),
177 "Address Length", NULL}
178};
179
180struct acpi_rsdump_info acpi_rs_dump_memory32[6] = {
181 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory32),
182 "32-Bit Memory Range", NULL},
183 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory32.write_protect),
184 "Write Protect", acpi_gbl_RWdecode},
185 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.minimum), "Address Minimum",
186 NULL},
187 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.maximum), "Address Maximum",
188 NULL},
189 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.alignment), "Alignment",
190 NULL},
191 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.address_length),
192 "Address Length", NULL}
193};
194
195struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[4] = {
196 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_memory32),
197 "32-Bit Fixed Memory Range", NULL},
198 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(fixed_memory32.write_protect),
199 "Write Protect", acpi_gbl_RWdecode},
200 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address), "Address",
201 NULL},
202 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address_length),
203 "Address Length", NULL}
204};
205
206struct acpi_rsdump_info acpi_rs_dump_address16[8] = {
207 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address16),
208 "16-Bit WORD Address Space", NULL},
209 {ACPI_RSD_ADDRESS, 0, NULL, NULL},
210 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.granularity), "Granularity",
211 NULL},
212 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.minimum), "Address Minimum",
213 NULL},
214 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.maximum), "Address Maximum",
215 NULL},
216 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.translation_offset),
217 "Translation Offset", NULL},
218 {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.address_length),
219 "Address Length", NULL},
220 {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address16.resource_source), NULL, NULL}
221};
222
223struct acpi_rsdump_info acpi_rs_dump_address32[8] = {
224 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address32),
225 "32-Bit DWORD Address Space", NULL},
226 {ACPI_RSD_ADDRESS, 0, NULL, NULL},
227 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.granularity), "Granularity",
228 NULL},
229 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.minimum), "Address Minimum",
230 NULL},
231 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.maximum), "Address Maximum",
232 NULL},
233 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.translation_offset),
234 "Translation Offset", NULL},
235 {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.address_length),
236 "Address Length", NULL},
237 {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address32.resource_source), NULL, NULL}
238};
239
240struct acpi_rsdump_info acpi_rs_dump_address64[8] = {
241 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address64),
242 "64-Bit QWORD Address Space", NULL},
243 {ACPI_RSD_ADDRESS, 0, NULL, NULL},
244 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.granularity), "Granularity",
245 NULL},
246 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.minimum), "Address Minimum",
247 NULL},
248 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.maximum), "Address Maximum",
249 NULL},
250 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.translation_offset),
251 "Translation Offset", NULL},
252 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.address_length),
253 "Address Length", NULL},
254 {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address64.resource_source), NULL, NULL}
255};
256
257struct acpi_rsdump_info acpi_rs_dump_ext_address64[8] = {
258 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_address64),
259 "64-Bit Extended Address Space", NULL},
260 {ACPI_RSD_ADDRESS, 0, NULL, NULL},
261 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.granularity),
262 "Granularity", NULL},
263 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.minimum),
264 "Address Minimum", NULL},
265 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.maximum),
266 "Address Maximum", NULL},
267 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.translation_offset),
268 "Translation Offset", NULL},
269 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.address_length),
270 "Address Length", NULL},
271 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.type_specific),
272 "Type-Specific Attribute", NULL}
273};
274
275struct acpi_rsdump_info acpi_rs_dump_ext_irq[8] = {
276 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_irq),
277 "Extended IRQ", NULL},
278 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.producer_consumer),
279 "Type", acpi_gbl_consume_decode},
280 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.triggering),
281 "Triggering", acpi_gbl_HEdecode},
282 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.polarity), "Polarity",
283 acpi_gbl_LLdecode},
284 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.sharable), "Sharing",
285 acpi_gbl_SHRdecode},
286 {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(extended_irq.resource_source), NULL,
287 NULL},
288 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(extended_irq.interrupt_count),
289 "Interrupt Count", NULL},
290 {ACPI_RSD_DWORDLIST, ACPI_RSD_OFFSET(extended_irq.interrupts[0]),
291 "Interrupt List", NULL}
292};
293
294struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = {
295 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_generic_reg),
296 "Generic Register", NULL},
297 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.space_id), "Space ID",
298 NULL},
299 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_width), "Bit Width",
300 NULL},
301 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_offset), "Bit Offset",
302 NULL},
303 {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.access_size),
304 "Access Size", NULL},
305 {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL}
306};
98 307
99 acpi_os_printf(" %s Triggered\n", 308/*
100 ACPI_LEVEL_SENSITIVE == 309 * Tables used for common address descriptor flag fields
101 irq_data->edge_level ? "Level" : "Edge"); 310 */
102 311static struct acpi_rsdump_info acpi_rs_dump_general_flags[5] = {
103 acpi_os_printf(" Active %s\n", 312 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_general_flags), NULL,
104 ACPI_ACTIVE_LOW == 313 NULL},
105 irq_data->active_high_low ? "Low" : "High"); 314 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.producer_consumer),
106 315 "Consumer/Producer", acpi_gbl_consume_decode},
107 acpi_os_printf(" %s\n", 316 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.decode), "Address Decode",
108 ACPI_SHARED == 317 acpi_gbl_DECdecode},
109 irq_data->shared_exclusive ? "Shared" : "Exclusive"); 318 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.min_address_fixed),
110 319 "Min Relocatability", acpi_gbl_min_decode},
111 acpi_os_printf(" %X Interrupts ( ", irq_data->number_of_interrupts); 320 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.max_address_fixed),
112 321 "Max Relocatability", acpi_gbl_max_decode}
113 for (index = 0; index < irq_data->number_of_interrupts; index++) { 322};
114 acpi_os_printf("%X ", irq_data->interrupts[index]); 323
115 } 324static struct acpi_rsdump_info acpi_rs_dump_memory_flags[5] = {
325 {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory_flags),
326 "Resource Type", (void *)"Memory Range"},
327 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.write_protect),
328 "Write Protect", acpi_gbl_RWdecode},
329 {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.caching),
330 "Caching", acpi_gbl_MEMdecode},
331 {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.range_type),
332 "Range Type", acpi_gbl_MTPdecode},
333 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.translation),
334 "Translation", acpi_gbl_TTPdecode}
335};
336
337static struct acpi_rsdump_info acpi_rs_dump_io_flags[4] = {
338 {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io_flags),
339 "Resource Type", (void *)"I/O Range"},
340 {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.io.range_type),
341 "Range Type", acpi_gbl_RNGdecode},
342 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation),
343 "Translation", acpi_gbl_TTPdecode},
344 {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation_type),
345 "Translation Type", acpi_gbl_TRSdecode}
346};
116 347
117 acpi_os_printf(")\n"); 348/*
118 return; 349 * Table used to dump _PRT contents
119} 350 */
351static struct acpi_rsdump_info acpi_rs_dump_prt[5] = {
352 {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_prt), NULL, NULL},
353 {ACPI_RSD_UINT64, ACPI_PRT_OFFSET(address), "Address", NULL},
354 {ACPI_RSD_UINT32, ACPI_PRT_OFFSET(pin), "Pin", NULL},
355 {ACPI_RSD_STRING, ACPI_PRT_OFFSET(source[0]), "Source", NULL},
356 {ACPI_RSD_UINT32, ACPI_PRT_OFFSET(source_index), "Source Index", NULL}
357};
120 358
121/******************************************************************************* 359/*******************************************************************************
122 * 360 *
123 * FUNCTION: acpi_rs_dump_dma 361 * FUNCTION: acpi_rs_dump_descriptor
124 * 362 *
125 * PARAMETERS: Data - pointer to the resource structure to dump. 363 * PARAMETERS: Resource
126 * 364 *
127 * RETURN: None 365 * RETURN: None
128 * 366 *
129 * DESCRIPTION: Prints out the various members of the Data structure type. 367 * DESCRIPTION:
130 * 368 *
131 ******************************************************************************/ 369 ******************************************************************************/
132 370
133static void acpi_rs_dump_dma(union acpi_resource_data *data) 371static void
372acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
134{ 373{
135 struct acpi_resource_dma *dma_data = (struct acpi_resource_dma *)data; 374 u8 *target = NULL;
136 u8 index = 0; 375 u8 *previous_target;
137 376 char *name;
138 ACPI_FUNCTION_ENTRY(); 377 u8 count;
139 378
140 acpi_os_printf("DMA Resource\n"); 379 /* First table entry must contain the table length (# of table entries) */
141 380
142 switch (dma_data->type) { 381 count = table->offset;
143 case ACPI_COMPATIBILITY: 382
144 acpi_os_printf(" Compatibility mode\n"); 383 while (count) {
145 break; 384 previous_target = target;
146 385 target = ACPI_ADD_PTR(u8, resource, table->offset);
147 case ACPI_TYPE_A: 386 name = table->name;
148 acpi_os_printf(" Type A\n"); 387
149 break; 388 switch (table->opcode) {
150 389 case ACPI_RSD_TITLE:
151 case ACPI_TYPE_B: 390 /*
152 acpi_os_printf(" Type B\n"); 391 * Optional resource title
153 break; 392 */
154 393 if (table->name) {
155 case ACPI_TYPE_F: 394 acpi_os_printf("%s Resource\n", name);
156 acpi_os_printf(" Type F\n"); 395 }
157 break; 396 break;
158
159 default:
160 acpi_os_printf(" Invalid DMA type\n");
161 break;
162 }
163
164 acpi_os_printf(" %sBus Master\n",
165 ACPI_BUS_MASTER == dma_data->bus_master ? "" : "Not a ");
166
167 switch (dma_data->transfer) {
168 case ACPI_TRANSFER_8:
169 acpi_os_printf(" 8-bit only transfer\n");
170 break;
171 397
172 case ACPI_TRANSFER_8_16: 398 /* Strings */
173 acpi_os_printf(" 8 and 16-bit transfer\n");
174 break;
175 399
176 case ACPI_TRANSFER_16: 400 case ACPI_RSD_LITERAL:
177 acpi_os_printf(" 16 bit only transfer\n"); 401 acpi_rs_out_string(name,
178 break; 402 ACPI_CAST_PTR(char, table->pointer));
403 break;
179 404
180 default: 405 case ACPI_RSD_STRING:
181 acpi_os_printf(" Invalid transfer preference\n"); 406 acpi_rs_out_string(name, ACPI_CAST_PTR(char, target));
182 break; 407 break;
183 }
184 408
185 acpi_os_printf(" Number of Channels: %X ( ", 409 /* Data items, 8/16/32/64 bit */
186 dma_data->number_of_channels);
187 410
188 for (index = 0; index < dma_data->number_of_channels; index++) { 411 case ACPI_RSD_UINT8:
189 acpi_os_printf("%X ", dma_data->channels[index]); 412 acpi_rs_out_integer8(name, ACPI_GET8(target));
190 } 413 break;
191 414
192 acpi_os_printf(")\n"); 415 case ACPI_RSD_UINT16:
193 return; 416 acpi_rs_out_integer16(name, ACPI_GET16(target));
194} 417 break;
195 418
196/******************************************************************************* 419 case ACPI_RSD_UINT32:
197 * 420 acpi_rs_out_integer32(name, ACPI_GET32(target));
198 * FUNCTION: acpi_rs_dump_start_depend_fns 421 break;
199 *
200 * PARAMETERS: Data - pointer to the resource structure to dump.
201 *
202 * RETURN: None
203 *
204 * DESCRIPTION: Prints out the various members of the Data structure type.
205 *
206 ******************************************************************************/
207 422
208static void acpi_rs_dump_start_depend_fns(union acpi_resource_data *data) 423 case ACPI_RSD_UINT64:
209{ 424 acpi_rs_out_integer64(name, ACPI_GET64(target));
210 struct acpi_resource_start_dpf *sdf_data = 425 break;
211 (struct acpi_resource_start_dpf *)data;
212 426
213 ACPI_FUNCTION_ENTRY(); 427 /* Flags: 1-bit and 2-bit flags supported */
214 428
215 acpi_os_printf("Start Dependent Functions Resource\n"); 429 case ACPI_RSD_1BITFLAG:
430 acpi_rs_out_string(name, ACPI_CAST_PTR(char,
431 table->
432 pointer[*target &
433 0x01]));
434 break;
216 435
217 switch (sdf_data->compatibility_priority) { 436 case ACPI_RSD_2BITFLAG:
218 case ACPI_GOOD_CONFIGURATION: 437 acpi_rs_out_string(name, ACPI_CAST_PTR(char,
219 acpi_os_printf(" Good configuration\n"); 438 table->
220 break; 439 pointer[*target &
440 0x03]));
441 break;
221 442
222 case ACPI_ACCEPTABLE_CONFIGURATION: 443 case ACPI_RSD_SHORTLIST:
223 acpi_os_printf(" Acceptable configuration\n"); 444 /*
224 break; 445 * Short byte list (single line output) for DMA and IRQ resources
446 * Note: The list length is obtained from the previous table entry
447 */
448 if (previous_target) {
449 acpi_rs_out_title(name);
450 acpi_rs_dump_short_byte_list(*previous_target,
451 target);
452 }
453 break;
225 454
226 case ACPI_SUB_OPTIMAL_CONFIGURATION: 455 case ACPI_RSD_LONGLIST:
227 acpi_os_printf(" Sub-optimal configuration\n"); 456 /*
228 break; 457 * Long byte list for Vendor resource data
458 * Note: The list length is obtained from the previous table entry
459 */
460 if (previous_target) {
461 acpi_rs_dump_byte_list(ACPI_GET16
462 (previous_target),
463 target);
464 }
465 break;
229 466
230 default: 467 case ACPI_RSD_DWORDLIST:
231 acpi_os_printf(" Invalid compatibility priority\n"); 468 /*
232 break; 469 * Dword list for Extended Interrupt resources
233 } 470 * Note: The list length is obtained from the previous table entry
471 */
472 if (previous_target) {
473 acpi_rs_dump_dword_list(*previous_target,
474 ACPI_CAST_PTR(u32,
475 target));
476 }
477 break;
234 478
235 switch (sdf_data->performance_robustness) { 479 case ACPI_RSD_ADDRESS:
236 case ACPI_GOOD_CONFIGURATION: 480 /*
237 acpi_os_printf(" Good configuration\n"); 481 * Common flags for all Address resources
238 break; 482 */
483 acpi_rs_dump_address_common(ACPI_CAST_PTR
484 (union acpi_resource_data,
485 target));
486 break;
239 487
240 case ACPI_ACCEPTABLE_CONFIGURATION: 488 case ACPI_RSD_SOURCE:
241 acpi_os_printf(" Acceptable configuration\n"); 489 /*
242 break; 490 * Optional resource_source for Address resources
491 */
492 acpi_rs_dump_resource_source(ACPI_CAST_PTR
493 (struct
494 acpi_resource_source,
495 target));
496 break;
243 497
244 case ACPI_SUB_OPTIMAL_CONFIGURATION: 498 default:
245 acpi_os_printf(" Sub-optimal configuration\n"); 499 acpi_os_printf("**** Invalid table opcode [%X] ****\n",
246 break; 500 table->opcode);
501 return;
502 }
247 503
248 default: 504 table++;
249 acpi_os_printf(" Invalid performance robustness preference\n"); 505 count--;
250 break;
251 } 506 }
252
253 return;
254}
255
256/*******************************************************************************
257 *
258 * FUNCTION: acpi_rs_dump_io
259 *
260 * PARAMETERS: Data - pointer to the resource structure to dump.
261 *
262 * RETURN: None
263 *
264 * DESCRIPTION: Prints out the various members of the Data structure type.
265 *
266 ******************************************************************************/
267
268static void acpi_rs_dump_io(union acpi_resource_data *data)
269{
270 struct acpi_resource_io *io_data = (struct acpi_resource_io *)data;
271
272 ACPI_FUNCTION_ENTRY();
273
274 acpi_os_printf("Io Resource\n");
275
276 acpi_os_printf(" %d bit decode\n",
277 ACPI_DECODE_16 == io_data->io_decode ? 16 : 10);
278
279 acpi_os_printf(" Range minimum base: %08X\n",
280 io_data->min_base_address);
281
282 acpi_os_printf(" Range maximum base: %08X\n",
283 io_data->max_base_address);
284
285 acpi_os_printf(" Alignment: %08X\n", io_data->alignment);
286
287 acpi_os_printf(" Range Length: %08X\n", io_data->range_length);
288
289 return;
290}
291
292/*******************************************************************************
293 *
294 * FUNCTION: acpi_rs_dump_fixed_io
295 *
296 * PARAMETERS: Data - pointer to the resource structure to dump.
297 *
298 * RETURN: None
299 *
300 * DESCRIPTION: Prints out the various members of the Data structure type.
301 *
302 ******************************************************************************/
303
304static void acpi_rs_dump_fixed_io(union acpi_resource_data *data)
305{
306 struct acpi_resource_fixed_io *fixed_io_data =
307 (struct acpi_resource_fixed_io *)data;
308
309 ACPI_FUNCTION_ENTRY();
310
311 acpi_os_printf("Fixed Io Resource\n");
312 acpi_os_printf(" Range base address: %08X",
313 fixed_io_data->base_address);
314
315 acpi_os_printf(" Range length: %08X", fixed_io_data->range_length);
316
317 return;
318} 507}
319 508
320/******************************************************************************* 509/*******************************************************************************
321 * 510 *
322 * FUNCTION: acpi_rs_dump_vendor_specific 511 * FUNCTION: acpi_rs_dump_resource_source
323 * 512 *
324 * PARAMETERS: Data - pointer to the resource structure to dump. 513 * PARAMETERS: resource_source - Pointer to a Resource Source struct
325 * 514 *
326 * RETURN: None 515 * RETURN: None
327 * 516 *
328 * DESCRIPTION: Prints out the various members of the Data structure type. 517 * DESCRIPTION: Common routine for dumping the optional resource_source and the
518 * corresponding resource_source_index.
329 * 519 *
330 ******************************************************************************/ 520 ******************************************************************************/
331 521
332static void acpi_rs_dump_vendor_specific(union acpi_resource_data *data) 522static void
523acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source)
333{ 524{
334 struct acpi_resource_vendor *vendor_data =
335 (struct acpi_resource_vendor *)data;
336 u16 index = 0;
337
338 ACPI_FUNCTION_ENTRY(); 525 ACPI_FUNCTION_ENTRY();
339 526
340 acpi_os_printf("Vendor Specific Resource\n"); 527 if (resource_source->index == 0xFF) {
341 528 return;
342 acpi_os_printf(" Length: %08X\n", vendor_data->length);
343
344 for (index = 0; index < vendor_data->length; index++) {
345 acpi_os_printf(" Byte %X: %08X\n",
346 index, vendor_data->reserved[index]);
347 } 529 }
348 530
349 return; 531 acpi_rs_out_integer8("Resource Source Index", resource_source->index);
350}
351
352/*******************************************************************************
353 *
354 * FUNCTION: acpi_rs_dump_memory24
355 *
356 * PARAMETERS: Data - pointer to the resource structure to dump.
357 *
358 * RETURN: None
359 *
360 * DESCRIPTION: Prints out the various members of the Data structure type.
361 *
362 ******************************************************************************/
363
364static void acpi_rs_dump_memory24(union acpi_resource_data *data)
365{
366 struct acpi_resource_mem24 *memory24_data =
367 (struct acpi_resource_mem24 *)data;
368
369 ACPI_FUNCTION_ENTRY();
370
371 acpi_os_printf("24-Bit Memory Range Resource\n");
372
373 acpi_os_printf(" Read%s\n",
374 ACPI_READ_WRITE_MEMORY ==
375 memory24_data->read_write_attribute ?
376 "/Write" : " only");
377
378 acpi_os_printf(" Range minimum base: %08X\n",
379 memory24_data->min_base_address);
380
381 acpi_os_printf(" Range maximum base: %08X\n",
382 memory24_data->max_base_address);
383
384 acpi_os_printf(" Alignment: %08X\n", memory24_data->alignment);
385
386 acpi_os_printf(" Range length: %08X\n", memory24_data->range_length);
387
388 return;
389}
390
391/*******************************************************************************
392 *
393 * FUNCTION: acpi_rs_dump_memory32
394 *
395 * PARAMETERS: Data - pointer to the resource structure to dump.
396 *
397 * RETURN: None
398 *
399 * DESCRIPTION: Prints out the various members of the Data structure type.
400 *
401 ******************************************************************************/
402
403static void acpi_rs_dump_memory32(union acpi_resource_data *data)
404{
405 struct acpi_resource_mem32 *memory32_data =
406 (struct acpi_resource_mem32 *)data;
407
408 ACPI_FUNCTION_ENTRY();
409
410 acpi_os_printf("32-Bit Memory Range Resource\n");
411
412 acpi_os_printf(" Read%s\n",
413 ACPI_READ_WRITE_MEMORY ==
414 memory32_data->read_write_attribute ?
415 "/Write" : " only");
416
417 acpi_os_printf(" Range minimum base: %08X\n",
418 memory32_data->min_base_address);
419
420 acpi_os_printf(" Range maximum base: %08X\n",
421 memory32_data->max_base_address);
422
423 acpi_os_printf(" Alignment: %08X\n", memory32_data->alignment);
424
425 acpi_os_printf(" Range length: %08X\n", memory32_data->range_length);
426 532
427 return; 533 acpi_rs_out_string("Resource Source",
534 resource_source->string_ptr ?
535 resource_source->string_ptr : "[Not Specified]");
428} 536}
429 537
430/******************************************************************************* 538/*******************************************************************************
431 * 539 *
432 * FUNCTION: acpi_rs_dump_fixed_memory32 540 * FUNCTION: acpi_rs_dump_address_common
433 * 541 *
434 * PARAMETERS: Data - pointer to the resource structure to dump. 542 * PARAMETERS: Resource - Pointer to an internal resource descriptor
435 *
436 * RETURN:
437 *
438 * DESCRIPTION: Prints out the various members of the Data structure type.
439 *
440 ******************************************************************************/
441
442static void acpi_rs_dump_fixed_memory32(union acpi_resource_data *data)
443{
444 struct acpi_resource_fixed_mem32 *fixed_memory32_data =
445 (struct acpi_resource_fixed_mem32 *)data;
446
447 ACPI_FUNCTION_ENTRY();
448
449 acpi_os_printf("32-Bit Fixed Location Memory Range Resource\n");
450
451 acpi_os_printf(" Read%s\n",
452 ACPI_READ_WRITE_MEMORY ==
453 fixed_memory32_data->
454 read_write_attribute ? "/Write" : " Only");
455
456 acpi_os_printf(" Range base address: %08X\n",
457 fixed_memory32_data->range_base_address);
458
459 acpi_os_printf(" Range length: %08X\n",
460 fixed_memory32_data->range_length);
461
462 return;
463}
464
465/*******************************************************************************
466 *
467 * FUNCTION: acpi_rs_dump_address16
468 *
469 * PARAMETERS: Data - pointer to the resource structure to dump.
470 * 543 *
471 * RETURN: None 544 * RETURN: None
472 * 545 *
473 * DESCRIPTION: Prints out the various members of the Data structure type. 546 * DESCRIPTION: Dump the fields that are common to all Address resource
547 * descriptors
474 * 548 *
475 ******************************************************************************/ 549 ******************************************************************************/
476 550
477static void acpi_rs_dump_address16(union acpi_resource_data *data) 551static void acpi_rs_dump_address_common(union acpi_resource_data *resource)
478{ 552{
479 struct acpi_resource_address16 *address16_data =
480 (struct acpi_resource_address16 *)data;
481
482 ACPI_FUNCTION_ENTRY(); 553 ACPI_FUNCTION_ENTRY();
483 554
484 acpi_os_printf("16-Bit Address Space Resource\n"); 555 /* Decode the type-specific flags */
485 acpi_os_printf(" Resource Type: ");
486 556
487 switch (address16_data->resource_type) { 557 switch (resource->address.resource_type) {
488 case ACPI_MEMORY_RANGE: 558 case ACPI_MEMORY_RANGE:
489 559
490 acpi_os_printf("Memory Range\n"); 560 acpi_rs_dump_descriptor(resource, acpi_rs_dump_memory_flags);
491
492 switch (address16_data->attribute.memory.cache_attribute) {
493 case ACPI_NON_CACHEABLE_MEMORY:
494 acpi_os_printf
495 (" Type Specific: Noncacheable memory\n");
496 break;
497
498 case ACPI_CACHABLE_MEMORY:
499 acpi_os_printf(" Type Specific: Cacheable memory\n");
500 break;
501
502 case ACPI_WRITE_COMBINING_MEMORY:
503 acpi_os_printf
504 (" Type Specific: Write-combining memory\n");
505 break;
506
507 case ACPI_PREFETCHABLE_MEMORY:
508 acpi_os_printf
509 (" Type Specific: Prefetchable memory\n");
510 break;
511
512 default:
513 acpi_os_printf
514 (" Type Specific: Invalid cache attribute\n");
515 break;
516 }
517
518 acpi_os_printf(" Type Specific: Read%s\n",
519 ACPI_READ_WRITE_MEMORY ==
520 address16_data->attribute.memory.
521 read_write_attribute ? "/Write" : " Only");
522 break; 561 break;
523 562
524 case ACPI_IO_RANGE: 563 case ACPI_IO_RANGE:
525 564
526 acpi_os_printf("I/O Range\n"); 565 acpi_rs_dump_descriptor(resource, acpi_rs_dump_io_flags);
527
528 switch (address16_data->attribute.io.range_attribute) {
529 case ACPI_NON_ISA_ONLY_RANGES:
530 acpi_os_printf
531 (" Type Specific: Non-ISA Io Addresses\n");
532 break;
533
534 case ACPI_ISA_ONLY_RANGES:
535 acpi_os_printf(" Type Specific: ISA Io Addresses\n");
536 break;
537
538 case ACPI_ENTIRE_RANGE:
539 acpi_os_printf
540 (" Type Specific: ISA and non-ISA Io Addresses\n");
541 break;
542
543 default:
544 acpi_os_printf
545 (" Type Specific: Invalid range attribute\n");
546 break;
547 }
548
549 acpi_os_printf(" Type Specific: %s Translation\n",
550 ACPI_SPARSE_TRANSLATION ==
551 address16_data->attribute.io.
552 translation_attribute ? "Sparse" : "Dense");
553 break; 566 break;
554 567
555 case ACPI_BUS_NUMBER_RANGE: 568 case ACPI_BUS_NUMBER_RANGE:
556 569
557 acpi_os_printf("Bus Number Range\n"); 570 acpi_rs_out_string("Resource Type", "Bus Number Range");
558 break; 571 break;
559 572
560 default: 573 default:
561 574
562 acpi_os_printf("0x%2.2X\n", address16_data->resource_type); 575 acpi_rs_out_integer8("Resource Type",
576 (u8) resource->address.resource_type);
563 break; 577 break;
564 } 578 }
565 579
566 acpi_os_printf(" Resource %s\n", 580 /* Decode the general flags */
567 ACPI_CONSUMER == address16_data->producer_consumer ?
568 "Consumer" : "Producer");
569
570 acpi_os_printf(" %s decode\n",
571 ACPI_SUB_DECODE == address16_data->decode ?
572 "Subtractive" : "Positive");
573 581
574 acpi_os_printf(" Min address is %s fixed\n", 582 acpi_rs_dump_descriptor(resource, acpi_rs_dump_general_flags);
575 ACPI_ADDRESS_FIXED == address16_data->min_address_fixed ?
576 "" : "not");
577
578 acpi_os_printf(" Max address is %s fixed\n",
579 ACPI_ADDRESS_FIXED == address16_data->max_address_fixed ?
580 "" : "not");
581
582 acpi_os_printf(" Granularity: %08X\n", address16_data->granularity);
583
584 acpi_os_printf(" Address range min: %08X\n",
585 address16_data->min_address_range);
586
587 acpi_os_printf(" Address range max: %08X\n",
588 address16_data->max_address_range);
589
590 acpi_os_printf(" Address translation offset: %08X\n",
591 address16_data->address_translation_offset);
592
593 acpi_os_printf(" Address Length: %08X\n",
594 address16_data->address_length);
595
596 if (0xFF != address16_data->resource_source.index) {
597 acpi_os_printf(" Resource Source Index: %X\n",
598 address16_data->resource_source.index);
599
600 acpi_os_printf(" Resource Source: %s\n",
601 address16_data->resource_source.string_ptr);
602 }
603
604 return;
605} 583}
606 584
607/******************************************************************************* 585/*******************************************************************************
608 * 586 *
609 * FUNCTION: acpi_rs_dump_address32 587 * FUNCTION: acpi_rs_dump_resource_list
610 * 588 *
611 * PARAMETERS: Data - pointer to the resource structure to dump. 589 * PARAMETERS: resource_list - Pointer to a resource descriptor list
612 * 590 *
613 * RETURN: None 591 * RETURN: None
614 * 592 *
615 * DESCRIPTION: Prints out the various members of the Data structure type. 593 * DESCRIPTION: Dispatches the structure to the correct dump routine.
616 * 594 *
617 ******************************************************************************/ 595 ******************************************************************************/
618 596
619static void acpi_rs_dump_address32(union acpi_resource_data *data) 597void acpi_rs_dump_resource_list(struct acpi_resource *resource_list)
620{ 598{
621 struct acpi_resource_address32 *address32_data = 599 u32 count = 0;
622 (struct acpi_resource_address32 *)data; 600 u32 type;
623 601
624 ACPI_FUNCTION_ENTRY(); 602 ACPI_FUNCTION_ENTRY();
625 603
626 acpi_os_printf("32-Bit Address Space Resource\n"); 604 if (!(acpi_dbg_level & ACPI_LV_RESOURCES)
627 605 || !(_COMPONENT & acpi_dbg_layer)) {
628 switch (address32_data->resource_type) { 606 return;
629 case ACPI_MEMORY_RANGE: 607 }
630
631 acpi_os_printf(" Resource Type: Memory Range\n");
632
633 switch (address32_data->attribute.memory.cache_attribute) {
634 case ACPI_NON_CACHEABLE_MEMORY:
635 acpi_os_printf
636 (" Type Specific: Noncacheable memory\n");
637 break;
638
639 case ACPI_CACHABLE_MEMORY:
640 acpi_os_printf(" Type Specific: Cacheable memory\n");
641 break;
642
643 case ACPI_WRITE_COMBINING_MEMORY:
644 acpi_os_printf
645 (" Type Specific: Write-combining memory\n");
646 break;
647
648 case ACPI_PREFETCHABLE_MEMORY:
649 acpi_os_printf
650 (" Type Specific: Prefetchable memory\n");
651 break;
652
653 default:
654 acpi_os_printf
655 (" Type Specific: Invalid cache attribute\n");
656 break;
657 }
658
659 acpi_os_printf(" Type Specific: Read%s\n",
660 ACPI_READ_WRITE_MEMORY ==
661 address32_data->attribute.memory.
662 read_write_attribute ? "/Write" : " Only");
663 break;
664
665 case ACPI_IO_RANGE:
666
667 acpi_os_printf(" Resource Type: Io Range\n");
668 608
669 switch (address32_data->attribute.io.range_attribute) { 609 /* Walk list and dump all resource descriptors (END_TAG terminates) */
670 case ACPI_NON_ISA_ONLY_RANGES:
671 acpi_os_printf
672 (" Type Specific: Non-ISA Io Addresses\n");
673 break;
674 610
675 case ACPI_ISA_ONLY_RANGES: 611 do {
676 acpi_os_printf(" Type Specific: ISA Io Addresses\n"); 612 acpi_os_printf("\n[%02X] ", count);
677 break; 613 count++;
678 614
679 case ACPI_ENTIRE_RANGE: 615 /* Validate Type before dispatch */
680 acpi_os_printf
681 (" Type Specific: ISA and non-ISA Io Addresses\n");
682 break;
683 616
684 default: 617 type = resource_list->type;
618 if (type > ACPI_RESOURCE_TYPE_MAX) {
685 acpi_os_printf 619 acpi_os_printf
686 (" Type Specific: Invalid Range attribute"); 620 ("Invalid descriptor type (%X) in resource list\n",
687 break; 621 resource_list->type);
622 return;
688 } 623 }
689 624
690 acpi_os_printf(" Type Specific: %s Translation\n", 625 /* Dump the resource descriptor */
691 ACPI_SPARSE_TRANSLATION ==
692 address32_data->attribute.io.
693 translation_attribute ? "Sparse" : "Dense");
694 break;
695
696 case ACPI_BUS_NUMBER_RANGE:
697
698 acpi_os_printf(" Resource Type: Bus Number Range\n");
699 break;
700
701 default:
702
703 acpi_os_printf(" Resource Type: 0x%2.2X\n",
704 address32_data->resource_type);
705 break;
706 }
707
708 acpi_os_printf(" Resource %s\n",
709 ACPI_CONSUMER == address32_data->producer_consumer ?
710 "Consumer" : "Producer");
711
712 acpi_os_printf(" %s decode\n",
713 ACPI_SUB_DECODE == address32_data->decode ?
714 "Subtractive" : "Positive");
715
716 acpi_os_printf(" Min address is %s fixed\n",
717 ACPI_ADDRESS_FIXED == address32_data->min_address_fixed ?
718 "" : "not ");
719
720 acpi_os_printf(" Max address is %s fixed\n",
721 ACPI_ADDRESS_FIXED == address32_data->max_address_fixed ?
722 "" : "not ");
723 626
724 acpi_os_printf(" Granularity: %08X\n", address32_data->granularity); 627 acpi_rs_dump_descriptor(&resource_list->data,
628 acpi_gbl_dump_resource_dispatch[type]);
725 629
726 acpi_os_printf(" Address range min: %08X\n", 630 /* Point to the next resource structure */
727 address32_data->min_address_range);
728 631
729 acpi_os_printf(" Address range max: %08X\n", 632 resource_list =
730 address32_data->max_address_range); 633 ACPI_ADD_PTR(struct acpi_resource, resource_list,
634 resource_list->length);
731 635
732 acpi_os_printf(" Address translation offset: %08X\n", 636 /* Exit when END_TAG descriptor is reached */
733 address32_data->address_translation_offset);
734 637
735 acpi_os_printf(" Address Length: %08X\n", 638 } while (type != ACPI_RESOURCE_TYPE_END_TAG);
736 address32_data->address_length);
737
738 if (0xFF != address32_data->resource_source.index) {
739 acpi_os_printf(" Resource Source Index: %X\n",
740 address32_data->resource_source.index);
741
742 acpi_os_printf(" Resource Source: %s\n",
743 address32_data->resource_source.string_ptr);
744 }
745
746 return;
747} 639}
748 640
749/******************************************************************************* 641/*******************************************************************************
750 * 642 *
751 * FUNCTION: acpi_rs_dump_address64 643 * FUNCTION: acpi_rs_dump_irq_list
752 * 644 *
753 * PARAMETERS: Data - pointer to the resource structure to dump. 645 * PARAMETERS: route_table - Pointer to the routing table to dump.
754 * 646 *
755 * RETURN: None 647 * RETURN: None
756 * 648 *
757 * DESCRIPTION: Prints out the various members of the Data structure type. 649 * DESCRIPTION: Print IRQ routing table
758 * 650 *
759 ******************************************************************************/ 651 ******************************************************************************/
760 652
761static void acpi_rs_dump_address64(union acpi_resource_data *data) 653void acpi_rs_dump_irq_list(u8 * route_table)
762{ 654{
763 struct acpi_resource_address64 *address64_data = 655 struct acpi_pci_routing_table *prt_element;
764 (struct acpi_resource_address64 *)data; 656 u8 count;
765 657
766 ACPI_FUNCTION_ENTRY(); 658 ACPI_FUNCTION_ENTRY();
767 659
768 acpi_os_printf("64-Bit Address Space Resource\n"); 660 if (!(acpi_dbg_level & ACPI_LV_RESOURCES)
769 661 || !(_COMPONENT & acpi_dbg_layer)) {
770 switch (address64_data->resource_type) { 662 return;
771 case ACPI_MEMORY_RANGE:
772
773 acpi_os_printf(" Resource Type: Memory Range\n");
774
775 switch (address64_data->attribute.memory.cache_attribute) {
776 case ACPI_NON_CACHEABLE_MEMORY:
777 acpi_os_printf
778 (" Type Specific: Noncacheable memory\n");
779 break;
780
781 case ACPI_CACHABLE_MEMORY:
782 acpi_os_printf(" Type Specific: Cacheable memory\n");
783 break;
784
785 case ACPI_WRITE_COMBINING_MEMORY:
786 acpi_os_printf
787 (" Type Specific: Write-combining memory\n");
788 break;
789
790 case ACPI_PREFETCHABLE_MEMORY:
791 acpi_os_printf
792 (" Type Specific: Prefetchable memory\n");
793 break;
794
795 default:
796 acpi_os_printf
797 (" Type Specific: Invalid cache attribute\n");
798 break;
799 }
800
801 acpi_os_printf(" Type Specific: Read%s\n",
802 ACPI_READ_WRITE_MEMORY ==
803 address64_data->attribute.memory.
804 read_write_attribute ? "/Write" : " Only");
805 break;
806
807 case ACPI_IO_RANGE:
808
809 acpi_os_printf(" Resource Type: Io Range\n");
810
811 switch (address64_data->attribute.io.range_attribute) {
812 case ACPI_NON_ISA_ONLY_RANGES:
813 acpi_os_printf
814 (" Type Specific: Non-ISA Io Addresses\n");
815 break;
816
817 case ACPI_ISA_ONLY_RANGES:
818 acpi_os_printf(" Type Specific: ISA Io Addresses\n");
819 break;
820
821 case ACPI_ENTIRE_RANGE:
822 acpi_os_printf
823 (" Type Specific: ISA and non-ISA Io Addresses\n");
824 break;
825
826 default:
827 acpi_os_printf
828 (" Type Specific: Invalid Range attribute");
829 break;
830 }
831
832 acpi_os_printf(" Type Specific: %s Translation\n",
833 ACPI_SPARSE_TRANSLATION ==
834 address64_data->attribute.io.
835 translation_attribute ? "Sparse" : "Dense");
836 break;
837
838 case ACPI_BUS_NUMBER_RANGE:
839
840 acpi_os_printf(" Resource Type: Bus Number Range\n");
841 break;
842
843 default:
844
845 acpi_os_printf(" Resource Type: 0x%2.2X\n",
846 address64_data->resource_type);
847 break;
848 } 663 }
849 664
850 acpi_os_printf(" Resource %s\n", 665 prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, route_table);
851 ACPI_CONSUMER == address64_data->producer_consumer ?
852 "Consumer" : "Producer");
853
854 acpi_os_printf(" %s decode\n",
855 ACPI_SUB_DECODE == address64_data->decode ?
856 "Subtractive" : "Positive");
857
858 acpi_os_printf(" Min address is %s fixed\n",
859 ACPI_ADDRESS_FIXED == address64_data->min_address_fixed ?
860 "" : "not ");
861
862 acpi_os_printf(" Max address is %s fixed\n",
863 ACPI_ADDRESS_FIXED == address64_data->max_address_fixed ?
864 "" : "not ");
865 666
866 acpi_os_printf(" Granularity: %8.8X%8.8X\n", 667 /* Dump all table elements, Exit on zero length element */
867 ACPI_FORMAT_UINT64(address64_data->granularity));
868 668
869 acpi_os_printf(" Address range min: %8.8X%8.8X\n", 669 for (count = 0; prt_element->length; count++) {
870 ACPI_FORMAT_UINT64(address64_data->min_address_range)); 670 acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n",
671 count);
672 acpi_rs_dump_descriptor(prt_element, acpi_rs_dump_prt);
871 673
872 acpi_os_printf(" Address range max: %8.8X%8.8X\n", 674 prt_element = ACPI_ADD_PTR(struct acpi_pci_routing_table,
873 ACPI_FORMAT_UINT64(address64_data->max_address_range)); 675 prt_element, prt_element->length);
874
875 acpi_os_printf(" Address translation offset: %8.8X%8.8X\n",
876 ACPI_FORMAT_UINT64(address64_data->
877 address_translation_offset));
878
879 acpi_os_printf(" Address Length: %8.8X%8.8X\n",
880 ACPI_FORMAT_UINT64(address64_data->address_length));
881
882 acpi_os_printf(" Type Specific Attributes: %8.8X%8.8X\n",
883 ACPI_FORMAT_UINT64(address64_data->
884 type_specific_attributes));
885
886 if (0xFF != address64_data->resource_source.index) {
887 acpi_os_printf(" Resource Source Index: %X\n",
888 address64_data->resource_source.index);
889
890 acpi_os_printf(" Resource Source: %s\n",
891 address64_data->resource_source.string_ptr);
892 } 676 }
893
894 return;
895} 677}
896 678
897/******************************************************************************* 679/*******************************************************************************
898 * 680 *
899 * FUNCTION: acpi_rs_dump_extended_irq 681 * FUNCTION: acpi_rs_out*
900 * 682 *
901 * PARAMETERS: Data - pointer to the resource structure to dump. 683 * PARAMETERS: Title - Name of the resource field
684 * Value - Value of the resource field
902 * 685 *
903 * RETURN: None 686 * RETURN: None
904 * 687 *
905 * DESCRIPTION: Prints out the various members of the Data structure type. 688 * DESCRIPTION: Miscellaneous helper functions to consistently format the
689 * output of the resource dump routines
906 * 690 *
907 ******************************************************************************/ 691 ******************************************************************************/
908 692
909static void acpi_rs_dump_extended_irq(union acpi_resource_data *data) 693static void acpi_rs_out_string(char *title, char *value)
910{ 694{
911 struct acpi_resource_ext_irq *ext_irq_data = 695 acpi_os_printf("%27s : %s", title, value);
912 (struct acpi_resource_ext_irq *)data; 696 if (!*value) {
913 u8 index = 0; 697 acpi_os_printf("[NULL NAMESTRING]");
914
915 ACPI_FUNCTION_ENTRY();
916
917 acpi_os_printf("Extended IRQ Resource\n");
918
919 acpi_os_printf(" Resource %s\n",
920 ACPI_CONSUMER == ext_irq_data->producer_consumer ?
921 "Consumer" : "Producer");
922
923 acpi_os_printf(" %s\n",
924 ACPI_LEVEL_SENSITIVE == ext_irq_data->edge_level ?
925 "Level" : "Edge");
926
927 acpi_os_printf(" Active %s\n",
928 ACPI_ACTIVE_LOW == ext_irq_data->active_high_low ?
929 "low" : "high");
930
931 acpi_os_printf(" %s\n",
932 ACPI_SHARED == ext_irq_data->shared_exclusive ?
933 "Shared" : "Exclusive");
934
935 acpi_os_printf(" Interrupts : %X ( ",
936 ext_irq_data->number_of_interrupts);
937
938 for (index = 0; index < ext_irq_data->number_of_interrupts; index++) {
939 acpi_os_printf("%X ", ext_irq_data->interrupts[index]);
940 }
941
942 acpi_os_printf(")\n");
943
944 if (0xFF != ext_irq_data->resource_source.index) {
945 acpi_os_printf(" Resource Source Index: %X",
946 ext_irq_data->resource_source.index);
947
948 acpi_os_printf(" Resource Source: %s",
949 ext_irq_data->resource_source.string_ptr);
950 } 698 }
951 699 acpi_os_printf("\n");
952 return;
953} 700}
954 701
955/******************************************************************************* 702static void acpi_rs_out_integer8(char *title, u8 value)
956 *
957 * FUNCTION: acpi_rs_dump_resource_list
958 *
959 * PARAMETERS: Resource - pointer to the resource structure to dump.
960 *
961 * RETURN: None
962 *
963 * DESCRIPTION: Dispatches the structure to the correct dump routine.
964 *
965 ******************************************************************************/
966
967void acpi_rs_dump_resource_list(struct acpi_resource *resource)
968{ 703{
969 u8 count = 0; 704 acpi_os_printf("%27s : %2.2X\n", title, value);
970 u8 done = FALSE; 705}
971
972 ACPI_FUNCTION_ENTRY();
973
974 if (acpi_dbg_level & ACPI_LV_RESOURCES && _COMPONENT & acpi_dbg_layer) {
975 while (!done) {
976 acpi_os_printf("Resource structure %X.\n", count++);
977
978 switch (resource->id) {
979 case ACPI_RSTYPE_IRQ:
980 acpi_rs_dump_irq(&resource->data);
981 break;
982
983 case ACPI_RSTYPE_DMA:
984 acpi_rs_dump_dma(&resource->data);
985 break;
986
987 case ACPI_RSTYPE_START_DPF:
988 acpi_rs_dump_start_depend_fns(&resource->data);
989 break;
990
991 case ACPI_RSTYPE_END_DPF:
992 acpi_os_printf
993 ("end_dependent_functions Resource\n");
994 /* acpi_rs_dump_end_dependent_functions (Resource->Data); */
995 break;
996
997 case ACPI_RSTYPE_IO:
998 acpi_rs_dump_io(&resource->data);
999 break;
1000
1001 case ACPI_RSTYPE_FIXED_IO:
1002 acpi_rs_dump_fixed_io(&resource->data);
1003 break;
1004
1005 case ACPI_RSTYPE_VENDOR:
1006 acpi_rs_dump_vendor_specific(&resource->data);
1007 break;
1008
1009 case ACPI_RSTYPE_END_TAG:
1010 /*rs_dump_end_tag (Resource->Data); */
1011 acpi_os_printf("end_tag Resource\n");
1012 done = TRUE;
1013 break;
1014
1015 case ACPI_RSTYPE_MEM24:
1016 acpi_rs_dump_memory24(&resource->data);
1017 break;
1018
1019 case ACPI_RSTYPE_MEM32:
1020 acpi_rs_dump_memory32(&resource->data);
1021 break;
1022
1023 case ACPI_RSTYPE_FIXED_MEM32:
1024 acpi_rs_dump_fixed_memory32(&resource->data);
1025 break;
1026
1027 case ACPI_RSTYPE_ADDRESS16:
1028 acpi_rs_dump_address16(&resource->data);
1029 break;
1030
1031 case ACPI_RSTYPE_ADDRESS32:
1032 acpi_rs_dump_address32(&resource->data);
1033 break;
1034
1035 case ACPI_RSTYPE_ADDRESS64:
1036 acpi_rs_dump_address64(&resource->data);
1037 break;
1038
1039 case ACPI_RSTYPE_EXT_IRQ:
1040 acpi_rs_dump_extended_irq(&resource->data);
1041 break;
1042 706
1043 default: 707static void acpi_rs_out_integer16(char *title, u16 value)
1044 acpi_os_printf("Invalid resource type\n"); 708{
1045 break; 709 acpi_os_printf("%27s : %4.4X\n", title, value);
710}
1046 711
1047 } 712static void acpi_rs_out_integer32(char *title, u32 value)
713{
714 acpi_os_printf("%27s : %8.8X\n", title, value);
715}
1048 716
1049 resource = 717static void acpi_rs_out_integer64(char *title, u64 value)
1050 ACPI_PTR_ADD(struct acpi_resource, resource, 718{
1051 resource->length); 719 acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value));
1052 } 720}
1053 }
1054 721
1055 return; 722static void acpi_rs_out_title(char *title)
723{
724 acpi_os_printf("%27s : ", title);
1056} 725}
1057 726
1058/******************************************************************************* 727/*******************************************************************************
1059 * 728 *
1060 * FUNCTION: acpi_rs_dump_irq_list 729 * FUNCTION: acpi_rs_dump*List
1061 * 730 *
1062 * PARAMETERS: route_table - pointer to the routing table to dump. 731 * PARAMETERS: Length - Number of elements in the list
732 * Data - Start of the list
1063 * 733 *
1064 * RETURN: None 734 * RETURN: None
1065 * 735 *
1066 * DESCRIPTION: Dispatches the structures to the correct dump routine. 736 * DESCRIPTION: Miscellaneous functions to dump lists of raw data
1067 * 737 *
1068 ******************************************************************************/ 738 ******************************************************************************/
1069 739
1070void acpi_rs_dump_irq_list(u8 * route_table) 740static void acpi_rs_dump_byte_list(u16 length, u8 * data)
1071{ 741{
1072 u8 *buffer = route_table; 742 u8 i;
1073 u8 count = 0;
1074 u8 done = FALSE;
1075 struct acpi_pci_routing_table *prt_element;
1076 743
1077 ACPI_FUNCTION_ENTRY(); 744 for (i = 0; i < length; i++) {
1078 745 acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]);
1079 if (acpi_dbg_level & ACPI_LV_RESOURCES && _COMPONENT & acpi_dbg_layer) { 746 }
1080 prt_element = 747}
1081 ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer);
1082
1083 while (!done) {
1084 acpi_os_printf("PCI IRQ Routing Table structure %X.\n",
1085 count++);
1086
1087 acpi_os_printf(" Address: %8.8X%8.8X\n",
1088 ACPI_FORMAT_UINT64(prt_element->
1089 address));
1090 748
1091 acpi_os_printf(" Pin: %X\n", prt_element->pin); 749static void acpi_rs_dump_short_byte_list(u8 length, u8 * data)
750{
751 u8 i;
1092 752
1093 acpi_os_printf(" Source: %s\n", prt_element->source); 753 for (i = 0; i < length; i++) {
754 acpi_os_printf("%X ", data[i]);
755 }
756 acpi_os_printf("\n");
757}
1094 758
1095 acpi_os_printf(" source_index: %X\n", 759static void acpi_rs_dump_dword_list(u8 length, u32 * data)
1096 prt_element->source_index); 760{
761 u8 i;
1097 762
1098 buffer += prt_element->length; 763 for (i = 0; i < length; i++) {
1099 prt_element = 764 acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]);
1100 ACPI_CAST_PTR(struct acpi_pci_routing_table,
1101 buffer);
1102 if (0 == prt_element->length) {
1103 done = TRUE;
1104 }
1105 }
1106 } 765 }
1107
1108 return;
1109} 766}
1110 767
1111#endif 768#endif
diff --git a/drivers/acpi/resources/rsinfo.c b/drivers/acpi/resources/rsinfo.c
new file mode 100644
index 000000000000..d9ae64b77bd9
--- /dev/null
+++ b/drivers/acpi/resources/rsinfo.c
@@ -0,0 +1,204 @@
1/*******************************************************************************
2 *
3 * Module Name: rsinfo - Dispatch and Info tables
4 *
5 ******************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include <acpi/acpi.h>
45#include <acpi/acresrc.h>
46
47#define _COMPONENT ACPI_RESOURCES
48ACPI_MODULE_NAME("rsinfo")
49
50/*
51 * Resource dispatch and information tables. Any new resource types (either
52 * Large or Small) must be reflected in each of these tables, so they are here
53 * in one place.
54 *
55 * The tables for Large descriptors are indexed by bits 6:0 of the AML
56 * descriptor type byte. The tables for Small descriptors are indexed by
57 * bits 6:3 of the descriptor byte. The tables for internal resource
58 * descriptors are indexed by the acpi_resource_type field.
59 */
60/* Dispatch table for resource-to-AML (Set Resource) conversion functions */
61struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[] = {
62 acpi_rs_set_irq, /* 0x00, ACPI_RESOURCE_TYPE_IRQ */
63 acpi_rs_convert_dma, /* 0x01, ACPI_RESOURCE_TYPE_DMA */
64 acpi_rs_set_start_dpf, /* 0x02, ACPI_RESOURCE_TYPE_START_DEPENDENT */
65 acpi_rs_convert_end_dpf, /* 0x03, ACPI_RESOURCE_TYPE_END_DEPENDENT */
66 acpi_rs_convert_io, /* 0x04, ACPI_RESOURCE_TYPE_IO */
67 acpi_rs_convert_fixed_io, /* 0x05, ACPI_RESOURCE_TYPE_FIXED_IO */
68 acpi_rs_set_vendor, /* 0x06, ACPI_RESOURCE_TYPE_VENDOR */
69 acpi_rs_convert_end_tag, /* 0x07, ACPI_RESOURCE_TYPE_END_TAG */
70 acpi_rs_convert_memory24, /* 0x08, ACPI_RESOURCE_TYPE_MEMORY24 */
71 acpi_rs_convert_memory32, /* 0x09, ACPI_RESOURCE_TYPE_MEMORY32 */
72 acpi_rs_convert_fixed_memory32, /* 0x0A, ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */
73 acpi_rs_convert_address16, /* 0x0B, ACPI_RESOURCE_TYPE_ADDRESS16 */
74 acpi_rs_convert_address32, /* 0x0C, ACPI_RESOURCE_TYPE_ADDRESS32 */
75 acpi_rs_convert_address64, /* 0x0D, ACPI_RESOURCE_TYPE_ADDRESS64 */
76 acpi_rs_convert_ext_address64, /* 0x0E, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
77 acpi_rs_convert_ext_irq, /* 0x0F, ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
78 acpi_rs_convert_generic_reg /* 0x10, ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
79};
80
81/* Dispatch tables for AML-to-resource (Get Resource) conversion functions */
82
83struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[] = {
84 /* Small descriptors */
85
86 NULL, /* 0x00, Reserved */
87 NULL, /* 0x01, Reserved */
88 NULL, /* 0x02, Reserved */
89 NULL, /* 0x03, Reserved */
90 acpi_rs_get_irq, /* 0x04, ACPI_RESOURCE_NAME_IRQ */
91 acpi_rs_convert_dma, /* 0x05, ACPI_RESOURCE_NAME_DMA */
92 acpi_rs_get_start_dpf, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
93 acpi_rs_convert_end_dpf, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
94 acpi_rs_convert_io, /* 0x08, ACPI_RESOURCE_NAME_IO */
95 acpi_rs_convert_fixed_io, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO */
96 NULL, /* 0x0A, Reserved */
97 NULL, /* 0x0B, Reserved */
98 NULL, /* 0x0C, Reserved */
99 NULL, /* 0x0D, Reserved */
100 acpi_rs_get_vendor_small, /* 0x0E, ACPI_RESOURCE_NAME_VENDOR_SMALL */
101 acpi_rs_convert_end_tag, /* 0x0F, ACPI_RESOURCE_NAME_END_TAG */
102
103 /* Large descriptors */
104
105 NULL, /* 0x00, Reserved */
106 acpi_rs_convert_memory24, /* 0x01, ACPI_RESOURCE_NAME_MEMORY24 */
107 acpi_rs_convert_generic_reg, /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
108 NULL, /* 0x03, Reserved */
109 acpi_rs_get_vendor_large, /* 0x04, ACPI_RESOURCE_NAME_VENDOR_LARGE */
110 acpi_rs_convert_memory32, /* 0x05, ACPI_RESOURCE_NAME_MEMORY32 */
111 acpi_rs_convert_fixed_memory32, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY32 */
112 acpi_rs_convert_address32, /* 0x07, ACPI_RESOURCE_NAME_ADDRESS32 */
113 acpi_rs_convert_address16, /* 0x08, ACPI_RESOURCE_NAME_ADDRESS16 */
114 acpi_rs_convert_ext_irq, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_IRQ */
115 acpi_rs_convert_address64, /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */
116 acpi_rs_convert_ext_address64 /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */
117};
118
119#ifdef ACPI_FUTURE_USAGE
120#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
121
122/* Dispatch table for resource dump functions */
123
124struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[] = {
125 acpi_rs_dump_irq, /* ACPI_RESOURCE_TYPE_IRQ */
126 acpi_rs_dump_dma, /* ACPI_RESOURCE_TYPE_DMA */
127 acpi_rs_dump_start_dpf, /* ACPI_RESOURCE_TYPE_START_DEPENDENT */
128 acpi_rs_dump_end_dpf, /* ACPI_RESOURCE_TYPE_END_DEPENDENT */
129 acpi_rs_dump_io, /* ACPI_RESOURCE_TYPE_IO */
130 acpi_rs_dump_fixed_io, /* ACPI_RESOURCE_TYPE_FIXED_IO */
131 acpi_rs_dump_vendor, /* ACPI_RESOURCE_TYPE_VENDOR */
132 acpi_rs_dump_end_tag, /* ACPI_RESOURCE_TYPE_END_TAG */
133 acpi_rs_dump_memory24, /* ACPI_RESOURCE_TYPE_MEMORY24 */
134 acpi_rs_dump_memory32, /* ACPI_RESOURCE_TYPE_MEMORY32 */
135 acpi_rs_dump_fixed_memory32, /* ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */
136 acpi_rs_dump_address16, /* ACPI_RESOURCE_TYPE_ADDRESS16 */
137 acpi_rs_dump_address32, /* ACPI_RESOURCE_TYPE_ADDRESS32 */
138 acpi_rs_dump_address64, /* ACPI_RESOURCE_TYPE_ADDRESS64 */
139 acpi_rs_dump_ext_address64, /* ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
140 acpi_rs_dump_ext_irq, /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
141 acpi_rs_dump_generic_reg, /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
142};
143#endif
144#endif /* ACPI_FUTURE_USAGE */
145/*
146 * Base sizes for external AML resource descriptors, indexed by internal type.
147 * Includes size of the descriptor header (1 byte for small descriptors,
148 * 3 bytes for large descriptors)
149 */
150const u8 acpi_gbl_aml_resource_sizes[] = {
151 sizeof(struct aml_resource_irq), /* ACPI_RESOURCE_TYPE_IRQ (optional Byte 3 always created) */
152 sizeof(struct aml_resource_dma), /* ACPI_RESOURCE_TYPE_DMA */
153 sizeof(struct aml_resource_start_dependent), /* ACPI_RESOURCE_TYPE_START_DEPENDENT (optional Byte 1 always created) */
154 sizeof(struct aml_resource_end_dependent), /* ACPI_RESOURCE_TYPE_END_DEPENDENT */
155 sizeof(struct aml_resource_io), /* ACPI_RESOURCE_TYPE_IO */
156 sizeof(struct aml_resource_fixed_io), /* ACPI_RESOURCE_TYPE_FIXED_IO */
157 sizeof(struct aml_resource_vendor_small), /* ACPI_RESOURCE_TYPE_VENDOR */
158 sizeof(struct aml_resource_end_tag), /* ACPI_RESOURCE_TYPE_END_TAG */
159 sizeof(struct aml_resource_memory24), /* ACPI_RESOURCE_TYPE_MEMORY24 */
160 sizeof(struct aml_resource_memory32), /* ACPI_RESOURCE_TYPE_MEMORY32 */
161 sizeof(struct aml_resource_fixed_memory32), /* ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */
162 sizeof(struct aml_resource_address16), /* ACPI_RESOURCE_TYPE_ADDRESS16 */
163 sizeof(struct aml_resource_address32), /* ACPI_RESOURCE_TYPE_ADDRESS32 */
164 sizeof(struct aml_resource_address64), /* ACPI_RESOURCE_TYPE_ADDRESS64 */
165 sizeof(struct aml_resource_extended_address64), /*ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
166 sizeof(struct aml_resource_extended_irq), /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
167 sizeof(struct aml_resource_generic_register) /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
168};
169
170const u8 acpi_gbl_resource_struct_sizes[] = {
171 /* Small descriptors */
172
173 0,
174 0,
175 0,
176 0,
177 ACPI_RS_SIZE(struct acpi_resource_irq),
178 ACPI_RS_SIZE(struct acpi_resource_dma),
179 ACPI_RS_SIZE(struct acpi_resource_start_dependent),
180 ACPI_RS_SIZE_MIN,
181 ACPI_RS_SIZE(struct acpi_resource_io),
182 ACPI_RS_SIZE(struct acpi_resource_fixed_io),
183 0,
184 0,
185 0,
186 0,
187 ACPI_RS_SIZE(struct acpi_resource_vendor),
188 ACPI_RS_SIZE_MIN,
189
190 /* Large descriptors */
191
192 0,
193 ACPI_RS_SIZE(struct acpi_resource_memory24),
194 ACPI_RS_SIZE(struct acpi_resource_generic_register),
195 0,
196 ACPI_RS_SIZE(struct acpi_resource_vendor),
197 ACPI_RS_SIZE(struct acpi_resource_memory32),
198 ACPI_RS_SIZE(struct acpi_resource_fixed_memory32),
199 ACPI_RS_SIZE(struct acpi_resource_address32),
200 ACPI_RS_SIZE(struct acpi_resource_address16),
201 ACPI_RS_SIZE(struct acpi_resource_extended_irq),
202 ACPI_RS_SIZE(struct acpi_resource_address64),
203 ACPI_RS_SIZE(struct acpi_resource_extended_address64)
204};
diff --git a/drivers/acpi/resources/rsio.c b/drivers/acpi/resources/rsio.c
index d53bbe89e851..ea567167c4f2 100644
--- a/drivers/acpi/resources/rsio.c
+++ b/drivers/acpi/resources/rsio.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -49,428 +49,206 @@ ACPI_MODULE_NAME("rsio")
49 49
50/******************************************************************************* 50/*******************************************************************************
51 * 51 *
52 * FUNCTION: acpi_rs_io_resource 52 * acpi_rs_convert_io
53 * 53 *
54 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte 54 ******************************************************************************/
55 * stream 55struct acpi_rsconvert_info acpi_rs_convert_io[5] = {
56 * bytes_consumed - Pointer to where the number of bytes 56 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO,
57 * consumed the byte_stream_buffer is 57 ACPI_RS_SIZE(struct acpi_resource_io),
58 * returned 58 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)},
59 * output_buffer - Pointer to the return data buffer 59
60 * structure_size - Pointer to where the number of bytes 60 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO,
61 * in the return data struct is returned 61 sizeof(struct aml_resource_io),
62 * 62 0},
63 * RETURN: Status 63
64 /* Decode flag */
65
66 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.io.io_decode),
67 AML_OFFSET(io.flags),
68 0},
69 /*
70 * These fields are contiguous in both the source and destination:
71 * Address Alignment
72 * Length
73 * Minimum Base Address
74 * Maximum Base Address
75 */
76 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.io.alignment),
77 AML_OFFSET(io.alignment),
78 2},
79
80 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.io.minimum),
81 AML_OFFSET(io.minimum),
82 2}
83};
84
85/*******************************************************************************
64 * 86 *
65 * DESCRIPTION: Take the resource byte stream and fill out the appropriate 87 * acpi_rs_convert_fixed_io
66 * structure pointed to by the output_buffer. Return the
67 * number of bytes consumed from the byte stream.
68 * 88 *
69 ******************************************************************************/ 89 ******************************************************************************/
70acpi_status
71acpi_rs_io_resource(u8 * byte_stream_buffer,
72 acpi_size * bytes_consumed,
73 u8 ** output_buffer, acpi_size * structure_size)
74{
75 u8 *buffer = byte_stream_buffer;
76 struct acpi_resource *output_struct = (void *)*output_buffer;
77 u16 temp16 = 0;
78 u8 temp8 = 0;
79 acpi_size struct_size = ACPI_SIZEOF_RESOURCE(struct acpi_resource_io);
80
81 ACPI_FUNCTION_TRACE("rs_io_resource");
82
83 /* The number of bytes consumed are Constant */
84
85 *bytes_consumed = 8;
86
87 output_struct->id = ACPI_RSTYPE_IO;
88
89 /* Check Decode */
90
91 buffer += 1;
92 temp8 = *buffer;
93
94 output_struct->data.io.io_decode = temp8 & 0x01;
95
96 /* Check min_base Address */
97
98 buffer += 1;
99 ACPI_MOVE_16_TO_16(&temp16, buffer);
100
101 output_struct->data.io.min_base_address = temp16;
102
103 /* Check max_base Address */
104 90
105 buffer += 2; 91struct acpi_rsconvert_info acpi_rs_convert_fixed_io[4] = {
106 ACPI_MOVE_16_TO_16(&temp16, buffer); 92 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO,
107 93 ACPI_RS_SIZE(struct acpi_resource_fixed_io),
108 output_struct->data.io.max_base_address = temp16; 94 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)},
109 95
110 /* Check Base alignment */ 96 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO,
111 97 sizeof(struct aml_resource_fixed_io),
112 buffer += 2; 98 0},
113 temp8 = *buffer; 99 /*
114 100 * These fields are contiguous in both the source and destination:
115 output_struct->data.io.alignment = temp8; 101 * Base Address
116 102 * Length
117 /* Check range_length */ 103 */
118 104 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_io.address_length),
119 buffer += 1; 105 AML_OFFSET(fixed_io.address_length),
120 temp8 = *buffer; 106 1},
121 107
122 output_struct->data.io.range_length = temp8; 108 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_io.address),
123 109 AML_OFFSET(fixed_io.address),
124 /* Set the Length parameter */ 110 1}
125 111};
126 output_struct->length = (u32) struct_size;
127
128 /* Return the final size of the structure */
129
130 *structure_size = struct_size;
131 return_ACPI_STATUS(AE_OK);
132}
133 112
134/******************************************************************************* 113/*******************************************************************************
135 * 114 *
136 * FUNCTION: acpi_rs_fixed_io_resource 115 * acpi_rs_convert_generic_reg
137 *
138 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
139 * stream
140 * bytes_consumed - Pointer to where the number of bytes
141 * consumed the byte_stream_buffer is
142 * returned
143 * output_buffer - Pointer to the return data buffer
144 * structure_size - Pointer to where the number of bytes
145 * in the return data struct is returned
146 *
147 * RETURN: Status
148 *
149 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
150 * structure pointed to by the output_buffer. Return the
151 * number of bytes consumed from the byte stream.
152 * 116 *
153 ******************************************************************************/ 117 ******************************************************************************/
154 118
155acpi_status 119struct acpi_rsconvert_info acpi_rs_convert_generic_reg[4] = {
156acpi_rs_fixed_io_resource(u8 * byte_stream_buffer, 120 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
157 acpi_size * bytes_consumed, 121 ACPI_RS_SIZE(struct acpi_resource_generic_register),
158 u8 ** output_buffer, acpi_size * structure_size) 122 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)},
159{ 123
160 u8 *buffer = byte_stream_buffer; 124 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER,
161 struct acpi_resource *output_struct = (void *)*output_buffer; 125 sizeof(struct aml_resource_generic_register),
162 u16 temp16 = 0; 126 0},
163 u8 temp8 = 0; 127 /*
164 acpi_size struct_size = 128 * These fields are contiguous in both the source and destination:
165 ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_io); 129 * Address Space ID
166 130 * Register Bit Width
167 ACPI_FUNCTION_TRACE("rs_fixed_io_resource"); 131 * Register Bit Offset
168 132 * Access Size
169 /* The number of bytes consumed are Constant */ 133 */
170 134 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.generic_reg.space_id),
171 *bytes_consumed = 4; 135 AML_OFFSET(generic_reg.address_space_id),
172 136 4},
173 output_struct->id = ACPI_RSTYPE_FIXED_IO; 137
174 138 /* Get the Register Address */
175 /* Check Range Base Address */ 139
176 140 {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.generic_reg.address),
177 buffer += 1; 141 AML_OFFSET(generic_reg.address),
178 ACPI_MOVE_16_TO_16(&temp16, buffer); 142 1}
179 143};
180 output_struct->data.fixed_io.base_address = temp16;
181
182 /* Check range_length */
183
184 buffer += 2;
185 temp8 = *buffer;
186
187 output_struct->data.fixed_io.range_length = temp8;
188
189 /* Set the Length parameter */
190
191 output_struct->length = (u32) struct_size;
192
193 /* Return the final size of the structure */
194
195 *structure_size = struct_size;
196 return_ACPI_STATUS(AE_OK);
197}
198 144
199/******************************************************************************* 145/*******************************************************************************
200 * 146 *
201 * FUNCTION: acpi_rs_io_stream 147 * acpi_rs_convert_end_dpf
202 *
203 * PARAMETERS: linked_list - Pointer to the resource linked list
204 * output_buffer - Pointer to the user's return buffer
205 * bytes_consumed - Pointer to where the number of bytes
206 * used in the output_buffer is returned
207 *
208 * RETURN: Status
209 *
210 * DESCRIPTION: Take the linked list resource structure and fills in the
211 * the appropriate bytes in a byte stream
212 * 148 *
213 ******************************************************************************/ 149 ******************************************************************************/
214 150
215acpi_status 151struct acpi_rsconvert_info acpi_rs_convert_end_dpf[2] = {
216acpi_rs_io_stream(struct acpi_resource *linked_list, 152 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT,
217 u8 ** output_buffer, acpi_size * bytes_consumed) 153 ACPI_RS_SIZE_MIN,
218{ 154 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)},
219 u8 *buffer = *output_buffer;
220 u16 temp16 = 0;
221 u8 temp8 = 0;
222
223 ACPI_FUNCTION_TRACE("rs_io_stream");
224
225 /* The descriptor field is static */
226
227 *buffer = 0x47;
228 buffer += 1;
229
230 /* Io Information Byte */
231
232 temp8 = (u8) (linked_list->data.io.io_decode & 0x01);
233
234 *buffer = temp8;
235 buffer += 1;
236
237 /* Set the Range minimum base address */
238
239 temp16 = (u16) linked_list->data.io.min_base_address;
240
241 ACPI_MOVE_16_TO_16(buffer, &temp16);
242 buffer += 2;
243
244 /* Set the Range maximum base address */
245
246 temp16 = (u16) linked_list->data.io.max_base_address;
247 155
248 ACPI_MOVE_16_TO_16(buffer, &temp16); 156 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT,
249 buffer += 2; 157 sizeof(struct aml_resource_end_dependent),
250 158 0}
251 /* Set the base alignment */ 159};
252
253 temp8 = (u8) linked_list->data.io.alignment;
254
255 *buffer = temp8;
256 buffer += 1;
257
258 /* Set the range length */
259
260 temp8 = (u8) linked_list->data.io.range_length;
261
262 *buffer = temp8;
263 buffer += 1;
264
265 /* Return the number of bytes consumed in this operation */
266
267 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
268 return_ACPI_STATUS(AE_OK);
269}
270 160
271/******************************************************************************* 161/*******************************************************************************
272 * 162 *
273 * FUNCTION: acpi_rs_fixed_io_stream 163 * acpi_rs_convert_end_tag
274 *
275 * PARAMETERS: linked_list - Pointer to the resource linked list
276 * output_buffer - Pointer to the user's return buffer
277 * bytes_consumed - Pointer to where the number of bytes
278 * used in the output_buffer is returned
279 *
280 * RETURN: Status
281 *
282 * DESCRIPTION: Take the linked list resource structure and fills in the
283 * the appropriate bytes in a byte stream
284 * 164 *
285 ******************************************************************************/ 165 ******************************************************************************/
286 166
287acpi_status 167struct acpi_rsconvert_info acpi_rs_convert_end_tag[2] = {
288acpi_rs_fixed_io_stream(struct acpi_resource *linked_list, 168 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG,
289 u8 ** output_buffer, acpi_size * bytes_consumed) 169 ACPI_RS_SIZE_MIN,
290{ 170 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_tag)},
291 u8 *buffer = *output_buffer; 171
292 u16 temp16 = 0; 172 /*
293 u8 temp8 = 0; 173 * Note: The checksum field is set to zero, meaning that the resource
294 174 * data is treated as if the checksum operation succeeded.
295 ACPI_FUNCTION_TRACE("rs_fixed_io_stream"); 175 * (ACPI Spec 1.0b Section 6.4.2.8)
296 176 */
297 /* The descriptor field is static */ 177 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG,
298 178 sizeof(struct aml_resource_end_tag),
299 *buffer = 0x4B; 179 0}
300 180};
301 buffer += 1;
302
303 /* Set the Range base address */
304
305 temp16 = (u16) linked_list->data.fixed_io.base_address;
306
307 ACPI_MOVE_16_TO_16(buffer, &temp16);
308 buffer += 2;
309
310 /* Set the range length */
311
312 temp8 = (u8) linked_list->data.fixed_io.range_length;
313
314 *buffer = temp8;
315 buffer += 1;
316
317 /* Return the number of bytes consumed in this operation */
318
319 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
320 return_ACPI_STATUS(AE_OK);
321}
322 181
323/******************************************************************************* 182/*******************************************************************************
324 * 183 *
325 * FUNCTION: acpi_rs_dma_resource 184 * acpi_rs_get_start_dpf
326 *
327 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
328 * stream
329 * bytes_consumed - Pointer to where the number of bytes
330 * consumed the byte_stream_buffer is
331 * returned
332 * output_buffer - Pointer to the return data buffer
333 * structure_size - Pointer to where the number of bytes
334 * in the return data struct is returned
335 *
336 * RETURN: Status
337 *
338 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
339 * structure pointed to by the output_buffer. Return the
340 * number of bytes consumed from the byte stream.
341 * 185 *
342 ******************************************************************************/ 186 ******************************************************************************/
343 187
344acpi_status 188struct acpi_rsconvert_info acpi_rs_get_start_dpf[5] = {
345acpi_rs_dma_resource(u8 * byte_stream_buffer, 189 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT,
346 acpi_size * bytes_consumed, 190 ACPI_RS_SIZE(struct acpi_resource_start_dependent),
347 u8 ** output_buffer, acpi_size * structure_size) 191 ACPI_RSC_TABLE_SIZE(acpi_rs_get_start_dpf)},
348{
349 u8 *buffer = byte_stream_buffer;
350 struct acpi_resource *output_struct = (void *)*output_buffer;
351 u8 temp8 = 0;
352 u8 index;
353 u8 i;
354 acpi_size struct_size = ACPI_SIZEOF_RESOURCE(struct acpi_resource_dma);
355
356 ACPI_FUNCTION_TRACE("rs_dma_resource");
357
358 /* The number of bytes consumed are Constant */
359 192
360 *bytes_consumed = 3; 193 /* Defaults for Compatibility and Performance priorities */
361 output_struct->id = ACPI_RSTYPE_DMA;
362 194
363 /* Point to the 8-bits of Byte 1 */ 195 {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
196 ACPI_ACCEPTABLE_CONFIGURATION,
197 2},
364 198
365 buffer += 1; 199 /* All done if there is no flag byte present in the descriptor */
366 temp8 = *buffer;
367 200
368 /* Decode the DMA channel bits */ 201 {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
369 202
370 for (i = 0, index = 0; index < 8; index++) { 203 /* Flag byte is present, get the flags */
371 if ((temp8 >> index) & 0x01) {
372 output_struct->data.dma.channels[i] = index;
373 i++;
374 }
375 }
376 204
377 /* Zero DMA channels is valid */ 205 {ACPI_RSC_2BITFLAG,
206 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
207 AML_OFFSET(start_dpf.flags),
208 0},
378 209
379 output_struct->data.dma.number_of_channels = i; 210 {ACPI_RSC_2BITFLAG,
380 if (i > 0) { 211 ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
381 /* Calculate the structure size based upon the number of interrupts */ 212 AML_OFFSET(start_dpf.flags),
382 213 2}
383 struct_size += ((acpi_size) i - 1) * 4; 214};
384 }
385
386 /* Point to Byte 2 */
387
388 buffer += 1;
389 temp8 = *buffer;
390
391 /* Check for transfer preference (Bits[1:0]) */
392
393 output_struct->data.dma.transfer = temp8 & 0x03;
394
395 if (0x03 == output_struct->data.dma.transfer) {
396 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
397 "Invalid DMA.Transfer preference (3)\n"));
398 return_ACPI_STATUS(AE_BAD_DATA);
399 }
400
401 /* Get bus master preference (Bit[2]) */
402
403 output_struct->data.dma.bus_master = (temp8 >> 2) & 0x01;
404
405 /* Get channel speed support (Bits[6:5]) */
406
407 output_struct->data.dma.type = (temp8 >> 5) & 0x03;
408
409 /* Set the Length parameter */
410
411 output_struct->length = (u32) struct_size;
412
413 /* Return the final size of the structure */
414
415 *structure_size = struct_size;
416 return_ACPI_STATUS(AE_OK);
417}
418 215
419/******************************************************************************* 216/*******************************************************************************
420 * 217 *
421 * FUNCTION: acpi_rs_dma_stream 218 * acpi_rs_set_start_dpf
422 *
423 * PARAMETERS: linked_list - Pointer to the resource linked list
424 * output_buffer - Pointer to the user's return buffer
425 * bytes_consumed - Pointer to where the number of bytes
426 * used in the output_buffer is returned
427 *
428 * RETURN: Status
429 *
430 * DESCRIPTION: Take the linked list resource structure and fills in the
431 * the appropriate bytes in a byte stream
432 * 219 *
433 ******************************************************************************/ 220 ******************************************************************************/
434 221
435acpi_status 222struct acpi_rsconvert_info acpi_rs_set_start_dpf[6] = {
436acpi_rs_dma_stream(struct acpi_resource *linked_list, 223 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT,
437 u8 ** output_buffer, acpi_size * bytes_consumed) 224 sizeof(struct aml_resource_start_dependent),
438{ 225 ACPI_RSC_TABLE_SIZE(acpi_rs_set_start_dpf)},
439 u8 *buffer = *output_buffer; 226
440 u16 temp16 = 0; 227 /* Set the default flag values */
441 u8 temp8 = 0; 228
442 u8 index; 229 {ACPI_RSC_2BITFLAG,
443 230 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
444 ACPI_FUNCTION_TRACE("rs_dma_stream"); 231 AML_OFFSET(start_dpf.flags),
445 232 0},
446 /* The descriptor field is static */ 233
447 234 {ACPI_RSC_2BITFLAG,
448 *buffer = 0x2A; 235 ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
449 buffer += 1; 236 AML_OFFSET(start_dpf.flags),
450 temp8 = 0; 237 2},
451 238 /*
452 /* Loop through all of the Channels and set the mask bits */ 239 * All done if flags byte is necessary -- if either priority value
453 240 * is not ACPI_ACCEPTABLE_CONFIGURATION
454 for (index = 0; 241 */
455 index < linked_list->data.dma.number_of_channels; index++) { 242 {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
456 temp16 = (u16) linked_list->data.dma.channels[index]; 243 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
457 temp8 |= 0x1 << temp16; 244 ACPI_ACCEPTABLE_CONFIGURATION},
458 } 245
459 246 {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
460 *buffer = temp8; 247 ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
461 buffer += 1; 248 ACPI_ACCEPTABLE_CONFIGURATION},
462 249
463 /* Set the DMA Info */ 250 /* Flag byte is not necessary */
464 251
465 temp8 = (u8) ((linked_list->data.dma.type & 0x03) << 5); 252 {ACPI_RSC_LENGTH, 0, 0,
466 temp8 |= ((linked_list->data.dma.bus_master & 0x01) << 2); 253 sizeof(struct aml_resource_start_dependent_noprio)}
467 temp8 |= (linked_list->data.dma.transfer & 0x03); 254};
468
469 *buffer = temp8;
470 buffer += 1;
471
472 /* Return the number of bytes consumed in this operation */
473
474 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
475 return_ACPI_STATUS(AE_OK);
476}
diff --git a/drivers/acpi/resources/rsirq.c b/drivers/acpi/resources/rsirq.c
index 56043fee96cb..1fa63bc2e36f 100644
--- a/drivers/acpi/resources/rsirq.c
+++ b/drivers/acpi/resources/rsirq.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -49,504 +49,182 @@ ACPI_MODULE_NAME("rsirq")
49 49
50/******************************************************************************* 50/*******************************************************************************
51 * 51 *
52 * FUNCTION: acpi_rs_irq_resource 52 * acpi_rs_get_irq
53 *
54 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
55 * stream
56 * bytes_consumed - Pointer to where the number of bytes
57 * consumed the byte_stream_buffer is
58 * returned
59 * output_buffer - Pointer to the return data buffer
60 * structure_size - Pointer to where the number of bytes
61 * in the return data struct is returned
62 *
63 * RETURN: Status
64 *
65 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
66 * structure pointed to by the output_buffer. Return the
67 * number of bytes consumed from the byte stream.
68 * 53 *
69 ******************************************************************************/ 54 ******************************************************************************/
70acpi_status 55struct acpi_rsconvert_info acpi_rs_get_irq[7] = {
71acpi_rs_irq_resource(u8 * byte_stream_buffer, 56 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IRQ,
72 acpi_size * bytes_consumed, 57 ACPI_RS_SIZE(struct acpi_resource_irq),
73 u8 ** output_buffer, acpi_size * structure_size) 58 ACPI_RSC_TABLE_SIZE(acpi_rs_get_irq)},
74{
75 u8 *buffer = byte_stream_buffer;
76 struct acpi_resource *output_struct = (void *)*output_buffer;
77 u16 temp16 = 0;
78 u8 temp8 = 0;
79 u8 index;
80 u8 i;
81 acpi_size struct_size = ACPI_SIZEOF_RESOURCE(struct acpi_resource_irq);
82
83 ACPI_FUNCTION_TRACE("rs_irq_resource");
84
85 /*
86 * The number of bytes consumed are contained in the descriptor
87 * (Bits:0-1)
88 */
89 temp8 = *buffer;
90 *bytes_consumed = (temp8 & 0x03) + 1;
91 output_struct->id = ACPI_RSTYPE_IRQ;
92
93 /* Point to the 16-bits of Bytes 1 and 2 */
94
95 buffer += 1;
96 ACPI_MOVE_16_TO_16(&temp16, buffer);
97
98 output_struct->data.irq.number_of_interrupts = 0;
99
100 /* Decode the IRQ bits */
101
102 for (i = 0, index = 0; index < 16; index++) {
103 if ((temp16 >> index) & 0x01) {
104 output_struct->data.irq.interrupts[i] = index;
105 i++;
106 }
107 }
108 59
109 /* Zero interrupts is valid */ 60 /* Get the IRQ mask (bytes 1:2) */
110 61
111 output_struct->data.irq.number_of_interrupts = i; 62 {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]),
112 if (i > 0) { 63 AML_OFFSET(irq.irq_mask),
113 /* Calculate the structure size based upon the number of interrupts */ 64 ACPI_RS_OFFSET(data.irq.interrupt_count)},
114 65
115 struct_size += ((acpi_size) i - 1) * 4; 66 /* Set default flags (others are zero) */
116 }
117 67
118 /* Point to Byte 3 if it is used */ 68 {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.irq.triggering),
69 ACPI_EDGE_SENSITIVE,
70 1},
119 71
120 if (4 == *bytes_consumed) { 72 /* All done if no flag byte present in descriptor */
121 buffer += 2;
122 temp8 = *buffer;
123 73
124 /* Check for HE, LL interrupts */ 74 {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 3},
125 75
126 switch (temp8 & 0x09) { 76 /* Get flags: Triggering[0], Polarity[3], Sharing[4] */
127 case 0x01: /* HE */
128 output_struct->data.irq.edge_level =
129 ACPI_EDGE_SENSITIVE;
130 output_struct->data.irq.active_high_low =
131 ACPI_ACTIVE_HIGH;
132 break;
133 77
134 case 0x08: /* LL */ 78 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering),
135 output_struct->data.irq.edge_level = 79 AML_OFFSET(irq.flags),
136 ACPI_LEVEL_SENSITIVE; 80 0},
137 output_struct->data.irq.active_high_low =
138 ACPI_ACTIVE_LOW;
139 break;
140 81
141 default: 82 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity),
142 /* 83 AML_OFFSET(irq.flags),
143 * Only _LL and _HE polarity/trigger interrupts 84 3},
144 * are allowed (ACPI spec, section "IRQ Format")
145 * so 0x00 and 0x09 are illegal.
146 */
147 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
148 "Invalid interrupt polarity/trigger in resource list, %X\n",
149 temp8));
150 return_ACPI_STATUS(AE_BAD_DATA);
151 }
152 85
153 /* Check for sharable */ 86 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable),
154 87 AML_OFFSET(irq.flags),
155 output_struct->data.irq.shared_exclusive = (temp8 >> 3) & 0x01; 88 4}
156 } else { 89};
157 /*
158 * Assume Edge Sensitive, Active High, Non-Sharable
159 * per ACPI Specification
160 */
161 output_struct->data.irq.edge_level = ACPI_EDGE_SENSITIVE;
162 output_struct->data.irq.active_high_low = ACPI_ACTIVE_HIGH;
163 output_struct->data.irq.shared_exclusive = ACPI_EXCLUSIVE;
164 }
165
166 /* Set the Length parameter */
167
168 output_struct->length = (u32) struct_size;
169
170 /* Return the final size of the structure */
171
172 *structure_size = struct_size;
173 return_ACPI_STATUS(AE_OK);
174}
175 90
176/******************************************************************************* 91/*******************************************************************************
177 * 92 *
178 * FUNCTION: acpi_rs_irq_stream 93 * acpi_rs_set_irq
179 *
180 * PARAMETERS: linked_list - Pointer to the resource linked list
181 * output_buffer - Pointer to the user's return buffer
182 * bytes_consumed - Pointer to where the number of bytes
183 * used in the output_buffer is returned
184 *
185 * RETURN: Status
186 *
187 * DESCRIPTION: Take the linked list resource structure and fills in the
188 * the appropriate bytes in a byte stream
189 * 94 *
190 ******************************************************************************/ 95 ******************************************************************************/
191 96
192acpi_status 97struct acpi_rsconvert_info acpi_rs_set_irq[9] = {
193acpi_rs_irq_stream(struct acpi_resource *linked_list, 98 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IRQ,
194 u8 ** output_buffer, acpi_size * bytes_consumed) 99 sizeof(struct aml_resource_irq),
195{ 100 ACPI_RSC_TABLE_SIZE(acpi_rs_set_irq)},
196 u8 *buffer = *output_buffer;
197 u16 temp16 = 0;
198 u8 temp8 = 0;
199 u8 index;
200 u8 IRqinfo_byte_needed;
201
202 ACPI_FUNCTION_TRACE("rs_irq_stream");
203
204 /*
205 * The descriptor field is set based upon whether a third byte is
206 * needed to contain the IRQ Information.
207 */
208 if (ACPI_EDGE_SENSITIVE == linked_list->data.irq.edge_level &&
209 ACPI_ACTIVE_HIGH == linked_list->data.irq.active_high_low &&
210 ACPI_EXCLUSIVE == linked_list->data.irq.shared_exclusive) {
211 *buffer = 0x22;
212 IRqinfo_byte_needed = FALSE;
213 } else {
214 *buffer = 0x23;
215 IRqinfo_byte_needed = TRUE;
216 }
217
218 buffer += 1;
219 temp16 = 0;
220
221 /* Loop through all of the interrupts and set the mask bits */
222
223 for (index = 0;
224 index < linked_list->data.irq.number_of_interrupts; index++) {
225 temp8 = (u8) linked_list->data.irq.interrupts[index];
226 temp16 |= 0x1 << temp8;
227 }
228
229 ACPI_MOVE_16_TO_16(buffer, &temp16);
230 buffer += 2;
231
232 /* Set the IRQ Info byte if needed. */
233
234 if (IRqinfo_byte_needed) {
235 temp8 = 0;
236 temp8 = (u8) ((linked_list->data.irq.shared_exclusive &
237 0x01) << 4);
238
239 if (ACPI_LEVEL_SENSITIVE == linked_list->data.irq.edge_level &&
240 ACPI_ACTIVE_LOW == linked_list->data.irq.active_high_low) {
241 temp8 |= 0x08;
242 } else {
243 temp8 |= 0x01;
244 }
245
246 *buffer = temp8;
247 buffer += 1;
248 }
249
250 /* Return the number of bytes consumed in this operation */
251
252 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
253 return_ACPI_STATUS(AE_OK);
254}
255
256/*******************************************************************************
257 *
258 * FUNCTION: acpi_rs_extended_irq_resource
259 *
260 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
261 * stream
262 * bytes_consumed - Pointer to where the number of bytes
263 * consumed the byte_stream_buffer is
264 * returned
265 * output_buffer - Pointer to the return data buffer
266 * structure_size - Pointer to where the number of bytes
267 * in the return data struct is returned
268 *
269 * RETURN: Status
270 *
271 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
272 * structure pointed to by the output_buffer. Return the
273 * number of bytes consumed from the byte stream.
274 *
275 ******************************************************************************/
276
277acpi_status
278acpi_rs_extended_irq_resource(u8 * byte_stream_buffer,
279 acpi_size * bytes_consumed,
280 u8 ** output_buffer, acpi_size * structure_size)
281{
282 u8 *buffer = byte_stream_buffer;
283 struct acpi_resource *output_struct = (void *)*output_buffer;
284 u16 temp16 = 0;
285 u8 temp8 = 0;
286 u8 *temp_ptr;
287 u8 index;
288 acpi_size struct_size =
289 ACPI_SIZEOF_RESOURCE(struct acpi_resource_ext_irq);
290
291 ACPI_FUNCTION_TRACE("rs_extended_irq_resource");
292
293 /* Get the Descriptor Length field */
294
295 buffer += 1;
296 ACPI_MOVE_16_TO_16(&temp16, buffer);
297
298 /* Validate minimum descriptor length */
299
300 if (temp16 < 6) {
301 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
302 }
303
304 *bytes_consumed = temp16 + 3;
305 output_struct->id = ACPI_RSTYPE_EXT_IRQ;
306
307 /* Point to the Byte3 */
308
309 buffer += 2;
310 temp8 = *buffer;
311
312 output_struct->data.extended_irq.producer_consumer = temp8 & 0x01;
313 101
314 /* 102 /* Convert interrupt list to 16-bit IRQ bitmask */
315 * Check for Interrupt Mode
316 *
317 * The definition of an Extended IRQ changed between ACPI spec v1.0b
318 * and ACPI spec 2.0 (section 6.4.3.6 in both).
319 *
320 * - Edge/Level are defined opposite in the table vs the headers
321 */
322 output_struct->data.extended_irq.edge_level =
323 (temp8 & 0x2) ? ACPI_EDGE_SENSITIVE : ACPI_LEVEL_SENSITIVE;
324
325 /* Check Interrupt Polarity */
326
327 output_struct->data.extended_irq.active_high_low = (temp8 >> 2) & 0x1;
328
329 /* Check for sharable */
330
331 output_struct->data.extended_irq.shared_exclusive = (temp8 >> 3) & 0x01;
332 103
333 /* Point to Byte4 (IRQ Table length) */ 104 {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]),
105 AML_OFFSET(irq.irq_mask),
106 ACPI_RS_OFFSET(data.irq.interrupt_count)},
334 107
335 buffer += 1; 108 /* Set the flags byte by default */
336 temp8 = *buffer;
337 109
338 /* Must have at least one IRQ */ 110 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering),
111 AML_OFFSET(irq.flags),
112 0},
339 113
340 if (temp8 < 1) { 114 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity),
341 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH); 115 AML_OFFSET(irq.flags),
342 } 116 3},
343
344 output_struct->data.extended_irq.number_of_interrupts = temp8;
345 117
118 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable),
119 AML_OFFSET(irq.flags),
120 4},
346 /* 121 /*
347 * Add any additional structure size to properly calculate 122 * Check if the flags byte is necessary. Not needed if the flags are:
348 * the next pointer at the end of this function 123 * ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_HIGH, ACPI_EXCLUSIVE
349 */ 124 */
350 struct_size += (temp8 - 1) * 4; 125 {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
351 126 ACPI_RS_OFFSET(data.irq.triggering),
352 /* Point to Byte5 (First IRQ Number) */ 127 ACPI_EDGE_SENSITIVE},
353
354 buffer += 1;
355
356 /* Cycle through every IRQ in the table */
357
358 for (index = 0; index < temp8; index++) {
359 ACPI_MOVE_32_TO_32(&output_struct->data.extended_irq.
360 interrupts[index], buffer);
361
362 /* Point to the next IRQ */
363
364 buffer += 4;
365 }
366
367 /*
368 * This will leave us pointing to the Resource Source Index
369 * If it is present, then save it off and calculate the
370 * pointer to where the null terminated string goes:
371 * Each Interrupt takes 32-bits + the 5 bytes of the
372 * stream that are default.
373 *
374 * Note: Some resource descriptors will have an additional null, so
375 * we add 1 to the length.
376 */
377 if (*bytes_consumed >
378 ((acpi_size) output_struct->data.extended_irq.number_of_interrupts *
379 4) + (5 + 1)) {
380 /* Dereference the Index */
381
382 temp8 = *buffer;
383 output_struct->data.extended_irq.resource_source.index =
384 (u32) temp8;
385
386 /* Point to the String */
387
388 buffer += 1;
389
390 /* Point the String pointer to the end of this structure. */
391
392 output_struct->data.extended_irq.resource_source.string_ptr =
393 (char *)((char *)output_struct + struct_size);
394 128
395 temp_ptr = (u8 *) 129 {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
396 output_struct->data.extended_irq.resource_source.string_ptr; 130 ACPI_RS_OFFSET(data.irq.polarity),
131 ACPI_ACTIVE_HIGH},
397 132
398 /* Copy the string into the buffer */ 133 {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
134 ACPI_RS_OFFSET(data.irq.sharable),
135 ACPI_EXCLUSIVE},
399 136
400 index = 0; 137 /* irq_no_flags() descriptor can be used */
401 while (*buffer) {
402 *temp_ptr = *buffer;
403 138
404 temp_ptr += 1; 139 {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_irq_noflags)}
405 buffer += 1; 140};
406 index += 1;
407 }
408
409 /* Add the terminating null */
410
411 *temp_ptr = 0;
412 output_struct->data.extended_irq.resource_source.string_length =
413 index + 1;
414
415 /*
416 * In order for the struct_size to fall on a 32-bit boundary,
417 * calculate the length of the string and expand the
418 * struct_size to the next 32-bit boundary.
419 */
420 temp8 = (u8) (index + 1);
421 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
422 } else {
423 output_struct->data.extended_irq.resource_source.index = 0;
424 output_struct->data.extended_irq.resource_source.string_length =
425 0;
426 output_struct->data.extended_irq.resource_source.string_ptr =
427 NULL;
428 }
429
430 /* Set the Length parameter */
431
432 output_struct->length = (u32) struct_size;
433
434 /* Return the final size of the structure */
435
436 *structure_size = struct_size;
437 return_ACPI_STATUS(AE_OK);
438}
439 141
440/******************************************************************************* 142/*******************************************************************************
441 * 143 *
442 * FUNCTION: acpi_rs_extended_irq_stream 144 * acpi_rs_convert_ext_irq
443 *
444 * PARAMETERS: linked_list - Pointer to the resource linked list
445 * output_buffer - Pointer to the user's return buffer
446 * bytes_consumed - Pointer to where the number of bytes
447 * used in the output_buffer is returned
448 *
449 * RETURN: Status
450 *
451 * DESCRIPTION: Take the linked list resource structure and fills in the
452 * the appropriate bytes in a byte stream
453 * 145 *
454 ******************************************************************************/ 146 ******************************************************************************/
455 147
456acpi_status 148struct acpi_rsconvert_info acpi_rs_convert_ext_irq[9] = {
457acpi_rs_extended_irq_stream(struct acpi_resource *linked_list, 149 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_IRQ,
458 u8 ** output_buffer, acpi_size * bytes_consumed) 150 ACPI_RS_SIZE(struct acpi_resource_extended_irq),
459{ 151 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_irq)},
460 u8 *buffer = *output_buffer;
461 u16 *length_field;
462 u8 temp8 = 0;
463 u8 index;
464 152
465 ACPI_FUNCTION_TRACE("rs_extended_irq_stream"); 153 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_IRQ,
154 sizeof(struct aml_resource_extended_irq),
155 0},
466 156
467 /* Set the Descriptor Type field */ 157 /* Flag bits */
468 158
469 *buffer = ACPI_RDESC_TYPE_EXTENDED_XRUPT; 159 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.producer_consumer),
470 buffer += 1; 160 AML_OFFSET(extended_irq.flags),
161 0},
471 162
472 /* Save a pointer to the Length field - to be filled in later */ 163 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.triggering),
164 AML_OFFSET(extended_irq.flags),
165 1},
473 166
474 length_field = ACPI_CAST_PTR(u16, buffer); 167 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.polarity),
475 buffer += 2; 168 AML_OFFSET(extended_irq.flags),
169 2},
476 170
477 /* Set the Interrupt vector flags */ 171 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.sharable),
172 AML_OFFSET(extended_irq.flags),
173 3},
478 174
479 temp8 = (u8) (linked_list->data.extended_irq.producer_consumer & 0x01); 175 /* IRQ Table length (Byte4) */
480 temp8 |=
481 ((linked_list->data.extended_irq.shared_exclusive & 0x01) << 3);
482 176
483 /* 177 {ACPI_RSC_COUNT, ACPI_RS_OFFSET(data.extended_irq.interrupt_count),
484 * Set the Interrupt Mode 178 AML_OFFSET(extended_irq.interrupt_count),
485 * 179 sizeof(u32)}
486 * The definition of an Extended IRQ changed between ACPI spec v1.0b 180 ,
487 * and ACPI spec 2.0 (section 6.4.3.6 in both). This code does not
488 * implement the more restrictive definition of 1.0b
489 *
490 * - Edge/Level are defined opposite in the table vs the headers
491 */
492 if (ACPI_EDGE_SENSITIVE == linked_list->data.extended_irq.edge_level) {
493 temp8 |= 0x2;
494 }
495
496 /* Set the Interrupt Polarity */
497 181
498 temp8 |= ((linked_list->data.extended_irq.active_high_low & 0x1) << 2); 182 /* Copy every IRQ in the table, each is 32 bits */
499 183
500 *buffer = temp8; 184 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.extended_irq.interrupts[0]),
501 buffer += 1; 185 AML_OFFSET(extended_irq.interrupts[0]),
186 0}
187 ,
502 188
503 /* Set the Interrupt table length */ 189 /* Optional resource_source (Index and String) */
504 190
505 temp8 = (u8) linked_list->data.extended_irq.number_of_interrupts; 191 {ACPI_RSC_SOURCEX, ACPI_RS_OFFSET(data.extended_irq.resource_source),
192 ACPI_RS_OFFSET(data.extended_irq.interrupts[0]),
193 sizeof(struct aml_resource_extended_irq)}
194};
506 195
507 *buffer = temp8; 196/*******************************************************************************
508 buffer += 1; 197 *
509 198 * acpi_rs_convert_dma
510 for (index = 0; 199 *
511 index < linked_list->data.extended_irq.number_of_interrupts; 200 ******************************************************************************/
512 index++) {
513 ACPI_MOVE_32_TO_32(buffer,
514 &linked_list->data.extended_irq.
515 interrupts[index]);
516 buffer += 4;
517 }
518 201
519 /* Resource Source Index and Resource Source are optional */ 202struct acpi_rsconvert_info acpi_rs_convert_dma[6] = {
203 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_DMA,
204 ACPI_RS_SIZE(struct acpi_resource_dma),
205 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_dma)},
520 206
521 if (0 != linked_list->data.extended_irq.resource_source.string_length) { 207 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_DMA,
522 *buffer = 208 sizeof(struct aml_resource_dma),
523 (u8) linked_list->data.extended_irq.resource_source.index; 209 0},
524 buffer += 1;
525 210
526 /* Copy the string */ 211 /* Flags: transfer preference, bus mastering, channel speed */
527 212
528 ACPI_STRCPY((char *)buffer, 213 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.dma.transfer),
529 linked_list->data.extended_irq.resource_source. 214 AML_OFFSET(dma.flags),
530 string_ptr); 215 0},
531 216
532 /* 217 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.dma.bus_master),
533 * Buffer needs to be set to the length of the string + one for the 218 AML_OFFSET(dma.flags),
534 * terminating null 219 2},
535 */
536 buffer +=
537 (acpi_size) (ACPI_STRLEN
538 (linked_list->data.extended_irq.
539 resource_source.string_ptr) + 1);
540 }
541 220
542 /* Return the number of bytes consumed in this operation */ 221 {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.dma.type),
222 AML_OFFSET(dma.flags),
223 5},
543 224
544 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer); 225 /* DMA channel mask bits */
545 226
546 /* 227 {ACPI_RSC_BITMASK, ACPI_RS_OFFSET(data.dma.channels[0]),
547 * Set the length field to the number of bytes consumed 228 AML_OFFSET(dma.dma_channel_mask),
548 * minus the header size (3 bytes) 229 ACPI_RS_OFFSET(data.dma.channel_count)}
549 */ 230};
550 *length_field = (u16) (*bytes_consumed - 3);
551 return_ACPI_STATUS(AE_OK);
552}
diff --git a/drivers/acpi/resources/rslist.c b/drivers/acpi/resources/rslist.c
index 103eb31c284e..1434e786477e 100644
--- a/drivers/acpi/resources/rslist.c
+++ b/drivers/acpi/resources/rslist.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -49,52 +49,12 @@ ACPI_MODULE_NAME("rslist")
49 49
50/******************************************************************************* 50/*******************************************************************************
51 * 51 *
52 * FUNCTION: acpi_rs_get_resource_type 52 * FUNCTION: acpi_rs_convert_aml_to_resources
53 * 53 *
54 * PARAMETERS: resource_start_byte - Byte 0 of a resource descriptor 54 * PARAMETERS: Aml - Pointer to the resource byte stream
55 * 55 * aml_length - Length of Aml
56 * RETURN: The Resource Type with no extraneous bits 56 * output_buffer - Pointer to the buffer that will
57 * 57 * contain the output structures
58 * DESCRIPTION: Extract the Resource Type/Name from the first byte of
59 * a resource descriptor.
60 *
61 ******************************************************************************/
62u8 acpi_rs_get_resource_type(u8 resource_start_byte)
63{
64
65 ACPI_FUNCTION_ENTRY();
66
67 /* Determine if this is a small or large resource */
68
69 switch (resource_start_byte & ACPI_RDESC_TYPE_MASK) {
70 case ACPI_RDESC_TYPE_SMALL:
71
72 /* Small Resource Type -- Only bits 6:3 are valid */
73
74 return ((u8) (resource_start_byte & ACPI_RDESC_SMALL_MASK));
75
76 case ACPI_RDESC_TYPE_LARGE:
77
78 /* Large Resource Type -- All bits are valid */
79
80 return (resource_start_byte);
81
82 default:
83 /* Invalid type */
84 break;
85 }
86
87 return (0xFF);
88}
89
90/*******************************************************************************
91 *
92 * FUNCTION: acpi_rs_byte_stream_to_list
93 *
94 * PARAMETERS: byte_stream_buffer - Pointer to the resource byte stream
95 * byte_stream_buffer_length - Length of byte_stream_buffer
96 * output_buffer - Pointer to the buffer that will
97 * contain the output structures
98 * 58 *
99 * RETURN: Status 59 * RETURN: Status
100 * 60 *
@@ -102,241 +62,78 @@ u8 acpi_rs_get_resource_type(u8 resource_start_byte)
102 * linked list of resources in the caller's output buffer 62 * linked list of resources in the caller's output buffer
103 * 63 *
104 ******************************************************************************/ 64 ******************************************************************************/
105
106acpi_status 65acpi_status
107acpi_rs_byte_stream_to_list(u8 * byte_stream_buffer, 66acpi_rs_convert_aml_to_resources(u8 * aml, u32 aml_length, u8 * output_buffer)
108 u32 byte_stream_buffer_length, u8 * output_buffer)
109{ 67{
68 struct acpi_resource *resource = (void *)output_buffer;
110 acpi_status status; 69 acpi_status status;
111 acpi_size bytes_parsed = 0; 70 u8 resource_index;
112 u8 resource_type = 0; 71 u8 *end_aml;
113 acpi_size bytes_consumed = 0; 72
114 u8 *buffer = output_buffer; 73 ACPI_FUNCTION_TRACE("rs_convert_aml_to_resources");
115 acpi_size structure_size = 0;
116 u8 end_tag_processed = FALSE;
117 struct acpi_resource *resource;
118
119 ACPI_FUNCTION_TRACE("rs_byte_stream_to_list");
120
121 while (bytes_parsed < byte_stream_buffer_length && !end_tag_processed) {
122 /* The next byte in the stream is the resource type */
123
124 resource_type = acpi_rs_get_resource_type(*byte_stream_buffer);
125
126 switch (resource_type) {
127 case ACPI_RDESC_TYPE_MEMORY_24:
128 /*
129 * 24-Bit Memory Resource
130 */
131 status = acpi_rs_memory24_resource(byte_stream_buffer,
132 &bytes_consumed,
133 &buffer,
134 &structure_size);
135 break;
136
137 case ACPI_RDESC_TYPE_LARGE_VENDOR:
138 /*
139 * Vendor Defined Resource
140 */
141 status = acpi_rs_vendor_resource(byte_stream_buffer,
142 &bytes_consumed,
143 &buffer,
144 &structure_size);
145 break;
146
147 case ACPI_RDESC_TYPE_MEMORY_32:
148 /*
149 * 32-Bit Memory Range Resource
150 */
151 status =
152 acpi_rs_memory32_range_resource(byte_stream_buffer,
153 &bytes_consumed,
154 &buffer,
155 &structure_size);
156 break;
157
158 case ACPI_RDESC_TYPE_FIXED_MEMORY_32:
159 /*
160 * 32-Bit Fixed Memory Resource
161 */
162 status =
163 acpi_rs_fixed_memory32_resource(byte_stream_buffer,
164 &bytes_consumed,
165 &buffer,
166 &structure_size);
167 break;
168
169 case ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE:
170 case ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE:
171 /*
172 * 64-Bit Address Resource
173 */
174 status = acpi_rs_address64_resource(byte_stream_buffer,
175 &bytes_consumed,
176 &buffer,
177 &structure_size);
178 break;
179
180 case ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE:
181 /*
182 * 32-Bit Address Resource
183 */
184 status = acpi_rs_address32_resource(byte_stream_buffer,
185 &bytes_consumed,
186 &buffer,
187 &structure_size);
188 break;
189
190 case ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE:
191 /*
192 * 16-Bit Address Resource
193 */
194 status = acpi_rs_address16_resource(byte_stream_buffer,
195 &bytes_consumed,
196 &buffer,
197 &structure_size);
198 break;
199
200 case ACPI_RDESC_TYPE_EXTENDED_XRUPT:
201 /*
202 * Extended IRQ
203 */
204 status =
205 acpi_rs_extended_irq_resource(byte_stream_buffer,
206 &bytes_consumed,
207 &buffer,
208 &structure_size);
209 break;
210
211 case ACPI_RDESC_TYPE_IRQ_FORMAT:
212 /*
213 * IRQ Resource
214 */
215 status = acpi_rs_irq_resource(byte_stream_buffer,
216 &bytes_consumed, &buffer,
217 &structure_size);
218 break;
219
220 case ACPI_RDESC_TYPE_DMA_FORMAT:
221 /*
222 * DMA Resource
223 */
224 status = acpi_rs_dma_resource(byte_stream_buffer,
225 &bytes_consumed, &buffer,
226 &structure_size);
227 break;
228
229 case ACPI_RDESC_TYPE_START_DEPENDENT:
230 /*
231 * Start Dependent Functions Resource
232 */
233 status =
234 acpi_rs_start_depend_fns_resource
235 (byte_stream_buffer, &bytes_consumed, &buffer,
236 &structure_size);
237 break;
238
239 case ACPI_RDESC_TYPE_END_DEPENDENT:
240 /*
241 * End Dependent Functions Resource
242 */
243 status =
244 acpi_rs_end_depend_fns_resource(byte_stream_buffer,
245 &bytes_consumed,
246 &buffer,
247 &structure_size);
248 break;
249
250 case ACPI_RDESC_TYPE_IO_PORT:
251 /*
252 * IO Port Resource
253 */
254 status = acpi_rs_io_resource(byte_stream_buffer,
255 &bytes_consumed, &buffer,
256 &structure_size);
257 break;
258
259 case ACPI_RDESC_TYPE_FIXED_IO_PORT:
260 /*
261 * Fixed IO Port Resource
262 */
263 status = acpi_rs_fixed_io_resource(byte_stream_buffer,
264 &bytes_consumed,
265 &buffer,
266 &structure_size);
267 break;
268
269 case ACPI_RDESC_TYPE_SMALL_VENDOR:
270 /*
271 * Vendor Specific Resource
272 */
273 status = acpi_rs_vendor_resource(byte_stream_buffer,
274 &bytes_consumed,
275 &buffer,
276 &structure_size);
277 break;
278
279 case ACPI_RDESC_TYPE_END_TAG:
280 /*
281 * End Tag
282 */
283 end_tag_processed = TRUE;
284 status = acpi_rs_end_tag_resource(byte_stream_buffer,
285 &bytes_consumed,
286 &buffer,
287 &structure_size);
288 break;
289
290 default:
291 /*
292 * Invalid/Unknown resource type
293 */
294 status = AE_AML_INVALID_RESOURCE_TYPE;
295 break;
296 }
297 74
75 end_aml = aml + aml_length;
76
77 /* Loop until end-of-buffer or an end_tag is found */
78
79 while (aml < end_aml) {
80 /* Validate the Resource Type and Resource Length */
81
82 status = acpi_ut_validate_resource(aml, &resource_index);
298 if (ACPI_FAILURE(status)) { 83 if (ACPI_FAILURE(status)) {
299 return_ACPI_STATUS(status); 84 return_ACPI_STATUS(status);
300 } 85 }
301 86
302 /* Update the return value and counter */ 87 /* Convert the AML byte stream resource to a local resource struct */
303 88
304 bytes_parsed += bytes_consumed; 89 status =
90 acpi_rs_convert_aml_to_resource(resource,
91 ACPI_CAST_PTR(union
92 aml_resource,
93 aml),
94 acpi_gbl_get_resource_dispatch
95 [resource_index]);
96 if (ACPI_FAILURE(status)) {
97 ACPI_EXCEPTION((AE_INFO, status,
98 "Could not convert AML resource (Type %X)",
99 *aml));
100 return_ACPI_STATUS(status);
101 }
305 102
306 /* Set the byte stream to point to the next resource */ 103 /* Normal exit on completion of an end_tag resource descriptor */
307 104
308 byte_stream_buffer += bytes_consumed; 105 if (acpi_ut_get_resource_type(aml) ==
106 ACPI_RESOURCE_NAME_END_TAG) {
107 return_ACPI_STATUS(AE_OK);
108 }
309 109
310 /* Set the Buffer to the next structure */ 110 /* Point to the next input AML resource */
311 111
312 resource = ACPI_CAST_PTR(struct acpi_resource, buffer); 112 aml += acpi_ut_get_descriptor_length(aml);
313 resource->length =
314 (u32) ACPI_ALIGN_RESOURCE_SIZE(resource->length);
315 buffer += ACPI_ALIGN_RESOURCE_SIZE(structure_size);
316 }
317 113
318 /* Check the reason for exiting the while loop */ 114 /* Point to the next structure in the output buffer */
319 115
320 if (!end_tag_processed) { 116 resource =
321 return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG); 117 ACPI_ADD_PTR(struct acpi_resource, resource,
118 resource->length);
322 } 119 }
323 120
324 return_ACPI_STATUS(AE_OK); 121 /* Did not find an end_tag resource descriptor */
122
123 return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
325} 124}
326 125
327/******************************************************************************* 126/*******************************************************************************
328 * 127 *
329 * FUNCTION: acpi_rs_list_to_byte_stream 128 * FUNCTION: acpi_rs_convert_resources_to_aml
330 * 129 *
331 * PARAMETERS: linked_list - Pointer to the resource linked list 130 * PARAMETERS: Resource - Pointer to the resource linked list
332 * byte_steam_size_needed - Calculated size of the byte stream 131 * aml_size_needed - Calculated size of the byte stream
333 * needed from calling 132 * needed from calling acpi_rs_get_aml_length()
334 * acpi_rs_get_byte_stream_length() 133 * The size of the output_buffer is
335 * The size of the output_buffer is 134 * guaranteed to be >= aml_size_needed
336 * guaranteed to be >= 135 * output_buffer - Pointer to the buffer that will
337 * byte_stream_size_needed 136 * contain the byte stream
338 * output_buffer - Pointer to the buffer that will
339 * contain the byte stream
340 * 137 *
341 * RETURN: Status 138 * RETURN: Status
342 * 139 *
@@ -346,180 +143,73 @@ acpi_rs_byte_stream_to_list(u8 * byte_stream_buffer,
346 ******************************************************************************/ 143 ******************************************************************************/
347 144
348acpi_status 145acpi_status
349acpi_rs_list_to_byte_stream(struct acpi_resource *linked_list, 146acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
350 acpi_size byte_stream_size_needed, 147 acpi_size aml_size_needed, u8 * output_buffer)
351 u8 * output_buffer)
352{ 148{
149 u8 *aml = output_buffer;
150 u8 *end_aml = output_buffer + aml_size_needed;
353 acpi_status status; 151 acpi_status status;
354 u8 *buffer = output_buffer; 152
355 acpi_size bytes_consumed = 0; 153 ACPI_FUNCTION_TRACE("rs_convert_resources_to_aml");
356 u8 done = FALSE; 154
357 155 /* Walk the resource descriptor list, convert each descriptor */
358 ACPI_FUNCTION_TRACE("rs_list_to_byte_stream"); 156
359 157 while (aml < end_aml) {
360 while (!done) { 158 /* Validate the (internal) Resource Type */
361 switch (linked_list->id) { 159
362 case ACPI_RSTYPE_IRQ: 160 if (resource->type > ACPI_RESOURCE_TYPE_MAX) {
363 /* 161 ACPI_ERROR((AE_INFO,
364 * IRQ Resource 162 "Invalid descriptor type (%X) in resource list",
365 */ 163 resource->type));
366 status = 164 return_ACPI_STATUS(AE_BAD_DATA);
367 acpi_rs_irq_stream(linked_list, &buffer,
368 &bytes_consumed);
369 break;
370
371 case ACPI_RSTYPE_DMA:
372 /*
373 * DMA Resource
374 */
375 status =
376 acpi_rs_dma_stream(linked_list, &buffer,
377 &bytes_consumed);
378 break;
379
380 case ACPI_RSTYPE_START_DPF:
381 /*
382 * Start Dependent Functions Resource
383 */
384 status = acpi_rs_start_depend_fns_stream(linked_list,
385 &buffer,
386 &bytes_consumed);
387 break;
388
389 case ACPI_RSTYPE_END_DPF:
390 /*
391 * End Dependent Functions Resource
392 */
393 status = acpi_rs_end_depend_fns_stream(linked_list,
394 &buffer,
395 &bytes_consumed);
396 break;
397
398 case ACPI_RSTYPE_IO:
399 /*
400 * IO Port Resource
401 */
402 status =
403 acpi_rs_io_stream(linked_list, &buffer,
404 &bytes_consumed);
405 break;
406
407 case ACPI_RSTYPE_FIXED_IO:
408 /*
409 * Fixed IO Port Resource
410 */
411 status =
412 acpi_rs_fixed_io_stream(linked_list, &buffer,
413 &bytes_consumed);
414 break;
415
416 case ACPI_RSTYPE_VENDOR:
417 /*
418 * Vendor Defined Resource
419 */
420 status =
421 acpi_rs_vendor_stream(linked_list, &buffer,
422 &bytes_consumed);
423 break;
424
425 case ACPI_RSTYPE_END_TAG:
426 /*
427 * End Tag
428 */
429 status =
430 acpi_rs_end_tag_stream(linked_list, &buffer,
431 &bytes_consumed);
432
433 /* An End Tag indicates the end of the Resource Template */
434
435 done = TRUE;
436 break;
437
438 case ACPI_RSTYPE_MEM24:
439 /*
440 * 24-Bit Memory Resource
441 */
442 status =
443 acpi_rs_memory24_stream(linked_list, &buffer,
444 &bytes_consumed);
445 break;
446
447 case ACPI_RSTYPE_MEM32:
448 /*
449 * 32-Bit Memory Range Resource
450 */
451 status =
452 acpi_rs_memory32_range_stream(linked_list, &buffer,
453 &bytes_consumed);
454 break;
455
456 case ACPI_RSTYPE_FIXED_MEM32:
457 /*
458 * 32-Bit Fixed Memory Resource
459 */
460 status =
461 acpi_rs_fixed_memory32_stream(linked_list, &buffer,
462 &bytes_consumed);
463 break;
464
465 case ACPI_RSTYPE_ADDRESS16:
466 /*
467 * 16-Bit Address Descriptor Resource
468 */
469 status = acpi_rs_address16_stream(linked_list, &buffer,
470 &bytes_consumed);
471 break;
472
473 case ACPI_RSTYPE_ADDRESS32:
474 /*
475 * 32-Bit Address Descriptor Resource
476 */
477 status = acpi_rs_address32_stream(linked_list, &buffer,
478 &bytes_consumed);
479 break;
480
481 case ACPI_RSTYPE_ADDRESS64:
482 /*
483 * 64-Bit Address Descriptor Resource
484 */
485 status = acpi_rs_address64_stream(linked_list, &buffer,
486 &bytes_consumed);
487 break;
488
489 case ACPI_RSTYPE_EXT_IRQ:
490 /*
491 * Extended IRQ Resource
492 */
493 status =
494 acpi_rs_extended_irq_stream(linked_list, &buffer,
495 &bytes_consumed);
496 break;
497
498 default:
499 /*
500 * If we get here, everything is out of sync,
501 * so exit with an error
502 */
503 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
504 "Invalid descriptor type (%X) in resource list\n",
505 linked_list->id));
506 status = AE_BAD_DATA;
507 break;
508 } 165 }
509 166
167 /* Perform the conversion */
168
169 status = acpi_rs_convert_resource_to_aml(resource,
170 ACPI_CAST_PTR(union
171 aml_resource,
172 aml),
173 acpi_gbl_set_resource_dispatch
174 [resource->type]);
510 if (ACPI_FAILURE(status)) { 175 if (ACPI_FAILURE(status)) {
176 ACPI_EXCEPTION((AE_INFO, status,
177 "Could not convert resource (type %X) to AML",
178 resource->type));
511 return_ACPI_STATUS(status); 179 return_ACPI_STATUS(status);
512 } 180 }
513 181
514 /* Set the Buffer to point to the open byte */ 182 /* Perform final sanity check on the new AML resource descriptor */
183
184 status =
185 acpi_ut_validate_resource(ACPI_CAST_PTR
186 (union aml_resource, aml), NULL);
187 if (ACPI_FAILURE(status)) {
188 return_ACPI_STATUS(status);
189 }
515 190
516 buffer += bytes_consumed; 191 /* Check for end-of-list, normal exit */
517 192
518 /* Point to the next object */ 193 if (resource->type == ACPI_RESOURCE_TYPE_END_TAG) {
194 /* An End Tag indicates the end of the input Resource Template */
519 195
520 linked_list = ACPI_PTR_ADD(struct acpi_resource, 196 return_ACPI_STATUS(AE_OK);
521 linked_list, linked_list->length); 197 }
198
199 /*
200 * Extract the total length of the new descriptor and set the
201 * Aml to point to the next (output) resource descriptor
202 */
203 aml += acpi_ut_get_descriptor_length(aml);
204
205 /* Point to the next input resource descriptor */
206
207 resource =
208 ACPI_ADD_PTR(struct acpi_resource, resource,
209 resource->length);
522 } 210 }
523 211
524 return_ACPI_STATUS(AE_OK); 212 /* Completed buffer, but did not find an end_tag resource descriptor */
213
214 return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
525} 215}
diff --git a/drivers/acpi/resources/rsmemory.c b/drivers/acpi/resources/rsmemory.c
index daba1a1ed46d..a5131936d690 100644
--- a/drivers/acpi/resources/rsmemory.c
+++ b/drivers/acpi/resources/rsmemory.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -49,454 +49,187 @@ ACPI_MODULE_NAME("rsmemory")
49 49
50/******************************************************************************* 50/*******************************************************************************
51 * 51 *
52 * FUNCTION: acpi_rs_memory24_resource 52 * acpi_rs_convert_memory24
53 *
54 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
55 * stream
56 * bytes_consumed - Pointer to where the number of bytes
57 * consumed the byte_stream_buffer is
58 * returned
59 * output_buffer - Pointer to the return data buffer
60 * structure_size - Pointer to where the number of bytes
61 * in the return data struct is returned
62 *
63 * RETURN: Status
64 *
65 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
66 * structure pointed to by the output_buffer. Return the
67 * number of bytes consumed from the byte stream.
68 * 53 *
69 ******************************************************************************/ 54 ******************************************************************************/
70acpi_status 55struct acpi_rsconvert_info acpi_rs_convert_memory24[4] = {
71acpi_rs_memory24_resource(u8 * byte_stream_buffer, 56 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY24,
72 acpi_size * bytes_consumed, 57 ACPI_RS_SIZE(struct acpi_resource_memory24),
73 u8 ** output_buffer, acpi_size * structure_size) 58 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory24)},
74{
75 u8 *buffer = byte_stream_buffer;
76 struct acpi_resource *output_struct = (void *)*output_buffer;
77 u16 temp16 = 0;
78 u8 temp8 = 0;
79 acpi_size struct_size =
80 ACPI_SIZEOF_RESOURCE(struct acpi_resource_mem24);
81
82 ACPI_FUNCTION_TRACE("rs_memory24_resource");
83
84 /* Point past the Descriptor to get the number of bytes consumed */
85
86 buffer += 1;
87
88 ACPI_MOVE_16_TO_16(&temp16, buffer);
89 buffer += 2;
90 *bytes_consumed = (acpi_size) temp16 + 3;
91 output_struct->id = ACPI_RSTYPE_MEM24;
92
93 /* Check Byte 3 the Read/Write bit */
94
95 temp8 = *buffer;
96 buffer += 1;
97 output_struct->data.memory24.read_write_attribute = temp8 & 0x01;
98
99 /* Get min_base_address (Bytes 4-5) */
100
101 ACPI_MOVE_16_TO_16(&temp16, buffer);
102 buffer += 2;
103 output_struct->data.memory24.min_base_address = temp16;
104
105 /* Get max_base_address (Bytes 6-7) */
106
107 ACPI_MOVE_16_TO_16(&temp16, buffer);
108 buffer += 2;
109 output_struct->data.memory24.max_base_address = temp16;
110 59
111 /* Get Alignment (Bytes 8-9) */ 60 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY24,
61 sizeof(struct aml_resource_memory24),
62 0},
112 63
113 ACPI_MOVE_16_TO_16(&temp16, buffer); 64 /* Read/Write bit */
114 buffer += 2;
115 output_struct->data.memory24.alignment = temp16;
116 65
117 /* Get range_length (Bytes 10-11) */ 66 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory24.write_protect),
118 67 AML_OFFSET(memory24.flags),
119 ACPI_MOVE_16_TO_16(&temp16, buffer); 68 0},
120 output_struct->data.memory24.range_length = temp16; 69 /*
121 70 * These fields are contiguous in both the source and destination:
122 /* Set the Length parameter */ 71 * Minimum Base Address
123 72 * Maximum Base Address
124 output_struct->length = (u32) struct_size; 73 * Address Base Alignment
125 74 * Range Length
126 /* Return the final size of the structure */ 75 */
127 76 {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.memory24.minimum),
128 *structure_size = struct_size; 77 AML_OFFSET(memory24.minimum),
129 return_ACPI_STATUS(AE_OK); 78 4}
130} 79};
131 80
132/******************************************************************************* 81/*******************************************************************************
133 * 82 *
134 * FUNCTION: acpi_rs_memory24_stream 83 * acpi_rs_convert_memory32
135 *
136 * PARAMETERS: linked_list - Pointer to the resource linked list
137 * output_buffer - Pointer to the user's return buffer
138 * bytes_consumed - Pointer to where the number of bytes
139 * used in the output_buffer is returned
140 *
141 * RETURN: Status
142 *
143 * DESCRIPTION: Take the linked list resource structure and fills in the
144 * the appropriate bytes in a byte stream
145 * 84 *
146 ******************************************************************************/ 85 ******************************************************************************/
147 86
148acpi_status 87struct acpi_rsconvert_info acpi_rs_convert_memory32[4] = {
149acpi_rs_memory24_stream(struct acpi_resource *linked_list, 88 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY32,
150 u8 ** output_buffer, acpi_size * bytes_consumed) 89 ACPI_RS_SIZE(struct acpi_resource_memory32),
151{ 90 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory32)},
152 u8 *buffer = *output_buffer;
153 u16 temp16 = 0;
154 u8 temp8 = 0;
155
156 ACPI_FUNCTION_TRACE("rs_memory24_stream");
157
158 /* The descriptor field is static */
159
160 *buffer = 0x81;
161 buffer += 1;
162 91
163 /* The length field is static */ 92 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY32,
93 sizeof(struct aml_resource_memory32),
94 0},
164 95
165 temp16 = 0x09; 96 /* Read/Write bit */
166 ACPI_MOVE_16_TO_16(buffer, &temp16);
167 buffer += 2;
168 97
169 /* Set the Information Byte */ 98 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory32.write_protect),
170 99 AML_OFFSET(memory32.flags),
171 temp8 = (u8) (linked_list->data.memory24.read_write_attribute & 0x01); 100 0},
172 *buffer = temp8; 101 /*
173 buffer += 1; 102 * These fields are contiguous in both the source and destination:
174 103 * Minimum Base Address
175 /* Set the Range minimum base address */ 104 * Maximum Base Address
176 105 * Address Base Alignment
177 ACPI_MOVE_32_TO_16(buffer, 106 * Range Length
178 &linked_list->data.memory24.min_base_address); 107 */
179 buffer += 2; 108 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.memory32.minimum),
180 109 AML_OFFSET(memory32.minimum),
181 /* Set the Range maximum base address */ 110 4}
182 111};
183 ACPI_MOVE_32_TO_16(buffer,
184 &linked_list->data.memory24.max_base_address);
185 buffer += 2;
186
187 /* Set the base alignment */
188
189 ACPI_MOVE_32_TO_16(buffer, &linked_list->data.memory24.alignment);
190 buffer += 2;
191
192 /* Set the range length */
193
194 ACPI_MOVE_32_TO_16(buffer, &linked_list->data.memory24.range_length);
195 buffer += 2;
196
197 /* Return the number of bytes consumed in this operation */
198
199 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
200 return_ACPI_STATUS(AE_OK);
201}
202 112
203/******************************************************************************* 113/*******************************************************************************
204 * 114 *
205 * FUNCTION: acpi_rs_memory32_range_resource 115 * acpi_rs_convert_fixed_memory32
206 *
207 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
208 * stream
209 * bytes_consumed - Pointer to where the number of bytes
210 * consumed the byte_stream_buffer is
211 * returned
212 * output_buffer - Pointer to the return data buffer
213 * structure_size - Pointer to where the number of bytes
214 * in the return data struct is returned
215 *
216 * RETURN: Status
217 *
218 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
219 * structure pointed to by the output_buffer. Return the
220 * number of bytes consumed from the byte stream.
221 * 116 *
222 ******************************************************************************/ 117 ******************************************************************************/
223 118
224acpi_status 119struct acpi_rsconvert_info acpi_rs_convert_fixed_memory32[4] = {
225acpi_rs_memory32_range_resource(u8 * byte_stream_buffer, 120 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_MEMORY32,
226 acpi_size * bytes_consumed, 121 ACPI_RS_SIZE(struct acpi_resource_fixed_memory32),
227 u8 ** output_buffer, acpi_size * structure_size) 122 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_memory32)},
228{
229 u8 *buffer = byte_stream_buffer;
230 struct acpi_resource *output_struct = (void *)*output_buffer;
231 u16 temp16 = 0;
232 u8 temp8 = 0;
233 acpi_size struct_size =
234 ACPI_SIZEOF_RESOURCE(struct acpi_resource_mem32);
235
236 ACPI_FUNCTION_TRACE("rs_memory32_range_resource");
237
238 /* Point past the Descriptor to get the number of bytes consumed */
239
240 buffer += 1;
241 123
242 ACPI_MOVE_16_TO_16(&temp16, buffer); 124 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_MEMORY32,
243 buffer += 2; 125 sizeof(struct aml_resource_fixed_memory32),
244 *bytes_consumed = (acpi_size) temp16 + 3; 126 0},
245 127
246 output_struct->id = ACPI_RSTYPE_MEM32; 128 /* Read/Write bit */
247 129
130 {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.fixed_memory32.write_protect),
131 AML_OFFSET(fixed_memory32.flags),
132 0},
248 /* 133 /*
249 * Point to the place in the output buffer where the data portion will 134 * These fields are contiguous in both the source and destination:
250 * begin. 135 * Base Address
251 * 1. Set the RESOURCE_DATA * Data to point to its own address, then 136 * Range Length
252 * 2. Set the pointer to the next address.
253 *
254 * NOTE: output_struct->Data is cast to u8, otherwise, this addition adds
255 * 4 * sizeof(RESOURCE_DATA) instead of 4 * sizeof(u8)
256 */ 137 */
257 138 {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.fixed_memory32.address),
258 /* Check Byte 3 the Read/Write bit */ 139 AML_OFFSET(fixed_memory32.address),
259 140 2}
260 temp8 = *buffer; 141};
261 buffer += 1;
262
263 output_struct->data.memory32.read_write_attribute = temp8 & 0x01;
264
265 /* Get min_base_address (Bytes 4-7) */
266
267 ACPI_MOVE_32_TO_32(&output_struct->data.memory32.min_base_address,
268 buffer);
269 buffer += 4;
270
271 /* Get max_base_address (Bytes 8-11) */
272
273 ACPI_MOVE_32_TO_32(&output_struct->data.memory32.max_base_address,
274 buffer);
275 buffer += 4;
276
277 /* Get Alignment (Bytes 12-15) */
278
279 ACPI_MOVE_32_TO_32(&output_struct->data.memory32.alignment, buffer);
280 buffer += 4;
281
282 /* Get range_length (Bytes 16-19) */
283
284 ACPI_MOVE_32_TO_32(&output_struct->data.memory32.range_length, buffer);
285
286 /* Set the Length parameter */
287
288 output_struct->length = (u32) struct_size;
289
290 /* Return the final size of the structure */
291
292 *structure_size = struct_size;
293 return_ACPI_STATUS(AE_OK);
294}
295 142
296/******************************************************************************* 143/*******************************************************************************
297 * 144 *
298 * FUNCTION: acpi_rs_fixed_memory32_resource 145 * acpi_rs_get_vendor_small
299 *
300 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
301 * stream
302 * bytes_consumed - Pointer to where the number of bytes
303 * consumed the byte_stream_buffer is
304 * returned
305 * output_buffer - Pointer to the return data buffer
306 * structure_size - Pointer to where the number of bytes
307 * in the return data struct is returned
308 *
309 * RETURN: Status
310 *
311 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
312 * structure pointed to by the output_buffer. Return the
313 * number of bytes consumed from the byte stream.
314 * 146 *
315 ******************************************************************************/ 147 ******************************************************************************/
316 148
317acpi_status 149struct acpi_rsconvert_info acpi_rs_get_vendor_small[3] = {
318acpi_rs_fixed_memory32_resource(u8 * byte_stream_buffer, 150 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
319 acpi_size * bytes_consumed, 151 ACPI_RS_SIZE(struct acpi_resource_vendor),
320 u8 ** output_buffer, acpi_size * structure_size) 152 ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_small)},
321{
322 u8 *buffer = byte_stream_buffer;
323 struct acpi_resource *output_struct = (void *)*output_buffer;
324 u16 temp16 = 0;
325 u8 temp8 = 0;
326 acpi_size struct_size =
327 ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_mem32);
328
329 ACPI_FUNCTION_TRACE("rs_fixed_memory32_resource");
330 153
331 /* Point past the Descriptor to get the number of bytes consumed */ 154 /* Length of the vendor data (byte count) */
332 155
333 buffer += 1; 156 {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
334 ACPI_MOVE_16_TO_16(&temp16, buffer); 157 0,
158 sizeof(u8)}
159 ,
335 160
336 buffer += 2; 161 /* Vendor data */
337 *bytes_consumed = (acpi_size) temp16 + 3;
338 162
339 output_struct->id = ACPI_RSTYPE_FIXED_MEM32; 163 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
340 164 sizeof(struct aml_resource_small_header),
341 /* Check Byte 3 the Read/Write bit */ 165 0}
342 166};
343 temp8 = *buffer;
344 buffer += 1;
345 output_struct->data.fixed_memory32.read_write_attribute = temp8 & 0x01;
346
347 /* Get range_base_address (Bytes 4-7) */
348
349 ACPI_MOVE_32_TO_32(&output_struct->data.fixed_memory32.
350 range_base_address, buffer);
351 buffer += 4;
352
353 /* Get range_length (Bytes 8-11) */
354
355 ACPI_MOVE_32_TO_32(&output_struct->data.fixed_memory32.range_length,
356 buffer);
357
358 /* Set the Length parameter */
359
360 output_struct->length = (u32) struct_size;
361
362 /* Return the final size of the structure */
363
364 *structure_size = struct_size;
365 return_ACPI_STATUS(AE_OK);
366}
367 167
368/******************************************************************************* 168/*******************************************************************************
369 * 169 *
370 * FUNCTION: acpi_rs_memory32_range_stream 170 * acpi_rs_get_vendor_large
371 *
372 * PARAMETERS: linked_list - Pointer to the resource linked list
373 * output_buffer - Pointer to the user's return buffer
374 * bytes_consumed - Pointer to where the number of bytes
375 * used in the output_buffer is returned
376 *
377 * RETURN: Status
378 *
379 * DESCRIPTION: Take the linked list resource structure and fills in the
380 * the appropriate bytes in a byte stream
381 * 171 *
382 ******************************************************************************/ 172 ******************************************************************************/
383 173
384acpi_status 174struct acpi_rsconvert_info acpi_rs_get_vendor_large[3] = {
385acpi_rs_memory32_range_stream(struct acpi_resource *linked_list, 175 {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
386 u8 ** output_buffer, acpi_size * bytes_consumed) 176 ACPI_RS_SIZE(struct acpi_resource_vendor),
387{ 177 ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_large)},
388 u8 *buffer = *output_buffer;
389 u16 temp16 = 0;
390 u8 temp8 = 0;
391
392 ACPI_FUNCTION_TRACE("rs_memory32_range_stream");
393
394 /* The descriptor field is static */
395
396 *buffer = 0x85;
397 buffer += 1;
398
399 /* The length field is static */
400
401 temp16 = 0x11;
402
403 ACPI_MOVE_16_TO_16(buffer, &temp16);
404 buffer += 2;
405
406 /* Set the Information Byte */
407
408 temp8 = (u8) (linked_list->data.memory32.read_write_attribute & 0x01);
409 *buffer = temp8;
410 buffer += 1;
411
412 /* Set the Range minimum base address */
413
414 ACPI_MOVE_32_TO_32(buffer,
415 &linked_list->data.memory32.min_base_address);
416 buffer += 4;
417
418 /* Set the Range maximum base address */
419
420 ACPI_MOVE_32_TO_32(buffer,
421 &linked_list->data.memory32.max_base_address);
422 buffer += 4;
423 178
424 /* Set the base alignment */ 179 /* Length of the vendor data (byte count) */
425 180
426 ACPI_MOVE_32_TO_32(buffer, &linked_list->data.memory32.alignment); 181 {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
427 buffer += 4; 182 0,
183 sizeof(u8)}
184 ,
428 185
429 /* Set the range length */ 186 /* Vendor data */
430 187
431 ACPI_MOVE_32_TO_32(buffer, &linked_list->data.memory32.range_length); 188 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
432 buffer += 4; 189 sizeof(struct aml_resource_large_header),
433 190 0}
434 /* Return the number of bytes consumed in this operation */ 191};
435
436 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
437 return_ACPI_STATUS(AE_OK);
438}
439 192
440/******************************************************************************* 193/*******************************************************************************
441 * 194 *
442 * FUNCTION: acpi_rs_fixed_memory32_stream 195 * acpi_rs_set_vendor
443 *
444 * PARAMETERS: linked_list - Pointer to the resource linked list
445 * output_buffer - Pointer to the user's return buffer
446 * bytes_consumed - Pointer to where the number of bytes
447 * used in the output_buffer is returned
448 *
449 * RETURN: Status
450 *
451 * DESCRIPTION: Take the linked list resource structure and fills in the
452 * the appropriate bytes in a byte stream
453 * 196 *
454 ******************************************************************************/ 197 ******************************************************************************/
455 198
456acpi_status 199struct acpi_rsconvert_info acpi_rs_set_vendor[7] = {
457acpi_rs_fixed_memory32_stream(struct acpi_resource *linked_list, 200 /* Default is a small vendor descriptor */
458 u8 ** output_buffer, acpi_size * bytes_consumed)
459{
460 u8 *buffer = *output_buffer;
461 u16 temp16 = 0;
462 u8 temp8 = 0;
463
464 ACPI_FUNCTION_TRACE("rs_fixed_memory32_stream");
465 201
466 /* The descriptor field is static */ 202 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_SMALL,
203 sizeof(struct aml_resource_small_header),
204 ACPI_RSC_TABLE_SIZE(acpi_rs_set_vendor)},
467 205
468 *buffer = 0x86; 206 /* Get the length and copy the data */
469 buffer += 1;
470 207
471 /* The length field is static */ 208 {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
209 0,
210 0},
472 211
473 temp16 = 0x09; 212 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
213 sizeof(struct aml_resource_small_header),
214 0},
474 215
475 ACPI_MOVE_16_TO_16(buffer, &temp16); 216 /*
476 buffer += 2; 217 * All done if the Vendor byte length is 7 or less, meaning that it will
477 218 * fit within a small descriptor
478 /* Set the Information Byte */ 219 */
479 220 {ACPI_RSC_EXIT_LE, 0, 0, 7},
480 temp8 =
481 (u8) (linked_list->data.fixed_memory32.read_write_attribute & 0x01);
482 *buffer = temp8;
483 buffer += 1;
484
485 /* Set the Range base address */
486
487 ACPI_MOVE_32_TO_32(buffer,
488 &linked_list->data.fixed_memory32.
489 range_base_address);
490 buffer += 4;
491 221
492 /* Set the range length */ 222 /* Must create a large vendor descriptor */
493 223
494 ACPI_MOVE_32_TO_32(buffer, 224 {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_LARGE,
495 &linked_list->data.fixed_memory32.range_length); 225 sizeof(struct aml_resource_large_header),
496 buffer += 4; 226 0},
497 227
498 /* Return the number of bytes consumed in this operation */ 228 {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
229 0,
230 0},
499 231
500 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer); 232 {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
501 return_ACPI_STATUS(AE_OK); 233 sizeof(struct aml_resource_large_header),
502} 234 0}
235};
diff --git a/drivers/acpi/resources/rsmisc.c b/drivers/acpi/resources/rsmisc.c
index 7a8a34e757f5..ed866cf1c6d2 100644
--- a/drivers/acpi/resources/rsmisc.c
+++ b/drivers/acpi/resources/rsmisc.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -47,481 +47,501 @@
47#define _COMPONENT ACPI_RESOURCES 47#define _COMPONENT ACPI_RESOURCES
48ACPI_MODULE_NAME("rsmisc") 48ACPI_MODULE_NAME("rsmisc")
49 49
50#define INIT_RESOURCE_TYPE(i) i->resource_offset
51#define INIT_RESOURCE_LENGTH(i) i->aml_offset
52#define INIT_TABLE_LENGTH(i) i->value
53#define COMPARE_OPCODE(i) i->resource_offset
54#define COMPARE_TARGET(i) i->aml_offset
55#define COMPARE_VALUE(i) i->value
50/******************************************************************************* 56/*******************************************************************************
51 * 57 *
52 * FUNCTION: acpi_rs_end_tag_resource 58 * FUNCTION: acpi_rs_convert_aml_to_resource
53 * 59 *
54 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte 60 * PARAMETERS: Resource - Pointer to the resource descriptor
55 * stream 61 * Aml - Where the AML descriptor is returned
56 * bytes_consumed - Pointer to where the number of bytes 62 * Info - Pointer to appropriate conversion table
57 * consumed the byte_stream_buffer is
58 * returned
59 * output_buffer - Pointer to the return data buffer
60 * structure_size - Pointer to where the number of bytes
61 * in the return data struct is returned
62 * 63 *
63 * RETURN: Status 64 * RETURN: Status
64 * 65 *
65 * DESCRIPTION: Take the resource byte stream and fill out the appropriate 66 * DESCRIPTION: Convert an external AML resource descriptor to the corresponding
66 * structure pointed to by the output_buffer. Return the 67 * internal resource descriptor
67 * number of bytes consumed from the byte stream.
68 * 68 *
69 ******************************************************************************/ 69 ******************************************************************************/
70acpi_status 70acpi_status
71acpi_rs_end_tag_resource(u8 * byte_stream_buffer, 71acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
72 acpi_size * bytes_consumed, 72 union aml_resource *aml,
73 u8 ** output_buffer, acpi_size * structure_size) 73 struct acpi_rsconvert_info *info)
74{ 74{
75 struct acpi_resource *output_struct = (void *)*output_buffer; 75 acpi_rs_length aml_resource_length;
76 acpi_size struct_size = ACPI_RESOURCE_LENGTH; 76 void *source;
77 77 void *destination;
78 ACPI_FUNCTION_TRACE("rs_end_tag_resource"); 78 char *target;
79 79 u8 count;
80 /* The number of bytes consumed is static */ 80 u8 flags_mode = FALSE;
81 81 u16 item_count = 0;
82 *bytes_consumed = 2;
83
84 /* Fill out the structure */
85
86 output_struct->id = ACPI_RSTYPE_END_TAG;
87
88 /* Set the Length parameter */
89
90 output_struct->length = 0;
91
92 /* Return the final size of the structure */
93
94 *structure_size = struct_size;
95 return_ACPI_STATUS(AE_OK);
96}
97
98/*******************************************************************************
99 *
100 * FUNCTION: acpi_rs_end_tag_stream
101 *
102 * PARAMETERS: linked_list - Pointer to the resource linked list
103 * output_buffer - Pointer to the user's return buffer
104 * bytes_consumed - Pointer to where the number of bytes
105 * used in the output_buffer is returned
106 *
107 * RETURN: Status
108 *
109 * DESCRIPTION: Take the linked list resource structure and fills in the
110 * the appropriate bytes in a byte stream
111 *
112 ******************************************************************************/
113
114acpi_status
115acpi_rs_end_tag_stream(struct acpi_resource *linked_list,
116 u8 ** output_buffer, acpi_size * bytes_consumed)
117{
118 u8 *buffer = *output_buffer;
119 u8 temp8 = 0;
120
121 ACPI_FUNCTION_TRACE("rs_end_tag_stream");
122
123 /* The descriptor field is static */
124
125 *buffer = 0x79;
126 buffer += 1;
127
128 /*
129 * Set the Checksum - zero means that the resource data is treated as if
130 * the checksum operation succeeded (ACPI Spec 1.0b Section 6.4.2.8)
131 */
132 temp8 = 0;
133
134 *buffer = temp8;
135 buffer += 1;
136
137 /* Return the number of bytes consumed in this operation */
138
139 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
140 return_ACPI_STATUS(AE_OK);
141}
142
143/*******************************************************************************
144 *
145 * FUNCTION: acpi_rs_vendor_resource
146 *
147 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
148 * stream
149 * bytes_consumed - Pointer to where the number of bytes
150 * consumed the byte_stream_buffer is
151 * returned
152 * output_buffer - Pointer to the return data buffer
153 * structure_size - Pointer to where the number of bytes
154 * in the return data struct is returned
155 *
156 * RETURN: Status
157 *
158 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
159 * structure pointed to by the output_buffer. Return the
160 * number of bytes consumed from the byte stream.
161 *
162 ******************************************************************************/
163
164acpi_status
165acpi_rs_vendor_resource(u8 * byte_stream_buffer,
166 acpi_size * bytes_consumed,
167 u8 ** output_buffer, acpi_size * structure_size)
168{
169 u8 *buffer = byte_stream_buffer;
170 struct acpi_resource *output_struct = (void *)*output_buffer;
171 u16 temp16 = 0; 82 u16 temp16 = 0;
172 u8 temp8 = 0;
173 u8 index;
174 acpi_size struct_size =
175 ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor);
176
177 ACPI_FUNCTION_TRACE("rs_vendor_resource");
178
179 /* Dereference the Descriptor to find if this is a large or small item. */
180
181 temp8 = *buffer;
182
183 if (temp8 & 0x80) {
184 /* Large Item, point to the length field */
185
186 buffer += 1;
187 83
188 /* Dereference */ 84 ACPI_FUNCTION_TRACE("rs_get_resource");
189 85
190 ACPI_MOVE_16_TO_16(&temp16, buffer); 86 if (((acpi_native_uint) resource) & 0x3) {
87 /* Each internal resource struct is expected to be 32-bit aligned */
191 88
192 /* Calculate bytes consumed */ 89 ACPI_WARNING((AE_INFO,
193 90 "Misaligned resource pointer (get): %p Type %2.2X Len %X",
194 *bytes_consumed = (acpi_size) temp16 + 3; 91 resource, resource->type, resource->length));
195
196 /* Point to the first vendor byte */
197
198 buffer += 2;
199 } else {
200 /* Small Item, dereference the size */
201
202 temp16 = (u8) (*buffer & 0x07);
203
204 /* Calculate bytes consumed */
205
206 *bytes_consumed = (acpi_size) temp16 + 1;
207
208 /* Point to the first vendor byte */
209
210 buffer += 1;
211 } 92 }
212 93
213 output_struct->id = ACPI_RSTYPE_VENDOR; 94 /* Extract the resource Length field (does not include header length) */
214 output_struct->data.vendor_specific.length = temp16;
215 95
216 for (index = 0; index < temp16; index++) { 96 aml_resource_length = acpi_ut_get_resource_length(aml);
217 output_struct->data.vendor_specific.reserved[index] = *buffer;
218 buffer += 1;
219 }
220 97
221 /* 98 /*
222 * In order for the struct_size to fall on a 32-bit boundary, 99 * First table entry must be ACPI_RSC_INITxxx and must contain the
223 * calculate the length of the vendor string and expand the 100 * table length (# of table entries)
224 * struct_size to the next 32-bit boundary.
225 */ 101 */
226 struct_size += ACPI_ROUND_UP_to_32_bITS(temp16); 102 count = INIT_TABLE_LENGTH(info);
227 103
228 /* Set the Length parameter */ 104 while (count) {
229 105 /*
230 output_struct->length = (u32) struct_size; 106 * Source is the external AML byte stream buffer,
231 107 * destination is the internal resource descriptor
232 /* Return the final size of the structure */ 108 */
233 109 source = ACPI_ADD_PTR(void, aml, info->aml_offset);
234 *structure_size = struct_size; 110 destination =
235 return_ACPI_STATUS(AE_OK); 111 ACPI_ADD_PTR(void, resource, info->resource_offset);
236} 112
237 113 switch (info->opcode) {
238/******************************************************************************* 114 case ACPI_RSC_INITGET:
239 * 115 /*
240 * FUNCTION: acpi_rs_vendor_stream 116 * Get the resource type and the initial (minimum) length
241 * 117 */
242 * PARAMETERS: linked_list - Pointer to the resource linked list 118 ACPI_MEMSET(resource, 0, INIT_RESOURCE_LENGTH(info));
243 * output_buffer - Pointer to the user's return buffer 119 resource->type = INIT_RESOURCE_TYPE(info);
244 * bytes_consumed - Pointer to where the number of bytes 120 resource->length = INIT_RESOURCE_LENGTH(info);
245 * used in the output_buffer is returned 121 break;
246 * 122
247 * RETURN: Status 123 case ACPI_RSC_INITSET:
248 * 124 break;
249 * DESCRIPTION: Take the linked list resource structure and fills in the 125
250 * the appropriate bytes in a byte stream 126 case ACPI_RSC_FLAGINIT:
251 * 127
252 ******************************************************************************/ 128 flags_mode = TRUE;
253 129 break;
254acpi_status 130
255acpi_rs_vendor_stream(struct acpi_resource *linked_list, 131 case ACPI_RSC_1BITFLAG:
256 u8 ** output_buffer, acpi_size * bytes_consumed) 132 /*
257{ 133 * Mask and shift the flag bit
258 u8 *buffer = *output_buffer; 134 */
259 u16 temp16 = 0; 135 ACPI_SET8(destination) = (u8)
260 u8 temp8 = 0; 136 ((ACPI_GET8(source) >> info->value) & 0x01);
261 u8 index; 137 break;
262 138
263 ACPI_FUNCTION_TRACE("rs_vendor_stream"); 139 case ACPI_RSC_2BITFLAG:
264 140 /*
265 /* Dereference the length to find if this is a large or small item. */ 141 * Mask and shift the flag bits
266 142 */
267 if (linked_list->data.vendor_specific.length > 7) { 143 ACPI_SET8(destination) = (u8)
268 /* Large Item, Set the descriptor field and length bytes */ 144 ((ACPI_GET8(source) >> info->value) & 0x03);
269 145 break;
270 *buffer = 0x84; 146
271 buffer += 1; 147 case ACPI_RSC_COUNT:
272 148
273 temp16 = (u16) linked_list->data.vendor_specific.length; 149 item_count = ACPI_GET8(source);
274 150 ACPI_SET8(destination) = (u8) item_count;
275 ACPI_MOVE_16_TO_16(buffer, &temp16); 151
276 buffer += 2; 152 resource->length = resource->length +
277 } else { 153 (info->value * (item_count - 1));
278 /* Small Item, Set the descriptor field */ 154 break;
279 155
280 temp8 = 0x70; 156 case ACPI_RSC_COUNT16:
281 temp8 |= (u8) linked_list->data.vendor_specific.length; 157
158 item_count = aml_resource_length;
159 ACPI_SET16(destination) = item_count;
160
161 resource->length = resource->length +
162 (info->value * (item_count - 1));
163 break;
164
165 case ACPI_RSC_LENGTH:
166
167 resource->length = resource->length + info->value;
168 break;
169
170 case ACPI_RSC_MOVE8:
171 case ACPI_RSC_MOVE16:
172 case ACPI_RSC_MOVE32:
173 case ACPI_RSC_MOVE64:
174 /*
175 * Raw data move. Use the Info value field unless item_count has
176 * been previously initialized via a COUNT opcode
177 */
178 if (info->value) {
179 item_count = info->value;
180 }
181 acpi_rs_move_data(destination, source, item_count,
182 info->opcode);
183 break;
184
185 case ACPI_RSC_SET8:
186
187 ACPI_MEMSET(destination, info->aml_offset, info->value);
188 break;
189
190 case ACPI_RSC_DATA8:
191
192 target = ACPI_ADD_PTR(char, resource, info->value);
193 ACPI_MEMCPY(destination, source, ACPI_GET16(target));
194 break;
195
196 case ACPI_RSC_ADDRESS:
197 /*
198 * Common handler for address descriptor flags
199 */
200 if (!acpi_rs_get_address_common(resource, aml)) {
201 return_ACPI_STATUS
202 (AE_AML_INVALID_RESOURCE_TYPE);
203 }
204 break;
205
206 case ACPI_RSC_SOURCE:
207 /*
208 * Optional resource_source (Index and String)
209 */
210 resource->length +=
211 acpi_rs_get_resource_source(aml_resource_length,
212 info->value,
213 destination, aml, NULL);
214 break;
215
216 case ACPI_RSC_SOURCEX:
217 /*
218 * Optional resource_source (Index and String). This is the more
219 * complicated case used by the Interrupt() macro
220 */
221 target =
222 ACPI_ADD_PTR(char, resource,
223 info->aml_offset + (item_count * 4));
224
225 resource->length +=
226 acpi_rs_get_resource_source(aml_resource_length,
227 (acpi_rs_length) (((item_count - 1) * sizeof(u32)) + info->value), destination, aml, target);
228 break;
229
230 case ACPI_RSC_BITMASK:
231 /*
232 * 8-bit encoded bitmask (DMA macro)
233 */
234 item_count =
235 acpi_rs_decode_bitmask(ACPI_GET8(source),
236 destination);
237 if (item_count) {
238 resource->length += (item_count - 1);
239 }
240
241 target = ACPI_ADD_PTR(char, resource, info->value);
242 ACPI_SET8(target) = (u8) item_count;
243 break;
244
245 case ACPI_RSC_BITMASK16:
246 /*
247 * 16-bit encoded bitmask (IRQ macro)
248 */
249 ACPI_MOVE_16_TO_16(&temp16, source);
250
251 item_count =
252 acpi_rs_decode_bitmask(temp16, destination);
253 if (item_count) {
254 resource->length += (item_count - 1);
255 }
256
257 target = ACPI_ADD_PTR(char, resource, info->value);
258 ACPI_SET8(target) = (u8) item_count;
259 break;
260
261 case ACPI_RSC_EXIT_NE:
262 /*
263 * Control - Exit conversion if not equal
264 */
265 switch (info->resource_offset) {
266 case ACPI_RSC_COMPARE_AML_LENGTH:
267 if (aml_resource_length != info->value) {
268 goto exit;
269 }
270 break;
271
272 case ACPI_RSC_COMPARE_VALUE:
273 if (ACPI_GET8(source) != info->value) {
274 goto exit;
275 }
276 break;
277
278 default:
279
280 ACPI_ERROR((AE_INFO,
281 "Invalid conversion sub-opcode"));
282 return_ACPI_STATUS(AE_BAD_PARAMETER);
283 }
284 break;
285
286 default:
287
288 ACPI_ERROR((AE_INFO, "Invalid conversion opcode"));
289 return_ACPI_STATUS(AE_BAD_PARAMETER);
290 }
282 291
283 *buffer = temp8; 292 count--;
284 buffer += 1; 293 info++;
285 } 294 }
286 295
287 /* Loop through all of the Vendor Specific fields */ 296 exit:
297 if (!flags_mode) {
298 /* Round the resource struct length up to the next 32-bit boundary */
288 299
289 for (index = 0; index < linked_list->data.vendor_specific.length; 300 resource->length = ACPI_ROUND_UP_to_32_bITS(resource->length);
290 index++) {
291 temp8 = linked_list->data.vendor_specific.reserved[index];
292
293 *buffer = temp8;
294 buffer += 1;
295 } 301 }
296
297 /* Return the number of bytes consumed in this operation */
298
299 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
300 return_ACPI_STATUS(AE_OK); 302 return_ACPI_STATUS(AE_OK);
301} 303}
302 304
303/******************************************************************************* 305/*******************************************************************************
304 * 306 *
305 * FUNCTION: acpi_rs_start_depend_fns_resource 307 * FUNCTION: acpi_rs_convert_resource_to_aml
306 * 308 *
307 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte 309 * PARAMETERS: Resource - Pointer to the resource descriptor
308 * stream 310 * Aml - Where the AML descriptor is returned
309 * bytes_consumed - Pointer to where the number of bytes 311 * Info - Pointer to appropriate conversion table
310 * consumed the byte_stream_buffer is
311 * returned
312 * output_buffer - Pointer to the return data buffer
313 * structure_size - Pointer to where the number of bytes
314 * in the return data struct is returned
315 * 312 *
316 * RETURN: Status 313 * RETURN: Status
317 * 314 *
318 * DESCRIPTION: Take the resource byte stream and fill out the appropriate 315 * DESCRIPTION: Convert an internal resource descriptor to the corresponding
319 * structure pointed to by the output_buffer. Return the 316 * external AML resource descriptor.
320 * number of bytes consumed from the byte stream.
321 * 317 *
322 ******************************************************************************/ 318 ******************************************************************************/
323 319
324acpi_status 320acpi_status
325acpi_rs_start_depend_fns_resource(u8 * byte_stream_buffer, 321acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
326 acpi_size * bytes_consumed, 322 union aml_resource *aml,
327 u8 ** output_buffer, 323 struct acpi_rsconvert_info *info)
328 acpi_size * structure_size)
329{ 324{
330 u8 *buffer = byte_stream_buffer; 325 void *source = NULL;
331 struct acpi_resource *output_struct = (void *)*output_buffer; 326 void *destination;
332 u8 temp8 = 0; 327 acpi_rsdesc_size aml_length = 0;
333 acpi_size struct_size = 328 u8 count;
334 ACPI_SIZEOF_RESOURCE(struct acpi_resource_start_dpf); 329 u16 temp16 = 0;
335 330 u16 item_count = 0;
336 ACPI_FUNCTION_TRACE("rs_start_depend_fns_resource");
337
338 /* The number of bytes consumed are found in the descriptor (Bits:0-1) */
339
340 temp8 = *buffer;
341
342 *bytes_consumed = (temp8 & 0x01) + 1;
343
344 output_struct->id = ACPI_RSTYPE_START_DPF;
345
346 /* Point to Byte 1 if it is used */
347
348 if (2 == *bytes_consumed) {
349 buffer += 1;
350 temp8 = *buffer;
351
352 /* Check Compatibility priority */
353
354 output_struct->data.start_dpf.compatibility_priority =
355 temp8 & 0x03;
356
357 if (3 == output_struct->data.start_dpf.compatibility_priority) {
358 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE);
359 }
360
361 /* Check Performance/Robustness preference */
362 331
363 output_struct->data.start_dpf.performance_robustness = 332 ACPI_FUNCTION_TRACE("rs_convert_resource_to_aml");
364 (temp8 >> 2) & 0x03;
365 333
366 if (3 == output_struct->data.start_dpf.performance_robustness) { 334 /*
367 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE); 335 * First table entry must be ACPI_RSC_INITxxx and must contain the
336 * table length (# of table entries)
337 */
338 count = INIT_TABLE_LENGTH(info);
339
340 while (count) {
341 /*
342 * Source is the internal resource descriptor,
343 * destination is the external AML byte stream buffer
344 */
345 source = ACPI_ADD_PTR(void, resource, info->resource_offset);
346 destination = ACPI_ADD_PTR(void, aml, info->aml_offset);
347
348 switch (info->opcode) {
349 case ACPI_RSC_INITSET:
350
351 ACPI_MEMSET(aml, 0, INIT_RESOURCE_LENGTH(info));
352 aml_length = INIT_RESOURCE_LENGTH(info);
353 acpi_rs_set_resource_header(INIT_RESOURCE_TYPE(info),
354 aml_length, aml);
355 break;
356
357 case ACPI_RSC_INITGET:
358 break;
359
360 case ACPI_RSC_FLAGINIT:
361 /*
362 * Clear the flag byte
363 */
364 ACPI_SET8(destination) = 0;
365 break;
366
367 case ACPI_RSC_1BITFLAG:
368 /*
369 * Mask and shift the flag bit
370 */
371 ACPI_SET8(destination) |= (u8)
372 ((ACPI_GET8(source) & 0x01) << info->value);
373 break;
374
375 case ACPI_RSC_2BITFLAG:
376 /*
377 * Mask and shift the flag bits
378 */
379 ACPI_SET8(destination) |= (u8)
380 ((ACPI_GET8(source) & 0x03) << info->value);
381 break;
382
383 case ACPI_RSC_COUNT:
384
385 item_count = ACPI_GET8(source);
386 ACPI_SET8(destination) = (u8) item_count;
387
388 aml_length =
389 (u16) (aml_length +
390 (info->value * (item_count - 1)));
391 break;
392
393 case ACPI_RSC_COUNT16:
394
395 item_count = ACPI_GET16(source);
396 aml_length = (u16) (aml_length + item_count);
397 acpi_rs_set_resource_length(aml_length, aml);
398 break;
399
400 case ACPI_RSC_LENGTH:
401
402 acpi_rs_set_resource_length(info->value, aml);
403 break;
404
405 case ACPI_RSC_MOVE8:
406 case ACPI_RSC_MOVE16:
407 case ACPI_RSC_MOVE32:
408 case ACPI_RSC_MOVE64:
409
410 if (info->value) {
411 item_count = info->value;
412 }
413 acpi_rs_move_data(destination, source, item_count,
414 info->opcode);
415 break;
416
417 case ACPI_RSC_ADDRESS:
418
419 /* Set the Resource Type, General Flags, and Type-Specific Flags */
420
421 acpi_rs_set_address_common(aml, resource);
422 break;
423
424 case ACPI_RSC_SOURCEX:
425 /*
426 * Optional resource_source (Index and String)
427 */
428 aml_length =
429 acpi_rs_set_resource_source(aml,
430 (acpi_rs_length)
431 aml_length, source);
432 acpi_rs_set_resource_length(aml_length, aml);
433 break;
434
435 case ACPI_RSC_SOURCE:
436 /*
437 * Optional resource_source (Index and String). This is the more
438 * complicated case used by the Interrupt() macro
439 */
440 aml_length =
441 acpi_rs_set_resource_source(aml, info->value,
442 source);
443 acpi_rs_set_resource_length(aml_length, aml);
444 break;
445
446 case ACPI_RSC_BITMASK:
447 /*
448 * 8-bit encoded bitmask (DMA macro)
449 */
450 ACPI_SET8(destination) = (u8)
451 acpi_rs_encode_bitmask(source,
452 *ACPI_ADD_PTR(u8, resource,
453 info->value));
454 break;
455
456 case ACPI_RSC_BITMASK16:
457 /*
458 * 16-bit encoded bitmask (IRQ macro)
459 */
460 temp16 = acpi_rs_encode_bitmask(source,
461 *ACPI_ADD_PTR(u8,
462 resource,
463 info->
464 value));
465 ACPI_MOVE_16_TO_16(destination, &temp16);
466 break;
467
468 case ACPI_RSC_EXIT_LE:
469 /*
470 * Control - Exit conversion if less than or equal
471 */
472 if (item_count <= info->value) {
473 goto exit;
474 }
475 break;
476
477 case ACPI_RSC_EXIT_NE:
478 /*
479 * Control - Exit conversion if not equal
480 */
481 switch (COMPARE_OPCODE(info)) {
482 case ACPI_RSC_COMPARE_VALUE:
483
484 if (*ACPI_ADD_PTR(u8, resource,
485 COMPARE_TARGET(info)) !=
486 COMPARE_VALUE(info)) {
487 goto exit;
488 }
489 break;
490
491 default:
492
493 ACPI_ERROR((AE_INFO,
494 "Invalid conversion sub-opcode"));
495 return_ACPI_STATUS(AE_BAD_PARAMETER);
496 }
497 break;
498
499 default:
500
501 ACPI_ERROR((AE_INFO, "Invalid conversion opcode"));
502 return_ACPI_STATUS(AE_BAD_PARAMETER);
368 } 503 }
369 } else {
370 output_struct->data.start_dpf.compatibility_priority =
371 ACPI_ACCEPTABLE_CONFIGURATION;
372 504
373 output_struct->data.start_dpf.performance_robustness = 505 count--;
374 ACPI_ACCEPTABLE_CONFIGURATION; 506 info++;
375 } 507 }
376 508
377 /* Set the Length parameter */ 509 exit:
378
379 output_struct->length = (u32) struct_size;
380
381 /* Return the final size of the structure */
382
383 *structure_size = struct_size;
384 return_ACPI_STATUS(AE_OK); 510 return_ACPI_STATUS(AE_OK);
385} 511}
386 512
387/******************************************************************************* 513#if 0
388 * 514/* Previous resource validations */
389 * FUNCTION: acpi_rs_end_depend_fns_resource
390 *
391 * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte
392 * stream
393 * bytes_consumed - Pointer to where the number of bytes
394 * consumed the byte_stream_buffer is
395 * returned
396 * output_buffer - Pointer to the return data buffer
397 * structure_size - Pointer to where the number of bytes
398 * in the return data struct is returned
399 *
400 * RETURN: Status
401 *
402 * DESCRIPTION: Take the resource byte stream and fill out the appropriate
403 * structure pointed to by the output_buffer. Return the
404 * number of bytes consumed from the byte stream.
405 *
406 ******************************************************************************/
407
408acpi_status
409acpi_rs_end_depend_fns_resource(u8 * byte_stream_buffer,
410 acpi_size * bytes_consumed,
411 u8 ** output_buffer, acpi_size * structure_size)
412{
413 struct acpi_resource *output_struct = (void *)*output_buffer;
414 acpi_size struct_size = ACPI_RESOURCE_LENGTH;
415
416 ACPI_FUNCTION_TRACE("rs_end_depend_fns_resource");
417
418 /* The number of bytes consumed is static */
419
420 *bytes_consumed = 1;
421 515
422 /* Fill out the structure */ 516if (aml->ext_address64.revision_iD != AML_RESOURCE_EXTENDED_ADDRESS_REVISION) {
423 517 return_ACPI_STATUS(AE_SUPPORT);
424 output_struct->id = ACPI_RSTYPE_END_DPF;
425
426 /* Set the Length parameter */
427
428 output_struct->length = (u32) struct_size;
429
430 /* Return the final size of the structure */
431
432 *structure_size = struct_size;
433 return_ACPI_STATUS(AE_OK);
434} 518}
435 519
436/******************************************************************************* 520if (resource->data.start_dpf.performance_robustness >= 3) {
437 * 521 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE);
438 * FUNCTION: acpi_rs_start_depend_fns_stream 522}
439 *
440 * PARAMETERS: linked_list - Pointer to the resource linked list
441 * output_buffer - Pointer to the user's return buffer
442 * bytes_consumed - u32 pointer that is filled with
443 * the number of bytes of the
444 * output_buffer used
445 *
446 * RETURN: Status
447 *
448 * DESCRIPTION: Take the linked list resource structure and fills in the
449 * the appropriate bytes in a byte stream
450 *
451 ******************************************************************************/
452
453acpi_status
454acpi_rs_start_depend_fns_stream(struct acpi_resource *linked_list,
455 u8 ** output_buffer, acpi_size * bytes_consumed)
456{
457 u8 *buffer = *output_buffer;
458 u8 temp8 = 0;
459
460 ACPI_FUNCTION_TRACE("rs_start_depend_fns_stream");
461 523
524if (((aml->irq.flags & 0x09) == 0x00) || ((aml->irq.flags & 0x09) == 0x09)) {
462 /* 525 /*
463 * The descriptor field is set based upon whether a byte is needed 526 * Only [active_high, edge_sensitive] or [active_low, level_sensitive]
464 * to contain Priority data. 527 * polarity/trigger interrupts are allowed (ACPI spec, section
528 * "IRQ Format"), so 0x00 and 0x09 are illegal.
465 */ 529 */
466 if (ACPI_ACCEPTABLE_CONFIGURATION == 530 ACPI_ERROR((AE_INFO,
467 linked_list->data.start_dpf.compatibility_priority && 531 "Invalid interrupt polarity/trigger in resource list, %X",
468 ACPI_ACCEPTABLE_CONFIGURATION == 532 aml->irq.flags));
469 linked_list->data.start_dpf.performance_robustness) { 533 return_ACPI_STATUS(AE_BAD_DATA);
470 *buffer = 0x30;
471 } else {
472 *buffer = 0x31;
473 buffer += 1;
474
475 /* Set the Priority Byte Definition */
476
477 temp8 = 0;
478 temp8 =
479 (u8) ((linked_list->data.start_dpf.
480 performance_robustness & 0x03) << 2);
481 temp8 |=
482 (linked_list->data.start_dpf.compatibility_priority & 0x03);
483 *buffer = temp8;
484 }
485
486 buffer += 1;
487
488 /* Return the number of bytes consumed in this operation */
489
490 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
491 return_ACPI_STATUS(AE_OK);
492} 534}
493 535
494/******************************************************************************* 536resource->data.extended_irq.interrupt_count = temp8;
495 * 537if (temp8 < 1) {
496 * FUNCTION: acpi_rs_end_depend_fns_stream 538 /* Must have at least one IRQ */
497 *
498 * PARAMETERS: linked_list - Pointer to the resource linked list
499 * output_buffer - Pointer to the user's return buffer
500 * bytes_consumed - Pointer to where the number of bytes
501 * used in the output_buffer is returned
502 *
503 * RETURN: Status
504 *
505 * DESCRIPTION: Take the linked list resource structure and fills in the
506 * the appropriate bytes in a byte stream
507 *
508 ******************************************************************************/
509
510acpi_status
511acpi_rs_end_depend_fns_stream(struct acpi_resource *linked_list,
512 u8 ** output_buffer, acpi_size * bytes_consumed)
513{
514 u8 *buffer = *output_buffer;
515
516 ACPI_FUNCTION_TRACE("rs_end_depend_fns_stream");
517
518 /* The descriptor field is static */
519
520 *buffer = 0x38;
521 buffer += 1;
522 539
523 /* Return the number of bytes consumed in this operation */ 540 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
541}
524 542
525 *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer); 543if (resource->data.dma.transfer == 0x03) {
526 return_ACPI_STATUS(AE_OK); 544 ACPI_ERROR((AE_INFO, "Invalid DMA.Transfer preference (3)"));
545 return_ACPI_STATUS(AE_BAD_DATA);
527} 546}
547#endif
diff --git a/drivers/acpi/resources/rsutils.c b/drivers/acpi/resources/rsutils.c
index 4446778eaf79..25b5aedd6612 100644
--- a/drivers/acpi/resources/rsutils.c
+++ b/drivers/acpi/resources/rsutils.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -50,6 +50,389 @@ ACPI_MODULE_NAME("rsutils")
50 50
51/******************************************************************************* 51/*******************************************************************************
52 * 52 *
53 * FUNCTION: acpi_rs_decode_bitmask
54 *
55 * PARAMETERS: Mask - Bitmask to decode
56 * List - Where the converted list is returned
57 *
58 * RETURN: Count of bits set (length of list)
59 *
60 * DESCRIPTION: Convert a bit mask into a list of values
61 *
62 ******************************************************************************/
63u8 acpi_rs_decode_bitmask(u16 mask, u8 * list)
64{
65 acpi_native_uint i;
66 u8 bit_count;
67
68 ACPI_FUNCTION_ENTRY();
69
70 /* Decode the mask bits */
71
72 for (i = 0, bit_count = 0; mask; i++) {
73 if (mask & 0x0001) {
74 list[bit_count] = (u8) i;
75 bit_count++;
76 }
77
78 mask >>= 1;
79 }
80
81 return (bit_count);
82}
83
84/*******************************************************************************
85 *
86 * FUNCTION: acpi_rs_encode_bitmask
87 *
88 * PARAMETERS: List - List of values to encode
89 * Count - Length of list
90 *
91 * RETURN: Encoded bitmask
92 *
93 * DESCRIPTION: Convert a list of values to an encoded bitmask
94 *
95 ******************************************************************************/
96
97u16 acpi_rs_encode_bitmask(u8 * list, u8 count)
98{
99 acpi_native_uint i;
100 u16 mask;
101
102 ACPI_FUNCTION_ENTRY();
103
104 /* Encode the list into a single bitmask */
105
106 for (i = 0, mask = 0; i < count; i++) {
107 mask |= (0x0001 << list[i]);
108 }
109
110 return (mask);
111}
112
113/*******************************************************************************
114 *
115 * FUNCTION: acpi_rs_move_data
116 *
117 * PARAMETERS: Destination - Pointer to the destination descriptor
118 * Source - Pointer to the source descriptor
119 * item_count - How many items to move
120 * move_type - Byte width
121 *
122 * RETURN: None
123 *
124 * DESCRIPTION: Move multiple data items from one descriptor to another. Handles
125 * alignment issues and endian issues if necessary, as configured
126 * via the ACPI_MOVE_* macros. (This is why a memcpy is not used)
127 *
128 ******************************************************************************/
129
130void
131acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
132{
133 acpi_native_uint i;
134
135 ACPI_FUNCTION_ENTRY();
136
137 /* One move per item */
138
139 for (i = 0; i < item_count; i++) {
140 switch (move_type) {
141 /*
142 * For the 8-bit case, we can perform the move all at once
143 * since there are no alignment or endian issues
144 */
145 case ACPI_RSC_MOVE8:
146 ACPI_MEMCPY(destination, source, item_count);
147 return;
148
149 /*
150 * 16-, 32-, and 64-bit cases must use the move macros that perform
151 * endian conversion and/or accomodate hardware that cannot perform
152 * misaligned memory transfers
153 */
154 case ACPI_RSC_MOVE16:
155 ACPI_MOVE_16_TO_16(&ACPI_CAST_PTR(u16, destination)[i],
156 &ACPI_CAST_PTR(u16, source)[i]);
157 break;
158
159 case ACPI_RSC_MOVE32:
160 ACPI_MOVE_32_TO_32(&ACPI_CAST_PTR(u32, destination)[i],
161 &ACPI_CAST_PTR(u32, source)[i]);
162 break;
163
164 case ACPI_RSC_MOVE64:
165 ACPI_MOVE_64_TO_64(&ACPI_CAST_PTR(u64, destination)[i],
166 &ACPI_CAST_PTR(u64, source)[i]);
167 break;
168
169 default:
170 return;
171 }
172 }
173}
174
175/*******************************************************************************
176 *
177 * FUNCTION: acpi_rs_set_resource_length
178 *
179 * PARAMETERS: total_length - Length of the AML descriptor, including
180 * the header and length fields.
181 * Aml - Pointer to the raw AML descriptor
182 *
183 * RETURN: None
184 *
185 * DESCRIPTION: Set the resource_length field of an AML
186 * resource descriptor, both Large and Small descriptors are
187 * supported automatically. Note: Descriptor Type field must
188 * be valid.
189 *
190 ******************************************************************************/
191
192void
193acpi_rs_set_resource_length(acpi_rsdesc_size total_length,
194 union aml_resource *aml)
195{
196 acpi_rs_length resource_length;
197
198 ACPI_FUNCTION_ENTRY();
199
200 /* Length is the total descriptor length minus the header length */
201
202 resource_length = (acpi_rs_length)
203 (total_length - acpi_ut_get_resource_header_length(aml));
204
205 /* Length is stored differently for large and small descriptors */
206
207 if (aml->small_header.descriptor_type & ACPI_RESOURCE_NAME_LARGE) {
208 /* Large descriptor -- bytes 1-2 contain the 16-bit length */
209
210 ACPI_MOVE_16_TO_16(&aml->large_header.resource_length,
211 &resource_length);
212 } else {
213 /* Small descriptor -- bits 2:0 of byte 0 contain the length */
214
215 aml->small_header.descriptor_type = (u8)
216
217 /* Clear any existing length, preserving descriptor type bits */
218 ((aml->small_header.
219 descriptor_type & ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK)
220
221 | resource_length);
222 }
223}
224
225/*******************************************************************************
226 *
227 * FUNCTION: acpi_rs_set_resource_header
228 *
229 * PARAMETERS: descriptor_type - Byte to be inserted as the type
230 * total_length - Length of the AML descriptor, including
231 * the header and length fields.
232 * Aml - Pointer to the raw AML descriptor
233 *
234 * RETURN: None
235 *
236 * DESCRIPTION: Set the descriptor_type and resource_length fields of an AML
237 * resource descriptor, both Large and Small descriptors are
238 * supported automatically
239 *
240 ******************************************************************************/
241
242void
243acpi_rs_set_resource_header(u8 descriptor_type,
244 acpi_rsdesc_size total_length,
245 union aml_resource *aml)
246{
247 ACPI_FUNCTION_ENTRY();
248
249 /* Set the Resource Type */
250
251 aml->small_header.descriptor_type = descriptor_type;
252
253 /* Set the Resource Length */
254
255 acpi_rs_set_resource_length(total_length, aml);
256}
257
258/*******************************************************************************
259 *
260 * FUNCTION: acpi_rs_strcpy
261 *
262 * PARAMETERS: Destination - Pointer to the destination string
263 * Source - Pointer to the source string
264 *
265 * RETURN: String length, including NULL terminator
266 *
267 * DESCRIPTION: Local string copy that returns the string length, saving a
268 * strcpy followed by a strlen.
269 *
270 ******************************************************************************/
271
272static u16 acpi_rs_strcpy(char *destination, char *source)
273{
274 u16 i;
275
276 ACPI_FUNCTION_ENTRY();
277
278 for (i = 0; source[i]; i++) {
279 destination[i] = source[i];
280 }
281
282 destination[i] = 0;
283
284 /* Return string length including the NULL terminator */
285
286 return ((u16) (i + 1));
287}
288
289/*******************************************************************************
290 *
291 * FUNCTION: acpi_rs_get_resource_source
292 *
293 * PARAMETERS: resource_length - Length field of the descriptor
294 * minimum_length - Minimum length of the descriptor (minus
295 * any optional fields)
296 * resource_source - Where the resource_source is returned
297 * Aml - Pointer to the raw AML descriptor
298 * string_ptr - (optional) where to store the actual
299 * resource_source string
300 *
301 * RETURN: Length of the string plus NULL terminator, rounded up to 32 bit
302 *
303 * DESCRIPTION: Copy the optional resource_source data from a raw AML descriptor
304 * to an internal resource descriptor
305 *
306 ******************************************************************************/
307
308acpi_rs_length
309acpi_rs_get_resource_source(acpi_rs_length resource_length,
310 acpi_rs_length minimum_length,
311 struct acpi_resource_source * resource_source,
312 union aml_resource * aml, char *string_ptr)
313{
314 acpi_rsdesc_size total_length;
315 u8 *aml_resource_source;
316
317 ACPI_FUNCTION_ENTRY();
318
319 total_length =
320 resource_length + sizeof(struct aml_resource_large_header);
321 aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length);
322
323 /*
324 * resource_source is present if the length of the descriptor is longer than
325 * the minimum length.
326 *
327 * Note: Some resource descriptors will have an additional null, so
328 * we add 1 to the minimum length.
329 */
330 if (total_length > (acpi_rsdesc_size) (minimum_length + 1)) {
331 /* Get the resource_source_index */
332
333 resource_source->index = aml_resource_source[0];
334
335 resource_source->string_ptr = string_ptr;
336 if (!string_ptr) {
337 /*
338 * String destination pointer is not specified; Set the String
339 * pointer to the end of the current resource_source structure.
340 */
341 resource_source->string_ptr =
342 ACPI_ADD_PTR(char, resource_source,
343 sizeof(struct acpi_resource_source));
344 }
345
346 /*
347 * In order for the struct_size to fall on a 32-bit boundary, calculate
348 * the length of the string (+1 for the NULL terminator) and expand the
349 * struct_size to the next 32-bit boundary.
350 *
351 * Zero the entire area of the buffer.
352 */
353 total_length =
354 ACPI_ROUND_UP_to_32_bITS(ACPI_STRLEN
355 ((char *)&aml_resource_source[1]) +
356 1);
357 ACPI_MEMSET(resource_source->string_ptr, 0, total_length);
358
359 /* Copy the resource_source string to the destination */
360
361 resource_source->string_length =
362 acpi_rs_strcpy(resource_source->string_ptr,
363 (char *)&aml_resource_source[1]);
364
365 return ((acpi_rs_length) total_length);
366 }
367
368 /* resource_source is not present */
369
370 resource_source->index = 0;
371 resource_source->string_length = 0;
372 resource_source->string_ptr = NULL;
373 return (0);
374}
375
376/*******************************************************************************
377 *
378 * FUNCTION: acpi_rs_set_resource_source
379 *
380 * PARAMETERS: Aml - Pointer to the raw AML descriptor
381 * minimum_length - Minimum length of the descriptor (minus
382 * any optional fields)
383 * resource_source - Internal resource_source
384
385 *
386 * RETURN: Total length of the AML descriptor
387 *
388 * DESCRIPTION: Convert an optional resource_source from internal format to a
389 * raw AML resource descriptor
390 *
391 ******************************************************************************/
392
393acpi_rsdesc_size
394acpi_rs_set_resource_source(union aml_resource * aml,
395 acpi_rs_length minimum_length,
396 struct acpi_resource_source * resource_source)
397{
398 u8 *aml_resource_source;
399 acpi_rsdesc_size descriptor_length;
400
401 ACPI_FUNCTION_ENTRY();
402
403 descriptor_length = minimum_length;
404
405 /* Non-zero string length indicates presence of a resource_source */
406
407 if (resource_source->string_length) {
408 /* Point to the end of the AML descriptor */
409
410 aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length);
411
412 /* Copy the resource_source_index */
413
414 aml_resource_source[0] = (u8) resource_source->index;
415
416 /* Copy the resource_source string */
417
418 ACPI_STRCPY((char *)&aml_resource_source[1],
419 resource_source->string_ptr);
420
421 /*
422 * Add the length of the string (+ 1 for null terminator) to the
423 * final descriptor length
424 */
425 descriptor_length +=
426 ((acpi_rsdesc_size) resource_source->string_length + 1);
427 }
428
429 /* Return the new total length of the AML descriptor */
430
431 return (descriptor_length);
432}
433
434/*******************************************************************************
435 *
53 * FUNCTION: acpi_rs_get_prt_method_data 436 * FUNCTION: acpi_rs_get_prt_method_data
54 * 437 *
55 * PARAMETERS: Handle - a handle to the containing object 438 * PARAMETERS: Handle - a handle to the containing object
@@ -65,8 +448,9 @@ ACPI_MODULE_NAME("rsutils")
65 * and the contents of the callers buffer is undefined. 448 * and the contents of the callers buffer is undefined.
66 * 449 *
67 ******************************************************************************/ 450 ******************************************************************************/
451
68acpi_status 452acpi_status
69acpi_rs_get_prt_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer) 453acpi_rs_get_prt_method_data(acpi_handle handle, struct acpi_buffer * ret_buffer)
70{ 454{
71 union acpi_operand_object *obj_desc; 455 union acpi_operand_object *obj_desc;
72 acpi_status status; 456 acpi_status status;
@@ -284,7 +668,7 @@ acpi_rs_set_srs_method_data(acpi_handle handle, struct acpi_buffer *in_buffer)
284 * Convert the linked list into a byte stream 668 * Convert the linked list into a byte stream
285 */ 669 */
286 buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 670 buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
287 status = acpi_rs_create_byte_stream(in_buffer->pointer, &buffer); 671 status = acpi_rs_create_aml_resources(in_buffer->pointer, &buffer);
288 if (ACPI_FAILURE(status)) { 672 if (ACPI_FAILURE(status)) {
289 return_ACPI_STATUS(status); 673 return_ACPI_STATUS(status);
290 } 674 }
diff --git a/drivers/acpi/resources/rsxface.c b/drivers/acpi/resources/rsxface.c
index ee5a5c509199..88b67077aeeb 100644
--- a/drivers/acpi/resources/rsxface.c
+++ b/drivers/acpi/resources/rsxface.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -57,13 +57,17 @@ ACPI_MODULE_NAME("rsxface")
57 ACPI_COPY_FIELD(out, in, decode); \ 57 ACPI_COPY_FIELD(out, in, decode); \
58 ACPI_COPY_FIELD(out, in, min_address_fixed); \ 58 ACPI_COPY_FIELD(out, in, min_address_fixed); \
59 ACPI_COPY_FIELD(out, in, max_address_fixed); \ 59 ACPI_COPY_FIELD(out, in, max_address_fixed); \
60 ACPI_COPY_FIELD(out, in, attribute); \ 60 ACPI_COPY_FIELD(out, in, info); \
61 ACPI_COPY_FIELD(out, in, granularity); \ 61 ACPI_COPY_FIELD(out, in, granularity); \
62 ACPI_COPY_FIELD(out, in, min_address_range); \ 62 ACPI_COPY_FIELD(out, in, minimum); \
63 ACPI_COPY_FIELD(out, in, max_address_range); \ 63 ACPI_COPY_FIELD(out, in, maximum); \
64 ACPI_COPY_FIELD(out, in, address_translation_offset); \ 64 ACPI_COPY_FIELD(out, in, translation_offset); \
65 ACPI_COPY_FIELD(out, in, address_length); \ 65 ACPI_COPY_FIELD(out, in, address_length); \
66 ACPI_COPY_FIELD(out, in, resource_source); 66 ACPI_COPY_FIELD(out, in, resource_source);
67/* Local prototypes */
68static acpi_status
69acpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context);
70
67/******************************************************************************* 71/*******************************************************************************
68 * 72 *
69 * FUNCTION: acpi_get_irq_routing_table 73 * FUNCTION: acpi_get_irq_routing_table
@@ -86,6 +90,7 @@ ACPI_MODULE_NAME("rsxface")
86 * the object indicated by the passed device_handle. 90 * the object indicated by the passed device_handle.
87 * 91 *
88 ******************************************************************************/ 92 ******************************************************************************/
93
89acpi_status 94acpi_status
90acpi_get_irq_routing_table(acpi_handle device_handle, 95acpi_get_irq_routing_table(acpi_handle device_handle,
91 struct acpi_buffer *ret_buffer) 96 struct acpi_buffer *ret_buffer)
@@ -222,12 +227,12 @@ EXPORT_SYMBOL(acpi_get_possible_resources);
222 * 227 *
223 * FUNCTION: acpi_walk_resources 228 * FUNCTION: acpi_walk_resources
224 * 229 *
225 * PARAMETERS: device_handle - a handle to the device object for the 230 * PARAMETERS: device_handle - Handle to the device object for the
226 * device we are querying 231 * device we are querying
227 * Path - method name of the resources we want 232 * Name - Method name of the resources we want
228 * (METHOD_NAME__CRS or METHOD_NAME__PRS) 233 * (METHOD_NAME__CRS or METHOD_NAME__PRS)
229 * user_function - called for each resource 234 * user_function - Called for each resource
230 * Context - passed to user_function 235 * Context - Passed to user_function
231 * 236 *
232 * RETURN: Status 237 * RETURN: Status
233 * 238 *
@@ -239,79 +244,74 @@ EXPORT_SYMBOL(acpi_get_possible_resources);
239 244
240acpi_status 245acpi_status
241acpi_walk_resources(acpi_handle device_handle, 246acpi_walk_resources(acpi_handle device_handle,
242 char *path, 247 char *name,
243 ACPI_WALK_RESOURCE_CALLBACK user_function, void *context) 248 ACPI_WALK_RESOURCE_CALLBACK user_function, void *context)
244{ 249{
245 acpi_status status; 250 acpi_status status;
246 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 251 struct acpi_buffer buffer;
247 struct acpi_resource *resource; 252 struct acpi_resource *resource;
248 struct acpi_resource *buffer_end; 253 struct acpi_resource *resource_end;
249 254
250 ACPI_FUNCTION_TRACE("acpi_walk_resources"); 255 ACPI_FUNCTION_TRACE("acpi_walk_resources");
251 256
252 if (!device_handle || 257 /* Parameter validation */
253 (ACPI_STRNCMP(path, METHOD_NAME__CRS, sizeof(METHOD_NAME__CRS)) && 258
254 ACPI_STRNCMP(path, METHOD_NAME__PRS, sizeof(METHOD_NAME__PRS)))) { 259 if (!device_handle || !user_function || !name ||
260 (ACPI_STRNCMP(name, METHOD_NAME__CRS, sizeof(METHOD_NAME__CRS)) &&
261 ACPI_STRNCMP(name, METHOD_NAME__PRS, sizeof(METHOD_NAME__PRS)))) {
255 return_ACPI_STATUS(AE_BAD_PARAMETER); 262 return_ACPI_STATUS(AE_BAD_PARAMETER);
256 } 263 }
257 264
258 status = acpi_rs_get_method_data(device_handle, path, &buffer); 265 /* Get the _CRS or _PRS resource list */
266
267 buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
268 status = acpi_rs_get_method_data(device_handle, name, &buffer);
259 if (ACPI_FAILURE(status)) { 269 if (ACPI_FAILURE(status)) {
260 return_ACPI_STATUS(status); 270 return_ACPI_STATUS(status);
261 } 271 }
262 272
263 /* Setup pointers */ 273 /* Buffer now contains the resource list */
264 274
265 resource = (struct acpi_resource *)buffer.pointer; 275 resource = ACPI_CAST_PTR(struct acpi_resource, buffer.pointer);
266 buffer_end = ACPI_CAST_PTR(struct acpi_resource, 276 resource_end =
267 ((u8 *) buffer.pointer + buffer.length)); 277 ACPI_ADD_PTR(struct acpi_resource, buffer.pointer, buffer.length);
268 278
269 /* Walk the resource list */ 279 /* Walk the resource list until the end_tag is found (or buffer end) */
270 280
271 for (;;) { 281 while (resource < resource_end) {
272 if (!resource || resource->id == ACPI_RSTYPE_END_TAG) { 282 /* Sanity check the resource */
283
284 if (resource->type > ACPI_RESOURCE_TYPE_MAX) {
285 status = AE_AML_INVALID_RESOURCE_TYPE;
273 break; 286 break;
274 } 287 }
275 288
276 status = user_function(resource, context); 289 /* Invoke the user function, abort on any error returned */
277
278 switch (status) {
279 case AE_OK:
280 case AE_CTRL_DEPTH:
281 290
282 /* Just keep going */ 291 status = user_function(resource, context);
292 if (ACPI_FAILURE(status)) {
293 if (status == AE_CTRL_TERMINATE) {
294 /* This is an OK termination by the user function */
283 295
284 status = AE_OK; 296 status = AE_OK;
297 }
285 break; 298 break;
299 }
286 300
287 case AE_CTRL_TERMINATE: 301 /* end_tag indicates end-of-list */
288
289 /* Exit now, with OK stats */
290
291 status = AE_OK;
292 goto cleanup;
293
294 default:
295
296 /* All others are valid exceptions */
297 302
298 goto cleanup; 303 if (resource->type == ACPI_RESOURCE_TYPE_END_TAG) {
304 break;
299 } 305 }
300 306
301 /* Get the next resource descriptor */ 307 /* Get the next resource descriptor */
302 308
303 resource = ACPI_NEXT_RESOURCE(resource); 309 resource =
304 310 ACPI_ADD_PTR(struct acpi_resource, resource,
305 /* Check for end-of-buffer */ 311 resource->length);
306
307 if (resource >= buffer_end) {
308 goto cleanup;
309 }
310 } 312 }
311 313
312 cleanup: 314 ACPI_MEM_FREE(buffer.pointer);
313
314 acpi_os_free(buffer.pointer);
315 return_ACPI_STATUS(status); 315 return_ACPI_STATUS(status);
316} 316}
317 317
@@ -360,8 +360,8 @@ EXPORT_SYMBOL(acpi_set_current_resources);
360 * 360 *
361 * FUNCTION: acpi_resource_to_address64 361 * FUNCTION: acpi_resource_to_address64
362 * 362 *
363 * PARAMETERS: resource - Pointer to a resource 363 * PARAMETERS: Resource - Pointer to a resource
364 * out - Pointer to the users's return 364 * Out - Pointer to the users's return
365 * buffer (a struct 365 * buffer (a struct
366 * struct acpi_resource_address64) 366 * struct acpi_resource_address64)
367 * 367 *
@@ -381,20 +381,26 @@ acpi_resource_to_address64(struct acpi_resource *resource,
381 struct acpi_resource_address16 *address16; 381 struct acpi_resource_address16 *address16;
382 struct acpi_resource_address32 *address32; 382 struct acpi_resource_address32 *address32;
383 383
384 switch (resource->id) { 384 if (!resource || !out) {
385 case ACPI_RSTYPE_ADDRESS16: 385 return (AE_BAD_PARAMETER);
386 }
387
388 /* Convert 16 or 32 address descriptor to 64 */
389
390 switch (resource->type) {
391 case ACPI_RESOURCE_TYPE_ADDRESS16:
386 392
387 address16 = (struct acpi_resource_address16 *)&resource->data; 393 address16 = (struct acpi_resource_address16 *)&resource->data;
388 ACPI_COPY_ADDRESS(out, address16); 394 ACPI_COPY_ADDRESS(out, address16);
389 break; 395 break;
390 396
391 case ACPI_RSTYPE_ADDRESS32: 397 case ACPI_RESOURCE_TYPE_ADDRESS32:
392 398
393 address32 = (struct acpi_resource_address32 *)&resource->data; 399 address32 = (struct acpi_resource_address32 *)&resource->data;
394 ACPI_COPY_ADDRESS(out, address32); 400 ACPI_COPY_ADDRESS(out, address32);
395 break; 401 break;
396 402
397 case ACPI_RSTYPE_ADDRESS64: 403 case ACPI_RESOURCE_TYPE_ADDRESS64:
398 404
399 /* Simple copy for 64 bit source */ 405 /* Simple copy for 64 bit source */
400 406
@@ -410,3 +416,113 @@ acpi_resource_to_address64(struct acpi_resource *resource,
410} 416}
411 417
412EXPORT_SYMBOL(acpi_resource_to_address64); 418EXPORT_SYMBOL(acpi_resource_to_address64);
419
420/*******************************************************************************
421 *
422 * FUNCTION: acpi_get_vendor_resource
423 *
424 * PARAMETERS: device_handle - Handle for the parent device object
425 * Name - Method name for the parent resource
426 * (METHOD_NAME__CRS or METHOD_NAME__PRS)
427 * Uuid - Pointer to the UUID to be matched.
428 * includes both subtype and 16-byte UUID
429 * ret_buffer - Where the vendor resource is returned
430 *
431 * RETURN: Status
432 *
433 * DESCRIPTION: Walk a resource template for the specified evice to find a
434 * vendor-defined resource that matches the supplied UUID and
435 * UUID subtype. Returns a struct acpi_resource of type Vendor.
436 *
437 ******************************************************************************/
438
439acpi_status
440acpi_get_vendor_resource(acpi_handle device_handle,
441 char *name,
442 struct acpi_vendor_uuid * uuid,
443 struct acpi_buffer * ret_buffer)
444{
445 struct acpi_vendor_walk_info info;
446 acpi_status status;
447
448 /* Other parameters are validated by acpi_walk_resources */
449
450 if (!uuid || !ret_buffer) {
451 return (AE_BAD_PARAMETER);
452 }
453
454 info.uuid = uuid;
455 info.buffer = ret_buffer;
456 info.status = AE_NOT_EXIST;
457
458 /* Walk the _CRS or _PRS resource list for this device */
459
460 status =
461 acpi_walk_resources(device_handle, name,
462 acpi_rs_match_vendor_resource, &info);
463 if (ACPI_FAILURE(status)) {
464 return (status);
465 }
466
467 return (info.status);
468}
469
470/*******************************************************************************
471 *
472 * FUNCTION: acpi_rs_match_vendor_resource
473 *
474 * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK
475 *
476 * RETURN: Status
477 *
478 * DESCRIPTION: Match a vendor resource via the ACPI 3.0 UUID
479 *
480 ******************************************************************************/
481
482static acpi_status
483acpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context)
484{
485 struct acpi_vendor_walk_info *info = context;
486 struct acpi_resource_vendor_typed *vendor;
487 struct acpi_buffer *buffer;
488 acpi_status status;
489
490 /* Ignore all descriptors except Vendor */
491
492 if (resource->type != ACPI_RESOURCE_TYPE_VENDOR) {
493 return (AE_OK);
494 }
495
496 vendor = &resource->data.vendor_typed;
497
498 /*
499 * For a valid match, these conditions must hold:
500 *
501 * 1) Length of descriptor data must be at least as long as a UUID struct
502 * 2) The UUID subtypes must match
503 * 3) The UUID data must match
504 */
505 if ((vendor->byte_length < (ACPI_UUID_LENGTH + 1)) ||
506 (vendor->uuid_subtype != info->uuid->subtype) ||
507 (ACPI_MEMCMP(vendor->uuid, info->uuid->data, ACPI_UUID_LENGTH))) {
508 return (AE_OK);
509 }
510
511 /* Validate/Allocate/Clear caller buffer */
512
513 buffer = info->buffer;
514 status = acpi_ut_initialize_buffer(buffer, resource->length);
515 if (ACPI_FAILURE(status)) {
516 return (status);
517 }
518
519 /* Found the correct resource, copy and return it */
520
521 ACPI_MEMCPY(buffer->pointer, resource, resource->length);
522 buffer->length = resource->length;
523
524 /* Found the desired descriptor, terminate resource walk */
525
526 info->status = AE_OK;
527 return (AE_CTRL_TERMINATE);
528}
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 3b26a7104363..9271e5209ac1 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -851,7 +851,7 @@ static void acpi_device_set_id(struct acpi_device *device,
851 * ---- 851 * ----
852 * Fix for the system root bus device -- the only root-level device. 852 * Fix for the system root bus device -- the only root-level device.
853 */ 853 */
854 if ((parent == ACPI_ROOT_OBJECT) && (type == ACPI_BUS_TYPE_DEVICE)) { 854 if (((acpi_handle)parent == ACPI_ROOT_OBJECT) && (type == ACPI_BUS_TYPE_DEVICE)) {
855 hid = ACPI_BUS_HID; 855 hid = ACPI_BUS_HID;
856 strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME); 856 strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME);
857 strcpy(device->pnp.device_class, ACPI_BUS_CLASS); 857 strcpy(device->pnp.device_class, ACPI_BUS_CLASS);
diff --git a/drivers/acpi/sleep/poweroff.c b/drivers/acpi/sleep/poweroff.c
index af7935a95bcc..47fb4b394eec 100644
--- a/drivers/acpi/sleep/poweroff.c
+++ b/drivers/acpi/sleep/poweroff.c
@@ -33,9 +33,7 @@ int acpi_sleep_prepare(u32 acpi_state)
33 ACPI_FLUSH_CPU_CACHE(); 33 ACPI_FLUSH_CPU_CACHE();
34 acpi_enable_wakeup_device_prep(acpi_state); 34 acpi_enable_wakeup_device_prep(acpi_state);
35#endif 35#endif
36 if (acpi_state == ACPI_STATE_S5) { 36 acpi_gpe_sleep_prepare(acpi_state);
37 acpi_wakeup_gpe_poweroff_prepare();
38 }
39 acpi_enter_sleep_state_prep(acpi_state); 37 acpi_enter_sleep_state_prep(acpi_state);
40 return 0; 38 return 0;
41} 39}
@@ -53,11 +51,16 @@ void acpi_power_off(void)
53 51
54static int acpi_shutdown(struct sys_device *x) 52static int acpi_shutdown(struct sys_device *x)
55{ 53{
56 if (system_state == SYSTEM_POWER_OFF) { 54 switch (system_state) {
57 /* Prepare if we are going to power off the system */ 55 case SYSTEM_POWER_OFF:
56 /* Prepare to power off the system */
58 return acpi_sleep_prepare(ACPI_STATE_S5); 57 return acpi_sleep_prepare(ACPI_STATE_S5);
58 case SYSTEM_SUSPEND_DISK:
59 /* Prepare to suspend the system to disk */
60 return acpi_sleep_prepare(ACPI_STATE_S4);
61 default:
62 return 0;
59 } 63 }
60 return 0;
61} 64}
62 65
63static struct sysdev_class acpi_sysclass = { 66static struct sysdev_class acpi_sysclass = {
diff --git a/drivers/acpi/sleep/sleep.h b/drivers/acpi/sleep/sleep.h
index efd0001c6f05..f3e70397a7d6 100644
--- a/drivers/acpi/sleep/sleep.h
+++ b/drivers/acpi/sleep/sleep.h
@@ -5,4 +5,4 @@ extern int acpi_suspend (u32 state);
5extern void acpi_enable_wakeup_device_prep(u8 sleep_state); 5extern void acpi_enable_wakeup_device_prep(u8 sleep_state);
6extern void acpi_enable_wakeup_device(u8 sleep_state); 6extern void acpi_enable_wakeup_device(u8 sleep_state);
7extern void acpi_disable_wakeup_device(u8 sleep_state); 7extern void acpi_disable_wakeup_device(u8 sleep_state);
8extern void acpi_wakeup_gpe_poweroff_prepare(void); 8extern void acpi_gpe_sleep_prepare(u32 sleep_state);
diff --git a/drivers/acpi/sleep/wakeup.c b/drivers/acpi/sleep/wakeup.c
index 4134ed43d026..85df0ceda2a9 100644
--- a/drivers/acpi/sleep/wakeup.c
+++ b/drivers/acpi/sleep/wakeup.c
@@ -192,7 +192,7 @@ late_initcall(acpi_wakeup_device_init);
192 * RUNTIME GPEs, we simply mark all GPES that 192 * RUNTIME GPEs, we simply mark all GPES that
193 * are not enabled for wakeup from S5 as RUNTIME. 193 * are not enabled for wakeup from S5 as RUNTIME.
194 */ 194 */
195void acpi_wakeup_gpe_poweroff_prepare(void) 195void acpi_gpe_sleep_prepare(u32 sleep_state)
196{ 196{
197 struct list_head *node, *next; 197 struct list_head *node, *next;
198 198
@@ -201,8 +201,8 @@ void acpi_wakeup_gpe_poweroff_prepare(void)
201 struct acpi_device, 201 struct acpi_device,
202 wakeup_list); 202 wakeup_list);
203 203
204 /* The GPE can wakeup system from S5, don't touch it */ 204 /* The GPE can wakeup system from this state, don't touch it */
205 if ((u32) dev->wakeup.sleep_state == ACPI_STATE_S5) 205 if ((u32) dev->wakeup.sleep_state >= sleep_state)
206 continue; 206 continue;
207 /* acpi_set_gpe_type will automatically disable GPE */ 207 /* acpi_set_gpe_type will automatically disable GPE */
208 acpi_set_gpe_type(dev->wakeup.gpe_device, 208 acpi_set_gpe_type(dev->wakeup.gpe_device,
diff --git a/drivers/acpi/tables/tbconvrt.c b/drivers/acpi/tables/tbconvrt.c
index a03939399fa9..03b37d2223bc 100644
--- a/drivers/acpi/tables/tbconvrt.c
+++ b/drivers/acpi/tables/tbconvrt.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -501,8 +501,8 @@ acpi_status acpi_tb_convert_table_fadt(void)
501 * at least as long as the version 1.0 FADT 501 * at least as long as the version 1.0 FADT
502 */ 502 */
503 if (acpi_gbl_FADT->length < sizeof(struct fadt_descriptor_rev1)) { 503 if (acpi_gbl_FADT->length < sizeof(struct fadt_descriptor_rev1)) {
504 ACPI_REPORT_ERROR(("FADT is invalid, too short: 0x%X\n", 504 ACPI_ERROR((AE_INFO, "FADT is invalid, too short: 0x%X",
505 acpi_gbl_FADT->length)); 505 acpi_gbl_FADT->length));
506 return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH); 506 return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
507 } 507 }
508 508
@@ -517,7 +517,10 @@ acpi_status acpi_tb_convert_table_fadt(void)
517 if (acpi_gbl_FADT->length < sizeof(struct fadt_descriptor_rev2)) { 517 if (acpi_gbl_FADT->length < sizeof(struct fadt_descriptor_rev2)) {
518 /* Length is too short to be a V2.0 table */ 518 /* Length is too short to be a V2.0 table */
519 519
520 ACPI_REPORT_WARNING(("Inconsistent FADT length (0x%X) and revision (0x%X), using FADT V1.0 portion of table\n", acpi_gbl_FADT->length, acpi_gbl_FADT->revision)); 520 ACPI_WARNING((AE_INFO,
521 "Inconsistent FADT length (0x%X) and revision (0x%X), using FADT V1.0 portion of table",
522 acpi_gbl_FADT->length,
523 acpi_gbl_FADT->revision));
521 524
522 acpi_tb_convert_fadt1(local_fadt, 525 acpi_tb_convert_fadt1(local_fadt,
523 (void *)acpi_gbl_FADT); 526 (void *)acpi_gbl_FADT);
@@ -554,7 +557,9 @@ acpi_status acpi_tb_convert_table_fadt(void)
554 ACPI_DEBUG_PRINT((ACPI_DB_TABLES, 557 ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
555 "Hex dump of common internal FADT, size %d (%X)\n", 558 "Hex dump of common internal FADT, size %d (%X)\n",
556 acpi_gbl_FADT->length, acpi_gbl_FADT->length)); 559 acpi_gbl_FADT->length, acpi_gbl_FADT->length));
557 ACPI_DUMP_BUFFER((u8 *) (acpi_gbl_FADT), acpi_gbl_FADT->length); 560
561 ACPI_DUMP_BUFFER(ACPI_CAST_PTR(u8, acpi_gbl_FADT),
562 acpi_gbl_FADT->length);
558 563
559 return_ACPI_STATUS(AE_OK); 564 return_ACPI_STATUS(AE_OK);
560} 565}
@@ -580,13 +585,15 @@ acpi_status acpi_tb_build_common_facs(struct acpi_table_desc *table_info)
580 /* Absolute minimum length is 24, but the ACPI spec says 64 */ 585 /* Absolute minimum length is 24, but the ACPI spec says 64 */
581 586
582 if (acpi_gbl_FACS->length < 24) { 587 if (acpi_gbl_FACS->length < 24) {
583 ACPI_REPORT_ERROR(("Invalid FACS table length: 0x%X\n", 588 ACPI_ERROR((AE_INFO, "Invalid FACS table length: 0x%X",
584 acpi_gbl_FACS->length)); 589 acpi_gbl_FACS->length));
585 return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH); 590 return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
586 } 591 }
587 592
588 if (acpi_gbl_FACS->length < 64) { 593 if (acpi_gbl_FACS->length < 64) {
589 ACPI_REPORT_WARNING(("FACS is shorter than the ACPI specification allows: 0x%X, using anyway\n", acpi_gbl_FACS->length)); 594 ACPI_WARNING((AE_INFO,
595 "FACS is shorter than the ACPI specification allows: 0x%X, using anyway",
596 acpi_gbl_FACS->length));
590 } 597 }
591 598
592 /* Copy fields to the new FACS */ 599 /* Copy fields to the new FACS */
diff --git a/drivers/acpi/tables/tbget.c b/drivers/acpi/tables/tbget.c
index 6acd5aeb093e..09b4ee6dfd60 100644
--- a/drivers/acpi/tables/tbget.c
+++ b/drivers/acpi/tables/tbget.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -91,9 +91,9 @@ acpi_tb_get_table(struct acpi_pointer *address,
91 91
92 status = acpi_tb_get_table_body(address, &header, table_info); 92 status = acpi_tb_get_table_body(address, &header, table_info);
93 if (ACPI_FAILURE(status)) { 93 if (ACPI_FAILURE(status)) {
94 ACPI_REPORT_ERROR(("Could not get ACPI table (size %X), %s\n", 94 ACPI_EXCEPTION((AE_INFO, status,
95 header.length, 95 "Could not get ACPI table (size %X)",
96 acpi_format_exception(status))); 96 header.length));
97 return_ACPI_STATUS(status); 97 return_ACPI_STATUS(status);
98 } 98 }
99 99
@@ -148,7 +148,6 @@ acpi_tb_get_table_header(struct acpi_pointer *address,
148 sizeof(struct acpi_table_header), 148 sizeof(struct acpi_table_header),
149 (void *)&header); 149 (void *)&header);
150 if (ACPI_FAILURE(status)) { 150 if (ACPI_FAILURE(status)) {
151 ACPI_REPORT_ERROR(("Could not map memory at %8.8X%8.8X for length %X\n", ACPI_FORMAT_UINT64(address->pointer.physical), sizeof(struct acpi_table_header)));
152 return_ACPI_STATUS(status); 151 return_ACPI_STATUS(status);
153 } 152 }
154 153
@@ -161,8 +160,8 @@ acpi_tb_get_table_header(struct acpi_pointer *address,
161 160
162 default: 161 default:
163 162
164 ACPI_REPORT_ERROR(("Invalid address flags %X\n", 163 ACPI_ERROR((AE_INFO, "Invalid address flags %X",
165 address->pointer_type)); 164 address->pointer_type));
166 return_ACPI_STATUS(AE_BAD_PARAMETER); 165 return_ACPI_STATUS(AE_BAD_PARAMETER);
167 } 166 }
168 167
@@ -253,8 +252,8 @@ acpi_tb_table_override(struct acpi_table_header *header,
253 if (ACPI_FAILURE(status)) { 252 if (ACPI_FAILURE(status)) {
254 /* Some severe error from the OSL, but we basically ignore it */ 253 /* Some severe error from the OSL, but we basically ignore it */
255 254
256 ACPI_REPORT_ERROR(("Could not override ACPI table, %s\n", 255 ACPI_EXCEPTION((AE_INFO, status,
257 acpi_format_exception(status))); 256 "Could not override ACPI table"));
258 return_ACPI_STATUS(status); 257 return_ACPI_STATUS(status);
259 } 258 }
260 259
@@ -273,15 +272,14 @@ acpi_tb_table_override(struct acpi_table_header *header,
273 272
274 status = acpi_tb_get_this_table(&address, new_table, table_info); 273 status = acpi_tb_get_this_table(&address, new_table, table_info);
275 if (ACPI_FAILURE(status)) { 274 if (ACPI_FAILURE(status)) {
276 ACPI_REPORT_ERROR(("Could not copy override ACPI table, %s\n", 275 ACPI_EXCEPTION((AE_INFO, status, "Could not copy ACPI table"));
277 acpi_format_exception(status)));
278 return_ACPI_STATUS(status); 276 return_ACPI_STATUS(status);
279 } 277 }
280 278
281 /* Copy the table info */ 279 /* Copy the table info */
282 280
283 ACPI_REPORT_INFO(("Table [%4.4s] replaced by host OS\n", 281 ACPI_INFO((AE_INFO, "Table [%4.4s] replaced by host OS",
284 table_info->pointer->signature)); 282 table_info->pointer->signature));
285 283
286 return_ACPI_STATUS(AE_OK); 284 return_ACPI_STATUS(AE_OK);
287} 285}
@@ -327,7 +325,9 @@ acpi_tb_get_this_table(struct acpi_pointer *address,
327 325
328 full_table = ACPI_MEM_ALLOCATE(header->length); 326 full_table = ACPI_MEM_ALLOCATE(header->length);
329 if (!full_table) { 327 if (!full_table) {
330 ACPI_REPORT_ERROR(("Could not allocate table memory for [%4.4s] length %X\n", header->signature, header->length)); 328 ACPI_ERROR((AE_INFO,
329 "Could not allocate table memory for [%4.4s] length %X",
330 header->signature, header->length));
331 return_ACPI_STATUS(AE_NO_MEMORY); 331 return_ACPI_STATUS(AE_NO_MEMORY);
332 } 332 }
333 333
@@ -351,7 +351,12 @@ acpi_tb_get_this_table(struct acpi_pointer *address,
351 (acpi_size) header->length, 351 (acpi_size) header->length,
352 (void *)&full_table); 352 (void *)&full_table);
353 if (ACPI_FAILURE(status)) { 353 if (ACPI_FAILURE(status)) {
354 ACPI_REPORT_ERROR(("Could not map memory for table [%4.4s] at %8.8X%8.8X for length %X\n", header->signature, ACPI_FORMAT_UINT64(address->pointer.physical), header->length)); 354 ACPI_ERROR((AE_INFO,
355 "Could not map memory for table [%4.4s] at %8.8X%8.8X for length %X",
356 header->signature,
357 ACPI_FORMAT_UINT64(address->pointer.
358 physical),
359 header->length));
355 return (status); 360 return (status);
356 } 361 }
357 362
@@ -362,8 +367,8 @@ acpi_tb_get_this_table(struct acpi_pointer *address,
362 367
363 default: 368 default:
364 369
365 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid address flags %X\n", 370 ACPI_ERROR((AE_INFO, "Invalid address flags %X",
366 address->pointer_type)); 371 address->pointer_type));
367 return_ACPI_STATUS(AE_BAD_PARAMETER); 372 return_ACPI_STATUS(AE_BAD_PARAMETER);
368 } 373 }
369 374
diff --git a/drivers/acpi/tables/tbgetall.c b/drivers/acpi/tables/tbgetall.c
index 8d72343537e7..134e5dce0bc1 100644
--- a/drivers/acpi/tables/tbgetall.c
+++ b/drivers/acpi/tables/tbgetall.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -152,7 +152,9 @@ acpi_tb_get_secondary_table(struct acpi_pointer *address,
152 /* Signature must match request */ 152 /* Signature must match request */
153 153
154 if (ACPI_STRNCMP(header.signature, signature, ACPI_NAME_SIZE)) { 154 if (ACPI_STRNCMP(header.signature, signature, ACPI_NAME_SIZE)) {
155 ACPI_REPORT_ERROR(("Incorrect table signature - wanted [%s] found [%4.4s]\n", signature, header.signature)); 155 ACPI_ERROR((AE_INFO,
156 "Incorrect table signature - wanted [%s] found [%4.4s]",
157 signature, header.signature));
156 return_ACPI_STATUS(AE_BAD_SIGNATURE); 158 return_ACPI_STATUS(AE_BAD_SIGNATURE);
157 } 159 }
158 160
@@ -231,14 +233,18 @@ acpi_status acpi_tb_get_required_tables(void)
231 */ 233 */
232 status = acpi_tb_get_primary_table(&address, &table_info); 234 status = acpi_tb_get_primary_table(&address, &table_info);
233 if ((status != AE_OK) && (status != AE_TABLE_NOT_SUPPORTED)) { 235 if ((status != AE_OK) && (status != AE_TABLE_NOT_SUPPORTED)) {
234 ACPI_REPORT_WARNING(("%s, while getting table at %8.8X%8.8X\n", acpi_format_exception(status), ACPI_FORMAT_UINT64(address.pointer.value))); 236 ACPI_WARNING((AE_INFO,
237 "%s, while getting table at %8.8X%8.8X",
238 acpi_format_exception(status),
239 ACPI_FORMAT_UINT64(address.pointer.
240 value)));
235 } 241 }
236 } 242 }
237 243
238 /* We must have a FADT to continue */ 244 /* We must have a FADT to continue */
239 245
240 if (!acpi_gbl_FADT) { 246 if (!acpi_gbl_FADT) {
241 ACPI_REPORT_ERROR(("No FADT present in RSDT/XSDT\n")); 247 ACPI_ERROR((AE_INFO, "No FADT present in RSDT/XSDT"));
242 return_ACPI_STATUS(AE_NO_ACPI_TABLES); 248 return_ACPI_STATUS(AE_NO_ACPI_TABLES);
243 } 249 }
244 250
@@ -248,7 +254,8 @@ acpi_status acpi_tb_get_required_tables(void)
248 */ 254 */
249 status = acpi_tb_convert_table_fadt(); 255 status = acpi_tb_convert_table_fadt();
250 if (ACPI_FAILURE(status)) { 256 if (ACPI_FAILURE(status)) {
251 ACPI_REPORT_ERROR(("Could not convert FADT to internal common format\n")); 257 ACPI_ERROR((AE_INFO,
258 "Could not convert FADT to internal common format"));
252 return_ACPI_STATUS(status); 259 return_ACPI_STATUS(status);
253 } 260 }
254 261
@@ -258,8 +265,8 @@ acpi_status acpi_tb_get_required_tables(void)
258 265
259 status = acpi_tb_get_secondary_table(&address, FACS_SIG, &table_info); 266 status = acpi_tb_get_secondary_table(&address, FACS_SIG, &table_info);
260 if (ACPI_FAILURE(status)) { 267 if (ACPI_FAILURE(status)) {
261 ACPI_REPORT_ERROR(("Could not get/install the FACS, %s\n", 268 ACPI_EXCEPTION((AE_INFO, status,
262 acpi_format_exception(status))); 269 "Could not get/install the FACS"));
263 return_ACPI_STATUS(status); 270 return_ACPI_STATUS(status);
264 } 271 }
265 272
@@ -278,7 +285,7 @@ acpi_status acpi_tb_get_required_tables(void)
278 285
279 status = acpi_tb_get_secondary_table(&address, DSDT_SIG, &table_info); 286 status = acpi_tb_get_secondary_table(&address, DSDT_SIG, &table_info);
280 if (ACPI_FAILURE(status)) { 287 if (ACPI_FAILURE(status)) {
281 ACPI_REPORT_ERROR(("Could not get/install the DSDT\n")); 288 ACPI_ERROR((AE_INFO, "Could not get/install the DSDT"));
282 return_ACPI_STATUS(status); 289 return_ACPI_STATUS(status);
283 } 290 }
284 291
@@ -292,7 +299,9 @@ acpi_status acpi_tb_get_required_tables(void)
292 "Hex dump of entire DSDT, size %d (0x%X), Integer width = %d\n", 299 "Hex dump of entire DSDT, size %d (0x%X), Integer width = %d\n",
293 acpi_gbl_DSDT->length, acpi_gbl_DSDT->length, 300 acpi_gbl_DSDT->length, acpi_gbl_DSDT->length,
294 acpi_gbl_integer_bit_width)); 301 acpi_gbl_integer_bit_width));
295 ACPI_DUMP_BUFFER((u8 *) acpi_gbl_DSDT, acpi_gbl_DSDT->length); 302
303 ACPI_DUMP_BUFFER(ACPI_CAST_PTR(u8, acpi_gbl_DSDT),
304 acpi_gbl_DSDT->length);
296 305
297 /* Always delete the RSDP mapping, we are done with it */ 306 /* Always delete the RSDP mapping, we are done with it */
298 307
diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c
index 10db8484e462..7ffd0fddb4e5 100644
--- a/drivers/acpi/tables/tbinstal.c
+++ b/drivers/acpi/tables/tbinstal.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -128,8 +128,8 @@ acpi_status acpi_tb_install_table(struct acpi_table_desc *table_info)
128 128
129 status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 129 status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
130 if (ACPI_FAILURE(status)) { 130 if (ACPI_FAILURE(status)) {
131 ACPI_REPORT_ERROR(("Could not acquire table mutex, %s\n", 131 ACPI_EXCEPTION((AE_INFO, status,
132 acpi_format_exception(status))); 132 "Could not acquire table mutex"));
133 return_ACPI_STATUS(status); 133 return_ACPI_STATUS(status);
134 } 134 }
135 135
@@ -146,9 +146,9 @@ acpi_status acpi_tb_install_table(struct acpi_table_desc *table_info)
146 146
147 status = acpi_tb_init_table_descriptor(table_info->type, table_info); 147 status = acpi_tb_init_table_descriptor(table_info->type, table_info);
148 if (ACPI_FAILURE(status)) { 148 if (ACPI_FAILURE(status)) {
149 ACPI_REPORT_ERROR(("Could not install table [%4.4s], %s\n", 149 ACPI_EXCEPTION((AE_INFO, status,
150 table_info->pointer->signature, 150 "Could not install table [%4.4s]",
151 acpi_format_exception(status))); 151 table_info->pointer->signature));
152 } 152 }
153 153
154 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s located at %p\n", 154 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s located at %p\n",
diff --git a/drivers/acpi/tables/tbrsdt.c b/drivers/acpi/tables/tbrsdt.c
index ad0252c2f7db..4d308220225d 100644
--- a/drivers/acpi/tables/tbrsdt.c
+++ b/drivers/acpi/tables/tbrsdt.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -176,7 +176,7 @@ acpi_status acpi_tb_validate_rsdt(struct acpi_table_header *table_ptr)
176{ 176{
177 int no_match; 177 int no_match;
178 178
179 ACPI_FUNCTION_NAME("tb_validate_rsdt"); 179 ACPI_FUNCTION_ENTRY();
180 180
181 /* 181 /*
182 * Search for appropriate signature, RSDT or XSDT 182 * Search for appropriate signature, RSDT or XSDT
@@ -192,24 +192,24 @@ acpi_status acpi_tb_validate_rsdt(struct acpi_table_header *table_ptr)
192 if (no_match) { 192 if (no_match) {
193 /* Invalid RSDT or XSDT signature */ 193 /* Invalid RSDT or XSDT signature */
194 194
195 ACPI_REPORT_ERROR(("Invalid signature where RSDP indicates RSDT/XSDT should be located\n")); 195 ACPI_ERROR((AE_INFO,
196 "Invalid signature where RSDP indicates RSDT/XSDT should be located. RSDP:"));
196 197
197 ACPI_DUMP_BUFFER(acpi_gbl_RSDP, 20); 198 ACPI_DUMP_BUFFER(acpi_gbl_RSDP, 20);
198 199
199 ACPI_DEBUG_PRINT_RAW((ACPI_DB_ERROR, 200 ACPI_ERROR((AE_INFO,
200 "RSDT/XSDT signature at %X (%p) is invalid\n", 201 "RSDT/XSDT signature at %X (%p) is invalid",
201 acpi_gbl_RSDP->rsdt_physical_address, 202 acpi_gbl_RSDP->rsdt_physical_address,
202 (void *)(acpi_native_uint) acpi_gbl_RSDP-> 203 (void *)(acpi_native_uint) acpi_gbl_RSDP->
203 rsdt_physical_address)); 204 rsdt_physical_address));
204 205
205 if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) { 206 if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) {
206 ACPI_REPORT_ERROR(("Looking for RSDT\n")) 207 ACPI_ERROR((AE_INFO, "Looking for RSDT"));
207 } else { 208 } else {
208 ACPI_REPORT_ERROR(("Looking for XSDT\n")) 209 ACPI_ERROR((AE_INFO, "Looking for XSDT"));
209 } 210 }
210 211
211 ACPI_DUMP_BUFFER((char *)table_ptr, 48); 212 ACPI_DUMP_BUFFER((char *)table_ptr, 48);
212
213 return (AE_BAD_SIGNATURE); 213 return (AE_BAD_SIGNATURE);
214 } 214 }
215 215
@@ -243,15 +243,13 @@ acpi_status acpi_tb_get_table_rsdt(void)
243 table_info.type = ACPI_TABLE_XSDT; 243 table_info.type = ACPI_TABLE_XSDT;
244 status = acpi_tb_get_table(&address, &table_info); 244 status = acpi_tb_get_table(&address, &table_info);
245 if (ACPI_FAILURE(status)) { 245 if (ACPI_FAILURE(status)) {
246 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 246 ACPI_EXCEPTION((AE_INFO, status,
247 "Could not get the RSDT/XSDT, %s\n", 247 "Could not get the RSDT/XSDT"));
248 acpi_format_exception(status)));
249
250 return_ACPI_STATUS(status); 248 return_ACPI_STATUS(status);
251 } 249 }
252 250
253 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 251 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
254 "RSDP located at %p, points to RSDT physical=%8.8X%8.8X \n", 252 "RSDP located at %p, points to RSDT physical=%8.8X%8.8X\n",
255 acpi_gbl_RSDP, 253 acpi_gbl_RSDP,
256 ACPI_FORMAT_UINT64(address.pointer.value))); 254 ACPI_FORMAT_UINT64(address.pointer.value)));
257 255
diff --git a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c
index 4b2fbb592f49..bc571592f087 100644
--- a/drivers/acpi/tables/tbutils.c
+++ b/drivers/acpi/tables/tbutils.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -94,9 +94,8 @@ acpi_status acpi_tb_is_table_installed(struct acpi_table_desc *new_table_desc)
94 new_table_desc->pointer->length) 94 new_table_desc->pointer->length)
95 && 95 &&
96 (!ACPI_MEMCMP 96 (!ACPI_MEMCMP
97 ((const char *)table_desc->pointer, 97 (table_desc->pointer, new_table_desc->pointer,
98 (const char *)new_table_desc->pointer, 98 new_table_desc->pointer->length))) {
99 (acpi_size) new_table_desc->pointer->length))) {
100 /* Match: this table is already installed */ 99 /* Match: this table is already installed */
101 100
102 ACPI_DEBUG_PRINT((ACPI_DB_TABLES, 101 ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
@@ -145,14 +144,13 @@ acpi_tb_validate_table_header(struct acpi_table_header *table_header)
145{ 144{
146 acpi_name signature; 145 acpi_name signature;
147 146
148 ACPI_FUNCTION_NAME("tb_validate_table_header"); 147 ACPI_FUNCTION_ENTRY();
149 148
150 /* Verify that this is a valid address */ 149 /* Verify that this is a valid address */
151 150
152 if (!acpi_os_readable(table_header, sizeof(struct acpi_table_header))) { 151 if (!acpi_os_readable(table_header, sizeof(struct acpi_table_header))) {
153 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 152 ACPI_ERROR((AE_INFO,
154 "Cannot read table header at %p\n", 153 "Cannot read table header at %p", table_header));
155 table_header));
156 154
157 return (AE_BAD_ADDRESS); 155 return (AE_BAD_ADDRESS);
158 } 156 }
@@ -161,12 +159,12 @@ acpi_tb_validate_table_header(struct acpi_table_header *table_header)
161 159
162 ACPI_MOVE_32_TO_32(&signature, table_header->signature); 160 ACPI_MOVE_32_TO_32(&signature, table_header->signature);
163 if (!acpi_ut_valid_acpi_name(signature)) { 161 if (!acpi_ut_valid_acpi_name(signature)) {
164 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 162 ACPI_ERROR((AE_INFO,
165 "Table signature at %p [%p] has invalid characters\n", 163 "Table signature at %p [%p] has invalid characters",
166 table_header, &signature)); 164 table_header, &signature));
167 165
168 ACPI_REPORT_WARNING(("Invalid table signature found: [%4.4s]\n", 166 ACPI_WARNING((AE_INFO, "Invalid table signature found: [%4.4s]",
169 (char *)&signature)); 167 ACPI_CAST_PTR(char, &signature)));
170 168
171 ACPI_DUMP_BUFFER(table_header, 169 ACPI_DUMP_BUFFER(table_header,
172 sizeof(struct acpi_table_header)); 170 sizeof(struct acpi_table_header));
@@ -176,11 +174,13 @@ acpi_tb_validate_table_header(struct acpi_table_header *table_header)
176 /* Validate the table length */ 174 /* Validate the table length */
177 175
178 if (table_header->length < sizeof(struct acpi_table_header)) { 176 if (table_header->length < sizeof(struct acpi_table_header)) {
179 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 177 ACPI_ERROR((AE_INFO,
180 "Invalid length in table header %p name %4.4s\n", 178 "Invalid length in table header %p name %4.4s",
181 table_header, (char *)&signature)); 179 table_header, (char *)&signature));
182 180
183 ACPI_REPORT_WARNING(("Invalid table header length (0x%X) found\n", (u32) table_header->length)); 181 ACPI_WARNING((AE_INFO,
182 "Invalid table header length (0x%X) found",
183 (u32) table_header->length));
184 184
185 ACPI_DUMP_BUFFER(table_header, 185 ACPI_DUMP_BUFFER(table_header,
186 sizeof(struct acpi_table_header)); 186 sizeof(struct acpi_table_header));
@@ -219,7 +219,10 @@ acpi_tb_verify_table_checksum(struct acpi_table_header * table_header)
219 /* Return the appropriate exception */ 219 /* Return the appropriate exception */
220 220
221 if (checksum) { 221 if (checksum) {
222 ACPI_REPORT_WARNING(("Invalid checksum in table [%4.4s] (%02X, sum %02X is not zero)\n", table_header->signature, (u32) table_header->checksum, (u32) checksum)); 222 ACPI_WARNING((AE_INFO,
223 "Invalid checksum in table [%4.4s] (%02X, sum %02X is not zero)",
224 table_header->signature,
225 (u32) table_header->checksum, (u32) checksum));
223 226
224 status = AE_BAD_CHECKSUM; 227 status = AE_BAD_CHECKSUM;
225 } 228 }
@@ -241,16 +244,16 @@ acpi_tb_verify_table_checksum(struct acpi_table_header * table_header)
241 244
242u8 acpi_tb_generate_checksum(void *buffer, u32 length) 245u8 acpi_tb_generate_checksum(void *buffer, u32 length)
243{ 246{
244 const u8 *limit; 247 u8 *end_buffer;
245 const u8 *rover; 248 u8 *rover;
246 u8 sum = 0; 249 u8 sum = 0;
247 250
248 if (buffer && length) { 251 if (buffer && length) {
249 /* Buffer and Length are valid */ 252 /* Buffer and Length are valid */
250 253
251 limit = (u8 *) buffer + length; 254 end_buffer = ACPI_ADD_PTR(u8, buffer, length);
252 255
253 for (rover = buffer; rover < limit; rover++) { 256 for (rover = buffer; rover < end_buffer; rover++) {
254 sum = (u8) (sum + *rover); 257 sum = (u8) (sum + *rover);
255 } 258 }
256 } 259 }
@@ -292,8 +295,7 @@ acpi_tb_handle_to_object(u16 table_id,
292 } 295 }
293 } 296 }
294 297
295 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "table_id=%X does not exist\n", 298 ACPI_ERROR((AE_INFO, "table_id=%X does not exist", table_id));
296 table_id));
297 return (AE_BAD_PARAMETER); 299 return (AE_BAD_PARAMETER);
298} 300}
299#endif 301#endif
diff --git a/drivers/acpi/tables/tbxface.c b/drivers/acpi/tables/tbxface.c
index 3f96a4909aad..9fe53c9d5b9a 100644
--- a/drivers/acpi/tables/tbxface.c
+++ b/drivers/acpi/tables/tbxface.c
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -75,8 +75,7 @@ acpi_status acpi_load_tables(void)
75 status = acpi_os_get_root_pointer(ACPI_LOGICAL_ADDRESSING, 75 status = acpi_os_get_root_pointer(ACPI_LOGICAL_ADDRESSING,
76 &rsdp_address); 76 &rsdp_address);
77 if (ACPI_FAILURE(status)) { 77 if (ACPI_FAILURE(status)) {
78 ACPI_REPORT_ERROR(("acpi_load_tables: Could not get RSDP, %s\n", 78 ACPI_EXCEPTION((AE_INFO, status, "Could not get the RSDP"));
79 acpi_format_exception(status)));
80 goto error_exit; 79 goto error_exit;
81 } 80 }
82 81
@@ -86,7 +85,7 @@ acpi_status acpi_load_tables(void)
86 85
87 status = acpi_tb_verify_rsdp(&rsdp_address); 86 status = acpi_tb_verify_rsdp(&rsdp_address);
88 if (ACPI_FAILURE(status)) { 87 if (ACPI_FAILURE(status)) {
89 ACPI_REPORT_ERROR(("acpi_load_tables: RSDP Failed validation: %s\n", acpi_format_exception(status))); 88 ACPI_EXCEPTION((AE_INFO, status, "During RSDP validation"));
90 goto error_exit; 89 goto error_exit;
91 } 90 }
92 91
@@ -94,7 +93,7 @@ acpi_status acpi_load_tables(void)
94 93
95 status = acpi_tb_get_table_rsdt(); 94 status = acpi_tb_get_table_rsdt();
96 if (ACPI_FAILURE(status)) { 95 if (ACPI_FAILURE(status)) {
97 ACPI_REPORT_ERROR(("acpi_load_tables: Could not load RSDT: %s\n", acpi_format_exception(status))); 96 ACPI_EXCEPTION((AE_INFO, status, "Could not load RSDT"));
98 goto error_exit; 97 goto error_exit;
99 } 98 }
100 99
@@ -102,7 +101,8 @@ acpi_status acpi_load_tables(void)
102 101
103 status = acpi_tb_get_required_tables(); 102 status = acpi_tb_get_required_tables();
104 if (ACPI_FAILURE(status)) { 103 if (ACPI_FAILURE(status)) {
105 ACPI_REPORT_ERROR(("acpi_load_tables: Error getting required tables (DSDT/FADT/FACS): %s\n", acpi_format_exception(status))); 104 ACPI_EXCEPTION((AE_INFO, status,
105 "Could not get all required tables (DSDT/FADT/FACS)"));
106 goto error_exit; 106 goto error_exit;
107 } 107 }
108 108
@@ -112,16 +112,14 @@ acpi_status acpi_load_tables(void)
112 112
113 status = acpi_ns_load_namespace(); 113 status = acpi_ns_load_namespace();
114 if (ACPI_FAILURE(status)) { 114 if (ACPI_FAILURE(status)) {
115 ACPI_REPORT_ERROR(("acpi_load_tables: Could not load namespace: %s\n", acpi_format_exception(status))); 115 ACPI_EXCEPTION((AE_INFO, status, "Could not load namespace"));
116 goto error_exit; 116 goto error_exit;
117 } 117 }
118 118
119 return_ACPI_STATUS(AE_OK); 119 return_ACPI_STATUS(AE_OK);
120 120
121 error_exit: 121 error_exit:
122 ACPI_REPORT_ERROR(("acpi_load_tables: Could not load tables: %s\n", 122 ACPI_EXCEPTION((AE_INFO, status, "Could not load tables"));
123 acpi_format_exception(status)));
124
125 return_ACPI_STATUS(status); 123 return_ACPI_STATUS(status);
126} 124}
127 125
diff --git a/drivers/acpi/tables/tbxfroot.c b/drivers/acpi/tables/tbxfroot.c
index 3b8a7e063e8a..a62db6af83c9 100644
--- a/drivers/acpi/tables/tbxfroot.c
+++ b/drivers/acpi/tables/tbxfroot.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -251,7 +251,7 @@ acpi_get_firmware_table(acpi_string signature,
251 251
252 acpi_tb_get_rsdt_address(&address); 252 acpi_tb_get_rsdt_address(&address);
253 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 253 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
254 "RSDP located at %p, RSDT physical=%8.8X%8.8X \n", 254 "RSDP located at %p, RSDT physical=%8.8X%8.8X\n",
255 acpi_gbl_RSDP, 255 acpi_gbl_RSDP,
256 ACPI_FORMAT_UINT64(address.pointer.value))); 256 ACPI_FORMAT_UINT64(address.pointer.value)));
257 257
@@ -396,9 +396,8 @@ acpi_status acpi_find_root_pointer(u32 flags, struct acpi_pointer *rsdp_address)
396 396
397 status = acpi_tb_find_rsdp(&table_info, flags); 397 status = acpi_tb_find_rsdp(&table_info, flags);
398 if (ACPI_FAILURE(status)) { 398 if (ACPI_FAILURE(status)) {
399 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 399 ACPI_EXCEPTION((AE_INFO, status,
400 "RSDP structure not found, %s Flags=%X\n", 400 "RSDP structure not found - Flags=%X", flags));
401 acpi_format_exception(status), flags));
402 401
403 return_ACPI_STATUS(AE_NO_ACPI_TABLES); 402 return_ACPI_STATUS(AE_NO_ACPI_TABLES);
404 } 403 }
@@ -503,10 +502,10 @@ acpi_tb_find_rsdp(struct acpi_table_desc *table_info, u32 flags)
503 ACPI_EBDA_PTR_LENGTH, 502 ACPI_EBDA_PTR_LENGTH,
504 (void *)&table_ptr); 503 (void *)&table_ptr);
505 if (ACPI_FAILURE(status)) { 504 if (ACPI_FAILURE(status)) {
506 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 505 ACPI_ERROR((AE_INFO,
507 "Could not map memory at %8.8X for length %X\n", 506 "Could not map memory at %8.8X for length %X",
508 ACPI_EBDA_PTR_LOCATION, 507 ACPI_EBDA_PTR_LOCATION,
509 ACPI_EBDA_PTR_LENGTH)); 508 ACPI_EBDA_PTR_LENGTH));
510 509
511 return_ACPI_STATUS(status); 510 return_ACPI_STATUS(status);
512 } 511 }
@@ -530,10 +529,10 @@ acpi_tb_find_rsdp(struct acpi_table_desc *table_info, u32 flags)
530 ACPI_EBDA_WINDOW_SIZE, 529 ACPI_EBDA_WINDOW_SIZE,
531 (void *)&table_ptr); 530 (void *)&table_ptr);
532 if (ACPI_FAILURE(status)) { 531 if (ACPI_FAILURE(status)) {
533 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 532 ACPI_ERROR((AE_INFO,
534 "Could not map memory at %8.8X for length %X\n", 533 "Could not map memory at %8.8X for length %X",
535 physical_address, 534 physical_address,
536 ACPI_EBDA_WINDOW_SIZE)); 535 ACPI_EBDA_WINDOW_SIZE));
537 536
538 return_ACPI_STATUS(status); 537 return_ACPI_STATUS(status);
539 } 538 }
@@ -563,10 +562,10 @@ acpi_tb_find_rsdp(struct acpi_table_desc *table_info, u32 flags)
563 (void *)&table_ptr); 562 (void *)&table_ptr);
564 563
565 if (ACPI_FAILURE(status)) { 564 if (ACPI_FAILURE(status)) {
566 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 565 ACPI_ERROR((AE_INFO,
567 "Could not map memory at %8.8X for length %X\n", 566 "Could not map memory at %8.8X for length %X",
568 ACPI_HI_RSDP_WINDOW_BASE, 567 ACPI_HI_RSDP_WINDOW_BASE,
569 ACPI_HI_RSDP_WINDOW_SIZE)); 568 ACPI_HI_RSDP_WINDOW_SIZE));
570 569
571 return_ACPI_STATUS(status); 570 return_ACPI_STATUS(status);
572 } 571 }
@@ -635,7 +634,7 @@ acpi_tb_find_rsdp(struct acpi_table_desc *table_info, u32 flags)
635 634
636 /* A valid RSDP was not found */ 635 /* A valid RSDP was not found */
637 636
638 ACPI_REPORT_ERROR(("No valid RSDP was found\n")); 637 ACPI_ERROR((AE_INFO, "No valid RSDP was found"));
639 return_ACPI_STATUS(AE_NOT_FOUND); 638 return_ACPI_STATUS(AE_NOT_FOUND);
640} 639}
641 640
diff --git a/drivers/acpi/utilities/Makefile b/drivers/acpi/utilities/Makefile
index e87108b7338a..88eff14c4894 100644
--- a/drivers/acpi/utilities/Makefile
+++ b/drivers/acpi/utilities/Makefile
@@ -2,7 +2,8 @@
2# Makefile for all Linux ACPI interpreter subdirectories 2# Makefile for all Linux ACPI interpreter subdirectories
3# 3#
4 4
5obj-y := utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \ 5obj-y := utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \
6 utcopy.o utdelete.o utglobal.o utmath.o utobject.o utstate.o utmutex.o utobject.o utcache.o 6 utcopy.o utdelete.o utglobal.o utmath.o utobject.o \
7 utstate.o utmutex.o utobject.o utcache.o utresrc.o
7 8
8EXTRA_CFLAGS += $(ACPI_CFLAGS) 9EXTRA_CFLAGS += $(ACPI_CFLAGS)
diff --git a/drivers/acpi/utilities/utalloc.c b/drivers/acpi/utilities/utalloc.c
index 068450b36475..03b0044974c2 100644
--- a/drivers/acpi/utilities/utalloc.c
+++ b/drivers/acpi/utilities/utalloc.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -47,7 +47,7 @@
47ACPI_MODULE_NAME("utalloc") 47ACPI_MODULE_NAME("utalloc")
48 48
49/* Local prototypes */ 49/* Local prototypes */
50#ifdef ACPI_DBG_TRACK_ALLOCATIONS 50#ifdef ACPI_DBG_TRACK_ALLOCATIONS
51static struct acpi_debug_mem_block *acpi_ut_find_allocation(void *allocation); 51static struct acpi_debug_mem_block *acpi_ut_find_allocation(void *allocation);
52 52
53static acpi_status 53static acpi_status
@@ -58,9 +58,7 @@ acpi_ut_track_allocation(struct acpi_debug_mem_block *address,
58static acpi_status 58static acpi_status
59acpi_ut_remove_allocation(struct acpi_debug_mem_block *address, 59acpi_ut_remove_allocation(struct acpi_debug_mem_block *address,
60 u32 component, char *module, u32 line); 60 u32 component, char *module, u32 line);
61#endif /* ACPI_DBG_TRACK_ALLOCATIONS */
62 61
63#ifdef ACPI_DBG_TRACK_ALLOCATIONS
64static acpi_status 62static acpi_status
65acpi_ut_create_list(char *list_name, 63acpi_ut_create_list(char *list_name,
66 u16 object_size, struct acpi_memory_list **return_cache); 64 u16 object_size, struct acpi_memory_list **return_cache);
@@ -303,8 +301,8 @@ void *acpi_ut_allocate(acpi_size size, u32 component, char *module, u32 line)
303 /* Check for an inadvertent size of zero bytes */ 301 /* Check for an inadvertent size of zero bytes */
304 302
305 if (!size) { 303 if (!size) {
306 _ACPI_REPORT_ERROR(module, line, component, 304 ACPI_ERROR((module, line,
307 ("ut_allocate: Attempt to allocate zero bytes\n")); 305 "ut_allocate: Attempt to allocate zero bytes, allocating 1 byte"));
308 size = 1; 306 size = 1;
309 } 307 }
310 308
@@ -312,9 +310,9 @@ void *acpi_ut_allocate(acpi_size size, u32 component, char *module, u32 line)
312 if (!allocation) { 310 if (!allocation) {
313 /* Report allocation error */ 311 /* Report allocation error */
314 312
315 _ACPI_REPORT_ERROR(module, line, component, 313 ACPI_ERROR((module, line,
316 ("ut_allocate: Could not allocate size %X\n", 314 "ut_allocate: Could not allocate size %X",
317 (u32) size)); 315 (u32) size));
318 316
319 return_PTR(NULL); 317 return_PTR(NULL);
320 } 318 }
@@ -346,18 +344,17 @@ void *acpi_ut_callocate(acpi_size size, u32 component, char *module, u32 line)
346 /* Check for an inadvertent size of zero bytes */ 344 /* Check for an inadvertent size of zero bytes */
347 345
348 if (!size) { 346 if (!size) {
349 _ACPI_REPORT_ERROR(module, line, component, 347 ACPI_ERROR((module, line,
350 ("ut_callocate: Attempt to allocate zero bytes\n")); 348 "Attempt to allocate zero bytes, allocating 1 byte"));
351 return_PTR(NULL); 349 size = 1;
352 } 350 }
353 351
354 allocation = acpi_os_allocate(size); 352 allocation = acpi_os_allocate(size);
355 if (!allocation) { 353 if (!allocation) {
356 /* Report allocation error */ 354 /* Report allocation error */
357 355
358 _ACPI_REPORT_ERROR(module, line, component, 356 ACPI_ERROR((module, line,
359 ("ut_callocate: Could not allocate size %X\n", 357 "Could not allocate size %X", (u32) size));
360 (u32) size));
361 return_PTR(NULL); 358 return_PTR(NULL);
362 } 359 }
363 360
@@ -482,9 +479,8 @@ void *acpi_ut_callocate_and_track(acpi_size size,
482 if (!allocation) { 479 if (!allocation) {
483 /* Report allocation error */ 480 /* Report allocation error */
484 481
485 _ACPI_REPORT_ERROR(module, line, component, 482 ACPI_ERROR((module, line,
486 ("ut_callocate: Could not allocate size %X\n", 483 "Could not allocate size %X", (u32) size));
487 (u32) size));
488 return (NULL); 484 return (NULL);
489 } 485 }
490 486
@@ -526,8 +522,7 @@ acpi_ut_free_and_track(void *allocation, u32 component, char *module, u32 line)
526 ACPI_FUNCTION_TRACE_PTR("ut_free", allocation); 522 ACPI_FUNCTION_TRACE_PTR("ut_free", allocation);
527 523
528 if (NULL == allocation) { 524 if (NULL == allocation) {
529 _ACPI_REPORT_ERROR(module, line, component, 525 ACPI_ERROR((module, line, "Attempt to delete a NULL address"));
530 ("acpi_ut_free: Attempt to delete a NULL address\n"));
531 526
532 return_VOID; 527 return_VOID;
533 } 528 }
@@ -542,14 +537,11 @@ acpi_ut_free_and_track(void *allocation, u32 component, char *module, u32 line)
542 status = acpi_ut_remove_allocation(debug_block, 537 status = acpi_ut_remove_allocation(debug_block,
543 component, module, line); 538 component, module, line);
544 if (ACPI_FAILURE(status)) { 539 if (ACPI_FAILURE(status)) {
545 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Could not free memory, %s\n", 540 ACPI_EXCEPTION((AE_INFO, status, "Could not free memory"));
546 acpi_format_exception(status)));
547 } 541 }
548 542
549 acpi_os_free(debug_block); 543 acpi_os_free(debug_block);
550
551 ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "%p freed\n", allocation)); 544 ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "%p freed\n", allocation));
552
553 return_VOID; 545 return_VOID;
554} 546}
555 547
@@ -626,10 +618,12 @@ acpi_ut_track_allocation(struct acpi_debug_mem_block *allocation,
626 */ 618 */
627 element = acpi_ut_find_allocation(allocation); 619 element = acpi_ut_find_allocation(allocation);
628 if (element) { 620 if (element) {
629 ACPI_REPORT_ERROR(("ut_track_allocation: Allocation already present in list! (%p)\n", allocation)); 621 ACPI_ERROR((AE_INFO,
622 "ut_track_allocation: Allocation already present in list! (%p)",
623 allocation));
630 624
631 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Element %p Address %p\n", 625 ACPI_ERROR((AE_INFO, "Element %p Address %p",
632 element, allocation)); 626 element, allocation));
633 627
634 goto unlock_and_exit; 628 goto unlock_and_exit;
635 } 629 }
@@ -689,8 +683,8 @@ acpi_ut_remove_allocation(struct acpi_debug_mem_block *allocation,
689 if (NULL == mem_list->list_head) { 683 if (NULL == mem_list->list_head) {
690 /* No allocations! */ 684 /* No allocations! */
691 685
692 _ACPI_REPORT_ERROR(module, line, component, 686 ACPI_ERROR((module, line,
693 ("ut_remove_allocation: Empty allocation list, nothing to free!\n")); 687 "Empty allocation list, nothing to free!"));
694 688
695 return_ACPI_STATUS(AE_OK); 689 return_ACPI_STATUS(AE_OK);
696 } 690 }
@@ -865,12 +859,11 @@ void acpi_ut_dump_allocations(u32 component, char *module)
865 /* Print summary */ 859 /* Print summary */
866 860
867 if (!num_outstanding) { 861 if (!num_outstanding) {
868 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 862 ACPI_INFO((AE_INFO, "No outstanding allocations"));
869 "No outstanding allocations.\n"));
870 } else { 863 } else {
871 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 864 ACPI_ERROR((AE_INFO,
872 "%d(%X) Outstanding allocations\n", 865 "%d(%X) Outstanding allocations",
873 num_outstanding, num_outstanding)); 866 num_outstanding, num_outstanding));
874 } 867 }
875 868
876 return_VOID; 869 return_VOID;
diff --git a/drivers/acpi/utilities/utcache.c b/drivers/acpi/utilities/utcache.c
index 93d48681d276..2177cb1ef2c4 100644
--- a/drivers/acpi/utilities/utcache.c
+++ b/drivers/acpi/utilities/utcache.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/utilities/utcopy.c b/drivers/acpi/utilities/utcopy.c
index 5442b32de611..df2d32096b72 100644
--- a/drivers/acpi/utilities/utcopy.c
+++ b/drivers/acpi/utilities/utcopy.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -398,14 +398,17 @@ acpi_ut_copy_iobject_to_eobject(union acpi_operand_object *internal_object,
398 * Build a simple object (no nested objects) 398 * Build a simple object (no nested objects)
399 */ 399 */
400 status = acpi_ut_copy_isimple_to_esimple(internal_object, 400 status = acpi_ut_copy_isimple_to_esimple(internal_object,
401 (union acpi_object *) 401 ACPI_CAST_PTR(union
402 ret_buffer->pointer, 402 acpi_object,
403 ((u8 *) ret_buffer-> 403 ret_buffer->
404 pointer + 404 pointer),
405 ACPI_ROUND_UP_TO_NATIVE_WORD 405 ACPI_ADD_PTR(u8,
406 (sizeof 406 ret_buffer->
407 (union 407 pointer,
408 acpi_object))), 408 ACPI_ROUND_UP_TO_NATIVE_WORD
409 (sizeof
410 (union
411 acpi_object))),
409 &ret_buffer->length); 412 &ret_buffer->length);
410 /* 413 /*
411 * build simple does not include the object size in the length 414 * build simple does not include the object size in the length
@@ -603,8 +606,8 @@ acpi_ut_copy_eobject_to_iobject(union acpi_object *external_object,
603 /* 606 /*
604 * Packages as external input to control methods are not supported, 607 * Packages as external input to control methods are not supported,
605 */ 608 */
606 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 609 ACPI_ERROR((AE_INFO,
607 "Packages as parameters not implemented!\n")); 610 "Packages as parameters not implemented!"));
608 611
609 return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 612 return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
610 } 613 }
@@ -867,7 +870,7 @@ acpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj,
867 count + 870 count +
868 1) * sizeof(void *)); 871 1) * sizeof(void *));
869 if (!dest_obj->package.elements) { 872 if (!dest_obj->package.elements) {
870 ACPI_REPORT_ERROR(("aml_build_copy_internal_package_object: Package allocation failure\n")); 873 ACPI_ERROR((AE_INFO, "Package allocation failure"));
871 return_ACPI_STATUS(AE_NO_MEMORY); 874 return_ACPI_STATUS(AE_NO_MEMORY);
872 } 875 }
873 876
diff --git a/drivers/acpi/utilities/utdebug.c b/drivers/acpi/utilities/utdebug.c
index d80e92639932..35f3d581e034 100644
--- a/drivers/acpi/utilities/utdebug.c
+++ b/drivers/acpi/utilities/utdebug.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/drivers/acpi/utilities/utdelete.c b/drivers/acpi/utilities/utdelete.c
index 2bc878f7a127..1db9695b0029 100644
--- a/drivers/acpi/utilities/utdelete.c
+++ b/drivers/acpi/utilities/utdelete.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -363,8 +363,7 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
363 363
364 default: 364 default:
365 365
366 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown action (%X)\n", 366 ACPI_ERROR((AE_INFO, "Unknown action (%X)", action));
367 action));
368 break; 367 break;
369 } 368 }
370 369
@@ -374,9 +373,9 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
374 */ 373 */
375 if (count > ACPI_MAX_REFERENCE_COUNT) { 374 if (count > ACPI_MAX_REFERENCE_COUNT) {
376 375
377 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 376 ACPI_WARNING((AE_INFO,
378 "**** Warning **** Large Reference Count (%X) in object %p\n\n", 377 "Large Reference Count (%X) in object %p",
379 count, object)); 378 count, object));
380 } 379 }
381 380
382 return; 381 return;
@@ -535,8 +534,8 @@ acpi_ut_update_object_reference(union acpi_operand_object * object, u16 action)
535 534
536 error_exit: 535 error_exit:
537 536
538 ACPI_REPORT_ERROR(("Could not update object reference count, %s\n", 537 ACPI_EXCEPTION((AE_INFO, status,
539 acpi_format_exception(status))); 538 "Could not update object reference count"));
540 539
541 return_ACPI_STATUS(status); 540 return_ACPI_STATUS(status);
542} 541}
diff --git a/drivers/acpi/utilities/uteval.c b/drivers/acpi/utilities/uteval.c
index 7b81d5ef3c32..106cc97cb4af 100644
--- a/drivers/acpi/utilities/uteval.c
+++ b/drivers/acpi/utilities/uteval.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -95,7 +95,9 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
95 95
96 for (i = 0; i < ACPI_NUM_OSI_STRINGS; i++) { 96 for (i = 0; i < ACPI_NUM_OSI_STRINGS; i++) {
97 if (!ACPI_STRCMP(string_desc->string.pointer, 97 if (!ACPI_STRCMP(string_desc->string.pointer,
98 (char *)acpi_gbl_valid_osi_strings[i])) { 98 ACPI_CAST_PTR(char,
99 acpi_gbl_valid_osi_strings[i])))
100 {
99 /* This string is supported */ 101 /* This string is supported */
100 102
101 return_desc->integer.value = 0xFFFFFFFF; 103 return_desc->integer.value = 0xFFFFFFFF;
@@ -152,8 +154,8 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
152 acpi_ut_get_node_name(prefix_node), 154 acpi_ut_get_node_name(prefix_node),
153 path)); 155 path));
154 } else { 156 } else {
155 ACPI_REPORT_METHOD_ERROR("Method execution failed", 157 ACPI_ERROR_METHOD("Method execution failed",
156 prefix_node, path, status); 158 prefix_node, path, status);
157 } 159 }
158 160
159 return_ACPI_STATUS(status); 161 return_ACPI_STATUS(status);
@@ -163,9 +165,8 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
163 165
164 if (!info.return_object) { 166 if (!info.return_object) {
165 if (expected_return_btypes) { 167 if (expected_return_btypes) {
166 ACPI_REPORT_METHOD_ERROR("No object was returned from", 168 ACPI_ERROR_METHOD("No object was returned from",
167 prefix_node, path, 169 prefix_node, path, AE_NOT_EXIST);
168 AE_NOT_EXIST);
169 170
170 return_ACPI_STATUS(AE_NOT_EXIST); 171 return_ACPI_STATUS(AE_NOT_EXIST);
171 } 172 }
@@ -210,15 +211,14 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
210 /* Is the return object one of the expected types? */ 211 /* Is the return object one of the expected types? */
211 212
212 if (!(expected_return_btypes & return_btype)) { 213 if (!(expected_return_btypes & return_btype)) {
213 ACPI_REPORT_METHOD_ERROR("Return object type is incorrect", 214 ACPI_ERROR_METHOD("Return object type is incorrect",
214 prefix_node, path, AE_TYPE); 215 prefix_node, path, AE_TYPE);
215 216
216 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 217 ACPI_ERROR((AE_INFO,
217 "Type returned from %s was incorrect: %s, expected Btypes: %X\n", 218 "Type returned from %s was incorrect: %s, expected Btypes: %X",
218 path, 219 path,
219 acpi_ut_get_object_type_name(info. 220 acpi_ut_get_object_type_name(info.return_object),
220 return_object), 221 expected_return_btypes));
221 expected_return_btypes));
222 222
223 /* On error exit, we must delete the return object */ 223 /* On error exit, we must delete the return object */
224 224
@@ -592,7 +592,7 @@ acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)
592 "_STA on %4.4s was not found, assuming device is present\n", 592 "_STA on %4.4s was not found, assuming device is present\n",
593 acpi_ut_get_node_name(device_node))); 593 acpi_ut_get_node_name(device_node)));
594 594
595 *flags = 0x0F; 595 *flags = ACPI_UINT32_MAX;
596 status = AE_OK; 596 status = AE_OK;
597 } 597 }
598 598
@@ -637,17 +637,17 @@ acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest)
637 for (i = 0; i < 4; i++) { 637 for (i = 0; i < 4; i++) {
638 highest[i] = 0xFF; 638 highest[i] = 0xFF;
639 status = acpi_ut_evaluate_object(device_node, 639 status = acpi_ut_evaluate_object(device_node,
640 (char *) 640 ACPI_CAST_PTR(char,
641 acpi_gbl_highest_dstate_names 641 acpi_gbl_highest_dstate_names
642 [i], ACPI_BTYPE_INTEGER, 642 [i]),
643 &obj_desc); 643 ACPI_BTYPE_INTEGER, &obj_desc);
644 if (ACPI_FAILURE(status)) { 644 if (ACPI_FAILURE(status)) {
645 if (status != AE_NOT_FOUND) { 645 if (status != AE_NOT_FOUND) {
646 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 646 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
647 "%s on Device %4.4s, %s\n", 647 "%s on Device %4.4s, %s\n",
648 (char *) 648 ACPI_CAST_PTR(char,
649 acpi_gbl_highest_dstate_names 649 acpi_gbl_highest_dstate_names
650 [i], 650 [i]),
651 acpi_ut_get_node_name 651 acpi_ut_get_node_name
652 (device_node), 652 (device_node),
653 acpi_format_exception 653 acpi_format_exception
diff --git a/drivers/acpi/utilities/utglobal.c b/drivers/acpi/utilities/utglobal.c
index 399e64b51886..ffd13383a325 100644
--- a/drivers/acpi/utilities/utglobal.c
+++ b/drivers/acpi/utilities/utglobal.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -67,8 +67,11 @@ const char *acpi_format_exception(acpi_status status)
67 acpi_status sub_status; 67 acpi_status sub_status;
68 const char *exception = NULL; 68 const char *exception = NULL;
69 69
70 ACPI_FUNCTION_NAME("format_exception"); 70 ACPI_FUNCTION_ENTRY();
71 71
72 /*
73 * Status is composed of two parts, a "type" and an actual code
74 */
72 sub_status = (status & ~AE_CODE_MASK); 75 sub_status = (status & ~AE_CODE_MASK);
73 76
74 switch (status & AE_CODE_MASK) { 77 switch (status & AE_CODE_MASK) {
@@ -118,13 +121,13 @@ const char *acpi_format_exception(acpi_status status)
118 if (!exception) { 121 if (!exception) {
119 /* Exception code was not recognized */ 122 /* Exception code was not recognized */
120 123
121 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 124 ACPI_ERROR((AE_INFO,
122 "Unknown exception code: 0x%8.8X\n", status)); 125 "Unknown exception code: 0x%8.8X", status));
123 126
124 return ((const char *)"UNKNOWN_STATUS_CODE"); 127 exception = "UNKNOWN_STATUS_CODE";
125 } 128 }
126 129
127 return ((const char *)exception); 130 return (ACPI_CAST_PTR(const char, exception));
128} 131}
129 132
130/******************************************************************************* 133/*******************************************************************************
@@ -217,23 +220,23 @@ const char *acpi_gbl_valid_osi_strings[ACPI_NUM_OSI_STRINGS] = {
217 * 2) _TZ_ is defined to be a thermal zone in order to allow ASL code to 220 * 2) _TZ_ is defined to be a thermal zone in order to allow ASL code to
218 * perform a Notify() operation on it. 221 * perform a Notify() operation on it.
219 */ 222 */
220const struct acpi_predefined_names acpi_gbl_pre_defined_names[] = 223const struct acpi_predefined_names acpi_gbl_pre_defined_names[] = {
221 { {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL}, 224 {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL},
222{"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL}, 225 {"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL},
223{"_SB_", ACPI_TYPE_DEVICE, NULL}, 226 {"_SB_", ACPI_TYPE_DEVICE, NULL},
224{"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL}, 227 {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL},
225{"_TZ_", ACPI_TYPE_THERMAL, NULL}, 228 {"_TZ_", ACPI_TYPE_THERMAL, NULL},
226{"_REV", ACPI_TYPE_INTEGER, (char *)ACPI_CA_SUPPORT_LEVEL}, 229 {"_REV", ACPI_TYPE_INTEGER, (char *)ACPI_CA_SUPPORT_LEVEL},
227{"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME}, 230 {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
228{"_GL_", ACPI_TYPE_MUTEX, (char *)1}, 231 {"_GL_", ACPI_TYPE_MUTEX, (char *)1},
229 232
230#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY) 233#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
231{"_OSI", ACPI_TYPE_METHOD, (char *)1}, 234 {"_OSI", ACPI_TYPE_METHOD, (char *)1},
232#endif 235#endif
233 236
234 /* Table terminator */ 237 /* Table terminator */
235 238
236{NULL, ACPI_TYPE_ANY, NULL} 239 {NULL, ACPI_TYPE_ANY, NULL}
237}; 240};
238 241
239/* 242/*
@@ -485,7 +488,7 @@ char *acpi_ut_get_region_name(u8 space_id)
485 return ("invalid_space_id"); 488 return ("invalid_space_id");
486 } 489 }
487 490
488 return ((char *)acpi_gbl_region_types[space_id]); 491 return (ACPI_CAST_PTR(char, acpi_gbl_region_types[space_id]));
489} 492}
490 493
491/******************************************************************************* 494/*******************************************************************************
@@ -503,11 +506,13 @@ char *acpi_ut_get_region_name(u8 space_id)
503/* Event type decoding */ 506/* Event type decoding */
504 507
505static const char *acpi_gbl_event_types[ACPI_NUM_FIXED_EVENTS] = { 508static const char *acpi_gbl_event_types[ACPI_NUM_FIXED_EVENTS] = {
509/*! [Begin] no source code translation (keep these strings as-is) */
506 "PM_Timer", 510 "PM_Timer",
507 "global_lock", 511 "GlobalLock",
508 "power_button", 512 "PowerButton",
509 "sleep_button", 513 "SleepButton",
510 "real_time_clock", 514 "RealTimeClock",
515/*! [End] no source code translation !*/
511}; 516};
512 517
513char *acpi_ut_get_event_name(u32 event_id) 518char *acpi_ut_get_event_name(u32 event_id)
@@ -517,7 +522,7 @@ char *acpi_ut_get_event_name(u32 event_id)
517 return ("invalid_event_iD"); 522 return ("invalid_event_iD");
518 } 523 }
519 524
520 return ((char *)acpi_gbl_event_types[event_id]); 525 return (ACPI_CAST_PTR(char, acpi_gbl_event_types[event_id]));
521} 526}
522 527
523/******************************************************************************* 528/*******************************************************************************
@@ -545,12 +550,13 @@ static const char acpi_gbl_bad_type[] = "UNDEFINED";
545/* Printable names of the ACPI object types */ 550/* Printable names of the ACPI object types */
546 551
547static const char *acpi_gbl_ns_type_names[] = { 552static const char *acpi_gbl_ns_type_names[] = {
553/*! [Begin] no source code translation (keep these strings as-is) */
548 /* 00 */ "Untyped", 554 /* 00 */ "Untyped",
549 /* 01 */ "Integer", 555 /* 01 */ "Integer",
550 /* 02 */ "String", 556 /* 02 */ "String",
551 /* 03 */ "Buffer", 557 /* 03 */ "Buffer",
552 /* 04 */ "Package", 558 /* 04 */ "Package",
553 /* 05 */ "field_unit", 559 /* 05 */ "FieldUnit",
554 /* 06 */ "Device", 560 /* 06 */ "Device",
555 /* 07 */ "Event", 561 /* 07 */ "Event",
556 /* 08 */ "Method", 562 /* 08 */ "Method",
@@ -559,33 +565,34 @@ static const char *acpi_gbl_ns_type_names[] = {
559 /* 11 */ "Power", 565 /* 11 */ "Power",
560 /* 12 */ "Processor", 566 /* 12 */ "Processor",
561 /* 13 */ "Thermal", 567 /* 13 */ "Thermal",
562 /* 14 */ "buffer_field", 568 /* 14 */ "BufferField",
563 /* 15 */ "ddb_handle", 569 /* 15 */ "DdbHandle",
564 /* 16 */ "debug_object", 570 /* 16 */ "DebugObject",
565 /* 17 */ "region_field", 571 /* 17 */ "RegionField",
566 /* 18 */ "bank_field", 572 /* 18 */ "BankField",
567 /* 19 */ "index_field", 573 /* 19 */ "IndexField",
568 /* 20 */ "Reference", 574 /* 20 */ "Reference",
569 /* 21 */ "Alias", 575 /* 21 */ "Alias",
570 /* 22 */ "method_alias", 576 /* 22 */ "MethodAlias",
571 /* 23 */ "Notify", 577 /* 23 */ "Notify",
572 /* 24 */ "addr_handler", 578 /* 24 */ "AddrHandler",
573 /* 25 */ "resource_desc", 579 /* 25 */ "ResourceDesc",
574 /* 26 */ "resource_fld", 580 /* 26 */ "ResourceFld",
575 /* 27 */ "Scope", 581 /* 27 */ "Scope",
576 /* 28 */ "Extra", 582 /* 28 */ "Extra",
577 /* 29 */ "Data", 583 /* 29 */ "Data",
578 /* 30 */ "Invalid" 584 /* 30 */ "Invalid"
585/*! [End] no source code translation !*/
579}; 586};
580 587
581char *acpi_ut_get_type_name(acpi_object_type type) 588char *acpi_ut_get_type_name(acpi_object_type type)
582{ 589{
583 590
584 if (type > ACPI_TYPE_INVALID) { 591 if (type > ACPI_TYPE_INVALID) {
585 return ((char *)acpi_gbl_bad_type); 592 return (ACPI_CAST_PTR(char, acpi_gbl_bad_type));
586 } 593 }
587 594
588 return ((char *)acpi_gbl_ns_type_names[type]); 595 return (ACPI_CAST_PTR(char, acpi_gbl_ns_type_names[type]));
589} 596}
590 597
591char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc) 598char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc)
@@ -634,7 +641,7 @@ char *acpi_ut_get_node_name(void *object)
634 641
635 /* Name must be a valid ACPI name */ 642 /* Name must be a valid ACPI name */
636 643
637 if (!acpi_ut_valid_acpi_name(*(u32 *) node->name.ascii)) { 644 if (!acpi_ut_valid_acpi_name(node->name.integer)) {
638 return ("????"); 645 return ("????");
639 } 646 }
640 647
@@ -658,15 +665,16 @@ char *acpi_ut_get_node_name(void *object)
658/* Printable names of object descriptor types */ 665/* Printable names of object descriptor types */
659 666
660static const char *acpi_gbl_desc_type_names[] = { 667static const char *acpi_gbl_desc_type_names[] = {
668/*! [Begin] no source code translation (keep these ASL Keywords as-is) */
661 /* 00 */ "Invalid", 669 /* 00 */ "Invalid",
662 /* 01 */ "Cached", 670 /* 01 */ "Cached",
663 /* 02 */ "State-Generic", 671 /* 02 */ "State-Generic",
664 /* 03 */ "State-Update", 672 /* 03 */ "State-Update",
665 /* 04 */ "State-Package", 673 /* 04 */ "State-Package",
666 /* 05 */ "State-Control", 674 /* 05 */ "State-Control",
667 /* 06 */ "State-root_parse_scope", 675 /* 06 */ "State-RootParseScope",
668 /* 07 */ "State-parse_scope", 676 /* 07 */ "State-ParseScope",
669 /* 08 */ "State-walk_scope", 677 /* 08 */ "State-WalkScope",
670 /* 09 */ "State-Result", 678 /* 09 */ "State-Result",
671 /* 10 */ "State-Notify", 679 /* 10 */ "State-Notify",
672 /* 11 */ "State-Thread", 680 /* 11 */ "State-Thread",
@@ -674,6 +682,7 @@ static const char *acpi_gbl_desc_type_names[] = {
674 /* 13 */ "Parser", 682 /* 13 */ "Parser",
675 /* 14 */ "Operand", 683 /* 14 */ "Operand",
676 /* 15 */ "Node" 684 /* 15 */ "Node"
685/*! [End] no source code translation !*/
677}; 686};
678 687
679char *acpi_ut_get_descriptor_name(void *object) 688char *acpi_ut_get_descriptor_name(void *object)
@@ -684,11 +693,12 @@ char *acpi_ut_get_descriptor_name(void *object)
684 } 693 }
685 694
686 if (ACPI_GET_DESCRIPTOR_TYPE(object) > ACPI_DESC_TYPE_MAX) { 695 if (ACPI_GET_DESCRIPTOR_TYPE(object) > ACPI_DESC_TYPE_MAX) {
687 return ((char *)acpi_gbl_bad_type); 696 return (ACPI_CAST_PTR(char, acpi_gbl_bad_type));
688 } 697 }
689 698
690 return ((char *) 699 return (ACPI_CAST_PTR(char,
691 acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE(object)]); 700 acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE
701 (object)]));
692 702
693} 703}
694 704
@@ -787,6 +797,11 @@ void acpi_ut_init_globals(void)
787 acpi_gbl_mutex_info[i].use_count = 0; 797 acpi_gbl_mutex_info[i].use_count = 0;
788 } 798 }
789 799
800 for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) {
801 acpi_gbl_owner_id_mask[i] = 0;
802 }
803 acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000; /* Last ID is never valid */
804
790 /* GPE support */ 805 /* GPE support */
791 806
792 acpi_gbl_gpe_xrupt_list_head = NULL; 807 acpi_gbl_gpe_xrupt_list_head = NULL;
@@ -824,7 +839,11 @@ void acpi_ut_init_globals(void)
824 acpi_gbl_ns_lookup_count = 0; 839 acpi_gbl_ns_lookup_count = 0;
825 acpi_gbl_ps_find_count = 0; 840 acpi_gbl_ps_find_count = 0;
826 acpi_gbl_acpi_hardware_present = TRUE; 841 acpi_gbl_acpi_hardware_present = TRUE;
827 acpi_gbl_owner_id_mask = 0; 842 acpi_gbl_last_owner_id_index = 0;
843 acpi_gbl_next_owner_id_offset = 0;
844 acpi_gbl_trace_method_name = 0;
845 acpi_gbl_trace_dbg_level = 0;
846 acpi_gbl_trace_dbg_layer = 0;
828 acpi_gbl_debugger_configuration = DEBUGGER_THREADING; 847 acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
829 acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT; 848 acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT;
830 849
@@ -836,7 +855,6 @@ void acpi_ut_init_globals(void)
836 /* Namespace */ 855 /* Namespace */
837 856
838 acpi_gbl_root_node = NULL; 857 acpi_gbl_root_node = NULL;
839
840 acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME; 858 acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME;
841 acpi_gbl_root_node_struct.descriptor = ACPI_DESC_TYPE_NAMED; 859 acpi_gbl_root_node_struct.descriptor = ACPI_DESC_TYPE_NAMED;
842 acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE; 860 acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE;
diff --git a/drivers/acpi/utilities/utinit.c b/drivers/acpi/utilities/utinit.c
index 9dde82b0beaf..ba771b4f39bc 100644
--- a/drivers/acpi/utilities/utinit.c
+++ b/drivers/acpi/utilities/utinit.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -72,9 +72,9 @@ static void
72acpi_ut_fadt_register_error(char *register_name, u32 value, acpi_size offset) 72acpi_ut_fadt_register_error(char *register_name, u32 value, acpi_size offset)
73{ 73{
74 74
75 ACPI_REPORT_WARNING(("Invalid FADT value %s=%X at offset %X FADT=%p\n", 75 ACPI_WARNING((AE_INFO,
76 register_name, value, (u32) offset, 76 "Invalid FADT value %s=%X at offset %X FADT=%p",
77 acpi_gbl_FADT)); 77 register_name, value, (u32) offset, acpi_gbl_FADT));
78} 78}
79 79
80/****************************************************************************** 80/******************************************************************************
@@ -221,15 +221,14 @@ void acpi_ut_subsystem_shutdown(void)
221 /* Just exit if subsystem is already shutdown */ 221 /* Just exit if subsystem is already shutdown */
222 222
223 if (acpi_gbl_shutdown) { 223 if (acpi_gbl_shutdown) {
224 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 224 ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated"));
225 "ACPI Subsystem is already terminated\n"));
226 return_VOID; 225 return_VOID;
227 } 226 }
228 227
229 /* Subsystem appears active, go ahead and shut it down */ 228 /* Subsystem appears active, go ahead and shut it down */
230 229
231 acpi_gbl_shutdown = TRUE; 230 acpi_gbl_shutdown = TRUE;
232 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem...\n")); 231 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
233 232
234 /* Close the acpi_event Handling */ 233 /* Close the acpi_event Handling */
235 234
diff --git a/drivers/acpi/utilities/utmath.c b/drivers/acpi/utilities/utmath.c
index 68a0a6f94129..4a3360484e72 100644
--- a/drivers/acpi/utilities/utmath.c
+++ b/drivers/acpi/utilities/utmath.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -82,7 +82,7 @@ acpi_ut_short_divide(acpi_integer dividend,
82 /* Always check for a zero divisor */ 82 /* Always check for a zero divisor */
83 83
84 if (divisor == 0) { 84 if (divisor == 0) {
85 ACPI_REPORT_ERROR(("acpi_ut_short_divide: Divide by zero\n")); 85 ACPI_ERROR((AE_INFO, "Divide by zero"));
86 return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO); 86 return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO);
87 } 87 }
88 88
@@ -144,7 +144,7 @@ acpi_ut_divide(acpi_integer in_dividend,
144 /* Always check for a zero divisor */ 144 /* Always check for a zero divisor */
145 145
146 if (in_divisor == 0) { 146 if (in_divisor == 0) {
147 ACPI_REPORT_ERROR(("acpi_ut_divide: Divide by zero\n")); 147 ACPI_ERROR((AE_INFO, "Divide by zero"));
148 return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO); 148 return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO);
149 } 149 }
150 150
@@ -266,7 +266,7 @@ acpi_ut_short_divide(acpi_integer in_dividend,
266 /* Always check for a zero divisor */ 266 /* Always check for a zero divisor */
267 267
268 if (divisor == 0) { 268 if (divisor == 0) {
269 ACPI_REPORT_ERROR(("acpi_ut_short_divide: Divide by zero\n")); 269 ACPI_ERROR((AE_INFO, "Divide by zero"));
270 return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO); 270 return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO);
271 } 271 }
272 272
@@ -292,7 +292,7 @@ acpi_ut_divide(acpi_integer in_dividend,
292 /* Always check for a zero divisor */ 292 /* Always check for a zero divisor */
293 293
294 if (in_divisor == 0) { 294 if (in_divisor == 0) {
295 ACPI_REPORT_ERROR(("acpi_ut_divide: Divide by zero\n")); 295 ACPI_ERROR((AE_INFO, "Divide by zero"));
296 return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO); 296 return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO);
297 } 297 }
298 298
diff --git a/drivers/acpi/utilities/utmisc.c b/drivers/acpi/utilities/utmisc.c
index 2ce872d75890..7364f5f8c9cd 100644
--- a/drivers/acpi/utilities/utmisc.c
+++ b/drivers/acpi/utilities/utmisc.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -63,6 +63,8 @@ ACPI_MODULE_NAME("utmisc")
63acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id) 63acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
64{ 64{
65 acpi_native_uint i; 65 acpi_native_uint i;
66 acpi_native_uint j;
67 acpi_native_uint k;
66 acpi_status status; 68 acpi_status status;
67 69
68 ACPI_FUNCTION_TRACE("ut_allocate_owner_id"); 70 ACPI_FUNCTION_TRACE("ut_allocate_owner_id");
@@ -70,8 +72,8 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
70 /* Guard against multiple allocations of ID to the same location */ 72 /* Guard against multiple allocations of ID to the same location */
71 73
72 if (*owner_id) { 74 if (*owner_id) {
73 ACPI_REPORT_ERROR(("Owner ID [%2.2X] already exists\n", 75 ACPI_ERROR((AE_INFO, "Owner ID [%2.2X] already exists",
74 *owner_id)); 76 *owner_id));
75 return_ACPI_STATUS(AE_ALREADY_EXISTS); 77 return_ACPI_STATUS(AE_ALREADY_EXISTS);
76 } 78 }
77 79
@@ -82,31 +84,67 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
82 return_ACPI_STATUS(status); 84 return_ACPI_STATUS(status);
83 } 85 }
84 86
85 /* Find a free owner ID */ 87 /*
88 * Find a free owner ID, cycle through all possible IDs on repeated
89 * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
90 * to be scanned twice.
91 */
92 for (i = 0, j = acpi_gbl_last_owner_id_index;
93 i < (ACPI_NUM_OWNERID_MASKS + 1); i++, j++) {
94 if (j >= ACPI_NUM_OWNERID_MASKS) {
95 j = 0; /* Wraparound to start of mask array */
96 }
97
98 for (k = acpi_gbl_next_owner_id_offset; k < 32; k++) {
99 if (acpi_gbl_owner_id_mask[j] == ACPI_UINT32_MAX) {
100 /* There are no free IDs in this mask */
86 101
87 for (i = 0; i < 64; i++) { 102 break;
88 if (!(acpi_gbl_owner_id_mask & (1ULL << i))) { 103 }
89 ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
90 "Current owner_id mask: %16.16LX New ID: %2.2X\n",
91 acpi_gbl_owner_id_mask,
92 (unsigned int)(i + 1)));
93 104
94 acpi_gbl_owner_id_mask |= (1ULL << i); 105 if (!(acpi_gbl_owner_id_mask[j] & (1 << k))) {
95 *owner_id = (acpi_owner_id) (i + 1); 106 /*
96 goto exit; 107 * Found a free ID. The actual ID is the bit index plus one,
108 * making zero an invalid Owner ID. Save this as the last ID
109 * allocated and update the global ID mask.
110 */
111 acpi_gbl_owner_id_mask[j] |= (1 << k);
112
113 acpi_gbl_last_owner_id_index = (u8) j;
114 acpi_gbl_next_owner_id_offset = (u8) (k + 1);
115
116 /*
117 * Construct encoded ID from the index and bit position
118 *
119 * Note: Last [j].k (bit 255) is never used and is marked
120 * permanently allocated (prevents +1 overflow)
121 */
122 *owner_id =
123 (acpi_owner_id) ((k + 1) + ACPI_MUL_32(j));
124
125 ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
126 "Allocated owner_id: %2.2X\n",
127 (unsigned int)*owner_id));
128 goto exit;
129 }
97 } 130 }
131
132 acpi_gbl_next_owner_id_offset = 0;
98 } 133 }
99 134
100 /* 135 /*
101 * If we are here, all owner_ids have been allocated. This probably should 136 * All owner_ids have been allocated. This typically should
102 * not happen since the IDs are reused after deallocation. The IDs are 137 * not happen since the IDs are reused after deallocation. The IDs are
103 * allocated upon table load (one per table) and method execution, and 138 * allocated upon table load (one per table) and method execution, and
104 * they are released when a table is unloaded or a method completes 139 * they are released when a table is unloaded or a method completes
105 * execution. 140 * execution.
141 *
142 * If this error happens, there may be very deep nesting of invoked control
143 * methods, or there may be a bug where the IDs are not released.
106 */ 144 */
107 *owner_id = 0;
108 status = AE_OWNER_ID_LIMIT; 145 status = AE_OWNER_ID_LIMIT;
109 ACPI_REPORT_ERROR(("Could not allocate new owner_id (64 max), AE_OWNER_ID_LIMIT\n")); 146 ACPI_ERROR((AE_INFO,
147 "Could not allocate new owner_id (255 max), AE_OWNER_ID_LIMIT"));
110 148
111 exit: 149 exit:
112 (void)acpi_ut_release_mutex(ACPI_MTX_CACHES); 150 (void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
@@ -123,7 +161,7 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
123 * control method or unloading a table. Either way, we would 161 * control method or unloading a table. Either way, we would
124 * ignore any error anyway. 162 * ignore any error anyway.
125 * 163 *
126 * DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 64 164 * DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 255
127 * 165 *
128 ******************************************************************************/ 166 ******************************************************************************/
129 167
@@ -131,6 +169,8 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
131{ 169{
132 acpi_owner_id owner_id = *owner_id_ptr; 170 acpi_owner_id owner_id = *owner_id_ptr;
133 acpi_status status; 171 acpi_status status;
172 acpi_native_uint index;
173 u32 bit;
134 174
135 ACPI_FUNCTION_TRACE_U32("ut_release_owner_id", owner_id); 175 ACPI_FUNCTION_TRACE_U32("ut_release_owner_id", owner_id);
136 176
@@ -140,8 +180,8 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
140 180
141 /* Zero is not a valid owner_iD */ 181 /* Zero is not a valid owner_iD */
142 182
143 if ((owner_id == 0) || (owner_id > 64)) { 183 if (owner_id == 0) {
144 ACPI_REPORT_ERROR(("Invalid owner_id: %2.2X\n", owner_id)); 184 ACPI_ERROR((AE_INFO, "Invalid owner_id: %2.2X", owner_id));
145 return_VOID; 185 return_VOID;
146 } 186 }
147 187
@@ -156,10 +196,19 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
156 196
157 owner_id--; 197 owner_id--;
158 198
199 /* Decode ID to index/offset pair */
200
201 index = ACPI_DIV_32(owner_id);
202 bit = 1 << ACPI_MOD_32(owner_id);
203
159 /* Free the owner ID only if it is valid */ 204 /* Free the owner ID only if it is valid */
160 205
161 if (acpi_gbl_owner_id_mask & (1ULL << owner_id)) { 206 if (acpi_gbl_owner_id_mask[index] & bit) {
162 acpi_gbl_owner_id_mask ^= (1ULL << owner_id); 207 acpi_gbl_owner_id_mask[index] ^= bit;
208 } else {
209 ACPI_ERROR((AE_INFO,
210 "Release of non-allocated owner_id: %2.2X",
211 owner_id + 1));
163 } 212 }
164 213
165 (void)acpi_ut_release_mutex(ACPI_MTX_CACHES); 214 (void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
@@ -790,109 +839,97 @@ u8 acpi_ut_generate_checksum(u8 * buffer, u32 length)
790 839
791/******************************************************************************* 840/*******************************************************************************
792 * 841 *
793 * FUNCTION: acpi_ut_get_resource_end_tag 842 * FUNCTION: acpi_ut_error, acpi_ut_warning, acpi_ut_info
794 * 843 *
795 * PARAMETERS: obj_desc - The resource template buffer object 844 * PARAMETERS: module_name - Caller's module name (for error output)
845 * line_number - Caller's line number (for error output)
846 * Format - Printf format string + additional args
796 * 847 *
797 * RETURN: Pointer to the end tag 848 * RETURN: None
798 * 849 *
799 * DESCRIPTION: Find the END_TAG resource descriptor in a resource template 850 * DESCRIPTION: Print message with module/line/version info
800 * 851 *
801 ******************************************************************************/ 852 ******************************************************************************/
802 853
803u8 *acpi_ut_get_resource_end_tag(union acpi_operand_object * obj_desc) 854void ACPI_INTERNAL_VAR_XFACE
855acpi_ut_error(char *module_name, u32 line_number, char *format, ...)
804{ 856{
805 u8 buffer_byte; 857 va_list args;
806 u8 *buffer;
807 u8 *end_buffer;
808 858
809 buffer = obj_desc->buffer.pointer; 859 acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
810 end_buffer = buffer + obj_desc->buffer.length;
811 860
812 while (buffer < end_buffer) { 861 va_start(args, format);
813 buffer_byte = *buffer; 862 acpi_os_vprintf(format, args);
814 if (buffer_byte & ACPI_RDESC_TYPE_MASK) { 863 acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
815 /* Large Descriptor - Length is next 2 bytes */ 864}
816 865
817 buffer += ((*(buffer + 1) | (*(buffer + 2) << 8)) + 3); 866void ACPI_INTERNAL_VAR_XFACE
818 } else { 867acpi_ut_exception(char *module_name,
819 /* Small Descriptor. End Tag will be found here */ 868 u32 line_number, acpi_status status, char *format, ...)
869{
870 va_list args;
820 871
821 if ((buffer_byte & ACPI_RDESC_SMALL_MASK) == 872 acpi_os_printf("ACPI Exception (%s-%04d): %s, ", module_name,
822 ACPI_RDESC_TYPE_END_TAG) { 873 line_number, acpi_format_exception(status));
823 /* Found the end tag descriptor, all done. */
824 874
825 return (buffer); 875 va_start(args, format);
826 } 876 acpi_os_vprintf(format, args);
877 acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
878}
827 879
828 /* Length is in the header */ 880void ACPI_INTERNAL_VAR_XFACE
881acpi_ut_warning(char *module_name, u32 line_number, char *format, ...)
882{
883 va_list args;
829 884
830 buffer += ((buffer_byte & 0x07) + 1); 885 acpi_os_printf("ACPI Warning (%s-%04d): ", module_name, line_number);
831 } 886
832 } 887 va_start(args, format);
888 acpi_os_vprintf(format, args);
889 acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
890}
891
892void ACPI_INTERNAL_VAR_XFACE
893acpi_ut_info(char *module_name, u32 line_number, char *format, ...)
894{
895 va_list args;
833 896
834 /* End tag not found */ 897 acpi_os_printf("ACPI (%s-%04d): ", module_name, line_number);
835 898
836 return (NULL); 899 va_start(args, format);
900 acpi_os_vprintf(format, args);
901 acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
837} 902}
838 903
839/******************************************************************************* 904/*******************************************************************************
840 * 905 *
841 * FUNCTION: acpi_ut_report_error 906 * FUNCTION: acpi_ut_report_error, Warning, Info
842 * 907 *
843 * PARAMETERS: module_name - Caller's module name (for error output) 908 * PARAMETERS: module_name - Caller's module name (for error output)
844 * line_number - Caller's line number (for error output) 909 * line_number - Caller's line number (for error output)
845 * component_id - Caller's component ID (for error output)
846 * 910 *
847 * RETURN: None 911 * RETURN: None
848 * 912 *
849 * DESCRIPTION: Print error message 913 * DESCRIPTION: Print error message
850 * 914 *
915 * Note: Legacy only, should be removed when no longer used by drivers.
916 *
851 ******************************************************************************/ 917 ******************************************************************************/
852 918
853void acpi_ut_report_error(char *module_name, u32 line_number, u32 component_id) 919void acpi_ut_report_error(char *module_name, u32 line_number)
854{ 920{
855 921
856 acpi_os_printf("%8s-%04d: *** Error: ", module_name, line_number); 922 acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
857} 923}
858 924
859/******************************************************************************* 925void acpi_ut_report_warning(char *module_name, u32 line_number)
860 *
861 * FUNCTION: acpi_ut_report_warning
862 *
863 * PARAMETERS: module_name - Caller's module name (for error output)
864 * line_number - Caller's line number (for error output)
865 * component_id - Caller's component ID (for error output)
866 *
867 * RETURN: None
868 *
869 * DESCRIPTION: Print warning message
870 *
871 ******************************************************************************/
872
873void
874acpi_ut_report_warning(char *module_name, u32 line_number, u32 component_id)
875{ 926{
876 927
877 acpi_os_printf("%8s-%04d: *** Warning: ", module_name, line_number); 928 acpi_os_printf("ACPI Warning (%s-%04d): ", module_name, line_number);
878} 929}
879 930
880/******************************************************************************* 931void acpi_ut_report_info(char *module_name, u32 line_number)
881 *
882 * FUNCTION: acpi_ut_report_info
883 *
884 * PARAMETERS: module_name - Caller's module name (for error output)
885 * line_number - Caller's line number (for error output)
886 * component_id - Caller's component ID (for error output)
887 *
888 * RETURN: None
889 *
890 * DESCRIPTION: Print information message
891 *
892 ******************************************************************************/
893
894void acpi_ut_report_info(char *module_name, u32 line_number, u32 component_id)
895{ 932{
896 933
897 acpi_os_printf("%8s-%04d: *** Info: ", module_name, line_number); 934 acpi_os_printf("ACPI (%s-%04d): ", module_name, line_number);
898} 935}
diff --git a/drivers/acpi/utilities/utmutex.c b/drivers/acpi/utilities/utmutex.c
index 90134c56ece9..45a7244df924 100644
--- a/drivers/acpi/utilities/utmutex.c
+++ b/drivers/acpi/utilities/utmutex.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -214,23 +214,22 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
214 * the ACPI subsystem code. 214 * the ACPI subsystem code.
215 */ 215 */
216 for (i = mutex_id; i < MAX_MUTEX; i++) { 216 for (i = mutex_id; i < MAX_MUTEX; i++) {
217 if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) { 217 if (acpi_gbl_mutex_info[i].thread_id == this_thread_id) {
218 if (i == mutex_id) { 218 if (i == mutex_id) {
219 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 219 ACPI_ERROR((AE_INFO,
220 "Mutex [%s] already acquired by this thread [%X]\n", 220 "Mutex [%s] already acquired by this thread [%X]",
221 acpi_ut_get_mutex_name 221 acpi_ut_get_mutex_name
222 (mutex_id), 222 (mutex_id),
223 this_thread_id)); 223 this_thread_id));
224 224
225 return (AE_ALREADY_ACQUIRED); 225 return (AE_ALREADY_ACQUIRED);
226 } 226 }
227 227
228 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 228 ACPI_ERROR((AE_INFO,
229 "Invalid acquire order: Thread %X owns [%s], wants [%s]\n", 229 "Invalid acquire order: Thread %X owns [%s], wants [%s]",
230 this_thread_id, 230 this_thread_id,
231 acpi_ut_get_mutex_name(i), 231 acpi_ut_get_mutex_name(i),
232 acpi_ut_get_mutex_name 232 acpi_ut_get_mutex_name(mutex_id)));
233 (mutex_id)));
234 233
235 return (AE_ACQUIRE_DEADLOCK); 234 return (AE_ACQUIRE_DEADLOCK);
236 } 235 }
@@ -253,11 +252,9 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
253 acpi_gbl_mutex_info[mutex_id].use_count++; 252 acpi_gbl_mutex_info[mutex_id].use_count++;
254 acpi_gbl_mutex_info[mutex_id].thread_id = this_thread_id; 253 acpi_gbl_mutex_info[mutex_id].thread_id = this_thread_id;
255 } else { 254 } else {
256 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 255 ACPI_EXCEPTION((AE_INFO, status,
257 "Thread %X could not acquire Mutex [%s] %s\n", 256 "Thread %X could not acquire Mutex [%X]",
258 this_thread_id, 257 this_thread_id, mutex_id));
259 acpi_ut_get_mutex_name(mutex_id),
260 acpi_format_exception(status)));
261 } 258 }
262 259
263 return (status); 260 return (status);
@@ -295,9 +292,9 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)
295 * Mutex must be acquired in order to release it! 292 * Mutex must be acquired in order to release it!
296 */ 293 */
297 if (acpi_gbl_mutex_info[mutex_id].thread_id == ACPI_MUTEX_NOT_ACQUIRED) { 294 if (acpi_gbl_mutex_info[mutex_id].thread_id == ACPI_MUTEX_NOT_ACQUIRED) {
298 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 295 ACPI_ERROR((AE_INFO,
299 "Mutex [%s] is not acquired, cannot release\n", 296 "Mutex [%X] is not acquired, cannot release",
300 acpi_ut_get_mutex_name(mutex_id))); 297 mutex_id));
301 298
302 return (AE_NOT_ACQUIRED); 299 return (AE_NOT_ACQUIRED);
303 } 300 }
@@ -313,16 +310,15 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)
313 * the ACPI subsystem code. 310 * the ACPI subsystem code.
314 */ 311 */
315 for (i = mutex_id; i < MAX_MUTEX; i++) { 312 for (i = mutex_id; i < MAX_MUTEX; i++) {
316 if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) { 313 if (acpi_gbl_mutex_info[i].thread_id == this_thread_id) {
317 if (i == mutex_id) { 314 if (i == mutex_id) {
318 continue; 315 continue;
319 } 316 }
320 317
321 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 318 ACPI_ERROR((AE_INFO,
322 "Invalid release order: owns [%s], releasing [%s]\n", 319 "Invalid release order: owns [%s], releasing [%s]",
323 acpi_ut_get_mutex_name(i), 320 acpi_ut_get_mutex_name(i),
324 acpi_ut_get_mutex_name 321 acpi_ut_get_mutex_name(mutex_id)));
325 (mutex_id)));
326 322
327 return (AE_RELEASE_DEADLOCK); 323 return (AE_RELEASE_DEADLOCK);
328 } 324 }
@@ -338,11 +334,9 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)
338 acpi_os_signal_semaphore(acpi_gbl_mutex_info[mutex_id].mutex, 1); 334 acpi_os_signal_semaphore(acpi_gbl_mutex_info[mutex_id].mutex, 1);
339 335
340 if (ACPI_FAILURE(status)) { 336 if (ACPI_FAILURE(status)) {
341 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 337 ACPI_EXCEPTION((AE_INFO, status,
342 "Thread %X could not release Mutex [%s] %s\n", 338 "Thread %X could not release Mutex [%X]",
343 this_thread_id, 339 this_thread_id, mutex_id));
344 acpi_ut_get_mutex_name(mutex_id),
345 acpi_format_exception(status)));
346 } else { 340 } else {
347 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, 341 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX,
348 "Thread %X released Mutex [%s]\n", 342 "Thread %X released Mutex [%s]\n",
diff --git a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c
index 3015e1540053..7ee2d1d98071 100644
--- a/drivers/acpi/utilities/utobject.c
+++ b/drivers/acpi/utilities/utobject.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -177,7 +177,8 @@ union acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size)
177 177
178 buffer = ACPI_MEM_CALLOCATE(buffer_size); 178 buffer = ACPI_MEM_CALLOCATE(buffer_size);
179 if (!buffer) { 179 if (!buffer) {
180 ACPI_REPORT_ERROR(("create_buffer: could not allocate size %X\n", (u32) buffer_size)); 180 ACPI_ERROR((AE_INFO, "Could not allocate size %X",
181 (u32) buffer_size));
181 acpi_ut_remove_reference(buffer_desc); 182 acpi_ut_remove_reference(buffer_desc);
182 return_PTR(NULL); 183 return_PTR(NULL);
183 } 184 }
@@ -228,7 +229,8 @@ union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size)
228 */ 229 */
229 string = ACPI_MEM_CALLOCATE(string_size + 1); 230 string = ACPI_MEM_CALLOCATE(string_size + 1);
230 if (!string) { 231 if (!string) {
231 ACPI_REPORT_ERROR(("create_string: could not allocate size %X\n", (u32) string_size)); 232 ACPI_ERROR((AE_INFO, "Could not allocate size %X",
233 (u32) string_size));
232 acpi_ut_remove_reference(string_desc); 234 acpi_ut_remove_reference(string_desc);
233 return_PTR(NULL); 235 return_PTR(NULL);
234 } 236 }
@@ -310,8 +312,8 @@ void *acpi_ut_allocate_object_desc_dbg(char *module_name,
310 312
311 object = acpi_os_acquire_object(acpi_gbl_operand_cache); 313 object = acpi_os_acquire_object(acpi_gbl_operand_cache);
312 if (!object) { 314 if (!object) {
313 _ACPI_REPORT_ERROR(module_name, line_number, component_id, 315 ACPI_ERROR((module_name, line_number,
314 ("Could not allocate an object descriptor\n")); 316 "Could not allocate an object descriptor"));
315 317
316 return_PTR(NULL); 318 return_PTR(NULL);
317 } 319 }
@@ -345,9 +347,9 @@ void acpi_ut_delete_object_desc(union acpi_operand_object *object)
345 /* Object must be an union acpi_operand_object */ 347 /* Object must be an union acpi_operand_object */
346 348
347 if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) { 349 if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) {
348 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 350 ACPI_ERROR((AE_INFO,
349 "%p is not an ACPI Operand object [%s]\n", 351 "%p is not an ACPI Operand object [%s]", object,
350 object, acpi_ut_get_descriptor_name(object))); 352 acpi_ut_get_descriptor_name(object)));
351 return_VOID; 353 return_VOID;
352 } 354 }
353 355
@@ -449,10 +451,10 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
449 * Notably, Locals and Args are not supported, but this may be 451 * Notably, Locals and Args are not supported, but this may be
450 * required eventually. 452 * required eventually.
451 */ 453 */
452 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 454 ACPI_ERROR((AE_INFO,
453 "Unsupported Reference opcode=%X in object %p\n", 455 "Unsupported Reference opcode=%X in object %p",
454 internal_object->reference.opcode, 456 internal_object->reference.opcode,
455 internal_object)); 457 internal_object));
456 status = AE_TYPE; 458 status = AE_TYPE;
457 break; 459 break;
458 } 460 }
@@ -460,10 +462,9 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
460 462
461 default: 463 default:
462 464
463 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 465 ACPI_ERROR((AE_INFO, "Unsupported type=%X in object %p",
464 "Unsupported type=%X in object %p\n", 466 ACPI_GET_OBJECT_TYPE(internal_object),
465 ACPI_GET_OBJECT_TYPE(internal_object), 467 internal_object));
466 internal_object));
467 status = AE_TYPE; 468 status = AE_TYPE;
468 break; 469 break;
469 } 470 }
diff --git a/drivers/acpi/utilities/utresrc.c b/drivers/acpi/utilities/utresrc.c
new file mode 100644
index 000000000000..16461317113f
--- /dev/null
+++ b/drivers/acpi/utilities/utresrc.c
@@ -0,0 +1,554 @@
1/*******************************************************************************
2 *
3 * Module Name: utresrc - Resource managment utilities
4 *
5 ******************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include <acpi/acpi.h>
45#include <acpi/amlresrc.h>
46
47#define _COMPONENT ACPI_UTILITIES
48ACPI_MODULE_NAME("utmisc")
49
50#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
51/*
52 * Strings used to decode resource descriptors.
53 * Used by both the disasssembler and the debugger resource dump routines
54 */
55const char *acpi_gbl_BMdecode[2] = {
56 "not_bus_master",
57 "bus_master"
58};
59
60const char *acpi_gbl_config_decode[4] = {
61 "0 - Good Configuration",
62 "1 - Acceptable Configuration",
63 "2 - Suboptimal Configuration",
64 "3 - ***Invalid Configuration***",
65};
66
67const char *acpi_gbl_consume_decode[2] = {
68 "resource_producer",
69 "resource_consumer"
70};
71
72const char *acpi_gbl_DECdecode[2] = {
73 "pos_decode",
74 "sub_decode"
75};
76
77const char *acpi_gbl_HEdecode[2] = {
78 "Level",
79 "Edge"
80};
81
82const char *acpi_gbl_io_decode[2] = {
83 "Decode10",
84 "Decode16"
85};
86
87const char *acpi_gbl_LLdecode[2] = {
88 "active_high",
89 "active_low"
90};
91
92const char *acpi_gbl_max_decode[2] = {
93 "max_not_fixed",
94 "max_fixed"
95};
96
97const char *acpi_gbl_MEMdecode[4] = {
98 "non_cacheable",
99 "Cacheable",
100 "write_combining",
101 "Prefetchable"
102};
103
104const char *acpi_gbl_min_decode[2] = {
105 "min_not_fixed",
106 "min_fixed"
107};
108
109const char *acpi_gbl_MTPdecode[4] = {
110 "address_range_memory",
111 "address_range_reserved",
112 "address_range_aCPI",
113 "address_range_nVS"
114};
115
116const char *acpi_gbl_RNGdecode[4] = {
117 "invalid_ranges",
118 "non_iSAonly_ranges",
119 "ISAonly_ranges",
120 "entire_range"
121};
122
123const char *acpi_gbl_RWdecode[2] = {
124 "read_only",
125 "read_write"
126};
127
128const char *acpi_gbl_SHRdecode[2] = {
129 "Exclusive",
130 "Shared"
131};
132
133const char *acpi_gbl_SIZdecode[4] = {
134 "Transfer8",
135 "Transfer8_16",
136 "Transfer16",
137 "invalid_size"
138};
139
140const char *acpi_gbl_TRSdecode[2] = {
141 "dense_translation",
142 "sparse_translation"
143};
144
145const char *acpi_gbl_TTPdecode[2] = {
146 "type_static",
147 "type_translation"
148};
149
150const char *acpi_gbl_TYPdecode[4] = {
151 "Compatibility",
152 "type_a",
153 "type_b",
154 "type_f"
155};
156
157#endif
158
159/*
160 * Base sizes of the raw AML resource descriptors, indexed by resource type.
161 * Zero indicates a reserved (and therefore invalid) resource type.
162 */
163const u8 acpi_gbl_resource_aml_sizes[] = {
164 /* Small descriptors */
165
166 0,
167 0,
168 0,
169 0,
170 ACPI_AML_SIZE_SMALL(struct aml_resource_irq),
171 ACPI_AML_SIZE_SMALL(struct aml_resource_dma),
172 ACPI_AML_SIZE_SMALL(struct aml_resource_start_dependent),
173 ACPI_AML_SIZE_SMALL(struct aml_resource_end_dependent),
174 ACPI_AML_SIZE_SMALL(struct aml_resource_io),
175 ACPI_AML_SIZE_SMALL(struct aml_resource_fixed_io),
176 0,
177 0,
178 0,
179 0,
180 ACPI_AML_SIZE_SMALL(struct aml_resource_vendor_small),
181 ACPI_AML_SIZE_SMALL(struct aml_resource_end_tag),
182
183 /* Large descriptors */
184
185 0,
186 ACPI_AML_SIZE_LARGE(struct aml_resource_memory24),
187 ACPI_AML_SIZE_LARGE(struct aml_resource_generic_register),
188 0,
189 ACPI_AML_SIZE_LARGE(struct aml_resource_vendor_large),
190 ACPI_AML_SIZE_LARGE(struct aml_resource_memory32),
191 ACPI_AML_SIZE_LARGE(struct aml_resource_fixed_memory32),
192 ACPI_AML_SIZE_LARGE(struct aml_resource_address32),
193 ACPI_AML_SIZE_LARGE(struct aml_resource_address16),
194 ACPI_AML_SIZE_LARGE(struct aml_resource_extended_irq),
195 ACPI_AML_SIZE_LARGE(struct aml_resource_address64),
196 ACPI_AML_SIZE_LARGE(struct aml_resource_extended_address64)
197};
198
199/*
200 * Resource types, used to validate the resource length field.
201 * The length of fixed-length types must match exactly, variable
202 * lengths must meet the minimum required length, etc.
203 * Zero indicates a reserved (and therefore invalid) resource type.
204 */
205static const u8 acpi_gbl_resource_types[] = {
206 /* Small descriptors */
207
208 0,
209 0,
210 0,
211 0,
212 ACPI_SMALL_VARIABLE_LENGTH,
213 ACPI_FIXED_LENGTH,
214 ACPI_SMALL_VARIABLE_LENGTH,
215 ACPI_FIXED_LENGTH,
216 ACPI_FIXED_LENGTH,
217 ACPI_FIXED_LENGTH,
218 0,
219 0,
220 0,
221 0,
222 ACPI_VARIABLE_LENGTH,
223 ACPI_FIXED_LENGTH,
224
225 /* Large descriptors */
226
227 0,
228 ACPI_FIXED_LENGTH,
229 ACPI_FIXED_LENGTH,
230 0,
231 ACPI_VARIABLE_LENGTH,
232 ACPI_FIXED_LENGTH,
233 ACPI_FIXED_LENGTH,
234 ACPI_VARIABLE_LENGTH,
235 ACPI_VARIABLE_LENGTH,
236 ACPI_VARIABLE_LENGTH,
237 ACPI_VARIABLE_LENGTH,
238 ACPI_FIXED_LENGTH
239};
240
241/*******************************************************************************
242 *
243 * FUNCTION: acpi_ut_validate_resource
244 *
245 * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
246 * return_index - Where the resource index is returned. NULL
247 * if the index is not required.
248 *
249 * RETURN: Status, and optionally the Index into the global resource tables
250 *
251 * DESCRIPTION: Validate an AML resource descriptor by checking the Resource
252 * Type and Resource Length. Returns an index into the global
253 * resource information/dispatch tables for later use.
254 *
255 ******************************************************************************/
256
257acpi_status acpi_ut_validate_resource(void *aml, u8 * return_index)
258{
259 u8 resource_type;
260 u8 resource_index;
261 acpi_rs_length resource_length;
262 acpi_rs_length minimum_resource_length;
263
264 ACPI_FUNCTION_ENTRY();
265
266 /*
267 * 1) Validate the resource_type field (Byte 0)
268 */
269 resource_type = ACPI_GET8(aml);
270
271 /*
272 * Byte 0 contains the descriptor name (Resource Type)
273 * Examine the large/small bit in the resource header
274 */
275 if (resource_type & ACPI_RESOURCE_NAME_LARGE) {
276 /* Verify the large resource type (name) against the max */
277
278 if (resource_type > ACPI_RESOURCE_NAME_LARGE_MAX) {
279 return (AE_AML_INVALID_RESOURCE_TYPE);
280 }
281
282 /*
283 * Large Resource Type -- bits 6:0 contain the name
284 * Translate range 0x80-0x8B to index range 0x10-0x1B
285 */
286 resource_index = (u8) (resource_type - 0x70);
287 } else {
288 /*
289 * Small Resource Type -- bits 6:3 contain the name
290 * Shift range to index range 0x00-0x0F
291 */
292 resource_index = (u8)
293 ((resource_type & ACPI_RESOURCE_NAME_SMALL_MASK) >> 3);
294 }
295
296 /* Check validity of the resource type, zero indicates name is invalid */
297
298 if (!acpi_gbl_resource_types[resource_index]) {
299 return (AE_AML_INVALID_RESOURCE_TYPE);
300 }
301
302 /*
303 * 2) Validate the resource_length field. This ensures that the length
304 * is at least reasonable, and guarantees that it is non-zero.
305 */
306 resource_length = acpi_ut_get_resource_length(aml);
307 minimum_resource_length = acpi_gbl_resource_aml_sizes[resource_index];
308
309 /* Validate based upon the type of resource - fixed length or variable */
310
311 switch (acpi_gbl_resource_types[resource_index]) {
312 case ACPI_FIXED_LENGTH:
313
314 /* Fixed length resource, length must match exactly */
315
316 if (resource_length != minimum_resource_length) {
317 return (AE_AML_BAD_RESOURCE_LENGTH);
318 }
319 break;
320
321 case ACPI_VARIABLE_LENGTH:
322
323 /* Variable length resource, length must be at least the minimum */
324
325 if (resource_length < minimum_resource_length) {
326 return (AE_AML_BAD_RESOURCE_LENGTH);
327 }
328 break;
329
330 case ACPI_SMALL_VARIABLE_LENGTH:
331
332 /* Small variable length resource, length can be (Min) or (Min-1) */
333
334 if ((resource_length > minimum_resource_length) ||
335 (resource_length < (minimum_resource_length - 1))) {
336 return (AE_AML_BAD_RESOURCE_LENGTH);
337 }
338 break;
339
340 default:
341
342 /* Shouldn't happen (because of validation earlier), but be sure */
343
344 return (AE_AML_INVALID_RESOURCE_TYPE);
345 }
346
347 /* Optionally return the resource table index */
348
349 if (return_index) {
350 *return_index = resource_index;
351 }
352
353 return (AE_OK);
354}
355
356/*******************************************************************************
357 *
358 * FUNCTION: acpi_ut_get_resource_type
359 *
360 * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
361 *
362 * RETURN: The Resource Type with no extraneous bits (except the
363 * Large/Small descriptor bit -- this is left alone)
364 *
365 * DESCRIPTION: Extract the Resource Type/Name from the first byte of
366 * a resource descriptor.
367 *
368 ******************************************************************************/
369
370u8 acpi_ut_get_resource_type(void *aml)
371{
372 ACPI_FUNCTION_ENTRY();
373
374 /*
375 * Byte 0 contains the descriptor name (Resource Type)
376 * Examine the large/small bit in the resource header
377 */
378 if (ACPI_GET8(aml) & ACPI_RESOURCE_NAME_LARGE) {
379 /* Large Resource Type -- bits 6:0 contain the name */
380
381 return (ACPI_GET8(aml));
382 } else {
383 /* Small Resource Type -- bits 6:3 contain the name */
384
385 return ((u8) (ACPI_GET8(aml) & ACPI_RESOURCE_NAME_SMALL_MASK));
386 }
387}
388
389/*******************************************************************************
390 *
391 * FUNCTION: acpi_ut_get_resource_length
392 *
393 * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
394 *
395 * RETURN: Byte Length
396 *
397 * DESCRIPTION: Get the "Resource Length" of a raw AML descriptor. By
398 * definition, this does not include the size of the descriptor
399 * header or the length field itself.
400 *
401 ******************************************************************************/
402
403u16 acpi_ut_get_resource_length(void *aml)
404{
405 acpi_rs_length resource_length;
406
407 ACPI_FUNCTION_ENTRY();
408
409 /*
410 * Byte 0 contains the descriptor name (Resource Type)
411 * Examine the large/small bit in the resource header
412 */
413 if (ACPI_GET8(aml) & ACPI_RESOURCE_NAME_LARGE) {
414 /* Large Resource type -- bytes 1-2 contain the 16-bit length */
415
416 ACPI_MOVE_16_TO_16(&resource_length, ACPI_ADD_PTR(u8, aml, 1));
417
418 } else {
419 /* Small Resource type -- bits 2:0 of byte 0 contain the length */
420
421 resource_length = (u16) (ACPI_GET8(aml) &
422 ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK);
423 }
424
425 return (resource_length);
426}
427
428/*******************************************************************************
429 *
430 * FUNCTION: acpi_ut_get_resource_header_length
431 *
432 * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
433 *
434 * RETURN: Length of the AML header (depends on large/small descriptor)
435 *
436 * DESCRIPTION: Get the length of the header for this resource.
437 *
438 ******************************************************************************/
439
440u8 acpi_ut_get_resource_header_length(void *aml)
441{
442 ACPI_FUNCTION_ENTRY();
443
444 /* Examine the large/small bit in the resource header */
445
446 if (ACPI_GET8(aml) & ACPI_RESOURCE_NAME_LARGE) {
447 return (sizeof(struct aml_resource_large_header));
448 } else {
449 return (sizeof(struct aml_resource_small_header));
450 }
451}
452
453/*******************************************************************************
454 *
455 * FUNCTION: acpi_ut_get_descriptor_length
456 *
457 * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
458 *
459 * RETURN: Byte length
460 *
461 * DESCRIPTION: Get the total byte length of a raw AML descriptor, including the
462 * length of the descriptor header and the length field itself.
463 * Used to walk descriptor lists.
464 *
465 ******************************************************************************/
466
467u32 acpi_ut_get_descriptor_length(void *aml)
468{
469 ACPI_FUNCTION_ENTRY();
470
471 /*
472 * Get the Resource Length (does not include header length) and add
473 * the header length (depends on if this is a small or large resource)
474 */
475 return (acpi_ut_get_resource_length(aml) +
476 acpi_ut_get_resource_header_length(aml));
477}
478
479/*******************************************************************************
480 *
481 * FUNCTION: acpi_ut_get_resource_end_tag
482 *
483 * PARAMETERS: obj_desc - The resource template buffer object
484 * end_tag - Where the pointer to the end_tag is returned
485 *
486 * RETURN: Status, pointer to the end tag
487 *
488 * DESCRIPTION: Find the end_tag resource descriptor in an AML resource template
489 * Note: allows a buffer length of zero.
490 *
491 ******************************************************************************/
492
493acpi_status
494acpi_ut_get_resource_end_tag(union acpi_operand_object * obj_desc,
495 u8 ** end_tag)
496{
497 acpi_status status;
498 u8 *aml;
499 u8 *end_aml;
500
501 ACPI_FUNCTION_TRACE("ut_get_resource_end_tag");
502
503 /* Get start and end pointers */
504
505 aml = obj_desc->buffer.pointer;
506 end_aml = aml + obj_desc->buffer.length;
507
508 /* Allow a buffer length of zero */
509
510 if (!obj_desc->buffer.length) {
511 *end_tag = aml;
512 return_ACPI_STATUS(AE_OK);
513 }
514
515 /* Walk the resource template, one descriptor per iteration */
516
517 while (aml < end_aml) {
518 /* Validate the Resource Type and Resource Length */
519
520 status = acpi_ut_validate_resource(aml, NULL);
521 if (ACPI_FAILURE(status)) {
522 return_ACPI_STATUS(status);
523 }
524
525 /* end_tag resource indicates the end of the resource template */
526
527 if (acpi_ut_get_resource_type(aml) ==
528 ACPI_RESOURCE_NAME_END_TAG) {
529 /*
530 * There must be at least one more byte in the buffer for
531 * the 2nd byte of the end_tag
532 */
533 if ((aml + 1) >= end_aml) {
534 return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
535 }
536
537 /* Return the pointer to the end_tag */
538
539 *end_tag = aml;
540 return_ACPI_STATUS(AE_OK);
541 }
542
543 /*
544 * Point to the next resource descriptor in the AML buffer. The
545 * descriptor length is guaranteed to be non-zero by resource
546 * validation above.
547 */
548 aml += acpi_ut_get_descriptor_length(aml);
549 }
550
551 /* Did not find an end_tag resource descriptor */
552
553 return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
554}
diff --git a/drivers/acpi/utilities/utstate.c b/drivers/acpi/utilities/utstate.c
index c1cb27583be8..4b134a722907 100644
--- a/drivers/acpi/utilities/utstate.c
+++ b/drivers/acpi/utilities/utstate.c
@@ -5,7 +5,7 @@
5 ******************************************************************************/ 5 ******************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -63,7 +63,7 @@ acpi_status
63acpi_ut_create_pkg_state_and_push(void *internal_object, 63acpi_ut_create_pkg_state_and_push(void *internal_object,
64 void *external_object, 64 void *external_object,
65 u16 index, 65 u16 index,
66 union acpi_generic_state ** state_list) 66 union acpi_generic_state **state_list)
67{ 67{
68 union acpi_generic_state *state; 68 union acpi_generic_state *state;
69 69
diff --git a/drivers/acpi/utilities/utxface.c b/drivers/acpi/utilities/utxface.c
index f06bd5e5e9d1..308a960871be 100644
--- a/drivers/acpi/utilities/utxface.c
+++ b/drivers/acpi/utilities/utxface.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -75,8 +75,7 @@ acpi_status acpi_initialize_subsystem(void)
75 75
76 status = acpi_os_initialize(); 76 status = acpi_os_initialize();
77 if (ACPI_FAILURE(status)) { 77 if (ACPI_FAILURE(status)) {
78 ACPI_REPORT_ERROR(("OSD failed to initialize, %s\n", 78 ACPI_EXCEPTION((AE_INFO, status, "During OSL initialization"));
79 acpi_format_exception(status)));
80 return_ACPI_STATUS(status); 79 return_ACPI_STATUS(status);
81 } 80 }
82 81
@@ -88,8 +87,8 @@ acpi_status acpi_initialize_subsystem(void)
88 87
89 status = acpi_ut_mutex_initialize(); 88 status = acpi_ut_mutex_initialize();
90 if (ACPI_FAILURE(status)) { 89 if (ACPI_FAILURE(status)) {
91 ACPI_REPORT_ERROR(("Global mutex creation failure, %s\n", 90 ACPI_EXCEPTION((AE_INFO, status,
92 acpi_format_exception(status))); 91 "During Global Mutex creation"));
93 return_ACPI_STATUS(status); 92 return_ACPI_STATUS(status);
94 } 93 }
95 94
@@ -99,15 +98,14 @@ acpi_status acpi_initialize_subsystem(void)
99 */ 98 */
100 status = acpi_ns_root_initialize(); 99 status = acpi_ns_root_initialize();
101 if (ACPI_FAILURE(status)) { 100 if (ACPI_FAILURE(status)) {
102 ACPI_REPORT_ERROR(("Namespace initialization failure, %s\n", 101 ACPI_EXCEPTION((AE_INFO, status,
103 acpi_format_exception(status))); 102 "During Namespace initialization"));
104 return_ACPI_STATUS(status); 103 return_ACPI_STATUS(status);
105 } 104 }
106 105
107 /* If configured, initialize the AML debugger */ 106 /* If configured, initialize the AML debugger */
108 107
109 ACPI_DEBUGGER_EXEC(status = acpi_db_initialize()); 108 ACPI_DEBUGGER_EXEC(status = acpi_db_initialize());
110
111 return_ACPI_STATUS(status); 109 return_ACPI_STATUS(status);
112} 110}
113 111
@@ -154,8 +152,7 @@ acpi_status acpi_enable_subsystem(u32 flags)
154 152
155 status = acpi_enable(); 153 status = acpi_enable();
156 if (ACPI_FAILURE(status)) { 154 if (ACPI_FAILURE(status)) {
157 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 155 ACPI_WARNING((AE_INFO, "acpi_enable failed"));
158 "acpi_enable failed.\n"));
159 return_ACPI_STATUS(status); 156 return_ACPI_STATUS(status);
160 } 157 }
161 } 158 }
@@ -178,10 +175,14 @@ acpi_status acpi_enable_subsystem(u32 flags)
178 /* 175 /*
179 * Initialize ACPI Event handling (Fixed and General Purpose) 176 * Initialize ACPI Event handling (Fixed and General Purpose)
180 * 177 *
181 * NOTE: We must have the hardware AND events initialized before we can 178 * Note1: We must have the hardware and events initialized before we can
182 * execute ANY control methods SAFELY. Any control method can require 179 * execute any control methods safely. Any control method can require
183 * ACPI hardware support, so the hardware MUST be initialized before 180 * ACPI hardware support, so the hardware must be fully initialized before
184 * execution! 181 * any method execution!
182 *
183 * Note2: Fixed events are initialized and enabled here. GPEs are
184 * initialized, but cannot be enabled until after the hardware is
185 * completely initialized (SCI and global_lock activated)
185 */ 186 */
186 if (!(flags & ACPI_NO_EVENT_INIT)) { 187 if (!(flags & ACPI_NO_EVENT_INIT)) {
187 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 188 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -193,8 +194,10 @@ acpi_status acpi_enable_subsystem(u32 flags)
193 } 194 }
194 } 195 }
195 196
196 /* Install the SCI handler and Global Lock handler */ 197 /*
197 198 * Install the SCI handler and Global Lock handler. This completes the
199 * hardware initialization.
200 */
198 if (!(flags & ACPI_NO_HANDLER_INIT)) { 201 if (!(flags & ACPI_NO_HANDLER_INIT)) {
199 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 202 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
200 "[Init] Installing SCI/GL handlers\n")); 203 "[Init] Installing SCI/GL handlers\n"));
@@ -205,6 +208,24 @@ acpi_status acpi_enable_subsystem(u32 flags)
205 } 208 }
206 } 209 }
207 210
211 /*
212 * Complete the GPE initialization for the GPE blocks defined in the FADT
213 * (GPE block 0 and 1).
214 *
215 * Note1: This is where the _PRW methods are executed for the GPEs. These
216 * methods can only be executed after the SCI and Global Lock handlers are
217 * installed and initialized.
218 *
219 * Note2: Currently, there seems to be no need to run the _REG methods
220 * before execution of the _PRW methods and enabling of the GPEs.
221 */
222 if (!(flags & ACPI_NO_EVENT_INIT)) {
223 status = acpi_ev_install_fadt_gpes();
224 if (ACPI_FAILURE(status)) {
225 return (status);
226 }
227 }
228
208 return_ACPI_STATUS(status); 229 return_ACPI_STATUS(status);
209} 230}
210 231
@@ -230,9 +251,9 @@ acpi_status acpi_initialize_objects(u32 flags)
230 /* 251 /*
231 * Run all _REG methods 252 * Run all _REG methods
232 * 253 *
233 * NOTE: Any objects accessed 254 * Note: Any objects accessed by the _REG methods will be automatically
234 * by the _REG methods will be automatically initialized, even if they 255 * initialized, even if they contain executable AML (see the call to
235 * contain executable AML (see call to acpi_ns_initialize_objects below). 256 * acpi_ns_initialize_objects below).
236 */ 257 */
237 if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) { 258 if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
238 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 259 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -245,9 +266,9 @@ acpi_status acpi_initialize_objects(u32 flags)
245 } 266 }
246 267
247 /* 268 /*
248 * Initialize the objects that remain uninitialized. This 269 * Initialize the objects that remain uninitialized. This runs the
249 * runs the executable AML that may be part of the declaration of these 270 * executable AML that may be part of the declaration of these objects:
250 * objects: operation_regions, buffer_fields, Buffers, and Packages. 271 * operation_regions, buffer_fields, Buffers, and Packages.
251 */ 272 */
252 if (!(flags & ACPI_NO_OBJECT_INIT)) { 273 if (!(flags & ACPI_NO_OBJECT_INIT)) {
253 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 274 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -260,8 +281,8 @@ acpi_status acpi_initialize_objects(u32 flags)
260 } 281 }
261 282
262 /* 283 /*
263 * Initialize all device objects in the namespace 284 * Initialize all device objects in the namespace. This runs the device
264 * This runs the _STA and _INI methods. 285 * _STA and _INI methods.
265 */ 286 */
266 if (!(flags & ACPI_NO_DEVICE_INIT)) { 287 if (!(flags & ACPI_NO_DEVICE_INIT)) {
267 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 288 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index d10668f14699..bd4887518373 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -920,8 +920,8 @@ static int acpi_video_device_add_fs(struct acpi_device *device)
920 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 920 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
921 "Unable to create 'state' fs entry\n")); 921 "Unable to create 'state' fs entry\n"));
922 else { 922 else {
923 acpi_video_device_state_fops.write = acpi_video_device_write_state;
923 entry->proc_fops = &acpi_video_device_state_fops; 924 entry->proc_fops = &acpi_video_device_state_fops;
924 entry->proc_fops->write = acpi_video_device_write_state;
925 entry->data = acpi_driver_data(device); 925 entry->data = acpi_driver_data(device);
926 entry->owner = THIS_MODULE; 926 entry->owner = THIS_MODULE;
927 } 927 }
@@ -934,8 +934,8 @@ static int acpi_video_device_add_fs(struct acpi_device *device)
934 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 934 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
935 "Unable to create 'brightness' fs entry\n")); 935 "Unable to create 'brightness' fs entry\n"));
936 else { 936 else {
937 acpi_video_device_brightness_fops.write = acpi_video_device_write_brightness;
937 entry->proc_fops = &acpi_video_device_brightness_fops; 938 entry->proc_fops = &acpi_video_device_brightness_fops;
938 entry->proc_fops->write = acpi_video_device_write_brightness;
939 entry->data = acpi_driver_data(device); 939 entry->data = acpi_driver_data(device);
940 entry->owner = THIS_MODULE; 940 entry->owner = THIS_MODULE;
941 } 941 }
@@ -1239,8 +1239,8 @@ static int acpi_video_bus_add_fs(struct acpi_device *device)
1239 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 1239 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
1240 "Unable to create 'POST' fs entry\n")); 1240 "Unable to create 'POST' fs entry\n"));
1241 else { 1241 else {
1242 acpi_video_bus_POST_fops.write = acpi_video_bus_write_POST;
1242 entry->proc_fops = &acpi_video_bus_POST_fops; 1243 entry->proc_fops = &acpi_video_bus_POST_fops;
1243 entry->proc_fops->write = acpi_video_bus_write_POST;
1244 entry->data = acpi_driver_data(device); 1244 entry->data = acpi_driver_data(device);
1245 entry->owner = THIS_MODULE; 1245 entry->owner = THIS_MODULE;
1246 } 1246 }
@@ -1253,8 +1253,8 @@ static int acpi_video_bus_add_fs(struct acpi_device *device)
1253 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 1253 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
1254 "Unable to create 'DOS' fs entry\n")); 1254 "Unable to create 'DOS' fs entry\n"));
1255 else { 1255 else {
1256 acpi_video_bus_DOS_fops.write = acpi_video_bus_write_DOS;
1256 entry->proc_fops = &acpi_video_bus_DOS_fops; 1257 entry->proc_fops = &acpi_video_bus_DOS_fops;
1257 entry->proc_fops->write = acpi_video_bus_write_DOS;
1258 entry->data = acpi_driver_data(device); 1258 entry->data = acpi_driver_data(device);
1259 entry->owner = THIS_MODULE; 1259 entry->owner = THIS_MODULE;
1260 } 1260 }
diff --git a/drivers/char/drm/ati_pcigart.c b/drivers/char/drm/ati_pcigart.c
index 5485382cadec..bd7be09ea53d 100644
--- a/drivers/char/drm/ati_pcigart.c
+++ b/drivers/char/drm/ati_pcigart.c
@@ -59,17 +59,16 @@ static void *drm_ati_alloc_pcigart_table(void)
59 int i; 59 int i;
60 DRM_DEBUG("%s\n", __FUNCTION__); 60 DRM_DEBUG("%s\n", __FUNCTION__);
61 61
62 address = __get_free_pages(GFP_KERNEL, ATI_PCIGART_TABLE_ORDER); 62 address = __get_free_pages(GFP_KERNEL | __GFP_COMP,
63 ATI_PCIGART_TABLE_ORDER);
63 if (address == 0UL) { 64 if (address == 0UL) {
64 return 0; 65 return NULL;
65 } 66 }
66 67
67 page = virt_to_page(address); 68 page = virt_to_page(address);
68 69
69 for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) { 70 for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++)
70 get_page(page);
71 SetPageReserved(page); 71 SetPageReserved(page);
72 }
73 72
74 DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address); 73 DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address);
75 return (void *)address; 74 return (void *)address;
@@ -83,10 +82,8 @@ static void drm_ati_free_pcigart_table(void *address)
83 82
84 page = virt_to_page((unsigned long)address); 83 page = virt_to_page((unsigned long)address);
85 84
86 for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) { 85 for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++)
87 __put_page(page);
88 ClearPageReserved(page); 86 ClearPageReserved(page);
89 }
90 87
91 free_pages((unsigned long)address, ATI_PCIGART_TABLE_ORDER); 88 free_pages((unsigned long)address, ATI_PCIGART_TABLE_ORDER);
92} 89}
@@ -127,7 +124,7 @@ int drm_ati_pcigart_cleanup(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
127 if (gart_info->gart_table_location == DRM_ATI_GART_MAIN 124 if (gart_info->gart_table_location == DRM_ATI_GART_MAIN
128 && gart_info->addr) { 125 && gart_info->addr) {
129 drm_ati_free_pcigart_table(gart_info->addr); 126 drm_ati_free_pcigart_table(gart_info->addr);
130 gart_info->addr = 0; 127 gart_info->addr = NULL;
131 } 128 }
132 129
133 return 1; 130 return 1;
@@ -168,7 +165,7 @@ int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
168 if (bus_address == 0) { 165 if (bus_address == 0) {
169 DRM_ERROR("unable to map PCIGART pages!\n"); 166 DRM_ERROR("unable to map PCIGART pages!\n");
170 drm_ati_free_pcigart_table(address); 167 drm_ati_free_pcigart_table(address);
171 address = 0; 168 address = NULL;
172 goto done; 169 goto done;
173 } 170 }
174 } else { 171 } else {
diff --git a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h
index 54b561e69486..71b8b32b075f 100644
--- a/drivers/char/drm/drmP.h
+++ b/drivers/char/drm/drmP.h
@@ -57,6 +57,7 @@
57#include <linux/smp_lock.h> /* For (un)lock_kernel */ 57#include <linux/smp_lock.h> /* For (un)lock_kernel */
58#include <linux/mm.h> 58#include <linux/mm.h>
59#include <linux/cdev.h> 59#include <linux/cdev.h>
60#include <linux/mutex.h>
60#if defined(__alpha__) || defined(__powerpc__) 61#if defined(__alpha__) || defined(__powerpc__)
61#include <asm/pgtable.h> /* For pte_wrprotect */ 62#include <asm/pgtable.h> /* For pte_wrprotect */
62#endif 63#endif
@@ -623,7 +624,7 @@ typedef struct drm_device {
623 /** \name Locks */ 624 /** \name Locks */
624 /*@{ */ 625 /*@{ */
625 spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */ 626 spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */
626 struct semaphore struct_sem; /**< For others */ 627 struct mutex struct_mutex; /**< For others */
627 /*@} */ 628 /*@} */
628 629
629 /** \name Usage Counters */ 630 /** \name Usage Counters */
@@ -658,7 +659,7 @@ typedef struct drm_device {
658 /*@{ */ 659 /*@{ */
659 drm_ctx_list_t *ctxlist; /**< Linked list of context handles */ 660 drm_ctx_list_t *ctxlist; /**< Linked list of context handles */
660 int ctx_count; /**< Number of context handles */ 661 int ctx_count; /**< Number of context handles */
661 struct semaphore ctxlist_sem; /**< For ctxlist */ 662 struct mutex ctxlist_mutex; /**< For ctxlist */
662 663
663 drm_map_t **context_sareas; /**< per-context SAREA's */ 664 drm_map_t **context_sareas; /**< per-context SAREA's */
664 int max_context; 665 int max_context;
diff --git a/drivers/char/drm/drm_auth.c b/drivers/char/drm/drm_auth.c
index a47b502bc7cc..2a37586a7ee8 100644
--- a/drivers/char/drm/drm_auth.c
+++ b/drivers/char/drm/drm_auth.c
@@ -56,7 +56,7 @@ static int drm_hash_magic(drm_magic_t magic)
56 * \param magic magic number. 56 * \param magic magic number.
57 * 57 *
58 * Searches in drm_device::magiclist within all files with the same hash key 58 * Searches in drm_device::magiclist within all files with the same hash key
59 * the one with matching magic number, while holding the drm_device::struct_sem 59 * the one with matching magic number, while holding the drm_device::struct_mutex
60 * lock. 60 * lock.
61 */ 61 */
62static drm_file_t *drm_find_file(drm_device_t * dev, drm_magic_t magic) 62static drm_file_t *drm_find_file(drm_device_t * dev, drm_magic_t magic)
@@ -65,14 +65,14 @@ static drm_file_t *drm_find_file(drm_device_t * dev, drm_magic_t magic)
65 drm_magic_entry_t *pt; 65 drm_magic_entry_t *pt;
66 int hash = drm_hash_magic(magic); 66 int hash = drm_hash_magic(magic);
67 67
68 down(&dev->struct_sem); 68 mutex_lock(&dev->struct_mutex);
69 for (pt = dev->magiclist[hash].head; pt; pt = pt->next) { 69 for (pt = dev->magiclist[hash].head; pt; pt = pt->next) {
70 if (pt->magic == magic) { 70 if (pt->magic == magic) {
71 retval = pt->priv; 71 retval = pt->priv;
72 break; 72 break;
73 } 73 }
74 } 74 }
75 up(&dev->struct_sem); 75 mutex_unlock(&dev->struct_mutex);
76 return retval; 76 return retval;
77} 77}
78 78
@@ -85,7 +85,7 @@ static drm_file_t *drm_find_file(drm_device_t * dev, drm_magic_t magic)
85 * 85 *
86 * Creates a drm_magic_entry structure and appends to the linked list 86 * Creates a drm_magic_entry structure and appends to the linked list
87 * associated the magic number hash key in drm_device::magiclist, while holding 87 * associated the magic number hash key in drm_device::magiclist, while holding
88 * the drm_device::struct_sem lock. 88 * the drm_device::struct_mutex lock.
89 */ 89 */
90static int drm_add_magic(drm_device_t * dev, drm_file_t * priv, 90static int drm_add_magic(drm_device_t * dev, drm_file_t * priv,
91 drm_magic_t magic) 91 drm_magic_t magic)
@@ -104,7 +104,7 @@ static int drm_add_magic(drm_device_t * dev, drm_file_t * priv,
104 entry->priv = priv; 104 entry->priv = priv;
105 entry->next = NULL; 105 entry->next = NULL;
106 106
107 down(&dev->struct_sem); 107 mutex_lock(&dev->struct_mutex);
108 if (dev->magiclist[hash].tail) { 108 if (dev->magiclist[hash].tail) {
109 dev->magiclist[hash].tail->next = entry; 109 dev->magiclist[hash].tail->next = entry;
110 dev->magiclist[hash].tail = entry; 110 dev->magiclist[hash].tail = entry;
@@ -112,7 +112,7 @@ static int drm_add_magic(drm_device_t * dev, drm_file_t * priv,
112 dev->magiclist[hash].head = entry; 112 dev->magiclist[hash].head = entry;
113 dev->magiclist[hash].tail = entry; 113 dev->magiclist[hash].tail = entry;
114 } 114 }
115 up(&dev->struct_sem); 115 mutex_unlock(&dev->struct_mutex);
116 116
117 return 0; 117 return 0;
118} 118}
@@ -124,7 +124,7 @@ static int drm_add_magic(drm_device_t * dev, drm_file_t * priv,
124 * \param magic magic number. 124 * \param magic magic number.
125 * 125 *
126 * Searches and unlinks the entry in drm_device::magiclist with the magic 126 * Searches and unlinks the entry in drm_device::magiclist with the magic
127 * number hash key, while holding the drm_device::struct_sem lock. 127 * number hash key, while holding the drm_device::struct_mutex lock.
128 */ 128 */
129static int drm_remove_magic(drm_device_t * dev, drm_magic_t magic) 129static int drm_remove_magic(drm_device_t * dev, drm_magic_t magic)
130{ 130{
@@ -135,7 +135,7 @@ static int drm_remove_magic(drm_device_t * dev, drm_magic_t magic)
135 DRM_DEBUG("%d\n", magic); 135 DRM_DEBUG("%d\n", magic);
136 hash = drm_hash_magic(magic); 136 hash = drm_hash_magic(magic);
137 137
138 down(&dev->struct_sem); 138 mutex_lock(&dev->struct_mutex);
139 for (pt = dev->magiclist[hash].head; pt; prev = pt, pt = pt->next) { 139 for (pt = dev->magiclist[hash].head; pt; prev = pt, pt = pt->next) {
140 if (pt->magic == magic) { 140 if (pt->magic == magic) {
141 if (dev->magiclist[hash].head == pt) { 141 if (dev->magiclist[hash].head == pt) {
@@ -147,11 +147,11 @@ static int drm_remove_magic(drm_device_t * dev, drm_magic_t magic)
147 if (prev) { 147 if (prev) {
148 prev->next = pt->next; 148 prev->next = pt->next;
149 } 149 }
150 up(&dev->struct_sem); 150 mutex_unlock(&dev->struct_mutex);
151 return 0; 151 return 0;
152 } 152 }
153 } 153 }
154 up(&dev->struct_sem); 154 mutex_unlock(&dev->struct_mutex);
155 155
156 drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC); 156 drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC);
157 157
diff --git a/drivers/char/drm/drm_bufs.c b/drivers/char/drm/drm_bufs.c
index 1db12dcb6802..e2637b4d51de 100644
--- a/drivers/char/drm/drm_bufs.c
+++ b/drivers/char/drm/drm_bufs.c
@@ -255,14 +255,14 @@ static int drm_addmap_core(drm_device_t * dev, unsigned int offset,
255 memset(list, 0, sizeof(*list)); 255 memset(list, 0, sizeof(*list));
256 list->map = map; 256 list->map = map;
257 257
258 down(&dev->struct_sem); 258 mutex_lock(&dev->struct_mutex);
259 list_add(&list->head, &dev->maplist->head); 259 list_add(&list->head, &dev->maplist->head);
260 /* Assign a 32-bit handle */ 260 /* Assign a 32-bit handle */
261 /* We do it here so that dev->struct_sem protects the increment */ 261 /* We do it here so that dev->struct_mutex protects the increment */
262 list->user_token = HandleID(map->type == _DRM_SHM 262 list->user_token = HandleID(map->type == _DRM_SHM
263 ? (unsigned long)map->handle 263 ? (unsigned long)map->handle
264 : map->offset, dev); 264 : map->offset, dev);
265 up(&dev->struct_sem); 265 mutex_unlock(&dev->struct_mutex);
266 266
267 *maplist = list; 267 *maplist = list;
268 return 0; 268 return 0;
@@ -392,9 +392,9 @@ int drm_rmmap(drm_device_t *dev, drm_local_map_t *map)
392{ 392{
393 int ret; 393 int ret;
394 394
395 down(&dev->struct_sem); 395 mutex_lock(&dev->struct_mutex);
396 ret = drm_rmmap_locked(dev, map); 396 ret = drm_rmmap_locked(dev, map);
397 up(&dev->struct_sem); 397 mutex_unlock(&dev->struct_mutex);
398 398
399 return ret; 399 return ret;
400} 400}
@@ -423,7 +423,7 @@ int drm_rmmap_ioctl(struct inode *inode, struct file *filp,
423 return -EFAULT; 423 return -EFAULT;
424 } 424 }
425 425
426 down(&dev->struct_sem); 426 mutex_lock(&dev->struct_mutex);
427 list_for_each(list, &dev->maplist->head) { 427 list_for_each(list, &dev->maplist->head) {
428 drm_map_list_t *r_list = list_entry(list, drm_map_list_t, head); 428 drm_map_list_t *r_list = list_entry(list, drm_map_list_t, head);
429 429
@@ -439,7 +439,7 @@ int drm_rmmap_ioctl(struct inode *inode, struct file *filp,
439 * find anything. 439 * find anything.
440 */ 440 */
441 if (list == (&dev->maplist->head)) { 441 if (list == (&dev->maplist->head)) {
442 up(&dev->struct_sem); 442 mutex_unlock(&dev->struct_mutex);
443 return -EINVAL; 443 return -EINVAL;
444 } 444 }
445 445
@@ -448,13 +448,13 @@ int drm_rmmap_ioctl(struct inode *inode, struct file *filp,
448 448
449 /* Register and framebuffer maps are permanent */ 449 /* Register and framebuffer maps are permanent */
450 if ((map->type == _DRM_REGISTERS) || (map->type == _DRM_FRAME_BUFFER)) { 450 if ((map->type == _DRM_REGISTERS) || (map->type == _DRM_FRAME_BUFFER)) {
451 up(&dev->struct_sem); 451 mutex_unlock(&dev->struct_mutex);
452 return 0; 452 return 0;
453 } 453 }
454 454
455 ret = drm_rmmap_locked(dev, map); 455 ret = drm_rmmap_locked(dev, map);
456 456
457 up(&dev->struct_sem); 457 mutex_unlock(&dev->struct_mutex);
458 458
459 return ret; 459 return ret;
460} 460}
@@ -566,16 +566,16 @@ int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request)
566 atomic_inc(&dev->buf_alloc); 566 atomic_inc(&dev->buf_alloc);
567 spin_unlock(&dev->count_lock); 567 spin_unlock(&dev->count_lock);
568 568
569 down(&dev->struct_sem); 569 mutex_lock(&dev->struct_mutex);
570 entry = &dma->bufs[order]; 570 entry = &dma->bufs[order];
571 if (entry->buf_count) { 571 if (entry->buf_count) {
572 up(&dev->struct_sem); 572 mutex_unlock(&dev->struct_mutex);
573 atomic_dec(&dev->buf_alloc); 573 atomic_dec(&dev->buf_alloc);
574 return -ENOMEM; /* May only call once for each order */ 574 return -ENOMEM; /* May only call once for each order */
575 } 575 }
576 576
577 if (count < 0 || count > 4096) { 577 if (count < 0 || count > 4096) {
578 up(&dev->struct_sem); 578 mutex_unlock(&dev->struct_mutex);
579 atomic_dec(&dev->buf_alloc); 579 atomic_dec(&dev->buf_alloc);
580 return -EINVAL; 580 return -EINVAL;
581 } 581 }
@@ -583,7 +583,7 @@ int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request)
583 entry->buflist = drm_alloc(count * sizeof(*entry->buflist), 583 entry->buflist = drm_alloc(count * sizeof(*entry->buflist),
584 DRM_MEM_BUFS); 584 DRM_MEM_BUFS);
585 if (!entry->buflist) { 585 if (!entry->buflist) {
586 up(&dev->struct_sem); 586 mutex_unlock(&dev->struct_mutex);
587 atomic_dec(&dev->buf_alloc); 587 atomic_dec(&dev->buf_alloc);
588 return -ENOMEM; 588 return -ENOMEM;
589 } 589 }
@@ -616,7 +616,7 @@ int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request)
616 /* Set count correctly so we free the proper amount. */ 616 /* Set count correctly so we free the proper amount. */
617 entry->buf_count = count; 617 entry->buf_count = count;
618 drm_cleanup_buf_error(dev, entry); 618 drm_cleanup_buf_error(dev, entry);
619 up(&dev->struct_sem); 619 mutex_unlock(&dev->struct_mutex);
620 atomic_dec(&dev->buf_alloc); 620 atomic_dec(&dev->buf_alloc);
621 return -ENOMEM; 621 return -ENOMEM;
622 } 622 }
@@ -638,7 +638,7 @@ int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request)
638 if (!temp_buflist) { 638 if (!temp_buflist) {
639 /* Free the entry because it isn't valid */ 639 /* Free the entry because it isn't valid */
640 drm_cleanup_buf_error(dev, entry); 640 drm_cleanup_buf_error(dev, entry);
641 up(&dev->struct_sem); 641 mutex_unlock(&dev->struct_mutex);
642 atomic_dec(&dev->buf_alloc); 642 atomic_dec(&dev->buf_alloc);
643 return -ENOMEM; 643 return -ENOMEM;
644 } 644 }
@@ -656,7 +656,7 @@ int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request)
656 DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); 656 DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count);
657 DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count); 657 DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count);
658 658
659 up(&dev->struct_sem); 659 mutex_unlock(&dev->struct_mutex);
660 660
661 request->count = entry->buf_count; 661 request->count = entry->buf_count;
662 request->size = size; 662 request->size = size;
@@ -722,16 +722,16 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)
722 atomic_inc(&dev->buf_alloc); 722 atomic_inc(&dev->buf_alloc);
723 spin_unlock(&dev->count_lock); 723 spin_unlock(&dev->count_lock);
724 724
725 down(&dev->struct_sem); 725 mutex_lock(&dev->struct_mutex);
726 entry = &dma->bufs[order]; 726 entry = &dma->bufs[order];
727 if (entry->buf_count) { 727 if (entry->buf_count) {
728 up(&dev->struct_sem); 728 mutex_unlock(&dev->struct_mutex);
729 atomic_dec(&dev->buf_alloc); 729 atomic_dec(&dev->buf_alloc);
730 return -ENOMEM; /* May only call once for each order */ 730 return -ENOMEM; /* May only call once for each order */
731 } 731 }
732 732
733 if (count < 0 || count > 4096) { 733 if (count < 0 || count > 4096) {
734 up(&dev->struct_sem); 734 mutex_unlock(&dev->struct_mutex);
735 atomic_dec(&dev->buf_alloc); 735 atomic_dec(&dev->buf_alloc);
736 return -EINVAL; 736 return -EINVAL;
737 } 737 }
@@ -739,7 +739,7 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)
739 entry->buflist = drm_alloc(count * sizeof(*entry->buflist), 739 entry->buflist = drm_alloc(count * sizeof(*entry->buflist),
740 DRM_MEM_BUFS); 740 DRM_MEM_BUFS);
741 if (!entry->buflist) { 741 if (!entry->buflist) {
742 up(&dev->struct_sem); 742 mutex_unlock(&dev->struct_mutex);
743 atomic_dec(&dev->buf_alloc); 743 atomic_dec(&dev->buf_alloc);
744 return -ENOMEM; 744 return -ENOMEM;
745 } 745 }
@@ -750,7 +750,7 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)
750 if (!entry->seglist) { 750 if (!entry->seglist) {
751 drm_free(entry->buflist, 751 drm_free(entry->buflist,
752 count * sizeof(*entry->buflist), DRM_MEM_BUFS); 752 count * sizeof(*entry->buflist), DRM_MEM_BUFS);
753 up(&dev->struct_sem); 753 mutex_unlock(&dev->struct_mutex);
754 atomic_dec(&dev->buf_alloc); 754 atomic_dec(&dev->buf_alloc);
755 return -ENOMEM; 755 return -ENOMEM;
756 } 756 }
@@ -766,7 +766,7 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)
766 count * sizeof(*entry->buflist), DRM_MEM_BUFS); 766 count * sizeof(*entry->buflist), DRM_MEM_BUFS);
767 drm_free(entry->seglist, 767 drm_free(entry->seglist,
768 count * sizeof(*entry->seglist), DRM_MEM_SEGS); 768 count * sizeof(*entry->seglist), DRM_MEM_SEGS);
769 up(&dev->struct_sem); 769 mutex_unlock(&dev->struct_mutex);
770 atomic_dec(&dev->buf_alloc); 770 atomic_dec(&dev->buf_alloc);
771 return -ENOMEM; 771 return -ENOMEM;
772 } 772 }
@@ -790,7 +790,7 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)
790 drm_free(temp_pagelist, 790 drm_free(temp_pagelist,
791 (dma->page_count + (count << page_order)) 791 (dma->page_count + (count << page_order))
792 * sizeof(*dma->pagelist), DRM_MEM_PAGES); 792 * sizeof(*dma->pagelist), DRM_MEM_PAGES);
793 up(&dev->struct_sem); 793 mutex_unlock(&dev->struct_mutex);
794 atomic_dec(&dev->buf_alloc); 794 atomic_dec(&dev->buf_alloc);
795 return -ENOMEM; 795 return -ENOMEM;
796 } 796 }
@@ -831,7 +831,7 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)
831 (count << page_order)) 831 (count << page_order))
832 * sizeof(*dma->pagelist), 832 * sizeof(*dma->pagelist),
833 DRM_MEM_PAGES); 833 DRM_MEM_PAGES);
834 up(&dev->struct_sem); 834 mutex_unlock(&dev->struct_mutex);
835 atomic_dec(&dev->buf_alloc); 835 atomic_dec(&dev->buf_alloc);
836 return -ENOMEM; 836 return -ENOMEM;
837 } 837 }
@@ -853,7 +853,7 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)
853 drm_free(temp_pagelist, 853 drm_free(temp_pagelist,
854 (dma->page_count + (count << page_order)) 854 (dma->page_count + (count << page_order))
855 * sizeof(*dma->pagelist), DRM_MEM_PAGES); 855 * sizeof(*dma->pagelist), DRM_MEM_PAGES);
856 up(&dev->struct_sem); 856 mutex_unlock(&dev->struct_mutex);
857 atomic_dec(&dev->buf_alloc); 857 atomic_dec(&dev->buf_alloc);
858 return -ENOMEM; 858 return -ENOMEM;
859 } 859 }
@@ -878,7 +878,7 @@ int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request)
878 dma->page_count += entry->seg_count << page_order; 878 dma->page_count += entry->seg_count << page_order;
879 dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order); 879 dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order);
880 880
881 up(&dev->struct_sem); 881 mutex_unlock(&dev->struct_mutex);
882 882
883 request->count = entry->buf_count; 883 request->count = entry->buf_count;
884 request->size = size; 884 request->size = size;
@@ -948,16 +948,16 @@ static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request)
948 atomic_inc(&dev->buf_alloc); 948 atomic_inc(&dev->buf_alloc);
949 spin_unlock(&dev->count_lock); 949 spin_unlock(&dev->count_lock);
950 950
951 down(&dev->struct_sem); 951 mutex_lock(&dev->struct_mutex);
952 entry = &dma->bufs[order]; 952 entry = &dma->bufs[order];
953 if (entry->buf_count) { 953 if (entry->buf_count) {
954 up(&dev->struct_sem); 954 mutex_unlock(&dev->struct_mutex);
955 atomic_dec(&dev->buf_alloc); 955 atomic_dec(&dev->buf_alloc);
956 return -ENOMEM; /* May only call once for each order */ 956 return -ENOMEM; /* May only call once for each order */
957 } 957 }
958 958
959 if (count < 0 || count > 4096) { 959 if (count < 0 || count > 4096) {
960 up(&dev->struct_sem); 960 mutex_unlock(&dev->struct_mutex);
961 atomic_dec(&dev->buf_alloc); 961 atomic_dec(&dev->buf_alloc);
962 return -EINVAL; 962 return -EINVAL;
963 } 963 }
@@ -965,7 +965,7 @@ static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request)
965 entry->buflist = drm_alloc(count * sizeof(*entry->buflist), 965 entry->buflist = drm_alloc(count * sizeof(*entry->buflist),
966 DRM_MEM_BUFS); 966 DRM_MEM_BUFS);
967 if (!entry->buflist) { 967 if (!entry->buflist) {
968 up(&dev->struct_sem); 968 mutex_unlock(&dev->struct_mutex);
969 atomic_dec(&dev->buf_alloc); 969 atomic_dec(&dev->buf_alloc);
970 return -ENOMEM; 970 return -ENOMEM;
971 } 971 }
@@ -999,7 +999,7 @@ static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request)
999 /* Set count correctly so we free the proper amount. */ 999 /* Set count correctly so we free the proper amount. */
1000 entry->buf_count = count; 1000 entry->buf_count = count;
1001 drm_cleanup_buf_error(dev, entry); 1001 drm_cleanup_buf_error(dev, entry);
1002 up(&dev->struct_sem); 1002 mutex_unlock(&dev->struct_mutex);
1003 atomic_dec(&dev->buf_alloc); 1003 atomic_dec(&dev->buf_alloc);
1004 return -ENOMEM; 1004 return -ENOMEM;
1005 } 1005 }
@@ -1022,7 +1022,7 @@ static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request)
1022 if (!temp_buflist) { 1022 if (!temp_buflist) {
1023 /* Free the entry because it isn't valid */ 1023 /* Free the entry because it isn't valid */
1024 drm_cleanup_buf_error(dev, entry); 1024 drm_cleanup_buf_error(dev, entry);
1025 up(&dev->struct_sem); 1025 mutex_unlock(&dev->struct_mutex);
1026 atomic_dec(&dev->buf_alloc); 1026 atomic_dec(&dev->buf_alloc);
1027 return -ENOMEM; 1027 return -ENOMEM;
1028 } 1028 }
@@ -1040,7 +1040,7 @@ static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request)
1040 DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); 1040 DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count);
1041 DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count); 1041 DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count);
1042 1042
1043 up(&dev->struct_sem); 1043 mutex_unlock(&dev->struct_mutex);
1044 1044
1045 request->count = entry->buf_count; 1045 request->count = entry->buf_count;
1046 request->size = size; 1046 request->size = size;
@@ -1110,16 +1110,16 @@ int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request)
1110 atomic_inc(&dev->buf_alloc); 1110 atomic_inc(&dev->buf_alloc);
1111 spin_unlock(&dev->count_lock); 1111 spin_unlock(&dev->count_lock);
1112 1112
1113 down(&dev->struct_sem); 1113 mutex_lock(&dev->struct_mutex);
1114 entry = &dma->bufs[order]; 1114 entry = &dma->bufs[order];
1115 if (entry->buf_count) { 1115 if (entry->buf_count) {
1116 up(&dev->struct_sem); 1116 mutex_unlock(&dev->struct_mutex);
1117 atomic_dec(&dev->buf_alloc); 1117 atomic_dec(&dev->buf_alloc);
1118 return -ENOMEM; /* May only call once for each order */ 1118 return -ENOMEM; /* May only call once for each order */
1119 } 1119 }
1120 1120
1121 if (count < 0 || count > 4096) { 1121 if (count < 0 || count > 4096) {
1122 up(&dev->struct_sem); 1122 mutex_unlock(&dev->struct_mutex);
1123 atomic_dec(&dev->buf_alloc); 1123 atomic_dec(&dev->buf_alloc);
1124 return -EINVAL; 1124 return -EINVAL;
1125 } 1125 }
@@ -1127,7 +1127,7 @@ int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request)
1127 entry->buflist = drm_alloc(count * sizeof(*entry->buflist), 1127 entry->buflist = drm_alloc(count * sizeof(*entry->buflist),
1128 DRM_MEM_BUFS); 1128 DRM_MEM_BUFS);
1129 if (!entry->buflist) { 1129 if (!entry->buflist) {
1130 up(&dev->struct_sem); 1130 mutex_unlock(&dev->struct_mutex);
1131 atomic_dec(&dev->buf_alloc); 1131 atomic_dec(&dev->buf_alloc);
1132 return -ENOMEM; 1132 return -ENOMEM;
1133 } 1133 }
@@ -1160,7 +1160,7 @@ int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request)
1160 /* Set count correctly so we free the proper amount. */ 1160 /* Set count correctly so we free the proper amount. */
1161 entry->buf_count = count; 1161 entry->buf_count = count;
1162 drm_cleanup_buf_error(dev, entry); 1162 drm_cleanup_buf_error(dev, entry);
1163 up(&dev->struct_sem); 1163 mutex_unlock(&dev->struct_mutex);
1164 atomic_dec(&dev->buf_alloc); 1164 atomic_dec(&dev->buf_alloc);
1165 return -ENOMEM; 1165 return -ENOMEM;
1166 } 1166 }
@@ -1182,7 +1182,7 @@ int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request)
1182 if (!temp_buflist) { 1182 if (!temp_buflist) {
1183 /* Free the entry because it isn't valid */ 1183 /* Free the entry because it isn't valid */
1184 drm_cleanup_buf_error(dev, entry); 1184 drm_cleanup_buf_error(dev, entry);
1185 up(&dev->struct_sem); 1185 mutex_unlock(&dev->struct_mutex);
1186 atomic_dec(&dev->buf_alloc); 1186 atomic_dec(&dev->buf_alloc);
1187 return -ENOMEM; 1187 return -ENOMEM;
1188 } 1188 }
@@ -1200,7 +1200,7 @@ int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request)
1200 DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count); 1200 DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count);
1201 DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count); 1201 DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count);
1202 1202
1203 up(&dev->struct_sem); 1203 mutex_unlock(&dev->struct_mutex);
1204 1204
1205 request->count = entry->buf_count; 1205 request->count = entry->buf_count;
1206 request->size = size; 1206 request->size = size;
diff --git a/drivers/char/drm/drm_context.c b/drivers/char/drm/drm_context.c
index f84254526949..83094c73da67 100644
--- a/drivers/char/drm/drm_context.c
+++ b/drivers/char/drm/drm_context.c
@@ -53,7 +53,7 @@
53 * \param ctx_handle context handle. 53 * \param ctx_handle context handle.
54 * 54 *
55 * Clears the bit specified by \p ctx_handle in drm_device::ctx_bitmap and the entry 55 * Clears the bit specified by \p ctx_handle in drm_device::ctx_bitmap and the entry
56 * in drm_device::context_sareas, while holding the drm_device::struct_sem 56 * in drm_device::context_sareas, while holding the drm_device::struct_mutex
57 * lock. 57 * lock.
58 */ 58 */
59void drm_ctxbitmap_free(drm_device_t * dev, int ctx_handle) 59void drm_ctxbitmap_free(drm_device_t * dev, int ctx_handle)
@@ -64,10 +64,10 @@ void drm_ctxbitmap_free(drm_device_t * dev, int ctx_handle)
64 goto failed; 64 goto failed;
65 65
66 if (ctx_handle < DRM_MAX_CTXBITMAP) { 66 if (ctx_handle < DRM_MAX_CTXBITMAP) {
67 down(&dev->struct_sem); 67 mutex_lock(&dev->struct_mutex);
68 clear_bit(ctx_handle, dev->ctx_bitmap); 68 clear_bit(ctx_handle, dev->ctx_bitmap);
69 dev->context_sareas[ctx_handle] = NULL; 69 dev->context_sareas[ctx_handle] = NULL;
70 up(&dev->struct_sem); 70 mutex_unlock(&dev->struct_mutex);
71 return; 71 return;
72 } 72 }
73 failed: 73 failed:
@@ -83,7 +83,7 @@ void drm_ctxbitmap_free(drm_device_t * dev, int ctx_handle)
83 * 83 *
84 * Find the first zero bit in drm_device::ctx_bitmap and (re)allocates 84 * Find the first zero bit in drm_device::ctx_bitmap and (re)allocates
85 * drm_device::context_sareas to accommodate the new entry while holding the 85 * drm_device::context_sareas to accommodate the new entry while holding the
86 * drm_device::struct_sem lock. 86 * drm_device::struct_mutex lock.
87 */ 87 */
88static int drm_ctxbitmap_next(drm_device_t * dev) 88static int drm_ctxbitmap_next(drm_device_t * dev)
89{ 89{
@@ -92,7 +92,7 @@ static int drm_ctxbitmap_next(drm_device_t * dev)
92 if (!dev->ctx_bitmap) 92 if (!dev->ctx_bitmap)
93 return -1; 93 return -1;
94 94
95 down(&dev->struct_sem); 95 mutex_lock(&dev->struct_mutex);
96 bit = find_first_zero_bit(dev->ctx_bitmap, DRM_MAX_CTXBITMAP); 96 bit = find_first_zero_bit(dev->ctx_bitmap, DRM_MAX_CTXBITMAP);
97 if (bit < DRM_MAX_CTXBITMAP) { 97 if (bit < DRM_MAX_CTXBITMAP) {
98 set_bit(bit, dev->ctx_bitmap); 98 set_bit(bit, dev->ctx_bitmap);
@@ -113,7 +113,7 @@ static int drm_ctxbitmap_next(drm_device_t * dev)
113 DRM_MEM_MAPS); 113 DRM_MEM_MAPS);
114 if (!ctx_sareas) { 114 if (!ctx_sareas) {
115 clear_bit(bit, dev->ctx_bitmap); 115 clear_bit(bit, dev->ctx_bitmap);
116 up(&dev->struct_sem); 116 mutex_unlock(&dev->struct_mutex);
117 return -1; 117 return -1;
118 } 118 }
119 dev->context_sareas = ctx_sareas; 119 dev->context_sareas = ctx_sareas;
@@ -126,16 +126,16 @@ static int drm_ctxbitmap_next(drm_device_t * dev)
126 DRM_MEM_MAPS); 126 DRM_MEM_MAPS);
127 if (!dev->context_sareas) { 127 if (!dev->context_sareas) {
128 clear_bit(bit, dev->ctx_bitmap); 128 clear_bit(bit, dev->ctx_bitmap);
129 up(&dev->struct_sem); 129 mutex_unlock(&dev->struct_mutex);
130 return -1; 130 return -1;
131 } 131 }
132 dev->context_sareas[bit] = NULL; 132 dev->context_sareas[bit] = NULL;
133 } 133 }
134 } 134 }
135 up(&dev->struct_sem); 135 mutex_unlock(&dev->struct_mutex);
136 return bit; 136 return bit;
137 } 137 }
138 up(&dev->struct_sem); 138 mutex_unlock(&dev->struct_mutex);
139 return -1; 139 return -1;
140} 140}
141 141
@@ -145,24 +145,24 @@ static int drm_ctxbitmap_next(drm_device_t * dev)
145 * \param dev DRM device. 145 * \param dev DRM device.
146 * 146 *
147 * Allocates and initialize drm_device::ctx_bitmap and drm_device::context_sareas, while holding 147 * Allocates and initialize drm_device::ctx_bitmap and drm_device::context_sareas, while holding
148 * the drm_device::struct_sem lock. 148 * the drm_device::struct_mutex lock.
149 */ 149 */
150int drm_ctxbitmap_init(drm_device_t * dev) 150int drm_ctxbitmap_init(drm_device_t * dev)
151{ 151{
152 int i; 152 int i;
153 int temp; 153 int temp;
154 154
155 down(&dev->struct_sem); 155 mutex_lock(&dev->struct_mutex);
156 dev->ctx_bitmap = (unsigned long *)drm_alloc(PAGE_SIZE, 156 dev->ctx_bitmap = (unsigned long *)drm_alloc(PAGE_SIZE,
157 DRM_MEM_CTXBITMAP); 157 DRM_MEM_CTXBITMAP);
158 if (dev->ctx_bitmap == NULL) { 158 if (dev->ctx_bitmap == NULL) {
159 up(&dev->struct_sem); 159 mutex_unlock(&dev->struct_mutex);
160 return -ENOMEM; 160 return -ENOMEM;
161 } 161 }
162 memset((void *)dev->ctx_bitmap, 0, PAGE_SIZE); 162 memset((void *)dev->ctx_bitmap, 0, PAGE_SIZE);
163 dev->context_sareas = NULL; 163 dev->context_sareas = NULL;
164 dev->max_context = -1; 164 dev->max_context = -1;
165 up(&dev->struct_sem); 165 mutex_unlock(&dev->struct_mutex);
166 166
167 for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) { 167 for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) {
168 temp = drm_ctxbitmap_next(dev); 168 temp = drm_ctxbitmap_next(dev);
@@ -178,17 +178,17 @@ int drm_ctxbitmap_init(drm_device_t * dev)
178 * \param dev DRM device. 178 * \param dev DRM device.
179 * 179 *
180 * Frees drm_device::ctx_bitmap and drm_device::context_sareas, while holding 180 * Frees drm_device::ctx_bitmap and drm_device::context_sareas, while holding
181 * the drm_device::struct_sem lock. 181 * the drm_device::struct_mutex lock.
182 */ 182 */
183void drm_ctxbitmap_cleanup(drm_device_t * dev) 183void drm_ctxbitmap_cleanup(drm_device_t * dev)
184{ 184{
185 down(&dev->struct_sem); 185 mutex_lock(&dev->struct_mutex);
186 if (dev->context_sareas) 186 if (dev->context_sareas)
187 drm_free(dev->context_sareas, 187 drm_free(dev->context_sareas,
188 sizeof(*dev->context_sareas) * 188 sizeof(*dev->context_sareas) *
189 dev->max_context, DRM_MEM_MAPS); 189 dev->max_context, DRM_MEM_MAPS);
190 drm_free((void *)dev->ctx_bitmap, PAGE_SIZE, DRM_MEM_CTXBITMAP); 190 drm_free((void *)dev->ctx_bitmap, PAGE_SIZE, DRM_MEM_CTXBITMAP);
191 up(&dev->struct_sem); 191 mutex_unlock(&dev->struct_mutex);
192} 192}
193 193
194/*@}*/ 194/*@}*/
@@ -222,15 +222,15 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
222 if (copy_from_user(&request, argp, sizeof(request))) 222 if (copy_from_user(&request, argp, sizeof(request)))
223 return -EFAULT; 223 return -EFAULT;
224 224
225 down(&dev->struct_sem); 225 mutex_lock(&dev->struct_mutex);
226 if (dev->max_context < 0 226 if (dev->max_context < 0
227 || request.ctx_id >= (unsigned)dev->max_context) { 227 || request.ctx_id >= (unsigned)dev->max_context) {
228 up(&dev->struct_sem); 228 mutex_unlock(&dev->struct_mutex);
229 return -EINVAL; 229 return -EINVAL;
230 } 230 }
231 231
232 map = dev->context_sareas[request.ctx_id]; 232 map = dev->context_sareas[request.ctx_id];
233 up(&dev->struct_sem); 233 mutex_unlock(&dev->struct_mutex);
234 234
235 request.handle = NULL; 235 request.handle = NULL;
236 list_for_each_entry(_entry, &dev->maplist->head, head) { 236 list_for_each_entry(_entry, &dev->maplist->head, head) {
@@ -274,7 +274,7 @@ int drm_setsareactx(struct inode *inode, struct file *filp,
274 (drm_ctx_priv_map_t __user *) arg, sizeof(request))) 274 (drm_ctx_priv_map_t __user *) arg, sizeof(request)))
275 return -EFAULT; 275 return -EFAULT;
276 276
277 down(&dev->struct_sem); 277 mutex_lock(&dev->struct_mutex);
278 list_for_each(list, &dev->maplist->head) { 278 list_for_each(list, &dev->maplist->head) {
279 r_list = list_entry(list, drm_map_list_t, head); 279 r_list = list_entry(list, drm_map_list_t, head);
280 if (r_list->map 280 if (r_list->map
@@ -282,7 +282,7 @@ int drm_setsareactx(struct inode *inode, struct file *filp,
282 goto found; 282 goto found;
283 } 283 }
284 bad: 284 bad:
285 up(&dev->struct_sem); 285 mutex_unlock(&dev->struct_mutex);
286 return -EINVAL; 286 return -EINVAL;
287 287
288 found: 288 found:
@@ -294,7 +294,7 @@ int drm_setsareactx(struct inode *inode, struct file *filp,
294 if (request.ctx_id >= (unsigned)dev->max_context) 294 if (request.ctx_id >= (unsigned)dev->max_context)
295 goto bad; 295 goto bad;
296 dev->context_sareas[request.ctx_id] = map; 296 dev->context_sareas[request.ctx_id] = map;
297 up(&dev->struct_sem); 297 mutex_unlock(&dev->struct_mutex);
298 return 0; 298 return 0;
299} 299}
300 300
@@ -448,10 +448,10 @@ int drm_addctx(struct inode *inode, struct file *filp,
448 ctx_entry->handle = ctx.handle; 448 ctx_entry->handle = ctx.handle;
449 ctx_entry->tag = priv; 449 ctx_entry->tag = priv;
450 450
451 down(&dev->ctxlist_sem); 451 mutex_lock(&dev->ctxlist_mutex);
452 list_add(&ctx_entry->head, &dev->ctxlist->head); 452 list_add(&ctx_entry->head, &dev->ctxlist->head);
453 ++dev->ctx_count; 453 ++dev->ctx_count;
454 up(&dev->ctxlist_sem); 454 mutex_unlock(&dev->ctxlist_mutex);
455 455
456 if (copy_to_user(argp, &ctx, sizeof(ctx))) 456 if (copy_to_user(argp, &ctx, sizeof(ctx)))
457 return -EFAULT; 457 return -EFAULT;
@@ -574,7 +574,7 @@ int drm_rmctx(struct inode *inode, struct file *filp,
574 drm_ctxbitmap_free(dev, ctx.handle); 574 drm_ctxbitmap_free(dev, ctx.handle);
575 } 575 }
576 576
577 down(&dev->ctxlist_sem); 577 mutex_lock(&dev->ctxlist_mutex);
578 if (!list_empty(&dev->ctxlist->head)) { 578 if (!list_empty(&dev->ctxlist->head)) {
579 drm_ctx_list_t *pos, *n; 579 drm_ctx_list_t *pos, *n;
580 580
@@ -586,7 +586,7 @@ int drm_rmctx(struct inode *inode, struct file *filp,
586 } 586 }
587 } 587 }
588 } 588 }
589 up(&dev->ctxlist_sem); 589 mutex_unlock(&dev->ctxlist_mutex);
590 590
591 return 0; 591 return 0;
592} 592}
diff --git a/drivers/char/drm/drm_drv.c b/drivers/char/drm/drm_drv.c
index c4fa5a29582b..dc6bbe8a18dc 100644
--- a/drivers/char/drm/drm_drv.c
+++ b/drivers/char/drm/drm_drv.c
@@ -151,7 +151,7 @@ int drm_lastclose(drm_device_t * dev)
151 if (dev->irq_enabled) 151 if (dev->irq_enabled)
152 drm_irq_uninstall(dev); 152 drm_irq_uninstall(dev);
153 153
154 down(&dev->struct_sem); 154 mutex_lock(&dev->struct_mutex);
155 del_timer(&dev->timer); 155 del_timer(&dev->timer);
156 156
157 /* Clear pid list */ 157 /* Clear pid list */
@@ -231,7 +231,7 @@ int drm_lastclose(drm_device_t * dev)
231 dev->lock.filp = NULL; 231 dev->lock.filp = NULL;
232 wake_up_interruptible(&dev->lock.lock_queue); 232 wake_up_interruptible(&dev->lock.lock_queue);
233 } 233 }
234 up(&dev->struct_sem); 234 mutex_unlock(&dev->struct_mutex);
235 235
236 DRM_DEBUG("lastclose completed\n"); 236 DRM_DEBUG("lastclose completed\n");
237 return 0; 237 return 0;
diff --git a/drivers/char/drm/drm_fops.c b/drivers/char/drm/drm_fops.c
index 403f44a1bf01..641f7633878c 100644
--- a/drivers/char/drm/drm_fops.c
+++ b/drivers/char/drm/drm_fops.c
@@ -262,7 +262,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp,
262 goto out_free; 262 goto out_free;
263 } 263 }
264 264
265 down(&dev->struct_sem); 265 mutex_lock(&dev->struct_mutex);
266 if (!dev->file_last) { 266 if (!dev->file_last) {
267 priv->next = NULL; 267 priv->next = NULL;
268 priv->prev = NULL; 268 priv->prev = NULL;
@@ -276,7 +276,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp,
276 dev->file_last->next = priv; 276 dev->file_last->next = priv;
277 dev->file_last = priv; 277 dev->file_last = priv;
278 } 278 }
279 up(&dev->struct_sem); 279 mutex_unlock(&dev->struct_mutex);
280 280
281#ifdef __alpha__ 281#ifdef __alpha__
282 /* 282 /*
@@ -413,7 +413,7 @@ int drm_release(struct inode *inode, struct file *filp)
413 413
414 drm_fasync(-1, filp, 0); 414 drm_fasync(-1, filp, 0);
415 415
416 down(&dev->ctxlist_sem); 416 mutex_lock(&dev->ctxlist_mutex);
417 if (dev->ctxlist && (!list_empty(&dev->ctxlist->head))) { 417 if (dev->ctxlist && (!list_empty(&dev->ctxlist->head))) {
418 drm_ctx_list_t *pos, *n; 418 drm_ctx_list_t *pos, *n;
419 419
@@ -432,9 +432,9 @@ int drm_release(struct inode *inode, struct file *filp)
432 } 432 }
433 } 433 }
434 } 434 }
435 up(&dev->ctxlist_sem); 435 mutex_unlock(&dev->ctxlist_mutex);
436 436
437 down(&dev->struct_sem); 437 mutex_lock(&dev->struct_mutex);
438 if (priv->remove_auth_on_close == 1) { 438 if (priv->remove_auth_on_close == 1) {
439 drm_file_t *temp = dev->file_first; 439 drm_file_t *temp = dev->file_first;
440 while (temp) { 440 while (temp) {
@@ -452,7 +452,7 @@ int drm_release(struct inode *inode, struct file *filp)
452 } else { 452 } else {
453 dev->file_last = priv->prev; 453 dev->file_last = priv->prev;
454 } 454 }
455 up(&dev->struct_sem); 455 mutex_unlock(&dev->struct_mutex);
456 456
457 if (dev->driver->postclose) 457 if (dev->driver->postclose)
458 dev->driver->postclose(dev, priv); 458 dev->driver->postclose(dev, priv);
diff --git a/drivers/char/drm/drm_ioctl.c b/drivers/char/drm/drm_ioctl.c
index bcd4e604d3ec..555f323b8a32 100644
--- a/drivers/char/drm/drm_ioctl.c
+++ b/drivers/char/drm/drm_ioctl.c
@@ -194,9 +194,9 @@ int drm_getmap(struct inode *inode, struct file *filp,
194 return -EFAULT; 194 return -EFAULT;
195 idx = map.offset; 195 idx = map.offset;
196 196
197 down(&dev->struct_sem); 197 mutex_lock(&dev->struct_mutex);
198 if (idx < 0) { 198 if (idx < 0) {
199 up(&dev->struct_sem); 199 mutex_unlock(&dev->struct_mutex);
200 return -EINVAL; 200 return -EINVAL;
201 } 201 }
202 202
@@ -209,7 +209,7 @@ int drm_getmap(struct inode *inode, struct file *filp,
209 i++; 209 i++;
210 } 210 }
211 if (!r_list || !r_list->map) { 211 if (!r_list || !r_list->map) {
212 up(&dev->struct_sem); 212 mutex_unlock(&dev->struct_mutex);
213 return -EINVAL; 213 return -EINVAL;
214 } 214 }
215 215
@@ -219,7 +219,7 @@ int drm_getmap(struct inode *inode, struct file *filp,
219 map.flags = r_list->map->flags; 219 map.flags = r_list->map->flags;
220 map.handle = (void *)(unsigned long)r_list->user_token; 220 map.handle = (void *)(unsigned long)r_list->user_token;
221 map.mtrr = r_list->map->mtrr; 221 map.mtrr = r_list->map->mtrr;
222 up(&dev->struct_sem); 222 mutex_unlock(&dev->struct_mutex);
223 223
224 if (copy_to_user(argp, &map, sizeof(map))) 224 if (copy_to_user(argp, &map, sizeof(map)))
225 return -EFAULT; 225 return -EFAULT;
@@ -253,11 +253,11 @@ int drm_getclient(struct inode *inode, struct file *filp,
253 if (copy_from_user(&client, argp, sizeof(client))) 253 if (copy_from_user(&client, argp, sizeof(client)))
254 return -EFAULT; 254 return -EFAULT;
255 idx = client.idx; 255 idx = client.idx;
256 down(&dev->struct_sem); 256 mutex_lock(&dev->struct_mutex);
257 for (i = 0, pt = dev->file_first; i < idx && pt; i++, pt = pt->next) ; 257 for (i = 0, pt = dev->file_first; i < idx && pt; i++, pt = pt->next) ;
258 258
259 if (!pt) { 259 if (!pt) {
260 up(&dev->struct_sem); 260 mutex_unlock(&dev->struct_mutex);
261 return -EINVAL; 261 return -EINVAL;
262 } 262 }
263 client.auth = pt->authenticated; 263 client.auth = pt->authenticated;
@@ -265,7 +265,7 @@ int drm_getclient(struct inode *inode, struct file *filp,
265 client.uid = pt->uid; 265 client.uid = pt->uid;
266 client.magic = pt->magic; 266 client.magic = pt->magic;
267 client.iocs = pt->ioctl_count; 267 client.iocs = pt->ioctl_count;
268 up(&dev->struct_sem); 268 mutex_unlock(&dev->struct_mutex);
269 269
270 if (copy_to_user(argp, &client, sizeof(client))) 270 if (copy_to_user(argp, &client, sizeof(client)))
271 return -EFAULT; 271 return -EFAULT;
@@ -292,7 +292,7 @@ int drm_getstats(struct inode *inode, struct file *filp,
292 292
293 memset(&stats, 0, sizeof(stats)); 293 memset(&stats, 0, sizeof(stats));
294 294
295 down(&dev->struct_sem); 295 mutex_lock(&dev->struct_mutex);
296 296
297 for (i = 0; i < dev->counters; i++) { 297 for (i = 0; i < dev->counters; i++) {
298 if (dev->types[i] == _DRM_STAT_LOCK) 298 if (dev->types[i] == _DRM_STAT_LOCK)
@@ -305,7 +305,7 @@ int drm_getstats(struct inode *inode, struct file *filp,
305 305
306 stats.count = dev->counters; 306 stats.count = dev->counters;
307 307
308 up(&dev->struct_sem); 308 mutex_unlock(&dev->struct_mutex);
309 309
310 if (copy_to_user((drm_stats_t __user *) arg, &stats, sizeof(stats))) 310 if (copy_to_user((drm_stats_t __user *) arg, &stats, sizeof(stats)))
311 return -EFAULT; 311 return -EFAULT;
diff --git a/drivers/char/drm/drm_irq.c b/drivers/char/drm/drm_irq.c
index b0d4b236e837..611a1173091d 100644
--- a/drivers/char/drm/drm_irq.c
+++ b/drivers/char/drm/drm_irq.c
@@ -98,20 +98,20 @@ static int drm_irq_install(drm_device_t * dev)
98 if (dev->irq == 0) 98 if (dev->irq == 0)
99 return -EINVAL; 99 return -EINVAL;
100 100
101 down(&dev->struct_sem); 101 mutex_lock(&dev->struct_mutex);
102 102
103 /* Driver must have been initialized */ 103 /* Driver must have been initialized */
104 if (!dev->dev_private) { 104 if (!dev->dev_private) {
105 up(&dev->struct_sem); 105 mutex_unlock(&dev->struct_mutex);
106 return -EINVAL; 106 return -EINVAL;
107 } 107 }
108 108
109 if (dev->irq_enabled) { 109 if (dev->irq_enabled) {
110 up(&dev->struct_sem); 110 mutex_unlock(&dev->struct_mutex);
111 return -EBUSY; 111 return -EBUSY;
112 } 112 }
113 dev->irq_enabled = 1; 113 dev->irq_enabled = 1;
114 up(&dev->struct_sem); 114 mutex_unlock(&dev->struct_mutex);
115 115
116 DRM_DEBUG("%s: irq=%d\n", __FUNCTION__, dev->irq); 116 DRM_DEBUG("%s: irq=%d\n", __FUNCTION__, dev->irq);
117 117
@@ -135,9 +135,9 @@ static int drm_irq_install(drm_device_t * dev)
135 ret = request_irq(dev->irq, dev->driver->irq_handler, 135 ret = request_irq(dev->irq, dev->driver->irq_handler,
136 sh_flags, dev->devname, dev); 136 sh_flags, dev->devname, dev);
137 if (ret < 0) { 137 if (ret < 0) {
138 down(&dev->struct_sem); 138 mutex_lock(&dev->struct_mutex);
139 dev->irq_enabled = 0; 139 dev->irq_enabled = 0;
140 up(&dev->struct_sem); 140 mutex_unlock(&dev->struct_mutex);
141 return ret; 141 return ret;
142 } 142 }
143 143
@@ -161,10 +161,10 @@ int drm_irq_uninstall(drm_device_t * dev)
161 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) 161 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
162 return -EINVAL; 162 return -EINVAL;
163 163
164 down(&dev->struct_sem); 164 mutex_lock(&dev->struct_mutex);
165 irq_enabled = dev->irq_enabled; 165 irq_enabled = dev->irq_enabled;
166 dev->irq_enabled = 0; 166 dev->irq_enabled = 0;
167 up(&dev->struct_sem); 167 mutex_unlock(&dev->struct_mutex);
168 168
169 if (!irq_enabled) 169 if (!irq_enabled)
170 return -EINVAL; 170 return -EINVAL;
diff --git a/drivers/char/drm/drm_pciids.h b/drivers/char/drm/drm_pciids.h
index 5b1d3a04458d..8fd6357a48da 100644
--- a/drivers/char/drm/drm_pciids.h
+++ b/drivers/char/drm/drm_pciids.h
@@ -3,6 +3,7 @@
3 Please contact dri-devel@lists.sf.net to add new cards to this list 3 Please contact dri-devel@lists.sf.net to add new cards to this list
4*/ 4*/
5#define radeon_PCI_IDS \ 5#define radeon_PCI_IDS \
6 {0x1002, 0x3150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV350},\
6 {0x1002, 0x4136, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS100|CHIP_IS_IGP}, \ 7 {0x1002, 0x4136, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS100|CHIP_IS_IGP}, \
7 {0x1002, 0x4137, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|CHIP_IS_IGP}, \ 8 {0x1002, 0x4137, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS200|CHIP_IS_IGP}, \
8 {0x1002, 0x4144, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \ 9 {0x1002, 0x4144, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \
@@ -242,5 +243,6 @@
242 {0x8086, 0x2582, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ 243 {0x8086, 0x2582, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
243 {0x8086, 0x2592, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ 244 {0x8086, 0x2592, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
244 {0x8086, 0x2772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ 245 {0x8086, 0x2772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
246 {0x8086, 0x27a2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
245 {0, 0, 0} 247 {0, 0, 0}
246 248
diff --git a/drivers/char/drm/drm_proc.c b/drivers/char/drm/drm_proc.c
index 6f943e3309ef..362a270af0f1 100644
--- a/drivers/char/drm/drm_proc.c
+++ b/drivers/char/drm/drm_proc.c
@@ -258,7 +258,7 @@ static int drm__vm_info(char *buf, char **start, off_t offset, int request,
258} 258}
259 259
260/** 260/**
261 * Simply calls _vm_info() while holding the drm_device::struct_sem lock. 261 * Simply calls _vm_info() while holding the drm_device::struct_mutex lock.
262 */ 262 */
263static int drm_vm_info(char *buf, char **start, off_t offset, int request, 263static int drm_vm_info(char *buf, char **start, off_t offset, int request,
264 int *eof, void *data) 264 int *eof, void *data)
@@ -266,9 +266,9 @@ static int drm_vm_info(char *buf, char **start, off_t offset, int request,
266 drm_device_t *dev = (drm_device_t *) data; 266 drm_device_t *dev = (drm_device_t *) data;
267 int ret; 267 int ret;
268 268
269 down(&dev->struct_sem); 269 mutex_lock(&dev->struct_mutex);
270 ret = drm__vm_info(buf, start, offset, request, eof, data); 270 ret = drm__vm_info(buf, start, offset, request, eof, data);
271 up(&dev->struct_sem); 271 mutex_unlock(&dev->struct_mutex);
272 return ret; 272 return ret;
273} 273}
274 274
@@ -331,7 +331,7 @@ static int drm__queues_info(char *buf, char **start, off_t offset,
331} 331}
332 332
333/** 333/**
334 * Simply calls _queues_info() while holding the drm_device::struct_sem lock. 334 * Simply calls _queues_info() while holding the drm_device::struct_mutex lock.
335 */ 335 */
336static int drm_queues_info(char *buf, char **start, off_t offset, int request, 336static int drm_queues_info(char *buf, char **start, off_t offset, int request,
337 int *eof, void *data) 337 int *eof, void *data)
@@ -339,9 +339,9 @@ static int drm_queues_info(char *buf, char **start, off_t offset, int request,
339 drm_device_t *dev = (drm_device_t *) data; 339 drm_device_t *dev = (drm_device_t *) data;
340 int ret; 340 int ret;
341 341
342 down(&dev->struct_sem); 342 mutex_lock(&dev->struct_mutex);
343 ret = drm__queues_info(buf, start, offset, request, eof, data); 343 ret = drm__queues_info(buf, start, offset, request, eof, data);
344 up(&dev->struct_sem); 344 mutex_unlock(&dev->struct_mutex);
345 return ret; 345 return ret;
346} 346}
347 347
@@ -403,7 +403,7 @@ static int drm__bufs_info(char *buf, char **start, off_t offset, int request,
403} 403}
404 404
405/** 405/**
406 * Simply calls _bufs_info() while holding the drm_device::struct_sem lock. 406 * Simply calls _bufs_info() while holding the drm_device::struct_mutex lock.
407 */ 407 */
408static int drm_bufs_info(char *buf, char **start, off_t offset, int request, 408static int drm_bufs_info(char *buf, char **start, off_t offset, int request,
409 int *eof, void *data) 409 int *eof, void *data)
@@ -411,9 +411,9 @@ static int drm_bufs_info(char *buf, char **start, off_t offset, int request,
411 drm_device_t *dev = (drm_device_t *) data; 411 drm_device_t *dev = (drm_device_t *) data;
412 int ret; 412 int ret;
413 413
414 down(&dev->struct_sem); 414 mutex_lock(&dev->struct_mutex);
415 ret = drm__bufs_info(buf, start, offset, request, eof, data); 415 ret = drm__bufs_info(buf, start, offset, request, eof, data);
416 up(&dev->struct_sem); 416 mutex_unlock(&dev->struct_mutex);
417 return ret; 417 return ret;
418} 418}
419 419
@@ -459,7 +459,7 @@ static int drm__clients_info(char *buf, char **start, off_t offset,
459} 459}
460 460
461/** 461/**
462 * Simply calls _clients_info() while holding the drm_device::struct_sem lock. 462 * Simply calls _clients_info() while holding the drm_device::struct_mutex lock.
463 */ 463 */
464static int drm_clients_info(char *buf, char **start, off_t offset, 464static int drm_clients_info(char *buf, char **start, off_t offset,
465 int request, int *eof, void *data) 465 int request, int *eof, void *data)
@@ -467,9 +467,9 @@ static int drm_clients_info(char *buf, char **start, off_t offset,
467 drm_device_t *dev = (drm_device_t *) data; 467 drm_device_t *dev = (drm_device_t *) data;
468 int ret; 468 int ret;
469 469
470 down(&dev->struct_sem); 470 mutex_lock(&dev->struct_mutex);
471 ret = drm__clients_info(buf, start, offset, request, eof, data); 471 ret = drm__clients_info(buf, start, offset, request, eof, data);
472 up(&dev->struct_sem); 472 mutex_unlock(&dev->struct_mutex);
473 return ret; 473 return ret;
474} 474}
475 475
@@ -540,9 +540,9 @@ static int drm_vma_info(char *buf, char **start, off_t offset, int request,
540 drm_device_t *dev = (drm_device_t *) data; 540 drm_device_t *dev = (drm_device_t *) data;
541 int ret; 541 int ret;
542 542
543 down(&dev->struct_sem); 543 mutex_lock(&dev->struct_mutex);
544 ret = drm__vma_info(buf, start, offset, request, eof, data); 544 ret = drm__vma_info(buf, start, offset, request, eof, data);
545 up(&dev->struct_sem); 545 mutex_unlock(&dev->struct_mutex);
546 return ret; 546 return ret;
547} 547}
548#endif 548#endif
diff --git a/drivers/char/drm/drm_stub.c b/drivers/char/drm/drm_stub.c
index 42d766359caa..7a9263ff3007 100644
--- a/drivers/char/drm/drm_stub.c
+++ b/drivers/char/drm/drm_stub.c
@@ -61,8 +61,8 @@ static int drm_fill_in_dev(drm_device_t * dev, struct pci_dev *pdev,
61 61
62 spin_lock_init(&dev->count_lock); 62 spin_lock_init(&dev->count_lock);
63 init_timer(&dev->timer); 63 init_timer(&dev->timer);
64 sema_init(&dev->struct_sem, 1); 64 mutex_init(&dev->struct_mutex);
65 sema_init(&dev->ctxlist_sem, 1); 65 mutex_init(&dev->ctxlist_mutex);
66 66
67 dev->pdev = pdev; 67 dev->pdev = pdev;
68 68
diff --git a/drivers/char/drm/drm_vm.c b/drivers/char/drm/drm_vm.c
index 3f73aa774c80..0291cd62c69f 100644
--- a/drivers/char/drm/drm_vm.c
+++ b/drivers/char/drm/drm_vm.c
@@ -188,7 +188,7 @@ static void drm_vm_shm_close(struct vm_area_struct *vma)
188 188
189 map = vma->vm_private_data; 189 map = vma->vm_private_data;
190 190
191 down(&dev->struct_sem); 191 mutex_lock(&dev->struct_mutex);
192 for (pt = dev->vmalist, prev = NULL; pt; pt = next) { 192 for (pt = dev->vmalist, prev = NULL; pt; pt = next) {
193 next = pt->next; 193 next = pt->next;
194 if (pt->vma->vm_private_data == map) 194 if (pt->vma->vm_private_data == map)
@@ -248,7 +248,7 @@ static void drm_vm_shm_close(struct vm_area_struct *vma)
248 drm_free(map, sizeof(*map), DRM_MEM_MAPS); 248 drm_free(map, sizeof(*map), DRM_MEM_MAPS);
249 } 249 }
250 } 250 }
251 up(&dev->struct_sem); 251 mutex_unlock(&dev->struct_mutex);
252} 252}
253 253
254/** 254/**
@@ -404,12 +404,12 @@ static void drm_vm_open(struct vm_area_struct *vma)
404 404
405 vma_entry = drm_alloc(sizeof(*vma_entry), DRM_MEM_VMAS); 405 vma_entry = drm_alloc(sizeof(*vma_entry), DRM_MEM_VMAS);
406 if (vma_entry) { 406 if (vma_entry) {
407 down(&dev->struct_sem); 407 mutex_lock(&dev->struct_mutex);
408 vma_entry->vma = vma; 408 vma_entry->vma = vma;
409 vma_entry->next = dev->vmalist; 409 vma_entry->next = dev->vmalist;
410 vma_entry->pid = current->pid; 410 vma_entry->pid = current->pid;
411 dev->vmalist = vma_entry; 411 dev->vmalist = vma_entry;
412 up(&dev->struct_sem); 412 mutex_unlock(&dev->struct_mutex);
413 } 413 }
414} 414}
415 415
@@ -431,7 +431,7 @@ static void drm_vm_close(struct vm_area_struct *vma)
431 vma->vm_start, vma->vm_end - vma->vm_start); 431 vma->vm_start, vma->vm_end - vma->vm_start);
432 atomic_dec(&dev->vma_count); 432 atomic_dec(&dev->vma_count);
433 433
434 down(&dev->struct_sem); 434 mutex_lock(&dev->struct_mutex);
435 for (pt = dev->vmalist, prev = NULL; pt; prev = pt, pt = pt->next) { 435 for (pt = dev->vmalist, prev = NULL; pt; prev = pt, pt = pt->next) {
436 if (pt->vma == vma) { 436 if (pt->vma == vma) {
437 if (prev) { 437 if (prev) {
@@ -443,7 +443,7 @@ static void drm_vm_close(struct vm_area_struct *vma)
443 break; 443 break;
444 } 444 }
445 } 445 }
446 up(&dev->struct_sem); 446 mutex_unlock(&dev->struct_mutex);
447} 447}
448 448
449/** 449/**
diff --git a/drivers/char/drm/i810_dma.c b/drivers/char/drm/i810_dma.c
index cc1b89086876..ae0aa6d7e0bb 100644
--- a/drivers/char/drm/i810_dma.c
+++ b/drivers/char/drm/i810_dma.c
@@ -958,7 +958,7 @@ static int i810_flush_queue(drm_device_t * dev)
958} 958}
959 959
960/* Must be called with the lock held */ 960/* Must be called with the lock held */
961void i810_reclaim_buffers(drm_device_t * dev, struct file *filp) 961static void i810_reclaim_buffers(drm_device_t * dev, struct file *filp)
962{ 962{
963 drm_device_dma_t *dma = dev->dma; 963 drm_device_dma_t *dma = dev->dma;
964 int i; 964 int i;
diff --git a/drivers/char/drm/i810_drv.h b/drivers/char/drm/i810_drv.h
index a18b80d91920..e8cf3ff606f0 100644
--- a/drivers/char/drm/i810_drv.h
+++ b/drivers/char/drm/i810_drv.h
@@ -113,8 +113,6 @@ typedef struct drm_i810_private {
113} drm_i810_private_t; 113} drm_i810_private_t;
114 114
115 /* i810_dma.c */ 115 /* i810_dma.c */
116extern void i810_reclaim_buffers(drm_device_t * dev, struct file *filp);
117
118extern int i810_driver_dma_quiescent(drm_device_t * dev); 116extern int i810_driver_dma_quiescent(drm_device_t * dev);
119extern void i810_driver_reclaim_buffers_locked(drm_device_t * dev, 117extern void i810_driver_reclaim_buffers_locked(drm_device_t * dev,
120 struct file *filp); 118 struct file *filp);
diff --git a/drivers/char/drm/i830_dma.c b/drivers/char/drm/i830_dma.c
index 4fea32aed6d2..163f2cbfe60d 100644
--- a/drivers/char/drm/i830_dma.c
+++ b/drivers/char/drm/i830_dma.c
@@ -1239,7 +1239,7 @@ static int i830_flush_queue(drm_device_t * dev)
1239} 1239}
1240 1240
1241/* Must be called with the lock held */ 1241/* Must be called with the lock held */
1242void i830_reclaim_buffers(drm_device_t * dev, struct file *filp) 1242static void i830_reclaim_buffers(drm_device_t * dev, struct file *filp)
1243{ 1243{
1244 drm_device_dma_t *dma = dev->dma; 1244 drm_device_dma_t *dma = dev->dma;
1245 int i; 1245 int i;
diff --git a/drivers/char/drm/i830_drv.h b/drivers/char/drm/i830_drv.h
index bf9075b576bd..85bc5be6f916 100644
--- a/drivers/char/drm/i830_drv.h
+++ b/drivers/char/drm/i830_drv.h
@@ -123,9 +123,6 @@ typedef struct drm_i830_private {
123extern drm_ioctl_desc_t i830_ioctls[]; 123extern drm_ioctl_desc_t i830_ioctls[];
124extern int i830_max_ioctl; 124extern int i830_max_ioctl;
125 125
126/* i830_dma.c */
127extern void i830_reclaim_buffers(drm_device_t * dev, struct file *filp);
128
129/* i830_irq.c */ 126/* i830_irq.c */
130extern int i830_irq_emit(struct inode *inode, struct file *filp, 127extern int i830_irq_emit(struct inode *inode, struct file *filp,
131 unsigned int cmd, unsigned long arg); 128 unsigned int cmd, unsigned long arg);
diff --git a/drivers/char/drm/i915_dma.c b/drivers/char/drm/i915_dma.c
index 9140703da1ba..1ff4c7ca0bff 100644
--- a/drivers/char/drm/i915_dma.c
+++ b/drivers/char/drm/i915_dma.c
@@ -344,18 +344,20 @@ static int i915_emit_cmds(drm_device_t * dev, int __user * buffer, int dwords)
344 int i; 344 int i;
345 RING_LOCALS; 345 RING_LOCALS;
346 346
347 if ((dwords+1) * sizeof(int) >= dev_priv->ring.Size - 8)
348 return DRM_ERR(EINVAL);
349
350 BEGIN_LP_RING(((dwords+1)&~1));
351
347 for (i = 0; i < dwords;) { 352 for (i = 0; i < dwords;) {
348 int cmd, sz; 353 int cmd, sz;
349 354
350 if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], sizeof(cmd))) 355 if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], sizeof(cmd)))
351 return DRM_ERR(EINVAL); 356 return DRM_ERR(EINVAL);
352 357
353/* printk("%d/%d ", i, dwords); */
354
355 if ((sz = validate_cmd(cmd)) == 0 || i + sz > dwords) 358 if ((sz = validate_cmd(cmd)) == 0 || i + sz > dwords)
356 return DRM_ERR(EINVAL); 359 return DRM_ERR(EINVAL);
357 360
358 BEGIN_LP_RING(sz);
359 OUT_RING(cmd); 361 OUT_RING(cmd);
360 362
361 while (++i, --sz) { 363 while (++i, --sz) {
@@ -365,9 +367,13 @@ static int i915_emit_cmds(drm_device_t * dev, int __user * buffer, int dwords)
365 } 367 }
366 OUT_RING(cmd); 368 OUT_RING(cmd);
367 } 369 }
368 ADVANCE_LP_RING();
369 } 370 }
370 371
372 if (dwords & 1)
373 OUT_RING(0);
374
375 ADVANCE_LP_RING();
376
371 return 0; 377 return 0;
372} 378}
373 379
@@ -401,6 +407,21 @@ static int i915_emit_box(drm_device_t * dev,
401 return 0; 407 return 0;
402} 408}
403 409
410static void i915_emit_breadcrumb(drm_device_t *dev)
411{
412 drm_i915_private_t *dev_priv = dev->dev_private;
413 RING_LOCALS;
414
415 dev_priv->sarea_priv->last_enqueue = dev_priv->counter++;
416
417 BEGIN_LP_RING(4);
418 OUT_RING(CMD_STORE_DWORD_IDX);
419 OUT_RING(20);
420 OUT_RING(dev_priv->counter);
421 OUT_RING(0);
422 ADVANCE_LP_RING();
423}
424
404static int i915_dispatch_cmdbuffer(drm_device_t * dev, 425static int i915_dispatch_cmdbuffer(drm_device_t * dev,
405 drm_i915_cmdbuffer_t * cmd) 426 drm_i915_cmdbuffer_t * cmd)
406{ 427{
@@ -429,6 +450,7 @@ static int i915_dispatch_cmdbuffer(drm_device_t * dev,
429 return ret; 450 return ret;
430 } 451 }
431 452
453 i915_emit_breadcrumb(dev);
432 return 0; 454 return 0;
433} 455}
434 456
@@ -475,12 +497,7 @@ static int i915_dispatch_batchbuffer(drm_device_t * dev,
475 497
476 dev_priv->sarea_priv->last_enqueue = dev_priv->counter++; 498 dev_priv->sarea_priv->last_enqueue = dev_priv->counter++;
477 499
478 BEGIN_LP_RING(4); 500 i915_emit_breadcrumb(dev);
479 OUT_RING(CMD_STORE_DWORD_IDX);
480 OUT_RING(20);
481 OUT_RING(dev_priv->counter);
482 OUT_RING(0);
483 ADVANCE_LP_RING();
484 501
485 return 0; 502 return 0;
486} 503}
@@ -657,7 +674,7 @@ static int i915_getparam(DRM_IOCTL_ARGS)
657 value = READ_BREADCRUMB(dev_priv); 674 value = READ_BREADCRUMB(dev_priv);
658 break; 675 break;
659 default: 676 default:
660 DRM_ERROR("Unkown parameter %d\n", param.param); 677 DRM_ERROR("Unknown parameter %d\n", param.param);
661 return DRM_ERR(EINVAL); 678 return DRM_ERR(EINVAL);
662 } 679 }
663 680
@@ -742,7 +759,8 @@ drm_ioctl_desc_t i915_ioctls[] = {
742 [DRM_IOCTL_NR(DRM_I915_ALLOC)] = {i915_mem_alloc, DRM_AUTH}, 759 [DRM_IOCTL_NR(DRM_I915_ALLOC)] = {i915_mem_alloc, DRM_AUTH},
743 [DRM_IOCTL_NR(DRM_I915_FREE)] = {i915_mem_free, DRM_AUTH}, 760 [DRM_IOCTL_NR(DRM_I915_FREE)] = {i915_mem_free, DRM_AUTH},
744 [DRM_IOCTL_NR(DRM_I915_INIT_HEAP)] = {i915_mem_init_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, 761 [DRM_IOCTL_NR(DRM_I915_INIT_HEAP)] = {i915_mem_init_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
745 [DRM_IOCTL_NR(DRM_I915_CMDBUFFER)] = {i915_cmdbuffer, DRM_AUTH} 762 [DRM_IOCTL_NR(DRM_I915_CMDBUFFER)] = {i915_cmdbuffer, DRM_AUTH},
763 [DRM_IOCTL_NR(DRM_I915_DESTROY_HEAP)] = { i915_mem_destroy_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY }
746}; 764};
747 765
748int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls); 766int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls);
diff --git a/drivers/char/drm/i915_drm.h b/drivers/char/drm/i915_drm.h
index 77412ddac007..4cb3da578330 100644
--- a/drivers/char/drm/i915_drm.h
+++ b/drivers/char/drm/i915_drm.h
@@ -74,6 +74,30 @@ typedef struct _drm_i915_sarea {
74 int pf_active; 74 int pf_active;
75 int pf_current_page; /* which buffer is being displayed? */ 75 int pf_current_page; /* which buffer is being displayed? */
76 int perf_boxes; /* performance boxes to be displayed */ 76 int perf_boxes; /* performance boxes to be displayed */
77 int width, height; /* screen size in pixels */
78
79 drm_handle_t front_handle;
80 int front_offset;
81 int front_size;
82
83 drm_handle_t back_handle;
84 int back_offset;
85 int back_size;
86
87 drm_handle_t depth_handle;
88 int depth_offset;
89 int depth_size;
90
91 drm_handle_t tex_handle;
92 int tex_offset;
93 int tex_size;
94 int log_tex_granularity;
95 int pitch;
96 int rotation; /* 0, 90, 180 or 270 */
97 int rotated_offset;
98 int rotated_size;
99 int rotated_pitch;
100 int virtualX, virtualY;
77} drm_i915_sarea_t; 101} drm_i915_sarea_t;
78 102
79/* Flags for perf_boxes 103/* Flags for perf_boxes
@@ -99,6 +123,7 @@ typedef struct _drm_i915_sarea {
99#define DRM_I915_FREE 0x09 123#define DRM_I915_FREE 0x09
100#define DRM_I915_INIT_HEAP 0x0a 124#define DRM_I915_INIT_HEAP 0x0a
101#define DRM_I915_CMDBUFFER 0x0b 125#define DRM_I915_CMDBUFFER 0x0b
126#define DRM_I915_DESTROY_HEAP 0x0c
102 127
103#define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) 128#define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
104#define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) 129#define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH)
@@ -112,6 +137,7 @@ typedef struct _drm_i915_sarea {
112#define DRM_IOCTL_I915_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_FREE, drm_i915_mem_free_t) 137#define DRM_IOCTL_I915_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_FREE, drm_i915_mem_free_t)
113#define DRM_IOCTL_I915_INIT_HEAP DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT_HEAP, drm_i915_mem_init_heap_t) 138#define DRM_IOCTL_I915_INIT_HEAP DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT_HEAP, drm_i915_mem_init_heap_t)
114#define DRM_IOCTL_I915_CMDBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_I915_CMDBUFFER, drm_i915_cmdbuffer_t) 139#define DRM_IOCTL_I915_CMDBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_I915_CMDBUFFER, drm_i915_cmdbuffer_t)
140#define DRM_IOCTL_I915_DESTROY_HEAP DRM_IOW( DRM_COMMAND_BASE + DRM_I915_DESTROY_HEAP, drm_i915_mem_destroy_heap_t)
115 141
116/* Allow drivers to submit batchbuffers directly to hardware, relying 142/* Allow drivers to submit batchbuffers directly to hardware, relying
117 * on the security mechanisms provided by hardware. 143 * on the security mechanisms provided by hardware.
@@ -191,4 +217,11 @@ typedef struct drm_i915_mem_init_heap {
191 int start; 217 int start;
192} drm_i915_mem_init_heap_t; 218} drm_i915_mem_init_heap_t;
193 219
220/* Allow memory manager to be torn down and re-initialized (eg on
221 * rotate):
222 */
223typedef struct drm_i915_mem_destroy_heap {
224 int region;
225} drm_i915_mem_destroy_heap_t;
226
194#endif /* _I915_DRM_H_ */ 227#endif /* _I915_DRM_H_ */
diff --git a/drivers/char/drm/i915_drv.h b/drivers/char/drm/i915_drv.h
index c6c71b45f101..7a65666899e4 100644
--- a/drivers/char/drm/i915_drv.h
+++ b/drivers/char/drm/i915_drv.h
@@ -37,16 +37,17 @@
37 37
38#define DRIVER_NAME "i915" 38#define DRIVER_NAME "i915"
39#define DRIVER_DESC "Intel Graphics" 39#define DRIVER_DESC "Intel Graphics"
40#define DRIVER_DATE "20051209" 40#define DRIVER_DATE "20060119"
41 41
42/* Interface history: 42/* Interface history:
43 * 43 *
44 * 1.1: Original. 44 * 1.1: Original.
45 * 1.2: Add Power Management 45 * 1.2: Add Power Management
46 * 1.3: Add vblank support 46 * 1.3: Add vblank support
47 * 1.4: Fix cmdbuffer path, add heap destroy
47 */ 48 */
48#define DRIVER_MAJOR 1 49#define DRIVER_MAJOR 1
49#define DRIVER_MINOR 3 50#define DRIVER_MINOR 4
50#define DRIVER_PATCHLEVEL 0 51#define DRIVER_PATCHLEVEL 0
51 52
52typedef struct _drm_i915_ring_buffer { 53typedef struct _drm_i915_ring_buffer {
@@ -123,6 +124,7 @@ extern void i915_driver_irq_uninstall(drm_device_t * dev);
123extern int i915_mem_alloc(DRM_IOCTL_ARGS); 124extern int i915_mem_alloc(DRM_IOCTL_ARGS);
124extern int i915_mem_free(DRM_IOCTL_ARGS); 125extern int i915_mem_free(DRM_IOCTL_ARGS);
125extern int i915_mem_init_heap(DRM_IOCTL_ARGS); 126extern int i915_mem_init_heap(DRM_IOCTL_ARGS);
127extern int i915_mem_destroy_heap(DRM_IOCTL_ARGS);
126extern void i915_mem_takedown(struct mem_block **heap); 128extern void i915_mem_takedown(struct mem_block **heap);
127extern void i915_mem_release(drm_device_t * dev, 129extern void i915_mem_release(drm_device_t * dev,
128 DRMFILE filp, struct mem_block *heap); 130 DRMFILE filp, struct mem_block *heap);
diff --git a/drivers/char/drm/i915_mem.c b/drivers/char/drm/i915_mem.c
index ba87ff17ff64..52c67324df58 100644
--- a/drivers/char/drm/i915_mem.c
+++ b/drivers/char/drm/i915_mem.c
@@ -365,3 +365,34 @@ int i915_mem_init_heap(DRM_IOCTL_ARGS)
365 365
366 return init_heap(heap, initheap.start, initheap.size); 366 return init_heap(heap, initheap.start, initheap.size);
367} 367}
368
369int i915_mem_destroy_heap( DRM_IOCTL_ARGS )
370{
371 DRM_DEVICE;
372 drm_i915_private_t *dev_priv = dev->dev_private;
373 drm_i915_mem_destroy_heap_t destroyheap;
374 struct mem_block **heap;
375
376 if ( !dev_priv ) {
377 DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
378 return DRM_ERR(EINVAL);
379 }
380
381 DRM_COPY_FROM_USER_IOCTL( destroyheap, (drm_i915_mem_destroy_heap_t *)data,
382 sizeof(destroyheap) );
383
384 heap = get_heap( dev_priv, destroyheap.region );
385 if (!heap) {
386 DRM_ERROR("get_heap failed");
387 return DRM_ERR(EFAULT);
388 }
389
390 if (!*heap) {
391 DRM_ERROR("heap not initialized?");
392 return DRM_ERR(EFAULT);
393 }
394
395 i915_mem_takedown( heap );
396 return 0;
397}
398
diff --git a/drivers/char/drm/radeon_cp.c b/drivers/char/drm/radeon_cp.c
index 915665c7fe7c..9bb8ae0c1c27 100644
--- a/drivers/char/drm/radeon_cp.c
+++ b/drivers/char/drm/radeon_cp.c
@@ -1640,7 +1640,7 @@ static int radeon_do_cleanup_cp(drm_device_t * dev)
1640 if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB) 1640 if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB)
1641 { 1641 {
1642 drm_core_ioremapfree(&dev_priv->gart_info.mapping, dev); 1642 drm_core_ioremapfree(&dev_priv->gart_info.mapping, dev);
1643 dev_priv->gart_info.addr = 0; 1643 dev_priv->gart_info.addr = NULL;
1644 } 1644 }
1645 } 1645 }
1646 /* only clear to the start of flags */ 1646 /* only clear to the start of flags */
diff --git a/drivers/char/drm/savage_bci.c b/drivers/char/drm/savage_bci.c
index 0d426deeefec..59c7520bf9a2 100644
--- a/drivers/char/drm/savage_bci.c
+++ b/drivers/char/drm/savage_bci.c
@@ -32,6 +32,8 @@
32#define SAVAGE_EVENT_USEC_TIMEOUT 5000000 /* 5s */ 32#define SAVAGE_EVENT_USEC_TIMEOUT 5000000 /* 5s */
33#define SAVAGE_FREELIST_DEBUG 0 33#define SAVAGE_FREELIST_DEBUG 0
34 34
35static int savage_do_cleanup_bci(drm_device_t *dev);
36
35static int 37static int
36savage_bci_wait_fifo_shadow(drm_savage_private_t * dev_priv, unsigned int n) 38savage_bci_wait_fifo_shadow(drm_savage_private_t * dev_priv, unsigned int n)
37{ 39{
@@ -895,7 +897,7 @@ static int savage_do_init_bci(drm_device_t * dev, drm_savage_init_t * init)
895 return 0; 897 return 0;
896} 898}
897 899
898int savage_do_cleanup_bci(drm_device_t * dev) 900static int savage_do_cleanup_bci(drm_device_t * dev)
899{ 901{
900 drm_savage_private_t *dev_priv = dev->dev_private; 902 drm_savage_private_t *dev_priv = dev->dev_private;
901 903
diff --git a/drivers/char/drm/savage_drv.h b/drivers/char/drm/savage_drv.h
index dd46cb85439c..8f04b3d82292 100644
--- a/drivers/char/drm/savage_drv.h
+++ b/drivers/char/drm/savage_drv.h
@@ -212,7 +212,6 @@ extern int savage_driver_load(drm_device_t *dev, unsigned long chipset);
212extern int savage_driver_firstopen(drm_device_t *dev); 212extern int savage_driver_firstopen(drm_device_t *dev);
213extern void savage_driver_lastclose(drm_device_t *dev); 213extern void savage_driver_lastclose(drm_device_t *dev);
214extern int savage_driver_unload(drm_device_t *dev); 214extern int savage_driver_unload(drm_device_t *dev);
215extern int savage_do_cleanup_bci(drm_device_t * dev);
216extern void savage_reclaim_buffers(drm_device_t * dev, DRMFILE filp); 215extern void savage_reclaim_buffers(drm_device_t * dev, DRMFILE filp);
217 216
218/* state functions */ 217/* state functions */
diff --git a/drivers/char/drm/via_dma.c b/drivers/char/drm/via_dma.c
index 593c0b8f650a..a691ae74129d 100644
--- a/drivers/char/drm/via_dma.c
+++ b/drivers/char/drm/via_dma.c
@@ -222,7 +222,7 @@ static int via_initialize(drm_device_t * dev,
222 return 0; 222 return 0;
223} 223}
224 224
225int via_dma_init(DRM_IOCTL_ARGS) 225static int via_dma_init(DRM_IOCTL_ARGS)
226{ 226{
227 DRM_DEVICE; 227 DRM_DEVICE;
228 drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; 228 drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
@@ -321,7 +321,7 @@ int via_driver_dma_quiescent(drm_device_t * dev)
321 return 0; 321 return 0;
322} 322}
323 323
324int via_flush_ioctl(DRM_IOCTL_ARGS) 324static int via_flush_ioctl(DRM_IOCTL_ARGS)
325{ 325{
326 DRM_DEVICE; 326 DRM_DEVICE;
327 327
@@ -330,7 +330,7 @@ int via_flush_ioctl(DRM_IOCTL_ARGS)
330 return via_driver_dma_quiescent(dev); 330 return via_driver_dma_quiescent(dev);
331} 331}
332 332
333int via_cmdbuffer(DRM_IOCTL_ARGS) 333static int via_cmdbuffer(DRM_IOCTL_ARGS)
334{ 334{
335 DRM_DEVICE; 335 DRM_DEVICE;
336 drm_via_cmdbuffer_t cmdbuf; 336 drm_via_cmdbuffer_t cmdbuf;
@@ -375,7 +375,7 @@ static int via_dispatch_pci_cmdbuffer(drm_device_t * dev,
375 return ret; 375 return ret;
376} 376}
377 377
378int via_pci_cmdbuffer(DRM_IOCTL_ARGS) 378static int via_pci_cmdbuffer(DRM_IOCTL_ARGS)
379{ 379{
380 DRM_DEVICE; 380 DRM_DEVICE;
381 drm_via_cmdbuffer_t cmdbuf; 381 drm_via_cmdbuffer_t cmdbuf;
@@ -665,7 +665,7 @@ static void via_cmdbuf_reset(drm_via_private_t * dev_priv)
665 * User interface to the space and lag functions. 665 * User interface to the space and lag functions.
666 */ 666 */
667 667
668int via_cmdbuf_size(DRM_IOCTL_ARGS) 668static int via_cmdbuf_size(DRM_IOCTL_ARGS)
669{ 669{
670 DRM_DEVICE; 670 DRM_DEVICE;
671 drm_via_cmdbuf_size_t d_siz; 671 drm_via_cmdbuf_size_t d_siz;
diff --git a/drivers/char/drm/via_dmablit.c b/drivers/char/drm/via_dmablit.c
index 9d5e027dae0e..b7f17457b424 100644
--- a/drivers/char/drm/via_dmablit.c
+++ b/drivers/char/drm/via_dmablit.c
@@ -108,7 +108,7 @@ via_map_blit_for_device(struct pci_dev *pdev,
108 int num_desc = 0; 108 int num_desc = 0;
109 int cur_line; 109 int cur_line;
110 dma_addr_t next = 0 | VIA_DMA_DPR_EC; 110 dma_addr_t next = 0 | VIA_DMA_DPR_EC;
111 drm_via_descriptor_t *desc_ptr = 0; 111 drm_via_descriptor_t *desc_ptr = NULL;
112 112
113 if (mode == 1) 113 if (mode == 1)
114 desc_ptr = vsg->desc_pages[cur_descriptor_page]; 114 desc_ptr = vsg->desc_pages[cur_descriptor_page];
@@ -167,7 +167,7 @@ via_map_blit_for_device(struct pci_dev *pdev,
167 */ 167 */
168 168
169 169
170void 170static void
171via_free_sg_info(struct pci_dev *pdev, drm_via_sg_info_t *vsg) 171via_free_sg_info(struct pci_dev *pdev, drm_via_sg_info_t *vsg)
172{ 172{
173 struct page *page; 173 struct page *page;
@@ -581,7 +581,7 @@ via_build_sg_info(drm_device_t *dev, drm_via_sg_info_t *vsg, drm_via_dmablit_t *
581 int ret = 0; 581 int ret = 0;
582 582
583 vsg->direction = (draw) ? DMA_TO_DEVICE : DMA_FROM_DEVICE; 583 vsg->direction = (draw) ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
584 vsg->bounce_buffer = 0; 584 vsg->bounce_buffer = NULL;
585 585
586 vsg->state = dr_via_sg_init; 586 vsg->state = dr_via_sg_init;
587 587
diff --git a/drivers/char/drm/via_drv.h b/drivers/char/drm/via_drv.h
index aad4f99f5405..52bcc7b1ba45 100644
--- a/drivers/char/drm/via_drv.h
+++ b/drivers/char/drm/via_drv.h
@@ -110,11 +110,6 @@ extern int via_mem_free(DRM_IOCTL_ARGS);
110extern int via_agp_init(DRM_IOCTL_ARGS); 110extern int via_agp_init(DRM_IOCTL_ARGS);
111extern int via_map_init(DRM_IOCTL_ARGS); 111extern int via_map_init(DRM_IOCTL_ARGS);
112extern int via_decoder_futex(DRM_IOCTL_ARGS); 112extern int via_decoder_futex(DRM_IOCTL_ARGS);
113extern int via_dma_init(DRM_IOCTL_ARGS);
114extern int via_cmdbuffer(DRM_IOCTL_ARGS);
115extern int via_flush_ioctl(DRM_IOCTL_ARGS);
116extern int via_pci_cmdbuffer(DRM_IOCTL_ARGS);
117extern int via_cmdbuf_size(DRM_IOCTL_ARGS);
118extern int via_wait_irq(DRM_IOCTL_ARGS); 113extern int via_wait_irq(DRM_IOCTL_ARGS);
119extern int via_dma_blit_sync( DRM_IOCTL_ARGS ); 114extern int via_dma_blit_sync( DRM_IOCTL_ARGS );
120extern int via_dma_blit( DRM_IOCTL_ARGS ); 115extern int via_dma_blit( DRM_IOCTL_ARGS );
@@ -139,8 +134,6 @@ extern int via_driver_dma_quiescent(drm_device_t * dev);
139extern void via_init_futex(drm_via_private_t * dev_priv); 134extern void via_init_futex(drm_via_private_t * dev_priv);
140extern void via_cleanup_futex(drm_via_private_t * dev_priv); 135extern void via_cleanup_futex(drm_via_private_t * dev_priv);
141extern void via_release_futex(drm_via_private_t * dev_priv, int context); 136extern void via_release_futex(drm_via_private_t * dev_priv, int context);
142extern int via_driver_irq_wait(drm_device_t * dev, unsigned int irq,
143 int force_sequence, unsigned int *sequence);
144 137
145extern void via_dmablit_handler(drm_device_t *dev, int engine, int from_irq); 138extern void via_dmablit_handler(drm_device_t *dev, int engine, int from_irq);
146extern void via_init_dmablit(drm_device_t *dev); 139extern void via_init_dmablit(drm_device_t *dev);
diff --git a/drivers/char/drm/via_irq.c b/drivers/char/drm/via_irq.c
index 56d7e3daea12..6152415644e9 100644
--- a/drivers/char/drm/via_irq.c
+++ b/drivers/char/drm/via_irq.c
@@ -190,7 +190,7 @@ int via_driver_vblank_wait(drm_device_t * dev, unsigned int *sequence)
190 return ret; 190 return ret;
191} 191}
192 192
193int 193static int
194via_driver_irq_wait(drm_device_t * dev, unsigned int irq, int force_sequence, 194via_driver_irq_wait(drm_device_t * dev, unsigned int irq, int force_sequence,
195 unsigned int *sequence) 195 unsigned int *sequence)
196{ 196{
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
index 3808d9572619..66a2fee06eb9 100644
--- a/drivers/char/hpet.c
+++ b/drivers/char/hpet.c
@@ -927,9 +927,9 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
927 if (ACPI_SUCCESS(status)) { 927 if (ACPI_SUCCESS(status)) {
928 unsigned long size; 928 unsigned long size;
929 929
930 size = addr.max_address_range - addr.min_address_range + 1; 930 size = addr.maximum - addr.minimum + 1;
931 hdp->hd_phys_address = addr.min_address_range; 931 hdp->hd_phys_address = addr.minimum;
932 hdp->hd_address = ioremap(addr.min_address_range, size); 932 hdp->hd_address = ioremap(addr.minimum, size);
933 933
934 if (hpet_is_known(hdp)) { 934 if (hpet_is_known(hdp)) {
935 printk(KERN_DEBUG "%s: 0x%lx is busy\n", 935 printk(KERN_DEBUG "%s: 0x%lx is busy\n",
@@ -937,15 +937,15 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
937 iounmap(hdp->hd_address); 937 iounmap(hdp->hd_address);
938 return -EBUSY; 938 return -EBUSY;
939 } 939 }
940 } else if (res->id == ACPI_RSTYPE_FIXED_MEM32) { 940 } else if (res->type == ACPI_RESOURCE_TYPE_FIXED_MEMORY32) {
941 struct acpi_resource_fixed_mem32 *fixmem32; 941 struct acpi_resource_fixed_memory32 *fixmem32;
942 942
943 fixmem32 = &res->data.fixed_memory32; 943 fixmem32 = &res->data.fixed_memory32;
944 if (!fixmem32) 944 if (!fixmem32)
945 return -EINVAL; 945 return -EINVAL;
946 946
947 hdp->hd_phys_address = fixmem32->range_base_address; 947 hdp->hd_phys_address = fixmem32->address;
948 hdp->hd_address = ioremap(fixmem32->range_base_address, 948 hdp->hd_address = ioremap(fixmem32->address,
949 HPET_RANGE_SIZE); 949 HPET_RANGE_SIZE);
950 950
951 if (hpet_is_known(hdp)) { 951 if (hpet_is_known(hdp)) {
@@ -954,20 +954,20 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
954 iounmap(hdp->hd_address); 954 iounmap(hdp->hd_address);
955 return -EBUSY; 955 return -EBUSY;
956 } 956 }
957 } else if (res->id == ACPI_RSTYPE_EXT_IRQ) { 957 } else if (res->type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ) {
958 struct acpi_resource_ext_irq *irqp; 958 struct acpi_resource_extended_irq *irqp;
959 int i; 959 int i;
960 960
961 irqp = &res->data.extended_irq; 961 irqp = &res->data.extended_irq;
962 962
963 if (irqp->number_of_interrupts > 0) { 963 if (irqp->interrupt_count > 0) {
964 hdp->hd_nirqs = irqp->number_of_interrupts; 964 hdp->hd_nirqs = irqp->interrupt_count;
965 965
966 for (i = 0; i < hdp->hd_nirqs; i++) { 966 for (i = 0; i < hdp->hd_nirqs; i++) {
967 int rc = 967 int rc =
968 acpi_register_gsi(irqp->interrupts[i], 968 acpi_register_gsi(irqp->interrupts[i],
969 irqp->edge_level, 969 irqp->triggering,
970 irqp->active_high_low); 970 irqp->polarity);
971 if (rc < 0) 971 if (rc < 0)
972 return AE_ERROR; 972 return AE_ERROR;
973 hdp->hd_irq[i] = rc; 973 hdp->hd_irq[i] = rc;
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c
index 4ee597d08797..2b286e865163 100644
--- a/drivers/ide/pci/sgiioc4.c
+++ b/drivers/ide/pci/sgiioc4.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2003 Silicon Graphics, Inc. All Rights Reserved. 2 * Copyright (c) 2003-2006 Silicon Graphics, Inc. All Rights Reserved.
3 * 3 *
4 * This program is free software; you can redistribute it and/or modify it 4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of version 2 of the GNU General Public License 5 * under the terms of version 2 of the GNU General Public License
@@ -510,7 +510,7 @@ sgiioc4_build_dma_table(ide_drive_t * drive, struct request *rq, int ddir)
510 drive->name); 510 drive->name);
511 goto use_pio_instead; 511 goto use_pio_instead;
512 } else { 512 } else {
513 u32 xcount, bcount = 513 u32 bcount =
514 0x10000 - (cur_addr & 0xffff); 514 0x10000 - (cur_addr & 0xffff);
515 515
516 if (bcount > cur_len) 516 if (bcount > cur_len)
@@ -525,8 +525,7 @@ sgiioc4_build_dma_table(ide_drive_t * drive, struct request *rq, int ddir)
525 *table = 0x0; 525 *table = 0x0;
526 table++; 526 table++;
527 527
528 xcount = bcount & 0xffff; 528 *table = cpu_to_be32(bcount);
529 *table = cpu_to_be32(xcount);
530 table++; 529 table++;
531 530
532 cur_addr += bcount; 531 cur_addr += bcount;
@@ -680,7 +679,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d)
680 return -EIO; 679 return -EIO;
681 680
682 /* Create /proc/ide entries */ 681 /* Create /proc/ide entries */
683 create_proc_ide_interfaces(); 682 create_proc_ide_interfaces();
684 683
685 return 0; 684 return 0;
686} 685}
diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c
index 74039db846ba..d73779a42417 100644
--- a/drivers/md/dm-log.c
+++ b/drivers/md/dm-log.c
@@ -545,7 +545,8 @@ static int core_get_resync_work(struct dirty_log *log, region_t *region)
545 return 0; 545 return 0;
546 546
547 do { 547 do {
548 *region = find_next_zero_bit((unsigned long *) lc->sync_bits, 548 *region = ext2_find_next_zero_bit(
549 (unsigned long *) lc->sync_bits,
549 lc->region_count, 550 lc->region_count,
550 lc->sync_search); 551 lc->sync_search);
551 lc->sync_search = *region + 1; 552 lc->sync_search = *region + 1;
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 7145cd150f7b..653d4dcbee23 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -1161,6 +1161,9 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
1161 1161
1162 sb->cnt_corrected_read = atomic_read(&rdev->corrected_errors); 1162 sb->cnt_corrected_read = atomic_read(&rdev->corrected_errors);
1163 1163
1164 sb->raid_disks = cpu_to_le32(mddev->raid_disks);
1165 sb->size = cpu_to_le64(mddev->size);
1166
1164 if (mddev->bitmap && mddev->bitmap_file == NULL) { 1167 if (mddev->bitmap && mddev->bitmap_file == NULL) {
1165 sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_offset); 1168 sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_offset);
1166 sb->feature_map = cpu_to_le32(MD_FEATURE_BITMAP_OFFSET); 1169 sb->feature_map = cpu_to_le32(MD_FEATURE_BITMAP_OFFSET);
@@ -2686,14 +2689,6 @@ static int do_md_stop(mddev_t * mddev, int ro)
2686 set_disk_ro(disk, 1); 2689 set_disk_ro(disk, 1);
2687 } 2690 }
2688 2691
2689 bitmap_destroy(mddev);
2690 if (mddev->bitmap_file) {
2691 atomic_set(&mddev->bitmap_file->f_dentry->d_inode->i_writecount, 1);
2692 fput(mddev->bitmap_file);
2693 mddev->bitmap_file = NULL;
2694 }
2695 mddev->bitmap_offset = 0;
2696
2697 /* 2692 /*
2698 * Free resources if final stop 2693 * Free resources if final stop
2699 */ 2694 */
@@ -2703,6 +2698,14 @@ static int do_md_stop(mddev_t * mddev, int ro)
2703 struct gendisk *disk; 2698 struct gendisk *disk;
2704 printk(KERN_INFO "md: %s stopped.\n", mdname(mddev)); 2699 printk(KERN_INFO "md: %s stopped.\n", mdname(mddev));
2705 2700
2701 bitmap_destroy(mddev);
2702 if (mddev->bitmap_file) {
2703 atomic_set(&mddev->bitmap_file->f_dentry->d_inode->i_writecount, 1);
2704 fput(mddev->bitmap_file);
2705 mddev->bitmap_file = NULL;
2706 }
2707 mddev->bitmap_offset = 0;
2708
2706 ITERATE_RDEV(mddev,rdev,tmp) 2709 ITERATE_RDEV(mddev,rdev,tmp)
2707 if (rdev->raid_disk >= 0) { 2710 if (rdev->raid_disk >= 0) {
2708 char nm[20]; 2711 char nm[20];
@@ -3465,7 +3468,7 @@ static int update_size(mddev_t *mddev, unsigned long size)
3465 bdev = bdget_disk(mddev->gendisk, 0); 3468 bdev = bdget_disk(mddev->gendisk, 0);
3466 if (bdev) { 3469 if (bdev) {
3467 mutex_lock(&bdev->bd_inode->i_mutex); 3470 mutex_lock(&bdev->bd_inode->i_mutex);
3468 i_size_write(bdev->bd_inode, mddev->array_size << 10); 3471 i_size_write(bdev->bd_inode, (loff_t)mddev->array_size << 10);
3469 mutex_unlock(&bdev->bd_inode->i_mutex); 3472 mutex_unlock(&bdev->bd_inode->i_mutex);
3470 bdput(bdev); 3473 bdput(bdev);
3471 } 3474 }
@@ -3485,17 +3488,6 @@ static int update_raid_disks(mddev_t *mddev, int raid_disks)
3485 if (mddev->sync_thread) 3488 if (mddev->sync_thread)
3486 return -EBUSY; 3489 return -EBUSY;
3487 rv = mddev->pers->reshape(mddev, raid_disks); 3490 rv = mddev->pers->reshape(mddev, raid_disks);
3488 if (!rv) {
3489 struct block_device *bdev;
3490
3491 bdev = bdget_disk(mddev->gendisk, 0);
3492 if (bdev) {
3493 mutex_lock(&bdev->bd_inode->i_mutex);
3494 i_size_write(bdev->bd_inode, mddev->array_size << 10);
3495 mutex_unlock(&bdev->bd_inode->i_mutex);
3496 bdput(bdev);
3497 }
3498 }
3499 return rv; 3491 return rv;
3500} 3492}
3501 3493
diff --git a/drivers/md/raid6main.c b/drivers/md/raid6main.c
index f618a53b98be..ed2abb2e2e2d 100644
--- a/drivers/md/raid6main.c
+++ b/drivers/md/raid6main.c
@@ -115,7 +115,7 @@ static void __release_stripe(raid6_conf_t *conf, struct stripe_head *sh)
115 list_add_tail(&sh->lru, &conf->inactive_list); 115 list_add_tail(&sh->lru, &conf->inactive_list);
116 atomic_dec(&conf->active_stripes); 116 atomic_dec(&conf->active_stripes);
117 if (!conf->inactive_blocked || 117 if (!conf->inactive_blocked ||
118 atomic_read(&conf->active_stripes) < (NR_STRIPES*3/4)) 118 atomic_read(&conf->active_stripes) < (conf->max_nr_stripes*3/4))
119 wake_up(&conf->wait_for_stripe); 119 wake_up(&conf->wait_for_stripe);
120 } 120 }
121 } 121 }
@@ -273,7 +273,8 @@ static struct stripe_head *get_active_stripe(raid6_conf_t *conf, sector_t sector
273 conf->inactive_blocked = 1; 273 conf->inactive_blocked = 1;
274 wait_event_lock_irq(conf->wait_for_stripe, 274 wait_event_lock_irq(conf->wait_for_stripe,
275 !list_empty(&conf->inactive_list) && 275 !list_empty(&conf->inactive_list) &&
276 (atomic_read(&conf->active_stripes) < (NR_STRIPES *3/4) 276 (atomic_read(&conf->active_stripes)
277 < (conf->max_nr_stripes *3/4)
277 || !conf->inactive_blocked), 278 || !conf->inactive_blocked),
278 conf->device_lock, 279 conf->device_lock,
279 unplug_slaves(conf->mddev); 280 unplug_slaves(conf->mddev);
@@ -302,9 +303,31 @@ static struct stripe_head *get_active_stripe(raid6_conf_t *conf, sector_t sector
302 return sh; 303 return sh;
303} 304}
304 305
305static int grow_stripes(raid6_conf_t *conf, int num) 306static int grow_one_stripe(raid6_conf_t *conf)
306{ 307{
307 struct stripe_head *sh; 308 struct stripe_head *sh;
309 sh = kmem_cache_alloc(conf->slab_cache, GFP_KERNEL);
310 if (!sh)
311 return 0;
312 memset(sh, 0, sizeof(*sh) + (conf->raid_disks-1)*sizeof(struct r5dev));
313 sh->raid_conf = conf;
314 spin_lock_init(&sh->lock);
315
316 if (grow_buffers(sh, conf->raid_disks)) {
317 shrink_buffers(sh, conf->raid_disks);
318 kmem_cache_free(conf->slab_cache, sh);
319 return 0;
320 }
321 /* we just created an active stripe so... */
322 atomic_set(&sh->count, 1);
323 atomic_inc(&conf->active_stripes);
324 INIT_LIST_HEAD(&sh->lru);
325 release_stripe(sh);
326 return 1;
327}
328
329static int grow_stripes(raid6_conf_t *conf, int num)
330{
308 kmem_cache_t *sc; 331 kmem_cache_t *sc;
309 int devs = conf->raid_disks; 332 int devs = conf->raid_disks;
310 333
@@ -316,44 +339,33 @@ static int grow_stripes(raid6_conf_t *conf, int num)
316 if (!sc) 339 if (!sc)
317 return 1; 340 return 1;
318 conf->slab_cache = sc; 341 conf->slab_cache = sc;
319 while (num--) { 342 while (num--)
320 sh = kmem_cache_alloc(sc, GFP_KERNEL); 343 if (!grow_one_stripe(conf))
321 if (!sh)
322 return 1;
323 memset(sh, 0, sizeof(*sh) + (devs-1)*sizeof(struct r5dev));
324 sh->raid_conf = conf;
325 spin_lock_init(&sh->lock);
326
327 if (grow_buffers(sh, conf->raid_disks)) {
328 shrink_buffers(sh, conf->raid_disks);
329 kmem_cache_free(sc, sh);
330 return 1; 344 return 1;
331 }
332 /* we just created an active stripe so... */
333 atomic_set(&sh->count, 1);
334 atomic_inc(&conf->active_stripes);
335 INIT_LIST_HEAD(&sh->lru);
336 release_stripe(sh);
337 }
338 return 0; 345 return 0;
339} 346}
340 347
341static void shrink_stripes(raid6_conf_t *conf) 348static int drop_one_stripe(raid6_conf_t *conf)
342{ 349{
343 struct stripe_head *sh; 350 struct stripe_head *sh;
351 spin_lock_irq(&conf->device_lock);
352 sh = get_free_stripe(conf);
353 spin_unlock_irq(&conf->device_lock);
354 if (!sh)
355 return 0;
356 if (atomic_read(&sh->count))
357 BUG();
358 shrink_buffers(sh, conf->raid_disks);
359 kmem_cache_free(conf->slab_cache, sh);
360 atomic_dec(&conf->active_stripes);
361 return 1;
362}
363
364static void shrink_stripes(raid6_conf_t *conf)
365{
366 while (drop_one_stripe(conf))
367 ;
344 368
345 while (1) {
346 spin_lock_irq(&conf->device_lock);
347 sh = get_free_stripe(conf);
348 spin_unlock_irq(&conf->device_lock);
349 if (!sh)
350 break;
351 if (atomic_read(&sh->count))
352 BUG();
353 shrink_buffers(sh, conf->raid_disks);
354 kmem_cache_free(conf->slab_cache, sh);
355 atomic_dec(&conf->active_stripes);
356 }
357 kmem_cache_destroy(conf->slab_cache); 369 kmem_cache_destroy(conf->slab_cache);
358 conf->slab_cache = NULL; 370 conf->slab_cache = NULL;
359} 371}
@@ -1912,6 +1924,74 @@ static void raid6d (mddev_t *mddev)
1912 PRINTK("--- raid6d inactive\n"); 1924 PRINTK("--- raid6d inactive\n");
1913} 1925}
1914 1926
1927static ssize_t
1928raid6_show_stripe_cache_size(mddev_t *mddev, char *page)
1929{
1930 raid6_conf_t *conf = mddev_to_conf(mddev);
1931 if (conf)
1932 return sprintf(page, "%d\n", conf->max_nr_stripes);
1933 else
1934 return 0;
1935}
1936
1937static ssize_t
1938raid6_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
1939{
1940 raid6_conf_t *conf = mddev_to_conf(mddev);
1941 char *end;
1942 int new;
1943 if (len >= PAGE_SIZE)
1944 return -EINVAL;
1945 if (!conf)
1946 return -ENODEV;
1947
1948 new = simple_strtoul(page, &end, 10);
1949 if (!*page || (*end && *end != '\n') )
1950 return -EINVAL;
1951 if (new <= 16 || new > 32768)
1952 return -EINVAL;
1953 while (new < conf->max_nr_stripes) {
1954 if (drop_one_stripe(conf))
1955 conf->max_nr_stripes--;
1956 else
1957 break;
1958 }
1959 while (new > conf->max_nr_stripes) {
1960 if (grow_one_stripe(conf))
1961 conf->max_nr_stripes++;
1962 else break;
1963 }
1964 return len;
1965}
1966
1967static struct md_sysfs_entry
1968raid6_stripecache_size = __ATTR(stripe_cache_size, S_IRUGO | S_IWUSR,
1969 raid6_show_stripe_cache_size,
1970 raid6_store_stripe_cache_size);
1971
1972static ssize_t
1973stripe_cache_active_show(mddev_t *mddev, char *page)
1974{
1975 raid6_conf_t *conf = mddev_to_conf(mddev);
1976 if (conf)
1977 return sprintf(page, "%d\n", atomic_read(&conf->active_stripes));
1978 else
1979 return 0;
1980}
1981
1982static struct md_sysfs_entry
1983raid6_stripecache_active = __ATTR_RO(stripe_cache_active);
1984
1985static struct attribute *raid6_attrs[] = {
1986 &raid6_stripecache_size.attr,
1987 &raid6_stripecache_active.attr,
1988 NULL,
1989};
1990static struct attribute_group raid6_attrs_group = {
1991 .name = NULL,
1992 .attrs = raid6_attrs,
1993};
1994
1915static int run(mddev_t *mddev) 1995static int run(mddev_t *mddev)
1916{ 1996{
1917 raid6_conf_t *conf; 1997 raid6_conf_t *conf;
@@ -2095,6 +2175,7 @@ static int stop (mddev_t *mddev)
2095 shrink_stripes(conf); 2175 shrink_stripes(conf);
2096 kfree(conf->stripe_hashtbl); 2176 kfree(conf->stripe_hashtbl);
2097 blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ 2177 blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
2178 sysfs_remove_group(&mddev->kobj, &raid6_attrs_group);
2098 kfree(conf); 2179 kfree(conf);
2099 mddev->private = NULL; 2180 mddev->private = NULL;
2100 return 0; 2181 return 0;
diff --git a/drivers/pci/hotplug/rpaphp_slot.c b/drivers/pci/hotplug/rpaphp_slot.c
index 04cc1e7275ce..78943e064b59 100644
--- a/drivers/pci/hotplug/rpaphp_slot.c
+++ b/drivers/pci/hotplug/rpaphp_slot.c
@@ -159,6 +159,7 @@ int rpaphp_deregister_slot(struct slot *slot)
159 dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); 159 dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval);
160 return retval; 160 return retval;
161} 161}
162EXPORT_SYMBOL_GPL(rpaphp_deregister_slot);
162 163
163int rpaphp_register_slot(struct slot *slot) 164int rpaphp_register_slot(struct slot *slot)
164{ 165{
diff --git a/drivers/pnp/card.c b/drivers/pnp/card.c
index 0ecbe4edbec1..aaa568a3806e 100644
--- a/drivers/pnp/card.c
+++ b/drivers/pnp/card.c
@@ -363,7 +363,7 @@ static int card_resume(struct pnp_dev *dev)
363 363
364int pnp_register_card_driver(struct pnp_card_driver * drv) 364int pnp_register_card_driver(struct pnp_card_driver * drv)
365{ 365{
366 int count = 0; 366 int count;
367 struct list_head *pos, *temp; 367 struct list_head *pos, *temp;
368 368
369 drv->link.name = drv->name; 369 drv->link.name = drv->name;
@@ -374,10 +374,15 @@ int pnp_register_card_driver(struct pnp_card_driver * drv)
374 drv->link.suspend = drv->suspend ? card_suspend : NULL; 374 drv->link.suspend = drv->suspend ? card_suspend : NULL;
375 drv->link.resume = drv->resume ? card_resume : NULL; 375 drv->link.resume = drv->resume ? card_resume : NULL;
376 376
377 count = pnp_register_driver(&drv->link);
378 if (count < 0)
379 return count;
380
377 spin_lock(&pnp_lock); 381 spin_lock(&pnp_lock);
378 list_add_tail(&drv->global_list, &pnp_card_drivers); 382 list_add_tail(&drv->global_list, &pnp_card_drivers);
379 spin_unlock(&pnp_lock); 383 spin_unlock(&pnp_lock);
380 pnp_register_driver(&drv->link); 384
385 count = 0;
381 386
382 list_for_each_safe(pos,temp,&pnp_cards){ 387 list_for_each_safe(pos,temp,&pnp_cards){
383 struct pnp_card *card = list_entry(pos, struct pnp_card, global_list); 388 struct pnp_card *card = list_entry(pos, struct pnp_card, global_list);
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
index 816479ad217b..f104577f73e0 100644
--- a/drivers/pnp/pnpacpi/core.c
+++ b/drivers/pnp/pnpacpi/core.c
@@ -27,12 +27,15 @@
27 27
28static int num = 0; 28static int num = 0;
29 29
30/* We need only to blacklist devices that have already an acpi driver that
31 * can't use pnp layer. We don't need to blacklist device that are directly
32 * used by the kernel (PCI root, ...), as it is harmless and there were
33 * already present in pnpbios. But there is an exception for devices that
34 * have irqs (PIC, Timer) because we call acpi_register_gsi.
35 * Finaly only devices that have a CRS method need to be in this list.
36 */
30static char __initdata excluded_id_list[] = 37static char __initdata excluded_id_list[] =
31 "PNP0C0A," /* Battery */
32 "PNP0C0C,PNP0C0E,PNP0C0D," /* Button */
33 "PNP0C09," /* EC */ 38 "PNP0C09," /* EC */
34 "PNP0C0B," /* Fan */
35 "PNP0A03," /* PCI root */
36 "PNP0C0F," /* Link device */ 39 "PNP0C0F," /* Link device */
37 "PNP0000," /* PIC */ 40 "PNP0000," /* PIC */
38 "PNP0100," /* Timer */ 41 "PNP0100," /* Timer */
@@ -131,7 +134,8 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
131 struct pnp_id *dev_id; 134 struct pnp_id *dev_id;
132 struct pnp_dev *dev; 135 struct pnp_dev *dev;
133 136
134 if (!ispnpidacpi(acpi_device_hid(device)) || 137 status = acpi_get_handle(device->handle, "_CRS", &temp);
138 if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) ||
135 is_exclusive_device(device)) 139 is_exclusive_device(device))
136 return 0; 140 return 0;
137 141
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c
index 416d30debe6c..407b4eaddcbf 100644
--- a/drivers/pnp/pnpacpi/rsparser.c
+++ b/drivers/pnp/pnpacpi/rsparser.c
@@ -3,7 +3,7 @@
3 * 3 *
4 * Copyright (c) 2004 Matthieu Castet <castet.matthieu@free.fr> 4 * Copyright (c) 2004 Matthieu Castet <castet.matthieu@free.fr>
5 * Copyright (c) 2004 Li Shaohua <shaohua.li@intel.com> 5 * Copyright (c) 2004 Li Shaohua <shaohua.li@intel.com>
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify it 7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the 8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any 9 * Free Software Foundation; either version 2, or (at your option) any
@@ -32,17 +32,17 @@
32/* 32/*
33 * Allocated Resources 33 * Allocated Resources
34 */ 34 */
35static int irq_flags(int edge_level, int active_high_low) 35static int irq_flags(int triggering, int polarity)
36{ 36{
37 int flag; 37 int flag;
38 if (edge_level == ACPI_LEVEL_SENSITIVE) { 38 if (triggering == ACPI_LEVEL_SENSITIVE) {
39 if(active_high_low == ACPI_ACTIVE_LOW) 39 if(polarity == ACPI_ACTIVE_LOW)
40 flag = IORESOURCE_IRQ_LOWLEVEL; 40 flag = IORESOURCE_IRQ_LOWLEVEL;
41 else 41 else
42 flag = IORESOURCE_IRQ_HIGHLEVEL; 42 flag = IORESOURCE_IRQ_HIGHLEVEL;
43 } 43 }
44 else { 44 else {
45 if(active_high_low == ACPI_ACTIVE_LOW) 45 if(polarity == ACPI_ACTIVE_LOW)
46 flag = IORESOURCE_IRQ_LOWEDGE; 46 flag = IORESOURCE_IRQ_LOWEDGE;
47 else 47 else
48 flag = IORESOURCE_IRQ_HIGHEDGE; 48 flag = IORESOURCE_IRQ_HIGHEDGE;
@@ -50,31 +50,31 @@ static int irq_flags(int edge_level, int active_high_low)
50 return flag; 50 return flag;
51} 51}
52 52
53static void decode_irq_flags(int flag, int *edge_level, int *active_high_low) 53static void decode_irq_flags(int flag, int *triggering, int *polarity)
54{ 54{
55 switch (flag) { 55 switch (flag) {
56 case IORESOURCE_IRQ_LOWLEVEL: 56 case IORESOURCE_IRQ_LOWLEVEL:
57 *edge_level = ACPI_LEVEL_SENSITIVE; 57 *triggering = ACPI_LEVEL_SENSITIVE;
58 *active_high_low = ACPI_ACTIVE_LOW; 58 *polarity = ACPI_ACTIVE_LOW;
59 break; 59 break;
60 case IORESOURCE_IRQ_HIGHLEVEL: 60 case IORESOURCE_IRQ_HIGHLEVEL:
61 *edge_level = ACPI_LEVEL_SENSITIVE; 61 *triggering = ACPI_LEVEL_SENSITIVE;
62 *active_high_low = ACPI_ACTIVE_HIGH; 62 *polarity = ACPI_ACTIVE_HIGH;
63 break; 63 break;
64 case IORESOURCE_IRQ_LOWEDGE: 64 case IORESOURCE_IRQ_LOWEDGE:
65 *edge_level = ACPI_EDGE_SENSITIVE; 65 *triggering = ACPI_EDGE_SENSITIVE;
66 *active_high_low = ACPI_ACTIVE_LOW; 66 *polarity = ACPI_ACTIVE_LOW;
67 break; 67 break;
68 case IORESOURCE_IRQ_HIGHEDGE: 68 case IORESOURCE_IRQ_HIGHEDGE:
69 *edge_level = ACPI_EDGE_SENSITIVE; 69 *triggering = ACPI_EDGE_SENSITIVE;
70 *active_high_low = ACPI_ACTIVE_HIGH; 70 *polarity = ACPI_ACTIVE_HIGH;
71 break; 71 break;
72 } 72 }
73} 73}
74 74
75static void 75static void
76pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, u32 gsi, 76pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, u32 gsi,
77 int edge_level, int active_high_low) 77 int triggering, int polarity)
78{ 78{
79 int i = 0; 79 int i = 0;
80 int irq; 80 int irq;
@@ -89,7 +89,7 @@ pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, u32 gsi,
89 return; 89 return;
90 90
91 res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag 91 res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag
92 irq = acpi_register_gsi(gsi, edge_level, active_high_low); 92 irq = acpi_register_gsi(gsi, triggering, polarity);
93 if (irq < 0) { 93 if (irq < 0) {
94 res->irq_resource[i].flags |= IORESOURCE_DISABLED; 94 res->irq_resource[i].flags |= IORESOURCE_DISABLED;
95 return; 95 return;
@@ -163,77 +163,96 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
163 struct pnp_resource_table * res_table = (struct pnp_resource_table *)data; 163 struct pnp_resource_table * res_table = (struct pnp_resource_table *)data;
164 int i; 164 int i;
165 165
166 switch (res->id) { 166 switch (res->type) {
167 case ACPI_RSTYPE_IRQ: 167 case ACPI_RESOURCE_TYPE_IRQ:
168 /* 168 /*
169 * Per spec, only one interrupt per descriptor is allowed in 169 * Per spec, only one interrupt per descriptor is allowed in
170 * _CRS, but some firmware violates this, so parse them all. 170 * _CRS, but some firmware violates this, so parse them all.
171 */ 171 */
172 for (i = 0; i < res->data.irq.number_of_interrupts; i++) { 172 for (i = 0; i < res->data.irq.interrupt_count; i++) {
173 pnpacpi_parse_allocated_irqresource(res_table, 173 pnpacpi_parse_allocated_irqresource(res_table,
174 res->data.irq.interrupts[i], 174 res->data.irq.interrupts[i],
175 res->data.irq.edge_level, 175 res->data.irq.triggering,
176 res->data.irq.active_high_low); 176 res->data.irq.polarity);
177 } 177 }
178 break; 178 break;
179 179
180 case ACPI_RSTYPE_EXT_IRQ: 180 case ACPI_RESOURCE_TYPE_DMA:
181 for (i = 0; i < res->data.extended_irq.number_of_interrupts; i++) { 181 if (res->data.dma.channel_count > 0)
182 pnpacpi_parse_allocated_irqresource(res_table, 182 pnpacpi_parse_allocated_dmaresource(res_table,
183 res->data.extended_irq.interrupts[i],
184 res->data.extended_irq.edge_level,
185 res->data.extended_irq.active_high_low);
186 }
187 break;
188 case ACPI_RSTYPE_DMA:
189 if (res->data.dma.number_of_channels > 0)
190 pnpacpi_parse_allocated_dmaresource(res_table,
191 res->data.dma.channels[0]); 183 res->data.dma.channels[0]);
192 break; 184 break;
193 case ACPI_RSTYPE_IO: 185
194 pnpacpi_parse_allocated_ioresource(res_table, 186 case ACPI_RESOURCE_TYPE_IO:
195 res->data.io.min_base_address, 187 pnpacpi_parse_allocated_ioresource(res_table,
196 res->data.io.range_length); 188 res->data.io.minimum,
189 res->data.io.address_length);
197 break; 190 break;
198 case ACPI_RSTYPE_FIXED_IO: 191
199 pnpacpi_parse_allocated_ioresource(res_table, 192 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
200 res->data.fixed_io.base_address, 193 case ACPI_RESOURCE_TYPE_END_DEPENDENT:
201 res->data.fixed_io.range_length);
202 break; 194 break;
203 case ACPI_RSTYPE_MEM24: 195
204 pnpacpi_parse_allocated_memresource(res_table, 196 case ACPI_RESOURCE_TYPE_FIXED_IO:
205 res->data.memory24.min_base_address, 197 pnpacpi_parse_allocated_ioresource(res_table,
206 res->data.memory24.range_length); 198 res->data.fixed_io.address,
199 res->data.fixed_io.address_length);
200 break;
201
202 case ACPI_RESOURCE_TYPE_VENDOR:
207 break; 203 break;
208 case ACPI_RSTYPE_MEM32: 204
209 pnpacpi_parse_allocated_memresource(res_table, 205 case ACPI_RESOURCE_TYPE_END_TAG:
210 res->data.memory32.min_base_address, 206 break;
211 res->data.memory32.range_length); 207
208 case ACPI_RESOURCE_TYPE_MEMORY24:
209 pnpacpi_parse_allocated_memresource(res_table,
210 res->data.memory24.minimum,
211 res->data.memory24.address_length);
212 break; 212 break;
213 case ACPI_RSTYPE_FIXED_MEM32: 213 case ACPI_RESOURCE_TYPE_MEMORY32:
214 pnpacpi_parse_allocated_memresource(res_table, 214 pnpacpi_parse_allocated_memresource(res_table,
215 res->data.fixed_memory32.range_base_address, 215 res->data.memory32.minimum,
216 res->data.fixed_memory32.range_length); 216 res->data.memory32.address_length);
217 break; 217 break;
218 case ACPI_RSTYPE_ADDRESS16: 218 case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
219 pnpacpi_parse_allocated_memresource(res_table, 219 pnpacpi_parse_allocated_memresource(res_table,
220 res->data.address16.min_address_range, 220 res->data.fixed_memory32.address,
221 res->data.fixed_memory32.address_length);
222 break;
223 case ACPI_RESOURCE_TYPE_ADDRESS16:
224 pnpacpi_parse_allocated_memresource(res_table,
225 res->data.address16.minimum,
221 res->data.address16.address_length); 226 res->data.address16.address_length);
222 break; 227 break;
223 case ACPI_RSTYPE_ADDRESS32: 228 case ACPI_RESOURCE_TYPE_ADDRESS32:
224 pnpacpi_parse_allocated_memresource(res_table, 229 pnpacpi_parse_allocated_memresource(res_table,
225 res->data.address32.min_address_range, 230 res->data.address32.minimum,
226 res->data.address32.address_length); 231 res->data.address32.address_length);
227 break; 232 break;
228 case ACPI_RSTYPE_ADDRESS64: 233 case ACPI_RESOURCE_TYPE_ADDRESS64:
229 pnpacpi_parse_allocated_memresource(res_table, 234 pnpacpi_parse_allocated_memresource(res_table,
230 res->data.address64.min_address_range, 235 res->data.address64.minimum,
231 res->data.address64.address_length); 236 res->data.address64.address_length);
232 break; 237 break;
233 case ACPI_RSTYPE_VENDOR: 238
239 case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
240 break;
241
242 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
243 for (i = 0; i < res->data.extended_irq.interrupt_count; i++) {
244 pnpacpi_parse_allocated_irqresource(res_table,
245 res->data.extended_irq.interrupts[i],
246 res->data.extended_irq.triggering,
247 res->data.extended_irq.polarity);
248 }
249 break;
250
251 case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
234 break; 252 break;
253
235 default: 254 default:
236 pnp_warn("PnPACPI: unknown resource type %d", res->id); 255 pnp_warn("PnPACPI: unknown resource type %d", res->type);
237 return AE_ERROR; 256 return AE_ERROR;
238 } 257 }
239 258
@@ -253,13 +272,13 @@ static void pnpacpi_parse_dma_option(struct pnp_option *option, struct acpi_reso
253 int i; 272 int i;
254 struct pnp_dma * dma; 273 struct pnp_dma * dma;
255 274
256 if (p->number_of_channels == 0) 275 if (p->channel_count == 0)
257 return; 276 return;
258 dma = kcalloc(1, sizeof(struct pnp_dma), GFP_KERNEL); 277 dma = kcalloc(1, sizeof(struct pnp_dma), GFP_KERNEL);
259 if (!dma) 278 if (!dma)
260 return; 279 return;
261 280
262 for(i = 0; i < p->number_of_channels; i++) 281 for(i = 0; i < p->channel_count; i++)
263 dma->map |= 1 << p->channels[i]; 282 dma->map |= 1 << p->channels[i];
264 dma->flags = 0; 283 dma->flags = 0;
265 if (p->bus_master) 284 if (p->bus_master)
@@ -309,37 +328,37 @@ static void pnpacpi_parse_irq_option(struct pnp_option *option,
309 int i; 328 int i;
310 struct pnp_irq * irq; 329 struct pnp_irq * irq;
311 330
312 if (p->number_of_interrupts == 0) 331 if (p->interrupt_count == 0)
313 return; 332 return;
314 irq = kcalloc(1, sizeof(struct pnp_irq), GFP_KERNEL); 333 irq = kcalloc(1, sizeof(struct pnp_irq), GFP_KERNEL);
315 if (!irq) 334 if (!irq)
316 return; 335 return;
317 336
318 for(i = 0; i < p->number_of_interrupts; i++) 337 for(i = 0; i < p->interrupt_count; i++)
319 if (p->interrupts[i]) 338 if (p->interrupts[i])
320 __set_bit(p->interrupts[i], irq->map); 339 __set_bit(p->interrupts[i], irq->map);
321 irq->flags = irq_flags(p->edge_level, p->active_high_low); 340 irq->flags = irq_flags(p->triggering, p->polarity);
322 341
323 pnp_register_irq_resource(option, irq); 342 pnp_register_irq_resource(option, irq);
324 return; 343 return;
325} 344}
326 345
327static void pnpacpi_parse_ext_irq_option(struct pnp_option *option, 346static void pnpacpi_parse_ext_irq_option(struct pnp_option *option,
328 struct acpi_resource_ext_irq *p) 347 struct acpi_resource_extended_irq *p)
329{ 348{
330 int i; 349 int i;
331 struct pnp_irq * irq; 350 struct pnp_irq * irq;
332 351
333 if (p->number_of_interrupts == 0) 352 if (p->interrupt_count == 0)
334 return; 353 return;
335 irq = kcalloc(1, sizeof(struct pnp_irq), GFP_KERNEL); 354 irq = kcalloc(1, sizeof(struct pnp_irq), GFP_KERNEL);
336 if (!irq) 355 if (!irq)
337 return; 356 return;
338 357
339 for(i = 0; i < p->number_of_interrupts; i++) 358 for(i = 0; i < p->interrupt_count; i++)
340 if (p->interrupts[i]) 359 if (p->interrupts[i])
341 __set_bit(p->interrupts[i], irq->map); 360 __set_bit(p->interrupts[i], irq->map);
342 irq->flags = irq_flags(p->edge_level, p->active_high_low); 361 irq->flags = irq_flags(p->triggering, p->polarity);
343 362
344 pnp_register_irq_resource(option, irq); 363 pnp_register_irq_resource(option, irq);
345 return; 364 return;
@@ -351,16 +370,16 @@ pnpacpi_parse_port_option(struct pnp_option *option,
351{ 370{
352 struct pnp_port * port; 371 struct pnp_port * port;
353 372
354 if (io->range_length == 0) 373 if (io->address_length == 0)
355 return; 374 return;
356 port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL); 375 port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL);
357 if (!port) 376 if (!port)
358 return; 377 return;
359 port->min = io->min_base_address; 378 port->min = io->minimum;
360 port->max = io->max_base_address; 379 port->max = io->maximum;
361 port->align = io->alignment; 380 port->align = io->alignment;
362 port->size = io->range_length; 381 port->size = io->address_length;
363 port->flags = ACPI_DECODE_16 == io->io_decode ? 382 port->flags = ACPI_DECODE_16 == io->io_decode ?
364 PNP_PORT_FLAG_16BITADDR : 0; 383 PNP_PORT_FLAG_16BITADDR : 0;
365 pnp_register_port_resource(option,port); 384 pnp_register_port_resource(option,port);
366 return; 385 return;
@@ -372,13 +391,13 @@ pnpacpi_parse_fixed_port_option(struct pnp_option *option,
372{ 391{
373 struct pnp_port * port; 392 struct pnp_port * port;
374 393
375 if (io->range_length == 0) 394 if (io->address_length == 0)
376 return; 395 return;
377 port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL); 396 port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL);
378 if (!port) 397 if (!port)
379 return; 398 return;
380 port->min = port->max = io->base_address; 399 port->min = port->max = io->address;
381 port->size = io->range_length; 400 port->size = io->address_length;
382 port->align = 0; 401 port->align = 0;
383 port->flags = PNP_PORT_FLAG_FIXED; 402 port->flags = PNP_PORT_FLAG_FIXED;
384 pnp_register_port_resource(option,port); 403 pnp_register_port_resource(option,port);
@@ -387,21 +406,21 @@ pnpacpi_parse_fixed_port_option(struct pnp_option *option,
387 406
388static void 407static void
389pnpacpi_parse_mem24_option(struct pnp_option *option, 408pnpacpi_parse_mem24_option(struct pnp_option *option,
390 struct acpi_resource_mem24 *p) 409 struct acpi_resource_memory24 *p)
391{ 410{
392 struct pnp_mem * mem; 411 struct pnp_mem * mem;
393 412
394 if (p->range_length == 0) 413 if (p->address_length == 0)
395 return; 414 return;
396 mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL); 415 mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL);
397 if (!mem) 416 if (!mem)
398 return; 417 return;
399 mem->min = p->min_base_address; 418 mem->min = p->minimum;
400 mem->max = p->max_base_address; 419 mem->max = p->maximum;
401 mem->align = p->alignment; 420 mem->align = p->alignment;
402 mem->size = p->range_length; 421 mem->size = p->address_length;
403 422
404 mem->flags = (ACPI_READ_WRITE_MEMORY == p->read_write_attribute) ? 423 mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
405 IORESOURCE_MEM_WRITEABLE : 0; 424 IORESOURCE_MEM_WRITEABLE : 0;
406 425
407 pnp_register_mem_resource(option,mem); 426 pnp_register_mem_resource(option,mem);
@@ -410,21 +429,21 @@ pnpacpi_parse_mem24_option(struct pnp_option *option,
410 429
411static void 430static void
412pnpacpi_parse_mem32_option(struct pnp_option *option, 431pnpacpi_parse_mem32_option(struct pnp_option *option,
413 struct acpi_resource_mem32 *p) 432 struct acpi_resource_memory32 *p)
414{ 433{
415 struct pnp_mem * mem; 434 struct pnp_mem * mem;
416 435
417 if (p->range_length == 0) 436 if (p->address_length == 0)
418 return; 437 return;
419 mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL); 438 mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL);
420 if (!mem) 439 if (!mem)
421 return; 440 return;
422 mem->min = p->min_base_address; 441 mem->min = p->minimum;
423 mem->max = p->max_base_address; 442 mem->max = p->maximum;
424 mem->align = p->alignment; 443 mem->align = p->alignment;
425 mem->size = p->range_length; 444 mem->size = p->address_length;
426 445
427 mem->flags = (ACPI_READ_WRITE_MEMORY == p->read_write_attribute) ? 446 mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
428 IORESOURCE_MEM_WRITEABLE : 0; 447 IORESOURCE_MEM_WRITEABLE : 0;
429 448
430 pnp_register_mem_resource(option,mem); 449 pnp_register_mem_resource(option,mem);
@@ -433,33 +452,72 @@ pnpacpi_parse_mem32_option(struct pnp_option *option,
433 452
434static void 453static void
435pnpacpi_parse_fixed_mem32_option(struct pnp_option *option, 454pnpacpi_parse_fixed_mem32_option(struct pnp_option *option,
436 struct acpi_resource_fixed_mem32 *p) 455 struct acpi_resource_fixed_memory32 *p)
437{ 456{
438 struct pnp_mem * mem; 457 struct pnp_mem * mem;
439 458
440 if (p->range_length == 0) 459 if (p->address_length == 0)
441 return; 460 return;
442 mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL); 461 mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL);
443 if (!mem) 462 if (!mem)
444 return; 463 return;
445 mem->min = mem->max = p->range_base_address; 464 mem->min = mem->max = p->address;
446 mem->size = p->range_length; 465 mem->size = p->address_length;
447 mem->align = 0; 466 mem->align = 0;
448 467
449 mem->flags = (ACPI_READ_WRITE_MEMORY == p->read_write_attribute) ? 468 mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
450 IORESOURCE_MEM_WRITEABLE : 0; 469 IORESOURCE_MEM_WRITEABLE : 0;
451 470
452 pnp_register_mem_resource(option,mem); 471 pnp_register_mem_resource(option,mem);
453 return; 472 return;
454} 473}
455 474
475static void
476pnpacpi_parse_address_option(struct pnp_option *option, struct acpi_resource *r)
477{
478 struct acpi_resource_address64 addr, *p = &addr;
479 acpi_status status;
480 struct pnp_mem * mem;
481 struct pnp_port * port;
482
483 status = acpi_resource_to_address64(r, p);
484 if (!ACPI_SUCCESS(status)) {
485 pnp_warn("PnPACPI: failed to convert resource type %d", r->type);
486 return;
487 }
488
489 if (p->address_length == 0)
490 return;
491
492 if (p->resource_type == ACPI_MEMORY_RANGE) {
493 mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL);
494 if (!mem)
495 return;
496 mem->min = mem->max = p->minimum;
497 mem->size = p->address_length;
498 mem->align = 0;
499 mem->flags = (p->info.mem.write_protect ==
500 ACPI_READ_WRITE_MEMORY) ? IORESOURCE_MEM_WRITEABLE : 0;
501 pnp_register_mem_resource(option,mem);
502 } else if (p->resource_type == ACPI_IO_RANGE) {
503 port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL);
504 if (!port)
505 return;
506 port->min = port->max = p->minimum;
507 port->size = p->address_length;
508 port->align = 0;
509 port->flags = PNP_PORT_FLAG_FIXED;
510 pnp_register_port_resource(option,port);
511 }
512}
513
456struct acpipnp_parse_option_s { 514struct acpipnp_parse_option_s {
457 struct pnp_option *option; 515 struct pnp_option *option;
458 struct pnp_option *option_independent; 516 struct pnp_option *option_independent;
459 struct pnp_dev *dev; 517 struct pnp_dev *dev;
460}; 518};
461 519
462static acpi_status pnpacpi_option_resource(struct acpi_resource *res, 520static acpi_status pnpacpi_option_resource(struct acpi_resource *res,
463 void *data) 521 void *data)
464{ 522{
465 int priority = 0; 523 int priority = 0;
@@ -467,35 +525,16 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res,
467 struct pnp_dev *dev = parse_data->dev; 525 struct pnp_dev *dev = parse_data->dev;
468 struct pnp_option *option = parse_data->option; 526 struct pnp_option *option = parse_data->option;
469 527
470 switch (res->id) { 528 switch (res->type) {
471 case ACPI_RSTYPE_IRQ: 529 case ACPI_RESOURCE_TYPE_IRQ:
472 pnpacpi_parse_irq_option(option, &res->data.irq); 530 pnpacpi_parse_irq_option(option, &res->data.irq);
473 break; 531 break;
474 case ACPI_RSTYPE_EXT_IRQ: 532
475 pnpacpi_parse_ext_irq_option(option, 533 case ACPI_RESOURCE_TYPE_DMA:
476 &res->data.extended_irq);
477 break;
478 case ACPI_RSTYPE_DMA:
479 pnpacpi_parse_dma_option(option, &res->data.dma); 534 pnpacpi_parse_dma_option(option, &res->data.dma);
480 break; 535 break;
481 case ACPI_RSTYPE_IO: 536
482 pnpacpi_parse_port_option(option, &res->data.io); 537 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
483 break;
484 case ACPI_RSTYPE_FIXED_IO:
485 pnpacpi_parse_fixed_port_option(option,
486 &res->data.fixed_io);
487 break;
488 case ACPI_RSTYPE_MEM24:
489 pnpacpi_parse_mem24_option(option, &res->data.memory24);
490 break;
491 case ACPI_RSTYPE_MEM32:
492 pnpacpi_parse_mem32_option(option, &res->data.memory32);
493 break;
494 case ACPI_RSTYPE_FIXED_MEM32:
495 pnpacpi_parse_fixed_mem32_option(option,
496 &res->data.fixed_memory32);
497 break;
498 case ACPI_RSTYPE_START_DPF:
499 switch (res->data.start_dpf.compatibility_priority) { 538 switch (res->data.start_dpf.compatibility_priority) {
500 case ACPI_GOOD_CONFIGURATION: 539 case ACPI_GOOD_CONFIGURATION:
501 priority = PNP_RES_PRIORITY_PREFERRED; 540 priority = PNP_RES_PRIORITY_PREFERRED;
@@ -518,7 +557,8 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res,
518 return AE_ERROR; 557 return AE_ERROR;
519 parse_data->option = option; 558 parse_data->option = option;
520 break; 559 break;
521 case ACPI_RSTYPE_END_DPF: 560
561 case ACPI_RESOURCE_TYPE_END_DEPENDENT:
522 /*only one EndDependentFn is allowed*/ 562 /*only one EndDependentFn is allowed*/
523 if (!parse_data->option_independent) { 563 if (!parse_data->option_independent) {
524 pnp_warn("PnPACPI: more than one EndDependentFn"); 564 pnp_warn("PnPACPI: more than one EndDependentFn");
@@ -527,15 +567,59 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res,
527 parse_data->option = parse_data->option_independent; 567 parse_data->option = parse_data->option_independent;
528 parse_data->option_independent = NULL; 568 parse_data->option_independent = NULL;
529 break; 569 break;
570
571 case ACPI_RESOURCE_TYPE_IO:
572 pnpacpi_parse_port_option(option, &res->data.io);
573 break;
574
575 case ACPI_RESOURCE_TYPE_FIXED_IO:
576 pnpacpi_parse_fixed_port_option(option,
577 &res->data.fixed_io);
578 break;
579
580 case ACPI_RESOURCE_TYPE_VENDOR:
581 case ACPI_RESOURCE_TYPE_END_TAG:
582 break;
583
584 case ACPI_RESOURCE_TYPE_MEMORY24:
585 pnpacpi_parse_mem24_option(option, &res->data.memory24);
586 break;
587
588 case ACPI_RESOURCE_TYPE_MEMORY32:
589 pnpacpi_parse_mem32_option(option, &res->data.memory32);
590 break;
591
592 case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
593 pnpacpi_parse_fixed_mem32_option(option,
594 &res->data.fixed_memory32);
595 break;
596
597 case ACPI_RESOURCE_TYPE_ADDRESS16:
598 case ACPI_RESOURCE_TYPE_ADDRESS32:
599 case ACPI_RESOURCE_TYPE_ADDRESS64:
600 pnpacpi_parse_address_option(option, res);
601 break;
602
603 case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
604 break;
605
606 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
607 pnpacpi_parse_ext_irq_option(option,
608 &res->data.extended_irq);
609 break;
610
611 case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
612 break;
613
530 default: 614 default:
531 pnp_warn("PnPACPI: unknown resource type %d", res->id); 615 pnp_warn("PnPACPI: unknown resource type %d", res->type);
532 return AE_ERROR; 616 return AE_ERROR;
533 } 617 }
534 618
535 return AE_OK; 619 return AE_OK;
536} 620}
537 621
538acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle, 622acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle,
539 struct pnp_dev *dev) 623 struct pnp_dev *dev)
540{ 624{
541 acpi_status status; 625 acpi_status status;
@@ -546,7 +630,7 @@ acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle,
546 return AE_ERROR; 630 return AE_ERROR;
547 parse_data.option_independent = parse_data.option; 631 parse_data.option_independent = parse_data.option;
548 parse_data.dev = dev; 632 parse_data.dev = dev;
549 status = acpi_walk_resources(handle, METHOD_NAME__PRS, 633 status = acpi_walk_resources(handle, METHOD_NAME__PRS,
550 pnpacpi_option_resource, &parse_data); 634 pnpacpi_option_resource, &parse_data);
551 635
552 return status; 636 return status;
@@ -559,21 +643,24 @@ static acpi_status pnpacpi_count_resources(struct acpi_resource *res,
559 void *data) 643 void *data)
560{ 644{
561 int *res_cnt = (int *)data; 645 int *res_cnt = (int *)data;
562 switch (res->id) { 646 switch (res->type) {
563 case ACPI_RSTYPE_IRQ: 647 case ACPI_RESOURCE_TYPE_IRQ:
564 case ACPI_RSTYPE_EXT_IRQ: 648 case ACPI_RESOURCE_TYPE_DMA:
565 case ACPI_RSTYPE_DMA: 649 case ACPI_RESOURCE_TYPE_IO:
566 case ACPI_RSTYPE_IO: 650 case ACPI_RESOURCE_TYPE_FIXED_IO:
567 case ACPI_RSTYPE_FIXED_IO: 651 case ACPI_RESOURCE_TYPE_MEMORY24:
568 case ACPI_RSTYPE_MEM24: 652 case ACPI_RESOURCE_TYPE_MEMORY32:
569 case ACPI_RSTYPE_MEM32: 653 case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
570 case ACPI_RSTYPE_FIXED_MEM32: 654 case ACPI_RESOURCE_TYPE_ADDRESS16:
571#if 0 655 case ACPI_RESOURCE_TYPE_ADDRESS32:
572 case ACPI_RSTYPE_ADDRESS16: 656 case ACPI_RESOURCE_TYPE_ADDRESS64:
573 case ACPI_RSTYPE_ADDRESS32: 657 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
574 case ACPI_RSTYPE_ADDRESS64:
575#endif
576 (*res_cnt) ++; 658 (*res_cnt) ++;
659 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
660 case ACPI_RESOURCE_TYPE_END_DEPENDENT:
661 case ACPI_RESOURCE_TYPE_VENDOR:
662 case ACPI_RESOURCE_TYPE_END_TAG:
663 case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
577 default: 664 default:
578 return AE_OK; 665 return AE_OK;
579 } 666 }
@@ -584,22 +671,25 @@ static acpi_status pnpacpi_type_resources(struct acpi_resource *res,
584 void *data) 671 void *data)
585{ 672{
586 struct acpi_resource **resource = (struct acpi_resource **)data; 673 struct acpi_resource **resource = (struct acpi_resource **)data;
587 switch (res->id) { 674 switch (res->type) {
588 case ACPI_RSTYPE_IRQ: 675 case ACPI_RESOURCE_TYPE_IRQ:
589 case ACPI_RSTYPE_EXT_IRQ: 676 case ACPI_RESOURCE_TYPE_DMA:
590 case ACPI_RSTYPE_DMA: 677 case ACPI_RESOURCE_TYPE_IO:
591 case ACPI_RSTYPE_IO: 678 case ACPI_RESOURCE_TYPE_FIXED_IO:
592 case ACPI_RSTYPE_FIXED_IO: 679 case ACPI_RESOURCE_TYPE_MEMORY24:
593 case ACPI_RSTYPE_MEM24: 680 case ACPI_RESOURCE_TYPE_MEMORY32:
594 case ACPI_RSTYPE_MEM32: 681 case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
595 case ACPI_RSTYPE_FIXED_MEM32: 682 case ACPI_RESOURCE_TYPE_ADDRESS16:
596#if 0 683 case ACPI_RESOURCE_TYPE_ADDRESS32:
597 case ACPI_RSTYPE_ADDRESS16: 684 case ACPI_RESOURCE_TYPE_ADDRESS64:
598 case ACPI_RSTYPE_ADDRESS32: 685 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
599 case ACPI_RSTYPE_ADDRESS64: 686 (*resource)->type = res->type;
600#endif
601 (*resource)->id = res->id;
602 (*resource)++; 687 (*resource)++;
688 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
689 case ACPI_RESOURCE_TYPE_END_DEPENDENT:
690 case ACPI_RESOURCE_TYPE_VENDOR:
691 case ACPI_RESOURCE_TYPE_END_TAG:
692 case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
603 default: 693 default:
604 return AE_OK; 694 return AE_OK;
605 } 695 }
@@ -607,14 +697,14 @@ static acpi_status pnpacpi_type_resources(struct acpi_resource *res,
607 return AE_OK; 697 return AE_OK;
608} 698}
609 699
610int pnpacpi_build_resource_template(acpi_handle handle, 700int pnpacpi_build_resource_template(acpi_handle handle,
611 struct acpi_buffer *buffer) 701 struct acpi_buffer *buffer)
612{ 702{
613 struct acpi_resource *resource; 703 struct acpi_resource *resource;
614 int res_cnt = 0; 704 int res_cnt = 0;
615 acpi_status status; 705 acpi_status status;
616 706
617 status = acpi_walk_resources(handle, METHOD_NAME__CRS, 707 status = acpi_walk_resources(handle, METHOD_NAME__CRS,
618 pnpacpi_count_resources, &res_cnt); 708 pnpacpi_count_resources, &res_cnt);
619 if (ACPI_FAILURE(status)) { 709 if (ACPI_FAILURE(status)) {
620 pnp_err("Evaluate _CRS failed"); 710 pnp_err("Evaluate _CRS failed");
@@ -628,7 +718,7 @@ int pnpacpi_build_resource_template(acpi_handle handle,
628 return -ENOMEM; 718 return -ENOMEM;
629 pnp_dbg("Res cnt %d", res_cnt); 719 pnp_dbg("Res cnt %d", res_cnt);
630 resource = (struct acpi_resource *)buffer->pointer; 720 resource = (struct acpi_resource *)buffer->pointer;
631 status = acpi_walk_resources(handle, METHOD_NAME__CRS, 721 status = acpi_walk_resources(handle, METHOD_NAME__CRS,
632 pnpacpi_type_resources, &resource); 722 pnpacpi_type_resources, &resource);
633 if (ACPI_FAILURE(status)) { 723 if (ACPI_FAILURE(status)) {
634 kfree(buffer->pointer); 724 kfree(buffer->pointer);
@@ -636,54 +726,54 @@ int pnpacpi_build_resource_template(acpi_handle handle,
636 return -EINVAL; 726 return -EINVAL;
637 } 727 }
638 /* resource will pointer the end resource now */ 728 /* resource will pointer the end resource now */
639 resource->id = ACPI_RSTYPE_END_TAG; 729 resource->type = ACPI_RESOURCE_TYPE_END_TAG;
640 730
641 return 0; 731 return 0;
642} 732}
643 733
644static void pnpacpi_encode_irq(struct acpi_resource *resource, 734static void pnpacpi_encode_irq(struct acpi_resource *resource,
645 struct resource *p) 735 struct resource *p)
646{ 736{
647 int edge_level, active_high_low; 737 int triggering, polarity;
648 738
649 decode_irq_flags(p->flags & IORESOURCE_BITS, &edge_level, 739 decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering,
650 &active_high_low); 740 &polarity);
651 resource->id = ACPI_RSTYPE_IRQ; 741 resource->type = ACPI_RESOURCE_TYPE_IRQ;
652 resource->length = sizeof(struct acpi_resource); 742 resource->length = sizeof(struct acpi_resource);
653 resource->data.irq.edge_level = edge_level; 743 resource->data.irq.triggering = triggering;
654 resource->data.irq.active_high_low = active_high_low; 744 resource->data.irq.polarity = polarity;
655 if (edge_level == ACPI_EDGE_SENSITIVE) 745 if (triggering == ACPI_EDGE_SENSITIVE)
656 resource->data.irq.shared_exclusive = ACPI_EXCLUSIVE; 746 resource->data.irq.sharable = ACPI_EXCLUSIVE;
657 else 747 else
658 resource->data.irq.shared_exclusive = ACPI_SHARED; 748 resource->data.irq.sharable = ACPI_SHARED;
659 resource->data.irq.number_of_interrupts = 1; 749 resource->data.irq.interrupt_count = 1;
660 resource->data.irq.interrupts[0] = p->start; 750 resource->data.irq.interrupts[0] = p->start;
661} 751}
662 752
663static void pnpacpi_encode_ext_irq(struct acpi_resource *resource, 753static void pnpacpi_encode_ext_irq(struct acpi_resource *resource,
664 struct resource *p) 754 struct resource *p)
665{ 755{
666 int edge_level, active_high_low; 756 int triggering, polarity;
667 757
668 decode_irq_flags(p->flags & IORESOURCE_BITS, &edge_level, 758 decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering,
669 &active_high_low); 759 &polarity);
670 resource->id = ACPI_RSTYPE_EXT_IRQ; 760 resource->type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
671 resource->length = sizeof(struct acpi_resource); 761 resource->length = sizeof(struct acpi_resource);
672 resource->data.extended_irq.producer_consumer = ACPI_CONSUMER; 762 resource->data.extended_irq.producer_consumer = ACPI_CONSUMER;
673 resource->data.extended_irq.edge_level = edge_level; 763 resource->data.extended_irq.triggering = triggering;
674 resource->data.extended_irq.active_high_low = active_high_low; 764 resource->data.extended_irq.polarity = polarity;
675 if (edge_level == ACPI_EDGE_SENSITIVE) 765 if (triggering == ACPI_EDGE_SENSITIVE)
676 resource->data.irq.shared_exclusive = ACPI_EXCLUSIVE; 766 resource->data.irq.sharable = ACPI_EXCLUSIVE;
677 else 767 else
678 resource->data.irq.shared_exclusive = ACPI_SHARED; 768 resource->data.irq.sharable = ACPI_SHARED;
679 resource->data.extended_irq.number_of_interrupts = 1; 769 resource->data.extended_irq.interrupt_count = 1;
680 resource->data.extended_irq.interrupts[0] = p->start; 770 resource->data.extended_irq.interrupts[0] = p->start;
681} 771}
682 772
683static void pnpacpi_encode_dma(struct acpi_resource *resource, 773static void pnpacpi_encode_dma(struct acpi_resource *resource,
684 struct resource *p) 774 struct resource *p)
685{ 775{
686 resource->id = ACPI_RSTYPE_DMA; 776 resource->type = ACPI_RESOURCE_TYPE_DMA;
687 resource->length = sizeof(struct acpi_resource); 777 resource->length = sizeof(struct acpi_resource);
688 /* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */ 778 /* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */
689 if (p->flags & IORESOURCE_DMA_COMPATIBLE) 779 if (p->flags & IORESOURCE_DMA_COMPATIBLE)
@@ -701,75 +791,75 @@ static void pnpacpi_encode_dma(struct acpi_resource *resource,
701 else if (p->flags & IORESOURCE_DMA_16BIT) 791 else if (p->flags & IORESOURCE_DMA_16BIT)
702 resource->data.dma.transfer = ACPI_TRANSFER_16; 792 resource->data.dma.transfer = ACPI_TRANSFER_16;
703 resource->data.dma.bus_master = p->flags & IORESOURCE_DMA_MASTER; 793 resource->data.dma.bus_master = p->flags & IORESOURCE_DMA_MASTER;
704 resource->data.dma.number_of_channels = 1; 794 resource->data.dma.channel_count = 1;
705 resource->data.dma.channels[0] = p->start; 795 resource->data.dma.channels[0] = p->start;
706} 796}
707 797
708static void pnpacpi_encode_io(struct acpi_resource *resource, 798static void pnpacpi_encode_io(struct acpi_resource *resource,
709 struct resource *p) 799 struct resource *p)
710{ 800{
711 resource->id = ACPI_RSTYPE_IO; 801 resource->type = ACPI_RESOURCE_TYPE_IO;
712 resource->length = sizeof(struct acpi_resource); 802 resource->length = sizeof(struct acpi_resource);
713 /* Note: pnp_assign_port will copy pnp_port->flags into p->flags */ 803 /* Note: pnp_assign_port will copy pnp_port->flags into p->flags */
714 resource->data.io.io_decode = (p->flags & PNP_PORT_FLAG_16BITADDR)? 804 resource->data.io.io_decode = (p->flags & PNP_PORT_FLAG_16BITADDR)?
715 ACPI_DECODE_16 : ACPI_DECODE_10; 805 ACPI_DECODE_16 : ACPI_DECODE_10;
716 resource->data.io.min_base_address = p->start; 806 resource->data.io.minimum = p->start;
717 resource->data.io.max_base_address = p->end; 807 resource->data.io.maximum = p->end;
718 resource->data.io.alignment = 0; /* Correct? */ 808 resource->data.io.alignment = 0; /* Correct? */
719 resource->data.io.range_length = p->end - p->start + 1; 809 resource->data.io.address_length = p->end - p->start + 1;
720} 810}
721 811
722static void pnpacpi_encode_fixed_io(struct acpi_resource *resource, 812static void pnpacpi_encode_fixed_io(struct acpi_resource *resource,
723 struct resource *p) 813 struct resource *p)
724{ 814{
725 resource->id = ACPI_RSTYPE_FIXED_IO; 815 resource->type = ACPI_RESOURCE_TYPE_FIXED_IO;
726 resource->length = sizeof(struct acpi_resource); 816 resource->length = sizeof(struct acpi_resource);
727 resource->data.fixed_io.base_address = p->start; 817 resource->data.fixed_io.address = p->start;
728 resource->data.fixed_io.range_length = p->end - p->start + 1; 818 resource->data.fixed_io.address_length = p->end - p->start + 1;
729} 819}
730 820
731static void pnpacpi_encode_mem24(struct acpi_resource *resource, 821static void pnpacpi_encode_mem24(struct acpi_resource *resource,
732 struct resource *p) 822 struct resource *p)
733{ 823{
734 resource->id = ACPI_RSTYPE_MEM24; 824 resource->type = ACPI_RESOURCE_TYPE_MEMORY24;
735 resource->length = sizeof(struct acpi_resource); 825 resource->length = sizeof(struct acpi_resource);
736 /* Note: pnp_assign_mem will copy pnp_mem->flags into p->flags */ 826 /* Note: pnp_assign_mem will copy pnp_mem->flags into p->flags */
737 resource->data.memory24.read_write_attribute = 827 resource->data.memory24.write_protect =
738 (p->flags & IORESOURCE_MEM_WRITEABLE) ? 828 (p->flags & IORESOURCE_MEM_WRITEABLE) ?
739 ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY; 829 ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
740 resource->data.memory24.min_base_address = p->start; 830 resource->data.memory24.minimum = p->start;
741 resource->data.memory24.max_base_address = p->end; 831 resource->data.memory24.maximum = p->end;
742 resource->data.memory24.alignment = 0; 832 resource->data.memory24.alignment = 0;
743 resource->data.memory24.range_length = p->end - p->start + 1; 833 resource->data.memory24.address_length = p->end - p->start + 1;
744} 834}
745 835
746static void pnpacpi_encode_mem32(struct acpi_resource *resource, 836static void pnpacpi_encode_mem32(struct acpi_resource *resource,
747 struct resource *p) 837 struct resource *p)
748{ 838{
749 resource->id = ACPI_RSTYPE_MEM32; 839 resource->type = ACPI_RESOURCE_TYPE_MEMORY32;
750 resource->length = sizeof(struct acpi_resource); 840 resource->length = sizeof(struct acpi_resource);
751 resource->data.memory32.read_write_attribute = 841 resource->data.memory32.write_protect =
752 (p->flags & IORESOURCE_MEM_WRITEABLE) ? 842 (p->flags & IORESOURCE_MEM_WRITEABLE) ?
753 ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY; 843 ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
754 resource->data.memory32.min_base_address = p->start; 844 resource->data.memory32.minimum = p->start;
755 resource->data.memory32.max_base_address = p->end; 845 resource->data.memory32.maximum = p->end;
756 resource->data.memory32.alignment = 0; 846 resource->data.memory32.alignment = 0;
757 resource->data.memory32.range_length = p->end - p->start + 1; 847 resource->data.memory32.address_length = p->end - p->start + 1;
758} 848}
759 849
760static void pnpacpi_encode_fixed_mem32(struct acpi_resource *resource, 850static void pnpacpi_encode_fixed_mem32(struct acpi_resource *resource,
761 struct resource *p) 851 struct resource *p)
762{ 852{
763 resource->id = ACPI_RSTYPE_FIXED_MEM32; 853 resource->type = ACPI_RESOURCE_TYPE_FIXED_MEMORY32;
764 resource->length = sizeof(struct acpi_resource); 854 resource->length = sizeof(struct acpi_resource);
765 resource->data.fixed_memory32.read_write_attribute = 855 resource->data.fixed_memory32.write_protect =
766 (p->flags & IORESOURCE_MEM_WRITEABLE) ? 856 (p->flags & IORESOURCE_MEM_WRITEABLE) ?
767 ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY; 857 ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
768 resource->data.fixed_memory32.range_base_address = p->start; 858 resource->data.fixed_memory32.address = p->start;
769 resource->data.fixed_memory32.range_length = p->end - p->start + 1; 859 resource->data.fixed_memory32.address_length = p->end - p->start + 1;
770} 860}
771 861
772int pnpacpi_encode_resources(struct pnp_resource_table *res_table, 862int pnpacpi_encode_resources(struct pnp_resource_table *res_table,
773 struct acpi_buffer *buffer) 863 struct acpi_buffer *buffer)
774{ 864{
775 int i = 0; 865 int i = 0;
@@ -780,58 +870,67 @@ int pnpacpi_encode_resources(struct pnp_resource_table *res_table,
780 870
781 pnp_dbg("res cnt %d", res_cnt); 871 pnp_dbg("res cnt %d", res_cnt);
782 while (i < res_cnt) { 872 while (i < res_cnt) {
783 switch(resource->id) { 873 switch(resource->type) {
784 case ACPI_RSTYPE_IRQ: 874 case ACPI_RESOURCE_TYPE_IRQ:
785 pnp_dbg("Encode irq"); 875 pnp_dbg("Encode irq");
786 pnpacpi_encode_irq(resource, 876 pnpacpi_encode_irq(resource,
787 &res_table->irq_resource[irq]); 877 &res_table->irq_resource[irq]);
788 irq++; 878 irq++;
789 break; 879 break;
790 880
791 case ACPI_RSTYPE_EXT_IRQ: 881 case ACPI_RESOURCE_TYPE_DMA:
792 pnp_dbg("Encode ext irq");
793 pnpacpi_encode_ext_irq(resource,
794 &res_table->irq_resource[irq]);
795 irq++;
796 break;
797 case ACPI_RSTYPE_DMA:
798 pnp_dbg("Encode dma"); 882 pnp_dbg("Encode dma");
799 pnpacpi_encode_dma(resource, 883 pnpacpi_encode_dma(resource,
800 &res_table->dma_resource[dma]); 884 &res_table->dma_resource[dma]);
801 dma ++; 885 dma ++;
802 break; 886 break;
803 case ACPI_RSTYPE_IO: 887 case ACPI_RESOURCE_TYPE_IO:
804 pnp_dbg("Encode io"); 888 pnp_dbg("Encode io");
805 pnpacpi_encode_io(resource, 889 pnpacpi_encode_io(resource,
806 &res_table->port_resource[port]); 890 &res_table->port_resource[port]);
807 port ++; 891 port ++;
808 break; 892 break;
809 case ACPI_RSTYPE_FIXED_IO: 893 case ACPI_RESOURCE_TYPE_FIXED_IO:
810 pnp_dbg("Encode fixed io"); 894 pnp_dbg("Encode fixed io");
811 pnpacpi_encode_fixed_io(resource, 895 pnpacpi_encode_fixed_io(resource,
812 &res_table->port_resource[port]); 896 &res_table->port_resource[port]);
813 port ++; 897 port ++;
814 break; 898 break;
815 case ACPI_RSTYPE_MEM24: 899 case ACPI_RESOURCE_TYPE_MEMORY24:
816 pnp_dbg("Encode mem24"); 900 pnp_dbg("Encode mem24");
817 pnpacpi_encode_mem24(resource, 901 pnpacpi_encode_mem24(resource,
818 &res_table->mem_resource[mem]); 902 &res_table->mem_resource[mem]);
819 mem ++; 903 mem ++;
820 break; 904 break;
821 case ACPI_RSTYPE_MEM32: 905 case ACPI_RESOURCE_TYPE_MEMORY32:
822 pnp_dbg("Encode mem32"); 906 pnp_dbg("Encode mem32");
823 pnpacpi_encode_mem32(resource, 907 pnpacpi_encode_mem32(resource,
824 &res_table->mem_resource[mem]); 908 &res_table->mem_resource[mem]);
825 mem ++; 909 mem ++;
826 break; 910 break;
827 case ACPI_RSTYPE_FIXED_MEM32: 911 case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
828 pnp_dbg("Encode fixed mem32"); 912 pnp_dbg("Encode fixed mem32");
829 pnpacpi_encode_fixed_mem32(resource, 913 pnpacpi_encode_fixed_mem32(resource,
830 &res_table->mem_resource[mem]); 914 &res_table->mem_resource[mem]);
831 mem ++; 915 mem ++;
832 break; 916 break;
917 case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
918 pnp_dbg("Encode ext irq");
919 pnpacpi_encode_ext_irq(resource,
920 &res_table->irq_resource[irq]);
921 irq++;
922 break;
923 case ACPI_RESOURCE_TYPE_START_DEPENDENT:
924 case ACPI_RESOURCE_TYPE_END_DEPENDENT:
925 case ACPI_RESOURCE_TYPE_VENDOR:
926 case ACPI_RESOURCE_TYPE_END_TAG:
927 case ACPI_RESOURCE_TYPE_ADDRESS16:
928 case ACPI_RESOURCE_TYPE_ADDRESS32:
929 case ACPI_RESOURCE_TYPE_ADDRESS64:
930 case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
931 case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
833 default: /* other type */ 932 default: /* other type */
834 pnp_warn("unknown resource type %d", resource->id); 933 pnp_warn("unknown resource type %d", resource->type);
835 return -EINVAL; 934 return -EINVAL;
836 } 935 }
837 resource ++; 936 resource ++;
diff --git a/drivers/serial/8250_acpi.c b/drivers/serial/8250_acpi.c
index a802bdce6e5d..809f89ab965c 100644
--- a/drivers/serial/8250_acpi.c
+++ b/drivers/serial/8250_acpi.c
@@ -27,7 +27,7 @@ struct serial_private {
27static acpi_status acpi_serial_mmio(struct uart_port *port, 27static acpi_status acpi_serial_mmio(struct uart_port *port,
28 struct acpi_resource_address64 *addr) 28 struct acpi_resource_address64 *addr)
29{ 29{
30 port->mapbase = addr->min_address_range; 30 port->mapbase = addr->minimum;
31 port->iotype = UPIO_MEM; 31 port->iotype = UPIO_MEM;
32 port->flags |= UPF_IOREMAP; 32 port->flags |= UPF_IOREMAP;
33 return AE_OK; 33 return AE_OK;
@@ -36,8 +36,8 @@ static acpi_status acpi_serial_mmio(struct uart_port *port,
36static acpi_status acpi_serial_port(struct uart_port *port, 36static acpi_status acpi_serial_port(struct uart_port *port,
37 struct acpi_resource_io *io) 37 struct acpi_resource_io *io)
38{ 38{
39 if (io->range_length) { 39 if (io->address_length) {
40 port->iobase = io->min_base_address; 40 port->iobase = io->minimum;
41 port->iotype = UPIO_PORT; 41 port->iotype = UPIO_PORT;
42 } else 42 } else
43 printk(KERN_ERR "%s: zero-length IO port range?\n", __FUNCTION__); 43 printk(KERN_ERR "%s: zero-length IO port range?\n", __FUNCTION__);
@@ -45,13 +45,13 @@ static acpi_status acpi_serial_port(struct uart_port *port,
45} 45}
46 46
47static acpi_status acpi_serial_ext_irq(struct uart_port *port, 47static acpi_status acpi_serial_ext_irq(struct uart_port *port,
48 struct acpi_resource_ext_irq *ext_irq) 48 struct acpi_resource_extended_irq *ext_irq)
49{ 49{
50 int rc; 50 int rc;
51 51
52 if (ext_irq->number_of_interrupts > 0) { 52 if (ext_irq->interrupt_count > 0) {
53 rc = acpi_register_gsi(ext_irq->interrupts[0], 53 rc = acpi_register_gsi(ext_irq->interrupts[0],
54 ext_irq->edge_level, ext_irq->active_high_low); 54 ext_irq->triggering, ext_irq->polarity);
55 if (rc < 0) 55 if (rc < 0)
56 return AE_ERROR; 56 return AE_ERROR;
57 port->irq = rc; 57 port->irq = rc;
@@ -64,9 +64,9 @@ static acpi_status acpi_serial_irq(struct uart_port *port,
64{ 64{
65 int rc; 65 int rc;
66 66
67 if (irq->number_of_interrupts > 0) { 67 if (irq->interrupt_count > 0) {
68 rc = acpi_register_gsi(irq->interrupts[0], 68 rc = acpi_register_gsi(irq->interrupts[0],
69 irq->edge_level, irq->active_high_low); 69 irq->triggering, irq->polarity);
70 if (rc < 0) 70 if (rc < 0)
71 return AE_ERROR; 71 return AE_ERROR;
72 port->irq = rc; 72 port->irq = rc;
@@ -83,11 +83,11 @@ static acpi_status acpi_serial_resource(struct acpi_resource *res, void *data)
83 status = acpi_resource_to_address64(res, &addr); 83 status = acpi_resource_to_address64(res, &addr);
84 if (ACPI_SUCCESS(status)) 84 if (ACPI_SUCCESS(status))
85 return acpi_serial_mmio(port, &addr); 85 return acpi_serial_mmio(port, &addr);
86 else if (res->id == ACPI_RSTYPE_IO) 86 else if (res->type == ACPI_RESOURCE_TYPE_IO)
87 return acpi_serial_port(port, &res->data.io); 87 return acpi_serial_port(port, &res->data.io);
88 else if (res->id == ACPI_RSTYPE_EXT_IRQ) 88 else if (res->type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ)
89 return acpi_serial_ext_irq(port, &res->data.extended_irq); 89 return acpi_serial_ext_irq(port, &res->data.extended_irq);
90 else if (res->id == ACPI_RSTYPE_IRQ) 90 else if (res->type == ACPI_RESOURCE_TYPE_IRQ)
91 return acpi_serial_irq(port, &res->data.irq); 91 return acpi_serial_irq(port, &res->data.irq);
92 return AE_OK; 92 return AE_OK;
93} 93}
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 88f60aa52058..e488603fb1e7 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -1785,7 +1785,16 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
1785 } else if(volume_info.wsize) 1785 } else if(volume_info.wsize)
1786 cifs_sb->wsize = volume_info.wsize; 1786 cifs_sb->wsize = volume_info.wsize;
1787 else 1787 else
1788 cifs_sb->wsize = CIFSMaxBufSize; /* default */ 1788 cifs_sb->wsize =
1789 min_t(const int, PAGEVEC_SIZE * PAGE_CACHE_SIZE,
1790 127*1024);
1791 /* old default of CIFSMaxBufSize was too small now
1792 that SMB Write2 can send multiple pages in kvec.
1793 RFC1001 does not describe what happens when frame
1794 bigger than 128K is sent so use that as max in
1795 conjunction with 52K kvec constraint on arch with 4K
1796 page size */
1797
1789 if(cifs_sb->rsize < PAGE_CACHE_SIZE) { 1798 if(cifs_sb->rsize < PAGE_CACHE_SIZE) {
1790 cifs_sb->rsize = PAGE_CACHE_SIZE; 1799 cifs_sb->rsize = PAGE_CACHE_SIZE;
1791 /* Windows ME does this */ 1800 /* Windows ME does this */
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 77c990f0cb98..d17c97d07c80 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -1190,7 +1190,6 @@ retry:
1190 /* BB what if continued retry is 1190 /* BB what if continued retry is
1191 requested via mount flags? */ 1191 requested via mount flags? */
1192 set_bit(AS_EIO, &mapping->flags); 1192 set_bit(AS_EIO, &mapping->flags);
1193 SetPageError(page);
1194 } else { 1193 } else {
1195 cifs_stats_bytes_written(cifs_sb->tcon, 1194 cifs_stats_bytes_written(cifs_sb->tcon,
1196 bytes_written); 1195 bytes_written);
@@ -1198,6 +1197,13 @@ retry:
1198 } 1197 }
1199 for (i = 0; i < n_iov; i++) { 1198 for (i = 0; i < n_iov; i++) {
1200 page = pvec.pages[first + i]; 1199 page = pvec.pages[first + i];
1200 /* Should we also set page error on
1201 success rc but too little data written? */
1202 /* BB investigate retry logic on temporary
1203 server crash cases and how recovery works
1204 when page marked as error */
1205 if(rc)
1206 SetPageError(page);
1201 kunmap(page); 1207 kunmap(page);
1202 unlock_page(page); 1208 unlock_page(page);
1203 page_cache_release(page); 1209 page_cache_release(page);
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
index 7b98792150ea..b12cb8a7da7c 100644
--- a/fs/cifs/transport.c
+++ b/fs/cifs/transport.c
@@ -498,7 +498,6 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
498 else 498 else
499 *pRespBufType = CIFS_SMALL_BUFFER; 499 *pRespBufType = CIFS_SMALL_BUFFER;
500 iov[0].iov_len = receive_len + 4; 500 iov[0].iov_len = receive_len + 4;
501 iov[1].iov_len = 0;
502 501
503 dump_smb(midQ->resp_buf, 80); 502 dump_smb(midQ->resp_buf, 80);
504 /* convert the length into a more usable form */ 503 /* convert the length into a more usable form */
diff --git a/fs/compat.c b/fs/compat.c
index cc58a20df57a..70c5af4cc270 100644
--- a/fs/compat.c
+++ b/fs/compat.c
@@ -73,17 +73,17 @@ asmlinkage long compat_sys_utime(char __user *filename, struct compat_utimbuf __
73 return do_utimes(AT_FDCWD, filename, t ? tv : NULL); 73 return do_utimes(AT_FDCWD, filename, t ? tv : NULL);
74} 74}
75 75
76asmlinkage long compat_sys_futimesat(int dfd, char __user *filename, struct compat_timeval __user *t) 76asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename, struct compat_timeval __user *t)
77{ 77{
78 struct timeval tv[2]; 78 struct timeval tv[2];
79 79
80 if (t) { 80 if (t) {
81 if (get_user(tv[0].tv_sec, &t[0].tv_sec) || 81 if (get_user(tv[0].tv_sec, &t[0].tv_sec) ||
82 get_user(tv[0].tv_usec, &t[0].tv_usec) || 82 get_user(tv[0].tv_usec, &t[0].tv_usec) ||
83 get_user(tv[1].tv_sec, &t[1].tv_sec) || 83 get_user(tv[1].tv_sec, &t[1].tv_sec) ||
84 get_user(tv[1].tv_usec, &t[1].tv_usec)) 84 get_user(tv[1].tv_usec, &t[1].tv_usec))
85 return -EFAULT; 85 return -EFAULT;
86 } 86 }
87 return do_utimes(dfd, filename, t ? tv : NULL); 87 return do_utimes(dfd, filename, t ? tv : NULL);
88} 88}
89 89
@@ -114,7 +114,7 @@ asmlinkage long compat_sys_newlstat(char __user * filename,
114 return error; 114 return error;
115} 115}
116 116
117asmlinkage long compat_sys_newfstatat(int dfd, char __user *filename, 117asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user *filename,
118 struct compat_stat __user *statbuf, int flag) 118 struct compat_stat __user *statbuf, int flag)
119{ 119{
120 struct kstat stat; 120 struct kstat stat;
@@ -1326,7 +1326,7 @@ compat_sys_open(const char __user *filename, int flags, int mode)
1326 * O_LARGEFILE flag. 1326 * O_LARGEFILE flag.
1327 */ 1327 */
1328asmlinkage long 1328asmlinkage long
1329compat_sys_openat(int dfd, const char __user *filename, int flags, int mode) 1329compat_sys_openat(unsigned int dfd, const char __user *filename, int flags, int mode)
1330{ 1330{
1331 return do_sys_open(dfd, filename, flags, mode); 1331 return do_sys_open(dfd, filename, flags, mode);
1332} 1332}
diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h
index 427cff1a3f83..e27dc8f29972 100644
--- a/include/acpi/acconfig.h
+++ b/include/acpi/acconfig.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -61,9 +61,9 @@
61 * 61 *
62 */ 62 */
63 63
64/* Version string */ 64/* Current ACPICA subsystem version in YYYYMMDD format */
65 65
66#define ACPI_CA_VERSION 0x20050902 66#define ACPI_CA_VERSION 0x20060127
67 67
68/* 68/*
69 * OS name, used for the _OS object. The _OS object is essentially obsolete, 69 * OS name, used for the _OS object. The _OS object is essentially obsolete,
@@ -83,7 +83,7 @@
83#define ACPI_MAX_OBJECT_CACHE_DEPTH 96 /* Interpreter operand objects */ 83#define ACPI_MAX_OBJECT_CACHE_DEPTH 96 /* Interpreter operand objects */
84 84
85/* 85/*
86 * Should the subystem abort the loading of an ACPI table if the 86 * Should the subsystem abort the loading of an ACPI table if the
87 * table checksum is incorrect? 87 * table checksum is incorrect?
88 */ 88 */
89#define ACPI_CHECKSUM_ABORT FALSE 89#define ACPI_CHECKSUM_ABORT FALSE
@@ -98,11 +98,6 @@
98 98
99#define ACPI_CA_SUPPORT_LEVEL 3 99#define ACPI_CA_SUPPORT_LEVEL 3
100 100
101/* String size constants */
102
103#define ACPI_MAX_STRING_LENGTH 512
104#define ACPI_PATHNAME_MAX 256 /* A full namespace pathname */
105
106/* Maximum count for a semaphore object */ 101/* Maximum count for a semaphore object */
107 102
108#define ACPI_MAX_SEMAPHORE_COUNT 256 103#define ACPI_MAX_SEMAPHORE_COUNT 256
@@ -115,6 +110,10 @@
115 110
116#define ACPI_SYSMEM_REGION_WINDOW_SIZE 4096 111#define ACPI_SYSMEM_REGION_WINDOW_SIZE 4096
117 112
113/* owner_id tracking. 8 entries allows for 255 owner_ids */
114
115#define ACPI_NUM_OWNERID_MASKS 8
116
118/****************************************************************************** 117/******************************************************************************
119 * 118 *
120 * ACPI Specification constants (Do not change unless the specification changes) 119 * ACPI Specification constants (Do not change unless the specification changes)
@@ -134,14 +133,11 @@
134#define ACPI_METHOD_NUM_ARGS 7 133#define ACPI_METHOD_NUM_ARGS 7
135#define ACPI_METHOD_MAX_ARG 6 134#define ACPI_METHOD_MAX_ARG 6
136 135
137/* Maximum length of resulting string when converting from a buffer */ 136/* Length of _HID, _UID, _CID, and UUID values */
138
139#define ACPI_MAX_STRING_CONVERSION 200
140
141/* Length of _HID, _UID, and _CID values */
142 137
143#define ACPI_DEVICE_ID_LENGTH 0x09 138#define ACPI_DEVICE_ID_LENGTH 0x09
144#define ACPI_MAX_CID_LENGTH 48 139#define ACPI_MAX_CID_LENGTH 48
140#define ACPI_UUID_LENGTH 16
145 141
146/* 142/*
147 * Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG 143 * Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG
diff --git a/include/acpi/acdebug.h b/include/acpi/acdebug.h
index 70ce3b4d006e..d8167095caf3 100644
--- a/include/acpi/acdebug.h
+++ b/include/acpi/acdebug.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/acdisasm.h b/include/acpi/acdisasm.h
index 3d96dcb1bb4b..11a8fe39cb04 100644
--- a/include/acpi/acdisasm.h
+++ b/include/acpi/acdisasm.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -57,26 +57,11 @@ struct acpi_external_list {
57}; 57};
58 58
59extern struct acpi_external_list *acpi_gbl_external_list; 59extern struct acpi_external_list *acpi_gbl_external_list;
60extern const char *acpi_gbl_io_decode[2]; 60
61/* Strings used for decoding flags to ASL keywords */
62
61extern const char *acpi_gbl_word_decode[4]; 63extern const char *acpi_gbl_word_decode[4];
62extern const char *acpi_gbl_consume_decode[2];
63extern const char *acpi_gbl_min_decode[2];
64extern const char *acpi_gbl_max_decode[2];
65extern const char *acpi_gbl_DECdecode[2];
66extern const char *acpi_gbl_RNGdecode[4];
67extern const char *acpi_gbl_MEMdecode[4];
68extern const char *acpi_gbl_RWdecode[2];
69extern const char *acpi_gbl_irq_decode[2]; 64extern const char *acpi_gbl_irq_decode[2];
70extern const char *acpi_gbl_HEdecode[2];
71extern const char *acpi_gbl_LLdecode[2];
72extern const char *acpi_gbl_SHRdecode[2];
73extern const char *acpi_gbl_TYPdecode[4];
74extern const char *acpi_gbl_BMdecode[2];
75extern const char *acpi_gbl_SIZdecode[4];
76extern const char *acpi_gbl_TTPdecode[2];
77extern const char *acpi_gbl_MTPdecode[4];
78extern const char *acpi_gbl_TRSdecode[2];
79
80extern const char *acpi_gbl_lock_rule[ACPI_NUM_LOCK_RULES]; 65extern const char *acpi_gbl_lock_rule[ACPI_NUM_LOCK_RULES];
81extern const char *acpi_gbl_access_types[ACPI_NUM_ACCESS_TYPES]; 66extern const char *acpi_gbl_access_types[ACPI_NUM_ACCESS_TYPES];
82extern const char *acpi_gbl_update_rules[ACPI_NUM_UPDATE_RULES]; 67extern const char *acpi_gbl_update_rules[ACPI_NUM_UPDATE_RULES];
@@ -171,11 +156,19 @@ u8 acpi_dm_is_string_buffer(union acpi_parse_object *op);
171/* 156/*
172 * dmresrc 157 * dmresrc
173 */ 158 */
159void acpi_dm_dump_integer8(u8 value, char *name);
160
161void acpi_dm_dump_integer16(u16 value, char *name);
162
163void acpi_dm_dump_integer32(u32 value, char *name);
164
165void acpi_dm_dump_integer64(u64 value, char *name);
166
174void 167void
175acpi_dm_resource_descriptor(struct acpi_op_walk_info *info, 168acpi_dm_resource_template(struct acpi_op_walk_info *info,
176 u8 * byte_data, u32 byte_count); 169 u8 * byte_data, u32 byte_count);
177 170
178u8 acpi_dm_is_resource_descriptor(union acpi_parse_object *op); 171u8 acpi_dm_is_resource_template(union acpi_parse_object *op);
179 172
180void acpi_dm_indent(u32 level); 173void acpi_dm_indent(u32 level);
181 174
@@ -187,73 +180,69 @@ void acpi_dm_decode_attribute(u8 attribute);
187 * dmresrcl 180 * dmresrcl
188 */ 181 */
189void 182void
190acpi_dm_word_descriptor(struct asl_word_address_desc *resource, 183acpi_dm_word_descriptor(union aml_resource *resource, u32 length, u32 level);
191 u32 length, u32 level);
192 184
193void 185void
194acpi_dm_dword_descriptor(struct asl_dword_address_desc *resource, 186acpi_dm_dword_descriptor(union aml_resource *resource, u32 length, u32 level);
195 u32 length, u32 level);
196 187
197void 188void
198acpi_dm_extended_descriptor(struct asl_extended_address_desc *resource, 189acpi_dm_extended_descriptor(union aml_resource *resource,
199 u32 length, u32 level); 190 u32 length, u32 level);
200 191
201void 192void
202acpi_dm_qword_descriptor(struct asl_qword_address_desc *resource, 193acpi_dm_qword_descriptor(union aml_resource *resource, u32 length, u32 level);
203 u32 length, u32 level);
204 194
205void 195void
206acpi_dm_memory24_descriptor(struct asl_memory_24_desc *resource, 196acpi_dm_memory24_descriptor(union aml_resource *resource,
207 u32 length, u32 level); 197 u32 length, u32 level);
208 198
209void 199void
210acpi_dm_memory32_descriptor(struct asl_memory_32_desc *resource, 200acpi_dm_memory32_descriptor(union aml_resource *resource,
211 u32 length, u32 level); 201 u32 length, u32 level);
212 202
213void 203void
214acpi_dm_fixed_mem32_descriptor(struct asl_fixed_memory_32_desc *resource, 204acpi_dm_fixed_memory32_descriptor(union aml_resource *resource,
215 u32 length, u32 level); 205 u32 length, u32 level);
216 206
217void 207void
218acpi_dm_generic_register_descriptor(struct asl_general_register_desc *resource, 208acpi_dm_generic_register_descriptor(union aml_resource *resource,
219 u32 length, u32 level); 209 u32 length, u32 level);
220 210
221void 211void
222acpi_dm_interrupt_descriptor(struct asl_extended_xrupt_desc *resource, 212acpi_dm_interrupt_descriptor(union aml_resource *resource,
223 u32 length, u32 level); 213 u32 length, u32 level);
224 214
225void 215void
226acpi_dm_vendor_large_descriptor(struct asl_large_vendor_desc *resource, 216acpi_dm_vendor_large_descriptor(union aml_resource *resource,
227 u32 length, u32 level); 217 u32 length, u32 level);
228 218
219void acpi_dm_vendor_common(char *name, u8 * byte_data, u32 length, u32 level);
220
229/* 221/*
230 * dmresrcs 222 * dmresrcs
231 */ 223 */
232void 224void
233acpi_dm_irq_descriptor(struct asl_irq_format_desc *resource, 225acpi_dm_irq_descriptor(union aml_resource *resource, u32 length, u32 level);
234 u32 length, u32 level);
235 226
236void 227void
237acpi_dm_dma_descriptor(struct asl_dma_format_desc *resource, 228acpi_dm_dma_descriptor(union aml_resource *resource, u32 length, u32 level);
238 u32 length, u32 level);
239 229
240void 230void acpi_dm_io_descriptor(union aml_resource *resource, u32 length, u32 level);
241acpi_dm_io_descriptor(struct asl_io_port_desc *resource, u32 length, u32 level);
242 231
243void 232void
244acpi_dm_fixed_io_descriptor(struct asl_fixed_io_port_desc *resource, 233acpi_dm_fixed_io_descriptor(union aml_resource *resource,
245 u32 length, u32 level); 234 u32 length, u32 level);
246 235
247void 236void
248acpi_dm_start_dependent_descriptor(struct asl_start_dependent_desc *resource, 237acpi_dm_start_dependent_descriptor(union aml_resource *resource,
249 u32 length, u32 level); 238 u32 length, u32 level);
250 239
251void 240void
252acpi_dm_end_dependent_descriptor(struct asl_start_dependent_desc *resource, 241acpi_dm_end_dependent_descriptor(union aml_resource *resource,
253 u32 length, u32 level); 242 u32 length, u32 level);
254 243
255void 244void
256acpi_dm_vendor_small_descriptor(struct asl_small_vendor_desc *resource, 245acpi_dm_vendor_small_descriptor(union aml_resource *resource,
257 u32 length, u32 level); 246 u32 length, u32 level);
258 247
259/* 248/*
diff --git a/include/acpi/acdispat.h b/include/acpi/acdispat.h
index 065f24a77cfc..c41a926ff317 100644
--- a/include/acpi/acdispat.h
+++ b/include/acpi/acdispat.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -201,6 +201,9 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
201 union acpi_operand_object *obj_desc, 201 union acpi_operand_object *obj_desc,
202 struct acpi_namespace_node *calling_method_node); 202 struct acpi_namespace_node *calling_method_node);
203 203
204acpi_status
205acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state);
206
204/* 207/*
205 * dsinit 208 * dsinit
206 */ 209 */
diff --git a/include/acpi/acevents.h b/include/acpi/acevents.h
index bfa54600ecd9..f2717be4fe0d 100644
--- a/include/acpi/acevents.h
+++ b/include/acpi/acevents.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -51,6 +51,8 @@ acpi_status acpi_ev_initialize_events(void);
51 51
52acpi_status acpi_ev_install_xrupt_handlers(void); 52acpi_status acpi_ev_install_xrupt_handlers(void);
53 53
54acpi_status acpi_ev_install_fadt_gpes(void);
55
54u32 acpi_ev_fixed_event_detect(void); 56u32 acpi_ev_fixed_event_detect(void);
55 57
56/* 58/*
@@ -105,6 +107,10 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
105 u32 interrupt_number, 107 u32 interrupt_number,
106 struct acpi_gpe_block_info **return_gpe_block); 108 struct acpi_gpe_block_info **return_gpe_block);
107 109
110acpi_status
111acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
112 struct acpi_gpe_block_info *gpe_block);
113
108acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block); 114acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block);
109 115
110u32 116u32
diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h
index 4f005eb65928..dc768aa580e4 100644
--- a/include/acpi/acexcep.h
+++ b/include/acpi/acexcep.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/acglobal.h b/include/acpi/acglobal.h
index 4ab2ca18b8df..734cc77bf2c7 100644
--- a/include/acpi/acglobal.h
+++ b/include/acpi/acglobal.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -80,6 +80,15 @@ extern u32 acpi_dbg_layer;
80 80
81extern u32 acpi_gbl_nesting_level; 81extern u32 acpi_gbl_nesting_level;
82 82
83/* Support for dynamic control method tracing mechanism */
84
85ACPI_EXTERN u32 acpi_gbl_original_dbg_level;
86ACPI_EXTERN u32 acpi_gbl_original_dbg_layer;
87ACPI_EXTERN acpi_name acpi_gbl_trace_method_name;
88ACPI_EXTERN u32 acpi_gbl_trace_dbg_level;
89ACPI_EXTERN u32 acpi_gbl_trace_dbg_layer;
90ACPI_EXTERN u32 acpi_gbl_trace_flags;
91
83/***************************************************************************** 92/*****************************************************************************
84 * 93 *
85 * Runtime configuration (static defaults that can be overriden at runtime) 94 * Runtime configuration (static defaults that can be overriden at runtime)
@@ -89,11 +98,15 @@ extern u32 acpi_gbl_nesting_level;
89/* 98/*
90 * Enable "slack" in the AML interpreter? Default is FALSE, and the 99 * Enable "slack" in the AML interpreter? Default is FALSE, and the
91 * interpreter strictly follows the ACPI specification. Setting to TRUE 100 * interpreter strictly follows the ACPI specification. Setting to TRUE
92 * allows the interpreter to forgive certain bad AML constructs. Currently: 101 * allows the interpreter to ignore certain errors and/or bad AML constructs.
102 *
103 * Currently, these features are enabled by this flag:
104 *
93 * 1) Allow "implicit return" of last value in a control method 105 * 1) Allow "implicit return" of last value in a control method
94 * 2) Allow access beyond end of operation region 106 * 2) Allow access beyond the end of an operation region
95 * 3) Allow access to uninitialized locals/args (auto-init to integer 0) 107 * 3) Allow access to uninitialized locals/args (auto-init to integer 0)
96 * 4) Allow ANY object type to be a source operand for the Store() operator 108 * 4) Allow ANY object type to be a source operand for the Store() operator
109 * 5) Allow unresolved references (invalid target name) in package objects
97 */ 110 */
98ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_interpreter_slack, FALSE); 111ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_interpreter_slack, FALSE);
99 112
@@ -211,9 +224,11 @@ ACPI_EXTERN u32 acpi_gbl_original_mode;
211ACPI_EXTERN u32 acpi_gbl_rsdp_original_location; 224ACPI_EXTERN u32 acpi_gbl_rsdp_original_location;
212ACPI_EXTERN u32 acpi_gbl_ns_lookup_count; 225ACPI_EXTERN u32 acpi_gbl_ns_lookup_count;
213ACPI_EXTERN u32 acpi_gbl_ps_find_count; 226ACPI_EXTERN u32 acpi_gbl_ps_find_count;
214ACPI_EXTERN u64 acpi_gbl_owner_id_mask; 227ACPI_EXTERN u32 acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS];
215ACPI_EXTERN u16 acpi_gbl_pm1_enable_register_save; 228ACPI_EXTERN u16 acpi_gbl_pm1_enable_register_save;
216ACPI_EXTERN u16 acpi_gbl_global_lock_handle; 229ACPI_EXTERN u16 acpi_gbl_global_lock_handle;
230ACPI_EXTERN u8 acpi_gbl_last_owner_id_index;
231ACPI_EXTERN u8 acpi_gbl_next_owner_id_offset;
217ACPI_EXTERN u8 acpi_gbl_debugger_configuration; 232ACPI_EXTERN u8 acpi_gbl_debugger_configuration;
218ACPI_EXTERN u8 acpi_gbl_global_lock_acquired; 233ACPI_EXTERN u8 acpi_gbl_global_lock_acquired;
219ACPI_EXTERN u8 acpi_gbl_step_to_next_call; 234ACPI_EXTERN u8 acpi_gbl_step_to_next_call;
diff --git a/include/acpi/achware.h b/include/acpi/achware.h
index 3644d7248e7e..29b60a8c0593 100644
--- a/include/acpi/achware.h
+++ b/include/acpi/achware.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/acinterp.h b/include/acpi/acinterp.h
index 2c9c1a1d1b7f..9f22cfcb624b 100644
--- a/include/acpi/acinterp.h
+++ b/include/acpi/acinterp.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -44,7 +44,49 @@
44#ifndef __ACINTERP_H__ 44#ifndef __ACINTERP_H__
45#define __ACINTERP_H__ 45#define __ACINTERP_H__
46 46
47#define ACPI_WALK_OPERANDS (&(walk_state->operands [walk_state->num_operands -1])) 47#define ACPI_WALK_OPERANDS (&(walk_state->operands [walk_state->num_operands -1]))
48
49/* Macros for tables used for debug output */
50
51#define ACPI_EXD_OFFSET(f) (u8) ACPI_OFFSET (union acpi_operand_object,f)
52#define ACPI_EXD_NSOFFSET(f) (u8) ACPI_OFFSET (struct acpi_namespace_node,f)
53#define ACPI_EXD_TABLE_SIZE(name) (sizeof(name) / sizeof (struct acpi_exdump_info))
54
55/*
56 * If possible, pack the following structure to byte alignment, since we
57 * don't care about performance for debug output
58 */
59#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
60#pragma pack(1)
61#endif
62
63typedef const struct acpi_exdump_info {
64 u8 opcode;
65 u8 offset;
66 char *name;
67
68} acpi_exdump_info;
69
70/* Values for the Opcode field above */
71
72#define ACPI_EXD_INIT 0
73#define ACPI_EXD_TYPE 1
74#define ACPI_EXD_UINT8 2
75#define ACPI_EXD_UINT16 3
76#define ACPI_EXD_UINT32 4
77#define ACPI_EXD_UINT64 5
78#define ACPI_EXD_LITERAL 6
79#define ACPI_EXD_POINTER 7
80#define ACPI_EXD_ADDRESS 8
81#define ACPI_EXD_STRING 9
82#define ACPI_EXD_BUFFER 10
83#define ACPI_EXD_PACKAGE 11
84#define ACPI_EXD_FIELD 12
85#define ACPI_EXD_REFERENCE 13
86
87/* restore default alignment */
88
89#pragma pack()
48 90
49/* 91/*
50 * exconvrt - object conversion 92 * exconvrt - object conversion
@@ -327,7 +369,7 @@ acpi_ex_dump_operands(union acpi_operand_object **operands,
327void 369void
328acpi_ex_dump_object_descriptor(union acpi_operand_object *object, u32 flags); 370acpi_ex_dump_object_descriptor(union acpi_operand_object *object, u32 flags);
329 371
330void acpi_ex_dump_node(struct acpi_namespace_node *node, u32 flags); 372void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags);
331#endif /* ACPI_FUTURE_USAGE */ 373#endif /* ACPI_FUTURE_USAGE */
332 374
333/* 375/*
diff --git a/include/acpi/aclocal.h b/include/acpi/aclocal.h
index 9fba0fddda90..8361820d2970 100644
--- a/include/acpi/aclocal.h
+++ b/include/acpi/aclocal.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -276,6 +276,37 @@ struct acpi_create_field_info {
276 u8 field_type; 276 u8 field_type;
277}; 277};
278 278
279/*
280 * Bitmapped ACPI types. Used internally only
281 */
282#define ACPI_BTYPE_ANY 0x00000000
283#define ACPI_BTYPE_INTEGER 0x00000001
284#define ACPI_BTYPE_STRING 0x00000002
285#define ACPI_BTYPE_BUFFER 0x00000004
286#define ACPI_BTYPE_PACKAGE 0x00000008
287#define ACPI_BTYPE_FIELD_UNIT 0x00000010
288#define ACPI_BTYPE_DEVICE 0x00000020
289#define ACPI_BTYPE_EVENT 0x00000040
290#define ACPI_BTYPE_METHOD 0x00000080
291#define ACPI_BTYPE_MUTEX 0x00000100
292#define ACPI_BTYPE_REGION 0x00000200
293#define ACPI_BTYPE_POWER 0x00000400
294#define ACPI_BTYPE_PROCESSOR 0x00000800
295#define ACPI_BTYPE_THERMAL 0x00001000
296#define ACPI_BTYPE_BUFFER_FIELD 0x00002000
297#define ACPI_BTYPE_DDB_HANDLE 0x00004000
298#define ACPI_BTYPE_DEBUG_OBJECT 0x00008000
299#define ACPI_BTYPE_REFERENCE 0x00010000
300#define ACPI_BTYPE_RESOURCE 0x00020000
301
302#define ACPI_BTYPE_COMPUTE_DATA (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER)
303
304#define ACPI_BTYPE_DATA (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_PACKAGE)
305#define ACPI_BTYPE_DATA_REFERENCE (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE)
306#define ACPI_BTYPE_DEVICE_OBJECTS (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR)
307#define ACPI_BTYPE_OBJECTS_AND_REFS 0x0001FFFF /* ARG or LOCAL */
308#define ACPI_BTYPE_ALL_OBJECTS 0x0000FFFF
309
279/***************************************************************************** 310/*****************************************************************************
280 * 311 *
281 * Event typedefs and structs 312 * Event typedefs and structs
@@ -385,13 +416,13 @@ struct acpi_field_info {
385#define ACPI_CONTROL_PREDICATE_FALSE 0xC3 416#define ACPI_CONTROL_PREDICATE_FALSE 0xC3
386#define ACPI_CONTROL_PREDICATE_TRUE 0xC4 417#define ACPI_CONTROL_PREDICATE_TRUE 0xC4
387 418
388#define ACPI_STATE_COMMON /* Two 32-bit fields and a pointer */\ 419#define ACPI_STATE_COMMON /* Two 32-bit fields and a pointer */\
389 u8 data_type; /* To differentiate various internal objs */\ 420 u8 data_type; /* To differentiate various internal objs */\
390 u8 flags; \ 421 u8 flags; \
391 u16 value; \ 422 u16 value; \
392 u16 state; \ 423 u16 state; \
393 u16 reserved; \ 424 u16 reserved; \
394 void *next; \ 425 void *next;
395 426
396struct acpi_common_state { 427struct acpi_common_state {
397ACPI_STATE_COMMON}; 428ACPI_STATE_COMMON};
@@ -544,8 +575,7 @@ union acpi_parse_value {
544 char aml_op_name[16]) /* Op name (debug only) */\ 575 char aml_op_name[16]) /* Op name (debug only) */\
545 /* NON-DEBUG members below: */\ 576 /* NON-DEBUG members below: */\
546 struct acpi_namespace_node *node; /* For use by interpreter */\ 577 struct acpi_namespace_node *node; /* For use by interpreter */\
547 union acpi_parse_value value; /* Value or args associated with the opcode */\ 578 union acpi_parse_value value; /* Value or args associated with the opcode */
548
549 579
550#define ACPI_DASM_BUFFER 0x00 580#define ACPI_DASM_BUFFER 0x00
551#define ACPI_DASM_RESOURCE 0x01 581#define ACPI_DASM_RESOURCE 0x01
@@ -573,6 +603,8 @@ struct acpi_parse_obj_named {
573 603
574/* The parse node is the fundamental element of the parse tree */ 604/* The parse node is the fundamental element of the parse tree */
575 605
606#define ACPI_MAX_PARSEOP_NAME 20
607
576struct acpi_parse_obj_asl { 608struct acpi_parse_obj_asl {
577 ACPI_PARSE_COMMON union acpi_parse_object *child; 609 ACPI_PARSE_COMMON union acpi_parse_object *child;
578 union acpi_parse_object *parent_method; 610 union acpi_parse_object *parent_method;
@@ -597,7 +629,7 @@ struct acpi_parse_obj_asl {
597 u8 aml_opcode_length; 629 u8 aml_opcode_length;
598 u8 aml_pkg_len_bytes; 630 u8 aml_pkg_len_bytes;
599 u8 extra; 631 u8 extra;
600 char parse_op_name[12]; 632 char parse_op_name[ACPI_MAX_PARSEOP_NAME];
601}; 633};
602 634
603union acpi_parse_object { 635union acpi_parse_object {
@@ -735,44 +767,52 @@ struct acpi_bit_register_info {
735 767
736/* resource_type values */ 768/* resource_type values */
737 769
738#define ACPI_RESOURCE_TYPE_MEMORY_RANGE 0 770#define ACPI_ADDRESS_TYPE_MEMORY_RANGE 0
739#define ACPI_RESOURCE_TYPE_IO_RANGE 1 771#define ACPI_ADDRESS_TYPE_IO_RANGE 1
740#define ACPI_RESOURCE_TYPE_BUS_NUMBER_RANGE 2 772#define ACPI_ADDRESS_TYPE_BUS_NUMBER_RANGE 2
741 773
742/* Resource descriptor types and masks */ 774/* Resource descriptor types and masks */
743 775
744#define ACPI_RDESC_TYPE_LARGE 0x80 776#define ACPI_RESOURCE_NAME_LARGE 0x80
745#define ACPI_RDESC_TYPE_SMALL 0x00 777#define ACPI_RESOURCE_NAME_SMALL 0x00
746 778
747#define ACPI_RDESC_TYPE_MASK 0x80 779#define ACPI_RESOURCE_NAME_SMALL_MASK 0x78 /* Bits 6:3 contain the type */
748#define ACPI_RDESC_SMALL_MASK 0x78 /* Only bits 6:3 contain the type */ 780#define ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK 0x07 /* Bits 2:0 contain the length */
781#define ACPI_RESOURCE_NAME_LARGE_MASK 0x7F /* Bits 6:0 contain the type */
749 782
750/* 783/*
751 * Small resource descriptor types 784 * Small resource descriptor "names" as defined by the ACPI specification.
752 * Note: The 3 length bits (2:0) must be zero 785 * Note: Bits 2:0 are used for the descriptor length
753 */ 786 */
754#define ACPI_RDESC_TYPE_IRQ_FORMAT 0x20 787#define ACPI_RESOURCE_NAME_IRQ 0x20
755#define ACPI_RDESC_TYPE_DMA_FORMAT 0x28 788#define ACPI_RESOURCE_NAME_DMA 0x28
756#define ACPI_RDESC_TYPE_START_DEPENDENT 0x30 789#define ACPI_RESOURCE_NAME_START_DEPENDENT 0x30
757#define ACPI_RDESC_TYPE_END_DEPENDENT 0x38 790#define ACPI_RESOURCE_NAME_END_DEPENDENT 0x38
758#define ACPI_RDESC_TYPE_IO_PORT 0x40 791#define ACPI_RESOURCE_NAME_IO 0x40
759#define ACPI_RDESC_TYPE_FIXED_IO_PORT 0x48 792#define ACPI_RESOURCE_NAME_FIXED_IO 0x48
760#define ACPI_RDESC_TYPE_SMALL_VENDOR 0x70 793#define ACPI_RESOURCE_NAME_RESERVED_S1 0x50
761#define ACPI_RDESC_TYPE_END_TAG 0x78 794#define ACPI_RESOURCE_NAME_RESERVED_S2 0x58
795#define ACPI_RESOURCE_NAME_RESERVED_S3 0x60
796#define ACPI_RESOURCE_NAME_RESERVED_S4 0x68
797#define ACPI_RESOURCE_NAME_VENDOR_SMALL 0x70
798#define ACPI_RESOURCE_NAME_END_TAG 0x78
762 799
763/* 800/*
764 * Large resource descriptor types 801 * Large resource descriptor "names" as defined by the ACPI specification.
802 * Note: includes the Large Descriptor bit in bit[7]
765 */ 803 */
766#define ACPI_RDESC_TYPE_MEMORY_24 0x81 804#define ACPI_RESOURCE_NAME_MEMORY24 0x81
767#define ACPI_RDESC_TYPE_GENERAL_REGISTER 0x82 805#define ACPI_RESOURCE_NAME_GENERIC_REGISTER 0x82
768#define ACPI_RDESC_TYPE_LARGE_VENDOR 0x84 806#define ACPI_RESOURCE_NAME_RESERVED_L1 0x83
769#define ACPI_RDESC_TYPE_MEMORY_32 0x85 807#define ACPI_RESOURCE_NAME_VENDOR_LARGE 0x84
770#define ACPI_RDESC_TYPE_FIXED_MEMORY_32 0x86 808#define ACPI_RESOURCE_NAME_MEMORY32 0x85
771#define ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE 0x87 809#define ACPI_RESOURCE_NAME_FIXED_MEMORY32 0x86
772#define ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE 0x88 810#define ACPI_RESOURCE_NAME_ADDRESS32 0x87
773#define ACPI_RDESC_TYPE_EXTENDED_XRUPT 0x89 811#define ACPI_RESOURCE_NAME_ADDRESS16 0x88
774#define ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE 0x8A 812#define ACPI_RESOURCE_NAME_EXTENDED_IRQ 0x89
775#define ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE 0x8B 813#define ACPI_RESOURCE_NAME_ADDRESS64 0x8A
814#define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 0x8B
815#define ACPI_RESOURCE_NAME_LARGE_MAX 0x8B
776 816
777/***************************************************************************** 817/*****************************************************************************
778 * 818 *
@@ -780,7 +820,7 @@ struct acpi_bit_register_info {
780 * 820 *
781 ****************************************************************************/ 821 ****************************************************************************/
782 822
783#define ACPI_ASCII_ZERO 0x30 823#define ACPI_ASCII_ZERO 0x30
784 824
785/***************************************************************************** 825/*****************************************************************************
786 * 826 *
diff --git a/include/acpi/acmacros.h b/include/acpi/acmacros.h
index 702cc4e57f5f..f2be2a881730 100644
--- a/include/acpi/acmacros.h
+++ b/include/acpi/acmacros.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -60,7 +60,7 @@
60 60
61/* 61/*
62 * For 16-bit addresses, we have to assume that the upper 32 bits 62 * For 16-bit addresses, we have to assume that the upper 32 bits
63 * are zero. 63 * (out of 64) are zero.
64 */ 64 */
65#define ACPI_LODWORD(l) ((u32)(l)) 65#define ACPI_LODWORD(l) ((u32)(l))
66#define ACPI_HIDWORD(l) ((u32)(0)) 66#define ACPI_HIDWORD(l) ((u32)(0))
@@ -104,30 +104,38 @@
104#define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i),ACPI_LODWORD(i) 104#define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i),ACPI_LODWORD(i)
105 105
106/* 106/*
107 * Extract a byte of data using a pointer. Any more than a byte and we 107 * Extract data using a pointer. Any more than a byte and we
108 * get into potential aligment issues -- see the STORE macros below 108 * get into potential aligment issues -- see the STORE macros below.
109 * Use with care.
109 */ 110 */
110#define ACPI_GET8(addr) (*(u8*)(addr)) 111#define ACPI_GET8(ptr) *ACPI_CAST_PTR (u8, ptr)
112#define ACPI_GET16(ptr) *ACPI_CAST_PTR (u16, ptr)
113#define ACPI_GET32(ptr) *ACPI_CAST_PTR (u32, ptr)
114#define ACPI_GET64(ptr) *ACPI_CAST_PTR (u64, ptr)
115#define ACPI_SET8(ptr) *ACPI_CAST_PTR (u8, ptr)
116#define ACPI_SET16(ptr) *ACPI_CAST_PTR (u16, ptr)
117#define ACPI_SET32(ptr) *ACPI_CAST_PTR (u32, ptr)
118#define ACPI_SET64(ptr) *ACPI_CAST_PTR (u64, ptr)
111 119
112/* Pointer arithmetic */ 120/*
113 121 * Pointer manipulation
114#define ACPI_PTR_ADD(t,a,b) (t *) (void *)((char *)(a) + (acpi_native_uint)(b)) 122 */
115#define ACPI_PTR_DIFF(a,b) (acpi_native_uint) ((char *)(a) - (char *)(b)) 123#define ACPI_CAST_PTR(t, p) ((t *) (acpi_uintptr_t) (p))
124#define ACPI_CAST_INDIRECT_PTR(t, p) ((t **) (acpi_uintptr_t) (p))
125#define ACPI_ADD_PTR(t,a,b) ACPI_CAST_PTR (t, (ACPI_CAST_PTR (u8,(a)) + (acpi_native_uint)(b)))
126#define ACPI_PTR_DIFF(a,b) (acpi_native_uint) (ACPI_CAST_PTR (u8,(a)) - ACPI_CAST_PTR (u8,(b)))
116 127
117/* Pointer/Integer type conversions */ 128/* Pointer/Integer type conversions */
118 129
119#define ACPI_TO_POINTER(i) ACPI_PTR_ADD (void, (void *) NULL,(acpi_native_uint)i) 130#define ACPI_TO_POINTER(i) ACPI_ADD_PTR (void,(void *) NULL,(acpi_native_uint) i)
120#define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p,(void *) NULL) 131#define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p,(void *) NULL)
121#define ACPI_OFFSET(d,f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f),(void *) NULL) 132#define ACPI_OFFSET(d,f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f),(void *) NULL)
122#define ACPI_FADT_OFFSET(f) ACPI_OFFSET (FADT_DESCRIPTOR, f) 133#define ACPI_FADT_OFFSET(f) ACPI_OFFSET (FADT_DESCRIPTOR, f)
123 134
124#define ACPI_CAST_PTR(t, p) ((t *)(void *)(p))
125#define ACPI_CAST_INDIRECT_PTR(t, p) ((t **)(void *)(p))
126
127#if ACPI_MACHINE_WIDTH == 16 135#if ACPI_MACHINE_WIDTH == 16
128#define ACPI_STORE_POINTER(d,s) ACPI_MOVE_32_TO_32(d,s) 136#define ACPI_STORE_POINTER(d,s) ACPI_MOVE_32_TO_32(d,s)
129#define ACPI_PHYSADDR_TO_PTR(i) (void *)(i) 137#define ACPI_PHYSADDR_TO_PTR(i) (void *)(i)
130#define ACPI_PTR_TO_PHYSADDR(i) (u32) (char *)(i) 138#define ACPI_PTR_TO_PHYSADDR(i) (u32) ACPI_CAST_PTR (u8,(i))
131#else 139#else
132#define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i) 140#define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i)
133#define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i) 141#define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i)
@@ -202,7 +210,7 @@
202 210
203#define ACPI_BUFFER_INDEX(buf_len,buf_offset,byte_gran) (buf_offset) 211#define ACPI_BUFFER_INDEX(buf_len,buf_offset,byte_gran) (buf_offset)
204 212
205#ifdef ACPI_MISALIGNED_TRANSFERS 213#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
206 214
207/* The hardware supports unaligned transfers, just do the little-endian move */ 215/* The hardware supports unaligned transfers, just do the little-endian move */
208 216
@@ -326,11 +334,19 @@
326#define ACPI_MUL_16(a) _ACPI_MUL(a,4) 334#define ACPI_MUL_16(a) _ACPI_MUL(a,4)
327#define ACPI_MOD_16(a) _ACPI_MOD(a,16) 335#define ACPI_MOD_16(a) _ACPI_MOD(a,16)
328 336
337#define ACPI_DIV_32(a) _ACPI_DIV(a,5)
338#define ACPI_MUL_32(a) _ACPI_MUL(a,5)
339#define ACPI_MOD_32(a) _ACPI_MOD(a,32)
340
329/* 341/*
330 * Rounding macros (Power of two boundaries only) 342 * Rounding macros (Power of two boundaries only)
331 */ 343 */
332#define ACPI_ROUND_DOWN(value,boundary) (((acpi_native_uint)(value)) & (~(((acpi_native_uint) boundary)-1))) 344#define ACPI_ROUND_DOWN(value,boundary) (((acpi_native_uint)(value)) & \
333#define ACPI_ROUND_UP(value,boundary) ((((acpi_native_uint)(value)) + (((acpi_native_uint) boundary)-1)) & (~(((acpi_native_uint) boundary)-1))) 345 (~(((acpi_native_uint) boundary)-1)))
346
347#define ACPI_ROUND_UP(value,boundary) ((((acpi_native_uint)(value)) + \
348 (((acpi_native_uint) boundary)-1)) & \
349 (~(((acpi_native_uint) boundary)-1)))
334 350
335#define ACPI_ROUND_DOWN_TO_32_BITS(a) ACPI_ROUND_DOWN(a,4) 351#define ACPI_ROUND_DOWN_TO_32_BITS(a) ACPI_ROUND_DOWN(a,4)
336#define ACPI_ROUND_DOWN_TO_64_BITS(a) ACPI_ROUND_DOWN(a,8) 352#define ACPI_ROUND_DOWN_TO_64_BITS(a) ACPI_ROUND_DOWN(a,8)
@@ -365,6 +381,14 @@
365#define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) ((val << pos) & mask) 381#define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) ((val << pos) & mask)
366#define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask) 382#define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask)
367 383
384/* Generate a UUID */
385
386#define ACPI_INIT_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
387 (a) & 0xFF, ((a) >> 8) & 0xFF, ((a) >> 16) & 0xFF, ((a) >> 24) & 0xFF, \
388 (b) & 0xFF, ((b) >> 8) & 0xFF, \
389 (c) & 0xFF, ((c) >> 8) & 0xFF, \
390 (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)
391
368/* 392/*
369 * An struct acpi_namespace_node * can appear in some contexts, 393 * An struct acpi_namespace_node * can appear in some contexts,
370 * where a pointer to an union acpi_operand_object can also 394 * where a pointer to an union acpi_operand_object can also
@@ -423,57 +447,52 @@
423#define GET_CURRENT_ARG_TYPE(list) (list & ((u32) 0x1F)) 447#define GET_CURRENT_ARG_TYPE(list) (list & ((u32) 0x1F))
424#define INCREMENT_ARG_LIST(list) (list >>= ((u32) ARG_TYPE_WIDTH)) 448#define INCREMENT_ARG_LIST(list) (list >>= ((u32) ARG_TYPE_WIDTH))
425 449
450#if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES)
426/* 451/*
427 * Reporting macros that are never compiled out 452 * Module name is include in both debug and non-debug versions primarily for
453 * error messages. The __FILE__ macro is not very useful for this, because it
454 * often includes the entire pathname to the module
428 */ 455 */
429#define ACPI_PARAM_LIST(pl) pl 456#define ACPI_MODULE_NAME(name) static char ACPI_UNUSED_VAR *_acpi_module_name = name;
457#else
458#define ACPI_MODULE_NAME(name)
459#endif
430 460
431/* 461/*
432 * Error reporting. These versions add callers module and line#. 462 * Ascii error messages can be configured out
433 *
434 * Since _acpi_module_name gets compiled out when ACPI_DEBUG_OUTPUT
435 * isn't defined, only use it in debug mode.
436 */ 463 */
437#ifdef ACPI_DEBUG_OUTPUT 464#ifndef ACPI_NO_ERROR_MESSAGES
465#define AE_INFO _acpi_module_name, __LINE__
438 466
439#define ACPI_REPORT_INFO(fp) {acpi_ut_report_info(_acpi_module_name,__LINE__,_COMPONENT); \ 467/*
440 acpi_os_printf ACPI_PARAM_LIST(fp);} 468 * Error reporting. Callers module and line number are inserted by AE_INFO,
441#define ACPI_REPORT_ERROR(fp) {acpi_ut_report_error(_acpi_module_name,__LINE__,_COMPONENT); \ 469 * the plist contains a set of parens to allow variable-length lists.
442 acpi_os_printf ACPI_PARAM_LIST(fp);} 470 * These macros are used for both the debug and non-debug versions of the code.
443#define ACPI_REPORT_WARNING(fp) {acpi_ut_report_warning(_acpi_module_name,__LINE__,_COMPONENT); \ 471 */
444 acpi_os_printf ACPI_PARAM_LIST(fp);} 472#define ACPI_INFO(plist) acpi_ut_info plist
445#define ACPI_REPORT_NSERROR(s,e) acpi_ns_report_error(_acpi_module_name,__LINE__,_COMPONENT, s, e); 473#define ACPI_WARNING(plist) acpi_ut_warning plist
446 474#define ACPI_EXCEPTION(plist) acpi_ut_exception plist
447#define ACPI_REPORT_METHOD_ERROR(s,n,p,e) acpi_ns_report_method_error(_acpi_module_name,__LINE__,_COMPONENT, s, n, p, e); 475#define ACPI_ERROR(plist) acpi_ut_error plist
476#define ACPI_ERROR_NAMESPACE(s,e) acpi_ns_report_error (AE_INFO, s, e);
477#define ACPI_ERROR_METHOD(s,n,p,e) acpi_ns_report_method_error (AE_INFO, s, n, p, e);
448 478
449#else 479#else
450 480
451#define ACPI_REPORT_INFO(fp) {acpi_ut_report_info("ACPI",__LINE__,_COMPONENT); \ 481/* No error messages */
452 acpi_os_printf ACPI_PARAM_LIST(fp);}
453#define ACPI_REPORT_ERROR(fp) {acpi_ut_report_error("ACPI",__LINE__,_COMPONENT); \
454 acpi_os_printf ACPI_PARAM_LIST(fp);}
455#define ACPI_REPORT_WARNING(fp) {acpi_ut_report_warning("ACPI",__LINE__,_COMPONENT); \
456 acpi_os_printf ACPI_PARAM_LIST(fp);}
457#define ACPI_REPORT_NSERROR(s,e) acpi_ns_report_error("ACPI",__LINE__,_COMPONENT, s, e);
458 482
459#define ACPI_REPORT_METHOD_ERROR(s,n,p,e) acpi_ns_report_method_error("ACPI",__LINE__,_COMPONENT, s, n, p, e); 483#define ACPI_INFO(plist)
484#define ACPI_WARNING(plist)
485#define ACPI_EXCEPTION(plist)
486#define ACPI_ERROR(plist)
487#define ACPI_ERROR_NAMESPACE(s,e)
488#define ACPI_ERROR_METHOD(s,n,p,e)
460 489
461#endif 490#endif
462 491
463/* Error reporting. These versions pass thru the module and line# */
464
465#define _ACPI_REPORT_INFO(a,b,c,fp) {acpi_ut_report_info(a,b,c); \
466 acpi_os_printf ACPI_PARAM_LIST(fp);}
467#define _ACPI_REPORT_ERROR(a,b,c,fp) {acpi_ut_report_error(a,b,c); \
468 acpi_os_printf ACPI_PARAM_LIST(fp);}
469#define _ACPI_REPORT_WARNING(a,b,c,fp) {acpi_ut_report_warning(a,b,c); \
470 acpi_os_printf ACPI_PARAM_LIST(fp);}
471
472/* 492/*
473 * Debug macros that are conditionally compiled 493 * Debug macros that are conditionally compiled
474 */ 494 */
475#ifdef ACPI_DEBUG_OUTPUT 495#ifdef ACPI_DEBUG_OUTPUT
476#define ACPI_MODULE_NAME(name) static char ACPI_UNUSED_VAR *_acpi_module_name = name;
477 496
478/* 497/*
479 * Common parameters used for debug output functions: 498 * Common parameters used for debug output functions:
@@ -509,7 +528,7 @@
509#endif 528#endif
510 529
511#define ACPI_FUNCTION_TRACE(a) ACPI_FUNCTION_NAME(a) \ 530#define ACPI_FUNCTION_TRACE(a) ACPI_FUNCTION_NAME(a) \
512 acpi_ut_trace(ACPI_DEBUG_PARAMETERS) 531 acpi_ut_trace(ACPI_DEBUG_PARAMETERS)
513#define ACPI_FUNCTION_TRACE_PTR(a,b) ACPI_FUNCTION_NAME(a) \ 532#define ACPI_FUNCTION_TRACE_PTR(a,b) ACPI_FUNCTION_NAME(a) \
514 acpi_ut_trace_ptr(ACPI_DEBUG_PARAMETERS,(void *)b) 533 acpi_ut_trace_ptr(ACPI_DEBUG_PARAMETERS,(void *)b)
515#define ACPI_FUNCTION_TRACE_U32(a,b) ACPI_FUNCTION_NAME(a) \ 534#define ACPI_FUNCTION_TRACE_U32(a,b) ACPI_FUNCTION_NAME(a) \
@@ -525,6 +544,9 @@
525 * bad form, but having a separate exit macro is very ugly and difficult to maintain. 544 * bad form, but having a separate exit macro is very ugly and difficult to maintain.
526 * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros 545 * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros
527 * so that "_acpi_function_name" is defined. 546 * so that "_acpi_function_name" is defined.
547 *
548 * Note: the DO_WHILE0 macro is used to prevent some compilers from complaining
549 * about these constructs.
528 */ 550 */
529#ifdef ACPI_USE_DO_WHILE_0 551#ifdef ACPI_USE_DO_WHILE_0
530#define ACPI_DO_WHILE0(a) do a while(0) 552#define ACPI_DO_WHILE0(a) do a while(0)
@@ -532,10 +554,55 @@
532#define ACPI_DO_WHILE0(a) a 554#define ACPI_DO_WHILE0(a) a
533#endif 555#endif
534 556
535#define return_VOID ACPI_DO_WHILE0 ({acpi_ut_exit(ACPI_DEBUG_PARAMETERS);return;}) 557#define return_VOID ACPI_DO_WHILE0 ({ \
536#define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({acpi_ut_status_exit(ACPI_DEBUG_PARAMETERS,(s));return((s));}) 558 acpi_ut_exit (ACPI_DEBUG_PARAMETERS); \
537#define return_VALUE(s) ACPI_DO_WHILE0 ({acpi_ut_value_exit(ACPI_DEBUG_PARAMETERS,(acpi_integer)(s));return((s));}) 559 return;})
538#define return_PTR(s) ACPI_DO_WHILE0 ({acpi_ut_ptr_exit(ACPI_DEBUG_PARAMETERS,(u8 *)(s));return((s));}) 560/*
561 * There are two versions of most of the return macros. The default version is
562 * safer, since it avoids side-effects by guaranteeing that the argument will
563 * not be evaluated twice.
564 *
565 * A less-safe version of the macros is provided for optional use if the
566 * compiler uses excessive CPU stack (for example, this may happen in the
567 * debug case if code optimzation is disabled.)
568 */
569#ifndef ACPI_SIMPLE_RETURN_MACROS
570
571#define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \
572 register acpi_status _s = (s); \
573 acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, _s); \
574 return (_s); })
575#define return_PTR(s) ACPI_DO_WHILE0 ({ \
576 register void *_s = (void *) (s); \
577 acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) _s); \
578 return (_s); })
579#define return_VALUE(s) ACPI_DO_WHILE0 ({ \
580 register acpi_integer _s = (s); \
581 acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, _s); \
582 return (_s); })
583#define return_UINT8(s) ACPI_DO_WHILE0 ({ \
584 register u8 _s = (u8) (s); \
585 acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) _s); \
586 return (_s); })
587#define return_UINT32(s) ACPI_DO_WHILE0 ({ \
588 register u32 _s = (u32) (s); \
589 acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) _s); \
590 return (_s); })
591#else /* Use original less-safe macros */
592
593#define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \
594 acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, (s)); \
595 return((s)); })
596#define return_PTR(s) ACPI_DO_WHILE0 ({ \
597 acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) (s)); \
598 return((s)); })
599#define return_VALUE(s) ACPI_DO_WHILE0 ({ \
600 acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) (s)); \
601 return((s)); })
602#define return_UINT8(s) return_VALUE(s)
603#define return_UINT32(s) return_VALUE(s)
604
605#endif /* ACPI_SIMPLE_RETURN_MACROS */
539 606
540/* Conditional execution */ 607/* Conditional execution */
541 608
@@ -555,18 +622,6 @@
555#define ACPI_DUMP_PATHNAME(a,b,c,d) acpi_ns_dump_pathname(a,b,c,d) 622#define ACPI_DUMP_PATHNAME(a,b,c,d) acpi_ns_dump_pathname(a,b,c,d)
556#define ACPI_DUMP_RESOURCE_LIST(a) acpi_rs_dump_resource_list(a) 623#define ACPI_DUMP_RESOURCE_LIST(a) acpi_rs_dump_resource_list(a)
557#define ACPI_DUMP_BUFFER(a,b) acpi_ut_dump_buffer((u8 *)a,b,DB_BYTE_DISPLAY,_COMPONENT) 624#define ACPI_DUMP_BUFFER(a,b) acpi_ut_dump_buffer((u8 *)a,b,DB_BYTE_DISPLAY,_COMPONENT)
558#define ACPI_BREAK_MSG(a) acpi_os_signal (ACPI_SIGNAL_BREAKPOINT,(a))
559
560/*
561 * Generate INT3 on ACPI_ERROR (Debug only!)
562 */
563#define ACPI_ERROR_BREAK
564#ifdef ACPI_ERROR_BREAK
565#define ACPI_BREAK_ON_ERROR(lvl) if ((lvl)&ACPI_ERROR) \
566 acpi_os_signal(ACPI_SIGNAL_BREAKPOINT,"Fatal error encountered\n")
567#else
568#define ACPI_BREAK_ON_ERROR(lvl)
569#endif
570 625
571/* 626/*
572 * Master debug print macros 627 * Master debug print macros
@@ -574,17 +629,14 @@
574 * 1) Debug print for the current component is enabled 629 * 1) Debug print for the current component is enabled
575 * 2) Debug error level or trace level for the print statement is enabled 630 * 2) Debug error level or trace level for the print statement is enabled
576 */ 631 */
577#define ACPI_DEBUG_PRINT(pl) acpi_ut_debug_print ACPI_PARAM_LIST(pl) 632#define ACPI_DEBUG_PRINT(plist) acpi_ut_debug_print plist
578#define ACPI_DEBUG_PRINT_RAW(pl) acpi_ut_debug_print_raw ACPI_PARAM_LIST(pl) 633#define ACPI_DEBUG_PRINT_RAW(plist) acpi_ut_debug_print_raw plist
579 634
580#else 635#else
581/* 636/*
582 * This is the non-debug case -- make everything go away, 637 * This is the non-debug case -- make everything go away,
583 * leaving no executable debug code! 638 * leaving no executable debug code!
584 */ 639 */
585#define ACPI_MODULE_NAME(name)
586#define _acpi_module_name ""
587
588#define ACPI_DEBUG_EXEC(a) 640#define ACPI_DEBUG_EXEC(a)
589#define ACPI_NORMAL_EXEC(a) a; 641#define ACPI_NORMAL_EXEC(a) a;
590 642
@@ -607,11 +659,12 @@
607#define ACPI_DUMP_BUFFER(a,b) 659#define ACPI_DUMP_BUFFER(a,b)
608#define ACPI_DEBUG_PRINT(pl) 660#define ACPI_DEBUG_PRINT(pl)
609#define ACPI_DEBUG_PRINT_RAW(pl) 661#define ACPI_DEBUG_PRINT_RAW(pl)
610#define ACPI_BREAK_MSG(a)
611 662
612#define return_VOID return 663#define return_VOID return
613#define return_ACPI_STATUS(s) return(s) 664#define return_ACPI_STATUS(s) return(s)
614#define return_VALUE(s) return(s) 665#define return_VALUE(s) return(s)
666#define return_UINT8(s) return(s)
667#define return_UINT32(s) return(s)
615#define return_PTR(s) return(s) 668#define return_PTR(s) return(s)
616 669
617#endif 670#endif
diff --git a/include/acpi/acnames.h b/include/acpi/acnames.h
index 4f9063f3e951..b67da3636899 100644
--- a/include/acpi/acnames.h
+++ b/include/acpi/acnames.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/acnamesp.h b/include/acpi/acnamesp.h
index dd3501f7e5d6..b667a804fc8a 100644
--- a/include/acpi/acnamesp.h
+++ b/include/acpi/acnamesp.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -263,13 +263,11 @@ u32 acpi_ns_local(acpi_object_type type);
263void 263void
264acpi_ns_report_error(char *module_name, 264acpi_ns_report_error(char *module_name,
265 u32 line_number, 265 u32 line_number,
266 u32 component_id,
267 char *internal_name, acpi_status lookup_status); 266 char *internal_name, acpi_status lookup_status);
268 267
269void 268void
270acpi_ns_report_method_error(char *module_name, 269acpi_ns_report_method_error(char *module_name,
271 u32 line_number, 270 u32 line_number,
272 u32 component_id,
273 char *message, 271 char *message,
274 struct acpi_namespace_node *node, 272 struct acpi_namespace_node *node,
275 char *path, acpi_status lookup_status); 273 char *path, acpi_status lookup_status);
diff --git a/include/acpi/acobject.h b/include/acpi/acobject.h
index 4a326ba6d482..d130cfed8d55 100644
--- a/include/acpi/acobject.h
+++ b/include/acpi/acobject.h
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -69,7 +69,7 @@
69 u8 type; /* acpi_object_type */\ 69 u8 type; /* acpi_object_type */\
70 u16 reference_count; /* For object deletion management */\ 70 u16 reference_count; /* For object deletion management */\
71 union acpi_operand_object *next_object; /* Objects linked to parent NS node */\ 71 union acpi_operand_object *next_object; /* Objects linked to parent NS node */\
72 u8 flags; \ 72 u8 flags;
73 73
74/* Values for flag byte above */ 74/* Values for flag byte above */
75 75
diff --git a/include/acpi/acopcode.h b/include/acpi/acopcode.h
index 64da42992199..e6d78bd9e90a 100644
--- a/include/acpi/acopcode.h
+++ b/include/acpi/acopcode.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/acoutput.h b/include/acpi/acoutput.h
index 68d7edf0f697..7785d481dc3e 100644
--- a/include/acpi/acoutput.h
+++ b/include/acpi/acoutput.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -137,13 +137,19 @@
137 137
138/* Exception level -- used in the global "debug_level" */ 138/* Exception level -- used in the global "debug_level" */
139 139
140#define ACPI_DB_ERROR ACPI_DEBUG_LEVEL (ACPI_LV_ERROR)
141#define ACPI_DB_WARN ACPI_DEBUG_LEVEL (ACPI_LV_WARN)
142#define ACPI_DB_INIT ACPI_DEBUG_LEVEL (ACPI_LV_INIT) 140#define ACPI_DB_INIT ACPI_DEBUG_LEVEL (ACPI_LV_INIT)
143#define ACPI_DB_DEBUG_OBJECT ACPI_DEBUG_LEVEL (ACPI_LV_DEBUG_OBJECT) 141#define ACPI_DB_DEBUG_OBJECT ACPI_DEBUG_LEVEL (ACPI_LV_DEBUG_OBJECT)
144#define ACPI_DB_INFO ACPI_DEBUG_LEVEL (ACPI_LV_INFO) 142#define ACPI_DB_INFO ACPI_DEBUG_LEVEL (ACPI_LV_INFO)
145#define ACPI_DB_ALL_EXCEPTIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALL_EXCEPTIONS) 143#define ACPI_DB_ALL_EXCEPTIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALL_EXCEPTIONS)
146 144
145/*
146 * These two levels are essentially obsolete, all instances in the
147 * ACPICA core code have been replaced by REPORT_ERROR and REPORT_WARNING
148 * (Kept here because some drivers may still use them)
149 */
150#define ACPI_DB_ERROR ACPI_DEBUG_LEVEL (ACPI_LV_ERROR)
151#define ACPI_DB_WARN ACPI_DEBUG_LEVEL (ACPI_LV_WARN)
152
147/* Trace level -- also used in the global "debug_level" */ 153/* Trace level -- also used in the global "debug_level" */
148 154
149#define ACPI_DB_INIT_NAMES ACPI_DEBUG_LEVEL (ACPI_LV_INIT_NAMES) 155#define ACPI_DB_INIT_NAMES ACPI_DEBUG_LEVEL (ACPI_LV_INIT_NAMES)
diff --git a/include/acpi/acparser.h b/include/acpi/acparser.h
index d352d40de1f3..5a1ff484af33 100644
--- a/include/acpi/acparser.h
+++ b/include/acpi/acparser.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/acpi.h b/include/acpi/acpi.h
index ccf34f9dac64..b9a39d1009bd 100644
--- a/include/acpi/acpi.h
+++ b/include/acpi/acpi.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h
index c1b4e1f882e4..b425f9bb6d43 100644
--- a/include/acpi/acpi_drivers.h
+++ b/include/acpi/acpi_drivers.h
@@ -52,8 +52,8 @@
52/* ACPI PCI Interrupt Link (pci_link.c) */ 52/* ACPI PCI Interrupt Link (pci_link.c) */
53 53
54int acpi_irq_penalty_init(void); 54int acpi_irq_penalty_init(void);
55int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *edge_level, 55int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
56 int *active_high_low, char **name); 56 int *polarity, char **name);
57int acpi_pci_link_free_irq(acpi_handle handle); 57int acpi_pci_link_free_irq(acpi_handle handle);
58 58
59/* ACPI PCI Interrupt Routing (pci_irq.c) */ 59/* ACPI PCI Interrupt Routing (pci_irq.c) */
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h
index 98e0b8cd14ed..970e9a6372c3 100644
--- a/include/acpi/acpiosxf.h
+++ b/include/acpi/acpiosxf.h
@@ -8,7 +8,7 @@
8 *****************************************************************************/ 8 *****************************************************************************/
9 9
10/* 10/*
11 * Copyright (C) 2000 - 2005, R. Byron Moore 11 * Copyright (C) 2000 - 2006, R. Byron Moore
12 * All rights reserved. 12 * All rights reserved.
13 * 13 *
14 * Redistribution and use in source and binary forms, with or without 14 * Redistribution and use in source and binary forms, with or without
@@ -108,9 +108,9 @@ acpi_status acpi_os_create_lock(acpi_handle * out_handle);
108 108
109void acpi_os_delete_lock(acpi_handle handle); 109void acpi_os_delete_lock(acpi_handle handle);
110 110
111unsigned long acpi_os_acquire_lock(acpi_handle handle); 111acpi_cpu_flags acpi_os_acquire_lock(acpi_handle handle);
112 112
113void acpi_os_release_lock(acpi_handle handle, unsigned long flags); 113void acpi_os_release_lock(acpi_handle handle, acpi_cpu_flags flags);
114 114
115/* 115/*
116 * Memory allocation and mapping 116 * Memory allocation and mapping
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
index 2a9dbc13b0f2..66cf2ecef57a 100644
--- a/include/acpi/acpixf.h
+++ b/include/acpi/acpixf.h
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -149,6 +149,9 @@ acpi_detach_data(acpi_handle obj_handle, acpi_object_handler handler);
149acpi_status 149acpi_status
150acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data); 150acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data);
151 151
152acpi_status
153acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags);
154
152/* 155/*
153 * Object manipulation and enumeration 156 * Object manipulation and enumeration
154 */ 157 */
@@ -269,6 +272,12 @@ acpi_status(*ACPI_WALK_RESOURCE_CALLBACK) (struct acpi_resource * resource,
269 void *context); 272 void *context);
270 273
271acpi_status 274acpi_status
275acpi_get_vendor_resource(acpi_handle device_handle,
276 char *name,
277 struct acpi_vendor_uuid *uuid,
278 struct acpi_buffer *ret_buffer);
279
280acpi_status
272acpi_get_current_resources(acpi_handle device_handle, 281acpi_get_current_resources(acpi_handle device_handle,
273 struct acpi_buffer *ret_buffer); 282 struct acpi_buffer *ret_buffer);
274 283
@@ -280,7 +289,7 @@ acpi_get_possible_resources(acpi_handle device_handle,
280 289
281acpi_status 290acpi_status
282acpi_walk_resources(acpi_handle device_handle, 291acpi_walk_resources(acpi_handle device_handle,
283 char *path, 292 char *name,
284 ACPI_WALK_RESOURCE_CALLBACK user_function, void *context); 293 ACPI_WALK_RESOURCE_CALLBACK user_function, void *context);
285 294
286acpi_status 295acpi_status
diff --git a/include/acpi/acresrc.h b/include/acpi/acresrc.h
index 38e798b05d08..fa02e8083381 100644
--- a/include/acpi/acresrc.h
+++ b/include/acpi/acresrc.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -44,216 +44,284 @@
44#ifndef __ACRESRC_H__ 44#ifndef __ACRESRC_H__
45#define __ACRESRC_H__ 45#define __ACRESRC_H__
46 46
47/* 47/* Need the AML resource descriptor structs */
48 * Function prototypes called from Acpi* APIs
49 */
50acpi_status
51acpi_rs_get_prt_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
52 48
53acpi_status 49#include "amlresrc.h"
54acpi_rs_get_crs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
55 50
56#ifdef ACPI_FUTURE_USAGE 51/*
57acpi_status 52 * If possible, pack the following structures to byte alignment, since we
58acpi_rs_get_prs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer); 53 * don't care about performance for debug output
59#endif /* ACPI_FUTURE_USAGE */ 54 */
60 55#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
61acpi_status 56#pragma pack(1)
62acpi_rs_get_method_data(acpi_handle handle, 57#endif
63 char *path, struct acpi_buffer *ret_buffer);
64 58
65acpi_status 59/*
66acpi_rs_set_srs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer); 60 * Individual entry for the resource conversion tables
61 */
62typedef const struct acpi_rsconvert_info {
63 u8 opcode;
64 u8 resource_offset;
65 u8 aml_offset;
66 u8 value;
67
68} acpi_rsconvert_info;
69
70/* Resource conversion opcodes */
71
72#define ACPI_RSC_INITGET 0
73#define ACPI_RSC_INITSET 1
74#define ACPI_RSC_FLAGINIT 2
75#define ACPI_RSC_1BITFLAG 3
76#define ACPI_RSC_2BITFLAG 4
77#define ACPI_RSC_COUNT 5
78#define ACPI_RSC_COUNT16 6
79#define ACPI_RSC_LENGTH 7
80#define ACPI_RSC_MOVE8 8
81#define ACPI_RSC_MOVE16 9
82#define ACPI_RSC_MOVE32 10
83#define ACPI_RSC_MOVE64 11
84#define ACPI_RSC_SET8 12
85#define ACPI_RSC_DATA8 13
86#define ACPI_RSC_ADDRESS 14
87#define ACPI_RSC_SOURCE 15
88#define ACPI_RSC_SOURCEX 16
89#define ACPI_RSC_BITMASK 17
90#define ACPI_RSC_BITMASK16 18
91#define ACPI_RSC_EXIT_NE 19
92#define ACPI_RSC_EXIT_LE 20
93
94/* Resource Conversion sub-opcodes */
95
96#define ACPI_RSC_COMPARE_AML_LENGTH 0
97#define ACPI_RSC_COMPARE_VALUE 1
98
99#define ACPI_RSC_TABLE_SIZE(d) (sizeof (d) / sizeof (struct acpi_rsconvert_info))
100
101#define ACPI_RS_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_resource,f)
102#define AML_OFFSET(f) (u8) ACPI_OFFSET (union aml_resource,f)
103
104typedef const struct acpi_rsdump_info {
105 u8 opcode;
106 u8 offset;
107 char *name;
108 const char **pointer;
109
110} acpi_rsdump_info;
111
112/* Values for the Opcode field above */
113
114#define ACPI_RSD_TITLE 0
115#define ACPI_RSD_LITERAL 1
116#define ACPI_RSD_STRING 2
117#define ACPI_RSD_UINT8 3
118#define ACPI_RSD_UINT16 4
119#define ACPI_RSD_UINT32 5
120#define ACPI_RSD_UINT64 6
121#define ACPI_RSD_1BITFLAG 7
122#define ACPI_RSD_2BITFLAG 8
123#define ACPI_RSD_SHORTLIST 9
124#define ACPI_RSD_LONGLIST 10
125#define ACPI_RSD_DWORDLIST 11
126#define ACPI_RSD_ADDRESS 12
127#define ACPI_RSD_SOURCE 13
128
129/* restore default alignment */
130
131#pragma pack()
132
133/* Resource tables indexed by internal resource type */
134
135extern const u8 acpi_gbl_aml_resource_sizes[];
136extern struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[];
137
138/* Resource tables indexed by raw AML resource descriptor type */
139
140extern const u8 acpi_gbl_resource_struct_sizes[];
141extern struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[];
142
143struct acpi_vendor_walk_info {
144 struct acpi_vendor_uuid *uuid;
145 struct acpi_buffer *buffer;
146 acpi_status status;
147};
67 148
149/*
150 * rscreate
151 */
68acpi_status 152acpi_status
69acpi_rs_create_resource_list(union acpi_operand_object *byte_stream_buffer, 153acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,
70 struct acpi_buffer *output_buffer); 154 struct acpi_buffer *output_buffer);
71 155
72acpi_status 156acpi_status
73acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer, 157acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer,
74 struct acpi_buffer *output_buffer); 158 struct acpi_buffer *output_buffer);
75 159
76acpi_status 160acpi_status
77acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, 161acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
78 struct acpi_buffer *output_buffer); 162 struct acpi_buffer *output_buffer);
79 163
80/* 164/*
81 * rsdump 165 * rsutils
82 */ 166 */
83#ifdef ACPI_FUTURE_USAGE
84void acpi_rs_dump_resource_list(struct acpi_resource *resource);
85
86void acpi_rs_dump_irq_list(u8 * route_table);
87#endif /* ACPI_FUTURE_USAGE */
88
89/*
90 * rscalc
91 */
92acpi_status
93acpi_rs_get_byte_stream_start(u8 * byte_stream_buffer,
94 u8 ** byte_stream_start, u32 * size);
95
96acpi_status
97acpi_rs_get_list_length(u8 * byte_stream_buffer,
98 u32 byte_stream_buffer_length, acpi_size * size_needed);
99
100acpi_status
101acpi_rs_get_byte_stream_length(struct acpi_resource *linked_list_buffer,
102 acpi_size * size_needed);
103
104acpi_status
105acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
106 acpi_size * buffer_size_needed);
107
108acpi_status
109acpi_rs_byte_stream_to_list(u8 * byte_stream_buffer,
110 u32 byte_stream_buffer_length, u8 * output_buffer);
111
112acpi_status
113acpi_rs_list_to_byte_stream(struct acpi_resource *linked_list,
114 acpi_size byte_stream_size_needed,
115 u8 * output_buffer);
116
117acpi_status
118acpi_rs_io_resource(u8 * byte_stream_buffer,
119 acpi_size * bytes_consumed,
120 u8 ** output_buffer, acpi_size * structure_size);
121
122acpi_status
123acpi_rs_fixed_io_resource(u8 * byte_stream_buffer,
124 acpi_size * bytes_consumed,
125 u8 ** output_buffer, acpi_size * structure_size);
126
127acpi_status 167acpi_status
128acpi_rs_io_stream(struct acpi_resource *linked_list, 168acpi_rs_get_prt_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
129 u8 ** output_buffer, acpi_size * bytes_consumed);
130
131acpi_status
132acpi_rs_fixed_io_stream(struct acpi_resource *linked_list,
133 u8 ** output_buffer, acpi_size * bytes_consumed);
134
135acpi_status
136acpi_rs_irq_resource(u8 * byte_stream_buffer,
137 acpi_size * bytes_consumed,
138 u8 ** output_buffer, acpi_size * structure_size);
139
140acpi_status
141acpi_rs_irq_stream(struct acpi_resource *linked_list,
142 u8 ** output_buffer, acpi_size * bytes_consumed);
143
144acpi_status
145acpi_rs_dma_resource(u8 * byte_stream_buffer,
146 acpi_size * bytes_consumed,
147 u8 ** output_buffer, acpi_size * structure_size);
148 169
149acpi_status 170acpi_status
150acpi_rs_dma_stream(struct acpi_resource *linked_list, 171acpi_rs_get_crs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
151 u8 ** output_buffer, acpi_size * bytes_consumed);
152 172
173#ifdef ACPI_FUTURE_USAGE
153acpi_status 174acpi_status
154acpi_rs_address16_resource(u8 * byte_stream_buffer, 175acpi_rs_get_prs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
155 acpi_size * bytes_consumed, 176#endif /* ACPI_FUTURE_USAGE */
156 u8 ** output_buffer, acpi_size * structure_size);
157 177
158acpi_status 178acpi_status
159acpi_rs_address16_stream(struct acpi_resource *linked_list, 179acpi_rs_get_method_data(acpi_handle handle,
160 u8 ** output_buffer, acpi_size * bytes_consumed); 180 char *path, struct acpi_buffer *ret_buffer);
161 181
162acpi_status 182acpi_status
163acpi_rs_address32_resource(u8 * byte_stream_buffer, 183acpi_rs_set_srs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
164 acpi_size * bytes_consumed,
165 u8 ** output_buffer, acpi_size * structure_size);
166 184
185/*
186 * rscalc
187 */
167acpi_status 188acpi_status
168acpi_rs_address32_stream(struct acpi_resource *linked_list, 189acpi_rs_get_list_length(u8 * aml_buffer,
169 u8 ** output_buffer, acpi_size * bytes_consumed); 190 u32 aml_buffer_length, acpi_size * size_needed);
170 191
171acpi_status 192acpi_status
172acpi_rs_address64_resource(u8 * byte_stream_buffer, 193acpi_rs_get_aml_length(struct acpi_resource *linked_list_buffer,
173 acpi_size * bytes_consumed, 194 acpi_size * size_needed);
174 u8 ** output_buffer, acpi_size * structure_size);
175 195
176acpi_status 196acpi_status
177acpi_rs_address64_stream(struct acpi_resource *linked_list, 197acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
178 u8 ** output_buffer, acpi_size * bytes_consumed); 198 acpi_size * buffer_size_needed);
179 199
180acpi_status 200acpi_status
181acpi_rs_start_depend_fns_resource(u8 * byte_stream_buffer, 201acpi_rs_convert_aml_to_resources(u8 * aml_buffer,
182 acpi_size * bytes_consumed, 202 u32 aml_buffer_length, u8 * output_buffer);
183 u8 ** output_buffer,
184 acpi_size * structure_size);
185 203
186acpi_status 204acpi_status
187acpi_rs_end_depend_fns_resource(u8 * byte_stream_buffer, 205acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
188 acpi_size * bytes_consumed, 206 acpi_size aml_size_needed, u8 * output_buffer);
189 u8 ** output_buffer,
190 acpi_size * structure_size);
191 207
192acpi_status 208/*
193acpi_rs_start_depend_fns_stream(struct acpi_resource *linked_list, 209 * rsaddr
194 u8 ** output_buffer, 210 */
195 acpi_size * bytes_consumed); 211void
212acpi_rs_set_address_common(union aml_resource *aml,
213 struct acpi_resource *resource);
196 214
197acpi_status 215u8
198acpi_rs_end_depend_fns_stream(struct acpi_resource *linked_list, 216acpi_rs_get_address_common(struct acpi_resource *resource,
199 u8 ** output_buffer, acpi_size * bytes_consumed); 217 union aml_resource *aml);
200 218
219/*
220 * rsmisc
221 */
201acpi_status 222acpi_status
202acpi_rs_memory24_resource(u8 * byte_stream_buffer, 223acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
203 acpi_size * bytes_consumed, 224 union aml_resource *aml,
204 u8 ** output_buffer, acpi_size * structure_size); 225 struct acpi_rsconvert_info *info);
205 226
206acpi_status 227acpi_status
207acpi_rs_memory24_stream(struct acpi_resource *linked_list, 228acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
208 u8 ** output_buffer, acpi_size * bytes_consumed); 229 union aml_resource *aml,
230 struct acpi_rsconvert_info *info);
209 231
210acpi_status 232/*
211acpi_rs_memory32_range_resource(u8 * byte_stream_buffer, 233 * rsutils
212 acpi_size * bytes_consumed, 234 */
213 u8 ** output_buffer, 235void
214 acpi_size * structure_size); 236acpi_rs_move_data(void *destination,
237 void *source, u16 item_count, u8 move_type);
215 238
216acpi_status 239u8 acpi_rs_decode_bitmask(u16 mask, u8 * list);
217acpi_rs_fixed_memory32_resource(u8 * byte_stream_buffer,
218 acpi_size * bytes_consumed,
219 u8 ** output_buffer,
220 acpi_size * structure_size);
221 240
222acpi_status 241u16 acpi_rs_encode_bitmask(u8 * list, u8 count);
223acpi_rs_memory32_range_stream(struct acpi_resource *linked_list,
224 u8 ** output_buffer, acpi_size * bytes_consumed);
225 242
226acpi_status 243acpi_rs_length
227acpi_rs_fixed_memory32_stream(struct acpi_resource *linked_list, 244acpi_rs_get_resource_source(acpi_rs_length resource_length,
228 u8 ** output_buffer, acpi_size * bytes_consumed); 245 acpi_rs_length minimum_length,
246 struct acpi_resource_source *resource_source,
247 union aml_resource *aml, char *string_ptr);
229 248
230acpi_status 249acpi_rsdesc_size
231acpi_rs_extended_irq_resource(u8 * byte_stream_buffer, 250acpi_rs_set_resource_source(union aml_resource *aml,
232 acpi_size * bytes_consumed, 251 acpi_rs_length minimum_length,
233 u8 ** output_buffer, acpi_size * structure_size); 252 struct acpi_resource_source *resource_source);
234 253
235acpi_status 254void
236acpi_rs_extended_irq_stream(struct acpi_resource *linked_list, 255acpi_rs_set_resource_header(u8 descriptor_type,
237 u8 ** output_buffer, acpi_size * bytes_consumed); 256 acpi_rsdesc_size total_length,
257 union aml_resource *aml);
238 258
239acpi_status 259void
240acpi_rs_end_tag_resource(u8 * byte_stream_buffer, 260acpi_rs_set_resource_length(acpi_rsdesc_size total_length,
241 acpi_size * bytes_consumed, 261 union aml_resource *aml);
242 u8 ** output_buffer, acpi_size * structure_size);
243 262
244acpi_status 263/*
245acpi_rs_end_tag_stream(struct acpi_resource *linked_list, 264 * rsdump
246 u8 ** output_buffer, acpi_size * bytes_consumed); 265 */
266void acpi_rs_dump_resource_list(struct acpi_resource *resource);
247 267
248acpi_status 268void acpi_rs_dump_irq_list(u8 * route_table);
249acpi_rs_vendor_resource(u8 * byte_stream_buffer,
250 acpi_size * bytes_consumed,
251 u8 ** output_buffer, acpi_size * structure_size);
252 269
253acpi_status 270/*
254acpi_rs_vendor_stream(struct acpi_resource *linked_list, 271 * Resource conversion tables
255 u8 ** output_buffer, acpi_size * bytes_consumed); 272 */
273extern struct acpi_rsconvert_info acpi_rs_convert_dma[];
274extern struct acpi_rsconvert_info acpi_rs_convert_end_dpf[];
275extern struct acpi_rsconvert_info acpi_rs_convert_io[];
276extern struct acpi_rsconvert_info acpi_rs_convert_fixed_io[];
277extern struct acpi_rsconvert_info acpi_rs_convert_end_tag[];
278extern struct acpi_rsconvert_info acpi_rs_convert_memory24[];
279extern struct acpi_rsconvert_info acpi_rs_convert_generic_reg[];
280extern struct acpi_rsconvert_info acpi_rs_convert_memory32[];
281extern struct acpi_rsconvert_info acpi_rs_convert_fixed_memory32[];
282extern struct acpi_rsconvert_info acpi_rs_convert_address32[];
283extern struct acpi_rsconvert_info acpi_rs_convert_address16[];
284extern struct acpi_rsconvert_info acpi_rs_convert_ext_irq[];
285extern struct acpi_rsconvert_info acpi_rs_convert_address64[];
286extern struct acpi_rsconvert_info acpi_rs_convert_ext_address64[];
287
288/* These resources require separate get/set tables */
289
290extern struct acpi_rsconvert_info acpi_rs_get_irq[];
291extern struct acpi_rsconvert_info acpi_rs_get_start_dpf[];
292extern struct acpi_rsconvert_info acpi_rs_get_vendor_small[];
293extern struct acpi_rsconvert_info acpi_rs_get_vendor_large[];
294
295extern struct acpi_rsconvert_info acpi_rs_set_irq[];
296extern struct acpi_rsconvert_info acpi_rs_set_start_dpf[];
297extern struct acpi_rsconvert_info acpi_rs_set_vendor[];
298
299#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
300/*
301 * rsinfo
302 */
303extern struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[];
256 304
257u8 acpi_rs_get_resource_type(u8 resource_start_byte); 305/*
306 * rsdump
307 */
308extern struct acpi_rsdump_info acpi_rs_dump_irq[];
309extern struct acpi_rsdump_info acpi_rs_dump_dma[];
310extern struct acpi_rsdump_info acpi_rs_dump_start_dpf[];
311extern struct acpi_rsdump_info acpi_rs_dump_end_dpf[];
312extern struct acpi_rsdump_info acpi_rs_dump_io[];
313extern struct acpi_rsdump_info acpi_rs_dump_fixed_io[];
314extern struct acpi_rsdump_info acpi_rs_dump_vendor[];
315extern struct acpi_rsdump_info acpi_rs_dump_end_tag[];
316extern struct acpi_rsdump_info acpi_rs_dump_memory24[];
317extern struct acpi_rsdump_info acpi_rs_dump_memory32[];
318extern struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[];
319extern struct acpi_rsdump_info acpi_rs_dump_address16[];
320extern struct acpi_rsdump_info acpi_rs_dump_address32[];
321extern struct acpi_rsdump_info acpi_rs_dump_address64[];
322extern struct acpi_rsdump_info acpi_rs_dump_ext_address64[];
323extern struct acpi_rsdump_info acpi_rs_dump_ext_irq[];
324extern struct acpi_rsdump_info acpi_rs_dump_generic_reg[];
325#endif
258 326
259#endif /* __ACRESRC_H__ */ 327#endif /* __ACRESRC_H__ */
diff --git a/include/acpi/acstruct.h b/include/acpi/acstruct.h
index 99d235339801..d8c1c2cdac0c 100644
--- a/include/acpi/acstruct.h
+++ b/include/acpi/acstruct.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/actables.h b/include/acpi/actables.h
index f92c1858b808..30a47542e1c8 100644
--- a/include/acpi/actables.h
+++ b/include/acpi/actables.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/actbl.h b/include/acpi/actbl.h
index a46f406e1c94..ed53f842dad4 100644
--- a/include/acpi/actbl.h
+++ b/include/acpi/actbl.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -45,6 +45,12 @@
45#define __ACTBL_H__ 45#define __ACTBL_H__
46 46
47/* 47/*
48 * Note about bitfields: The u8 type is used for bitfields in ACPI tables.
49 * This is the only type that is even remotely portable. Anything else is not
50 * portable, so do not use any other bitfield types.
51 */
52
53/*
48 * Values for description table header signatures 54 * Values for description table header signatures
49 */ 55 */
50#define RSDP_NAME "RSDP" 56#define RSDP_NAME "RSDP"
diff --git a/include/acpi/actbl1.h b/include/acpi/actbl1.h
index 67312c3a915a..cd428d57add0 100644
--- a/include/acpi/actbl1.h
+++ b/include/acpi/actbl1.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h
index 50305ce2681a..dfc7ac1094bb 100644
--- a/include/acpi/actbl2.h
+++ b/include/acpi/actbl2.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
index 6213b27516e8..7ca89cde706e 100644
--- a/include/acpi/actypes.h
+++ b/include/acpi/actypes.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -44,7 +44,15 @@
44#ifndef __ACTYPES_H__ 44#ifndef __ACTYPES_H__
45#define __ACTYPES_H__ 45#define __ACTYPES_H__
46 46
47/*! [Begin] no source code translation (keep the typedefs) */ 47/*
48 * ACPI_MACHINE_WIDTH must be specified in an OS- or compiler-dependent header
49 * and must be either 16, 32, or 64
50 */
51#ifndef ACPI_MACHINE_WIDTH
52#error ACPI_MACHINE_WIDTH not defined
53#endif
54
55/*! [Begin] no source code translation */
48 56
49/* 57/*
50 * Data type ranges 58 * Data type ranges
@@ -58,87 +66,150 @@
58#define ACPI_UINT64_MAX (UINT64)(~((UINT64) 0)) /* 0xFFFFFFFFFFFFFFFF */ 66#define ACPI_UINT64_MAX (UINT64)(~((UINT64) 0)) /* 0xFFFFFFFFFFFFFFFF */
59#define ACPI_ASCII_MAX 0x7F 67#define ACPI_ASCII_MAX 0x7F
60 68
61#ifdef DEFINE_ALTERNATE_TYPES
62/* 69/*
63 * Types used only in translated source, defined here to enable 70 * Architecture-specific ACPICA Subsystem Data Types
64 * cross-platform compilation only. 71 *
72 * The goal of these types is to provide source code portability across
73 * 16-bit, 32-bit, and 64-bit targets.
74 *
75 * 1) The following types are of fixed size for all targets (16/32/64):
76 *
77 * BOOLEAN Logical boolean
78 *
79 * UINT8 8-bit (1 byte) unsigned value
80 * UINT16 16-bit (2 byte) unsigned value
81 * UINT32 32-bit (4 byte) unsigned value
82 * UINT64 64-bit (8 byte) unsigned value
83 *
84 * INT16 16-bit (2 byte) signed value
85 * INT32 32-bit (4 byte) signed value
86 * INT64 64-bit (8 byte) signed value
87 *
88 * COMPILER_DEPENDENT_UINT64/INT64 - These types are defined in the
89 * compiler-dependent header(s) and were introduced because there is no common
90 * 64-bit integer type across the various compilation models, as shown in
91 * the table below.
92 *
93 * Datatype LP64 ILP64 LLP64 ILP32 LP32 16bit
94 * char 8 8 8 8 8 8
95 * short 16 16 16 16 16 16
96 * _int32 32
97 * int 32 64 32 32 16 16
98 * long 64 64 32 32 32 32
99 * long long 64 64
100 * pointer 64 64 64 32 32 32
101 *
102 * Note: ILP64 and LP32 are currently not supported.
103 *
104 *
105 * 2) These types represent the native word size of the target mode of the
106 * processor, and may be 16-bit, 32-bit, or 64-bit as required. They are
107 * usually used for memory allocation, efficient loop counters, and array
108 * indexes. The types are similar to the size_t type in the C library and are
109 * required because there is no C type that consistently represents the native
110 * data width.
111 *
112 * ACPI_SIZE 16/32/64-bit unsigned value
113 * ACPI_NATIVE_UINT 16/32/64-bit unsigned value
114 * ACPI_NATIVE_INT 16/32/64-bit signed value
115 *
65 */ 116 */
66typedef int s32;
67typedef unsigned char u8;
68typedef unsigned short u16;
69typedef unsigned int u32;
70typedef COMPILER_DEPENDENT_UINT64 u64;
71
72#endif
73 117
74/* 118/*******************************************************************************
75 * Data types - Fixed across all compilation models (16/32/64)
76 * 119 *
77 * BOOLEAN Logical Boolean. 120 * Common types for all compilers, all targets
78 * INT8 8-bit (1 byte) signed value 121 *
79 * UINT8 8-bit (1 byte) unsigned value 122 ******************************************************************************/
80 * INT16 16-bit (2 byte) signed value
81 * UINT16 16-bit (2 byte) unsigned value
82 * INT32 32-bit (4 byte) signed value
83 * UINT32 32-bit (4 byte) unsigned value
84 * INT64 64-bit (8 byte) signed value
85 * UINT64 64-bit (8 byte) unsigned value
86 * ACPI_NATIVE_INT 32-bit on IA-32, 64-bit on IA-64 signed value
87 * ACPI_NATIVE_UINT 32-bit on IA-32, 64-bit on IA-64 unsigned value
88 */
89 123
90#ifndef ACPI_MACHINE_WIDTH 124typedef unsigned char BOOLEAN;
91#error ACPI_MACHINE_WIDTH not defined 125typedef unsigned char UINT8;
92#endif 126typedef unsigned short UINT16;
127typedef COMPILER_DEPENDENT_UINT64 UINT64;
128typedef COMPILER_DEPENDENT_INT64 INT64;
129
130/*! [End] no source code translation !*/
131
132/*******************************************************************************
133 *
134 * Types specific to 64-bit targets
135 *
136 ******************************************************************************/
93 137
94#if ACPI_MACHINE_WIDTH == 64 138#if ACPI_MACHINE_WIDTH == 64
95 139
96/*! [Begin] no source code translation (keep the typedefs) */ 140/*! [Begin] no source code translation (keep the typedefs as-is) */
97 141
98/*
99 * 64-bit type definitions
100 */
101typedef unsigned char UINT8;
102typedef unsigned char BOOLEAN;
103typedef unsigned short UINT16;
104typedef int INT32;
105typedef unsigned int UINT32; 142typedef unsigned int UINT32;
106typedef COMPILER_DEPENDENT_INT64 INT64; 143typedef int INT32;
107typedef COMPILER_DEPENDENT_UINT64 UINT64;
108 144
109/*! [End] no source code translation !*/ 145/*! [End] no source code translation !*/
110 146
111typedef s64 acpi_native_int;
112typedef u64 acpi_native_uint; 147typedef u64 acpi_native_uint;
148typedef s64 acpi_native_int;
113 149
114typedef u64 acpi_table_ptr; 150typedef u64 acpi_table_ptr;
115typedef u64 acpi_io_address; 151typedef u64 acpi_io_address;
116typedef u64 acpi_physical_address; 152typedef u64 acpi_physical_address;
117typedef u64 acpi_size;
118 153
119#define ALIGNED_ADDRESS_BOUNDARY 0x00000008 /* No hardware alignment support in IA64 */
120#define ACPI_USE_NATIVE_DIVIDE /* Native 64-bit integer support */
121#define ACPI_MAX_PTR ACPI_UINT64_MAX 154#define ACPI_MAX_PTR ACPI_UINT64_MAX
122#define ACPI_SIZE_MAX ACPI_UINT64_MAX 155#define ACPI_SIZE_MAX ACPI_UINT64_MAX
123 156
124#elif ACPI_MACHINE_WIDTH == 16 157#define ALIGNED_ADDRESS_BOUNDARY 0x00000008
125 158#define ACPI_USE_NATIVE_DIVIDE /* Has native 64-bit integer support */
126/*! [Begin] no source code translation (keep the typedefs) */
127 159
128/* 160/*
129 * 16-bit type definitions 161 * In the case of the Itanium Processor Family (IPF), the hardware does not
162 * support misaligned memory transfers. Set the MISALIGNMENT_NOT_SUPPORTED flag
163 * to indicate that special precautions must be taken to avoid alignment faults.
164 * (IA64 or ia64 is currently used by existing compilers to indicate IPF.)
165 *
166 * Note: Em64_t and other X86-64 processors support misaligned transfers,
167 * so there is no need to define this flag.
130 */ 168 */
131typedef unsigned char UINT8; 169#if defined (__IA64__) || defined (__ia64__)
132typedef unsigned char BOOLEAN; 170#define ACPI_MISALIGNMENT_NOT_SUPPORTED
133typedef unsigned int UINT16; 171#endif
134typedef long INT32;
135typedef int INT16;
136typedef unsigned long UINT32;
137 172
138struct { 173/*******************************************************************************
139 UINT32 Lo; 174 *
140 UINT32 Hi; 175 * Types specific to 32-bit targets
141}; 176 *
177 ******************************************************************************/
178
179#elif ACPI_MACHINE_WIDTH == 32
180
181/*! [Begin] no source code translation (keep the typedefs as-is) */
182
183typedef unsigned int UINT32;
184typedef int INT32;
185
186/*! [End] no source code translation !*/
187
188typedef u32 acpi_native_uint;
189typedef s32 acpi_native_int;
190
191typedef u64 acpi_table_ptr;
192typedef u32 acpi_io_address;
193typedef u64 acpi_physical_address;
194
195#define ACPI_MAX_PTR ACPI_UINT32_MAX
196#define ACPI_SIZE_MAX ACPI_UINT32_MAX
197
198#define ALIGNED_ADDRESS_BOUNDARY 0x00000004
199
200/*******************************************************************************
201 *
202 * Types specific to 16-bit targets
203 *
204 ******************************************************************************/
205
206#elif ACPI_MACHINE_WIDTH == 16
207
208/*! [Begin] no source code translation (keep the typedefs as-is) */
209
210typedef unsigned long UINT32;
211typedef short INT16;
212typedef long INT32;
142 213
143/*! [End] no source code translation !*/ 214/*! [End] no source code translation !*/
144 215
@@ -148,61 +219,84 @@ typedef s16 acpi_native_int;
148typedef u32 acpi_table_ptr; 219typedef u32 acpi_table_ptr;
149typedef u32 acpi_io_address; 220typedef u32 acpi_io_address;
150typedef char *acpi_physical_address; 221typedef char *acpi_physical_address;
151typedef u16 acpi_size;
152 222
153#define ALIGNED_ADDRESS_BOUNDARY 0x00000002
154#define ACPI_MISALIGNED_TRANSFERS
155#define ACPI_USE_NATIVE_DIVIDE /* No 64-bit integers, ok to use native divide */
156#define ACPI_MAX_PTR ACPI_UINT16_MAX 223#define ACPI_MAX_PTR ACPI_UINT16_MAX
157#define ACPI_SIZE_MAX ACPI_UINT16_MAX 224#define ACPI_SIZE_MAX ACPI_UINT16_MAX
158 225
159/* 226#define ALIGNED_ADDRESS_BOUNDARY 0x00000002
160 * (16-bit only) internal integers must be 32-bits, so 227#define ACPI_USE_NATIVE_DIVIDE /* No 64-bit integers, ok to use native divide */
161 * 64-bit integers cannot be supported 228
162 */ 229/* 64-bit integers cannot be supported */
230
163#define ACPI_NO_INTEGER64_SUPPORT 231#define ACPI_NO_INTEGER64_SUPPORT
164 232
165#elif ACPI_MACHINE_WIDTH == 32 233#else
166 234
167/*! [Begin] no source code translation (keep the typedefs) */ 235/* ACPI_MACHINE_WIDTH must be either 64, 32, or 16 */
168 236
169/* 237#error unknown ACPI_MACHINE_WIDTH
170 * 32-bit type definitions (default) 238#endif
171 */
172typedef unsigned char UINT8;
173typedef unsigned char BOOLEAN;
174typedef unsigned short UINT16;
175typedef int INT32;
176typedef unsigned int UINT32;
177typedef COMPILER_DEPENDENT_INT64 INT64;
178typedef COMPILER_DEPENDENT_UINT64 UINT64;
179 239
180/*! [End] no source code translation !*/ 240/* Variable-width type, used instead of clib size_t */
181 241
182typedef s32 acpi_native_int; 242typedef acpi_native_uint acpi_size;
183typedef u32 acpi_native_uint;
184 243
185typedef u64 acpi_table_ptr; 244/*******************************************************************************
186typedef u32 acpi_io_address; 245 *
187typedef u64 acpi_physical_address; 246 * OS- or compiler-dependent types
188typedef u32 acpi_size; 247 *
248 * If the defaults below are not appropriate for the host system, they can
249 * be defined in the compiler-specific or OS-specific header, and this will
250 * take precedence.
251 *
252 ******************************************************************************/
189 253
190#define ALIGNED_ADDRESS_BOUNDARY 0x00000004 254/* Use C99 uintptr_t for pointer casting if available, "void *" otherwise */
191#define ACPI_MISALIGNED_TRANSFERS
192#define ACPI_MAX_PTR ACPI_UINT32_MAX
193#define ACPI_SIZE_MAX ACPI_UINT32_MAX
194 255
195#else 256#ifndef acpi_uintptr_t
196#error unknown ACPI_MACHINE_WIDTH 257#define acpi_uintptr_t void *
197#endif 258#endif
198 259
199/* 260/*
200 * This type is used for bitfields in ACPI tables. The only type that is 261 * If acpi_cache_t was not defined in the OS-dependent header,
201 * even remotely portable is u8. Anything else is not portable, so 262 * define it now. This is typically the case where the local cache
202 * do not add any more bitfield types. 263 * manager implementation is to be used (ACPI_USE_LOCAL_CACHE)
264 */
265#ifndef acpi_cache_t
266#define acpi_cache_t struct acpi_memory_list
267#endif
268
269/*
270 * Allow the CPU flags word to be defined per-OS to simplify the use of the
271 * lock and unlock OSL interfaces.
272 */
273#ifndef acpi_cpu_flags
274#define acpi_cpu_flags acpi_native_uint
275#endif
276
277/*
278 * ACPI_PRINTF_LIKE is used to tag functions as "printf-like" because
279 * some compilers can catch printf format string problems
203 */ 280 */
204typedef u8 UINT8_BIT; 281#ifndef ACPI_PRINTF_LIKE
205typedef acpi_native_uint ACPI_PTRDIFF; 282#define ACPI_PRINTF_LIKE(c)
283#endif
284
285/*
286 * Some compilers complain about unused variables. Sometimes we don't want to
287 * use all the variables (for example, _acpi_module_name). This allows us
288 * to to tell the compiler in a per-variable manner that a variable
289 * is unused
290 */
291#ifndef ACPI_UNUSED_VAR
292#define ACPI_UNUSED_VAR
293#endif
294
295/*******************************************************************************
296 *
297 * Independent types
298 *
299 ******************************************************************************/
206 300
207/* 301/*
208 * Pointer overlays to avoid lots of typecasting for 302 * Pointer overlays to avoid lots of typecasting for
@@ -234,18 +328,8 @@ struct acpi_pointer {
234#define ACPI_LOGMODE_PHYSPTR ACPI_LOGICAL_ADDRESSING | ACPI_PHYSICAL_POINTER 328#define ACPI_LOGMODE_PHYSPTR ACPI_LOGICAL_ADDRESSING | ACPI_PHYSICAL_POINTER
235#define ACPI_LOGMODE_LOGPTR ACPI_LOGICAL_ADDRESSING | ACPI_LOGICAL_POINTER 329#define ACPI_LOGMODE_LOGPTR ACPI_LOGICAL_ADDRESSING | ACPI_LOGICAL_POINTER
236 330
237/* 331/* Logical defines and NULL */
238 * If acpi_cache_t was not defined in the OS-dependent header,
239 * define it now. This is typically the case where the local cache
240 * manager implementation is to be used (ACPI_USE_LOCAL_CACHE)
241 */
242#ifndef acpi_cache_t
243#define acpi_cache_t struct acpi_memory_list
244#endif
245 332
246/*
247 * Useful defines
248 */
249#ifdef FALSE 333#ifdef FALSE
250#undef FALSE 334#undef FALSE
251#endif 335#endif
@@ -261,12 +345,12 @@ struct acpi_pointer {
261#endif 345#endif
262 346
263/* 347/*
264 * Local datatypes 348 * Mescellaneous types
265 */ 349 */
266typedef u32 acpi_status; /* All ACPI Exceptions */ 350typedef u32 acpi_status; /* All ACPI Exceptions */
267typedef u32 acpi_name; /* 4-byte ACPI name */ 351typedef u32 acpi_name; /* 4-byte ACPI name */
268typedef char *acpi_string; /* Null terminated ASCII string */ 352typedef char *acpi_string; /* Null terminated ASCII string */
269typedef void *acpi_handle; /* Actually a ptr to an Node */ 353typedef void *acpi_handle; /* Actually a ptr to a NS Node */
270 354
271struct uint64_struct { 355struct uint64_struct {
272 u32 lo; 356 u32 lo;
@@ -323,7 +407,7 @@ typedef u64 acpi_integer;
323/* 407/*
324 * Constants with special meanings 408 * Constants with special meanings
325 */ 409 */
326#define ACPI_ROOT_OBJECT (acpi_handle) ACPI_PTR_ADD (char, NULL, ACPI_MAX_PTR) 410#define ACPI_ROOT_OBJECT ACPI_ADD_PTR (acpi_handle, NULL, ACPI_MAX_PTR)
327 411
328/* 412/*
329 * Initialization sequence 413 * Initialization sequence
@@ -470,37 +554,6 @@ typedef u32 acpi_object_type;
470#define ACPI_TYPE_NOT_FOUND 0xFF 554#define ACPI_TYPE_NOT_FOUND 0xFF
471 555
472/* 556/*
473 * Bitmapped ACPI types. Used internally only
474 */
475#define ACPI_BTYPE_ANY 0x00000000
476#define ACPI_BTYPE_INTEGER 0x00000001
477#define ACPI_BTYPE_STRING 0x00000002
478#define ACPI_BTYPE_BUFFER 0x00000004
479#define ACPI_BTYPE_PACKAGE 0x00000008
480#define ACPI_BTYPE_FIELD_UNIT 0x00000010
481#define ACPI_BTYPE_DEVICE 0x00000020
482#define ACPI_BTYPE_EVENT 0x00000040
483#define ACPI_BTYPE_METHOD 0x00000080
484#define ACPI_BTYPE_MUTEX 0x00000100
485#define ACPI_BTYPE_REGION 0x00000200
486#define ACPI_BTYPE_POWER 0x00000400
487#define ACPI_BTYPE_PROCESSOR 0x00000800
488#define ACPI_BTYPE_THERMAL 0x00001000
489#define ACPI_BTYPE_BUFFER_FIELD 0x00002000
490#define ACPI_BTYPE_DDB_HANDLE 0x00004000
491#define ACPI_BTYPE_DEBUG_OBJECT 0x00008000
492#define ACPI_BTYPE_REFERENCE 0x00010000
493#define ACPI_BTYPE_RESOURCE 0x00020000
494
495#define ACPI_BTYPE_COMPUTE_DATA (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER)
496
497#define ACPI_BTYPE_DATA (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_PACKAGE)
498#define ACPI_BTYPE_DATA_REFERENCE (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE)
499#define ACPI_BTYPE_DEVICE_OBJECTS (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR)
500#define ACPI_BTYPE_OBJECTS_AND_REFS 0x0001FFFF /* ARG or LOCAL */
501#define ACPI_BTYPE_ALL_OBJECTS 0x0000FFFF
502
503/*
504 * All I/O 557 * All I/O
505 */ 558 */
506#define ACPI_READ 0 559#define ACPI_READ 0
@@ -853,6 +906,14 @@ struct acpi_compatible_id_list {
853#define ACPI_VALID_CID 0x0010 906#define ACPI_VALID_CID 0x0010
854#define ACPI_VALID_SXDS 0x0020 907#define ACPI_VALID_SXDS 0x0020
855 908
909/* Flags for _STA method */
910
911#define ACPI_STA_DEVICE_PRESENT 0x01
912#define ACPI_STA_DEVICE_ENABLED 0x02
913#define ACPI_STA_DEVICE_UI 0x04
914#define ACPI_STA_DEVICE_OK 0x08
915#define ACPI_STA_BATTERY_PRESENT 0x10
916
856#define ACPI_COMMON_OBJ_INFO \ 917#define ACPI_COMMON_OBJ_INFO \
857 acpi_object_type type; /* ACPI object type */ \ 918 acpi_object_type type; /* ACPI object type */ \
858 acpi_name name /* ACPI object Name */ 919 acpi_name name /* ACPI object Name */
@@ -895,6 +956,8 @@ struct acpi_mem_space_context {
895/* 956/*
896 * Definitions for Resource Attributes 957 * Definitions for Resource Attributes
897 */ 958 */
959typedef u16 acpi_rs_length; /* Resource Length field is fixed at 16 bits */
960typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (length+3) = (64_k-1)+3 */
898 961
899/* 962/*
900 * Memory Attributes 963 * Memory Attributes
@@ -916,7 +979,9 @@ struct acpi_mem_space_context {
916#define ACPI_ISA_ONLY_RANGES (u8) 0x02 979#define ACPI_ISA_ONLY_RANGES (u8) 0x02
917#define ACPI_ENTIRE_RANGE (ACPI_NON_ISA_ONLY_RANGES | ACPI_ISA_ONLY_RANGES) 980#define ACPI_ENTIRE_RANGE (ACPI_NON_ISA_ONLY_RANGES | ACPI_ISA_ONLY_RANGES)
918 981
919#define ACPI_SPARSE_TRANSLATION (u8) 0x03 982/* Type of translation - 1=Sparse, 0=Dense */
983
984#define ACPI_SPARSE_TRANSLATION (u8) 0x01
920 985
921/* 986/*
922 * IO Port Descriptor Decode 987 * IO Port Descriptor Decode
@@ -927,8 +992,8 @@ struct acpi_mem_space_context {
927/* 992/*
928 * IRQ Attributes 993 * IRQ Attributes
929 */ 994 */
930#define ACPI_EDGE_SENSITIVE (u8) 0x00 995#define ACPI_LEVEL_SENSITIVE (u8) 0x00
931#define ACPI_LEVEL_SENSITIVE (u8) 0x01 996#define ACPI_EDGE_SENSITIVE (u8) 0x01
932 997
933#define ACPI_ACTIVE_HIGH (u8) 0x00 998#define ACPI_ACTIVE_HIGH (u8) 0x00
934#define ACPI_ACTIVE_LOW (u8) 0x01 999#define ACPI_ACTIVE_LOW (u8) 0x01
@@ -975,27 +1040,45 @@ struct acpi_mem_space_context {
975#define ACPI_CONSUMER (u8) 0x01 1040#define ACPI_CONSUMER (u8) 0x01
976 1041
977/* 1042/*
1043 * If possible, pack the following structures to byte alignment
1044 */
1045#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
1046#pragma pack(1)
1047#endif
1048
1049/* UUID data structures for use in vendor-defined resource descriptors */
1050
1051struct acpi_uuid {
1052 u8 data[ACPI_UUID_LENGTH];
1053};
1054
1055struct acpi_vendor_uuid {
1056 u8 subtype;
1057 u8 data[ACPI_UUID_LENGTH];
1058};
1059
1060/*
978 * Structures used to describe device resources 1061 * Structures used to describe device resources
979 */ 1062 */
980struct acpi_resource_irq { 1063struct acpi_resource_irq {
981 u32 edge_level; 1064 u8 triggering;
982 u32 active_high_low; 1065 u8 polarity;
983 u32 shared_exclusive; 1066 u8 sharable;
984 u32 number_of_interrupts; 1067 u8 interrupt_count;
985 u32 interrupts[1]; 1068 u8 interrupts[1];
986}; 1069};
987 1070
988struct acpi_resource_dma { 1071struct acpi_resource_dma {
989 u32 type; 1072 u8 type;
990 u32 bus_master; 1073 u8 bus_master;
991 u32 transfer; 1074 u8 transfer;
992 u32 number_of_channels; 1075 u8 channel_count;
993 u32 channels[1]; 1076 u8 channels[1];
994}; 1077};
995 1078
996struct acpi_resource_start_dpf { 1079struct acpi_resource_start_dependent {
997 u32 compatibility_priority; 1080 u8 compatibility_priority;
998 u32 performance_robustness; 1081 u8 performance_robustness;
999}; 1082};
1000 1083
1001/* 1084/*
@@ -1004,179 +1087,217 @@ struct acpi_resource_start_dpf {
1004 */ 1087 */
1005 1088
1006struct acpi_resource_io { 1089struct acpi_resource_io {
1007 u32 io_decode; 1090 u8 io_decode;
1008 u32 min_base_address; 1091 u8 alignment;
1009 u32 max_base_address; 1092 u8 address_length;
1010 u32 alignment; 1093 u16 minimum;
1011 u32 range_length; 1094 u16 maximum;
1012}; 1095};
1013 1096
1014struct acpi_resource_fixed_io { 1097struct acpi_resource_fixed_io {
1015 u32 base_address; 1098 u16 address;
1016 u32 range_length; 1099 u8 address_length;
1017}; 1100};
1018 1101
1019struct acpi_resource_vendor { 1102struct acpi_resource_vendor {
1020 u32 length; 1103 u16 byte_length;
1021 u8 reserved[1]; 1104 u8 byte_data[1];
1105};
1106
1107/* Vendor resource with UUID info (introduced in ACPI 3.0) */
1108
1109struct acpi_resource_vendor_typed {
1110 u16 byte_length;
1111 u8 uuid_subtype;
1112 u8 uuid[ACPI_UUID_LENGTH];
1113 u8 byte_data[1];
1022}; 1114};
1023 1115
1024struct acpi_resource_end_tag { 1116struct acpi_resource_end_tag {
1025 u8 checksum; 1117 u8 checksum;
1026}; 1118};
1027 1119
1028struct acpi_resource_mem24 { 1120struct acpi_resource_memory24 {
1029 u32 read_write_attribute; 1121 u8 write_protect;
1030 u32 min_base_address; 1122 u16 minimum;
1031 u32 max_base_address; 1123 u16 maximum;
1032 u32 alignment; 1124 u16 alignment;
1033 u32 range_length; 1125 u16 address_length;
1034}; 1126};
1035 1127
1036struct acpi_resource_mem32 { 1128struct acpi_resource_memory32 {
1037 u32 read_write_attribute; 1129 u8 write_protect;
1038 u32 min_base_address; 1130 u32 minimum;
1039 u32 max_base_address; 1131 u32 maximum;
1040 u32 alignment; 1132 u32 alignment;
1041 u32 range_length; 1133 u32 address_length;
1042}; 1134};
1043 1135
1044struct acpi_resource_fixed_mem32 { 1136struct acpi_resource_fixed_memory32 {
1045 u32 read_write_attribute; 1137 u8 write_protect;
1046 u32 range_base_address; 1138 u32 address;
1047 u32 range_length; 1139 u32 address_length;
1048}; 1140};
1049 1141
1050struct acpi_memory_attribute { 1142struct acpi_memory_attribute {
1051 u16 cache_attribute; 1143 u8 write_protect;
1052 u16 read_write_attribute; 1144 u8 caching;
1145 u8 range_type;
1146 u8 translation;
1053}; 1147};
1054 1148
1055struct acpi_io_attribute { 1149struct acpi_io_attribute {
1056 u16 range_attribute; 1150 u8 range_type;
1057 u16 translation_attribute; 1151 u8 translation;
1058}; 1152 u8 translation_type;
1059 1153 u8 reserved1;
1060struct acpi_bus_attribute {
1061 u16 reserved1;
1062 u16 reserved2;
1063}; 1154};
1064 1155
1065union acpi_resource_attribute { 1156union acpi_resource_attribute {
1066 struct acpi_memory_attribute memory; 1157 struct acpi_memory_attribute mem;
1067 struct acpi_io_attribute io; 1158 struct acpi_io_attribute io;
1068 struct acpi_bus_attribute bus; 1159
1160 /* Used for the *word_space macros */
1161
1162 u8 type_specific;
1069}; 1163};
1070 1164
1071struct acpi_resource_source { 1165struct acpi_resource_source {
1072 u32 index; 1166 u8 index;
1073 u32 string_length; 1167 u16 string_length;
1074 char *string_ptr; 1168 char *string_ptr;
1075}; 1169};
1076 1170
1077/* Fields common to all address descriptors, 16/32/64 bit */ 1171/* Fields common to all address descriptors, 16/32/64 bit */
1078 1172
1079#define ACPI_RESOURCE_ADDRESS_COMMON \ 1173#define ACPI_RESOURCE_ADDRESS_COMMON \
1080 u32 resource_type; \ 1174 u8 resource_type; \
1081 u32 producer_consumer; \ 1175 u8 producer_consumer; \
1082 u32 decode; \ 1176 u8 decode; \
1083 u32 min_address_fixed; \ 1177 u8 min_address_fixed; \
1084 u32 max_address_fixed; \ 1178 u8 max_address_fixed; \
1085 union acpi_resource_attribute attribute; 1179 union acpi_resource_attribute info;
1086 1180
1087struct acpi_resource_address { 1181struct acpi_resource_address {
1088ACPI_RESOURCE_ADDRESS_COMMON}; 1182ACPI_RESOURCE_ADDRESS_COMMON};
1089 1183
1090struct acpi_resource_address16 { 1184struct acpi_resource_address16 {
1091 ACPI_RESOURCE_ADDRESS_COMMON u32 granularity; 1185 ACPI_RESOURCE_ADDRESS_COMMON u16 granularity;
1092 u32 min_address_range; 1186 u16 minimum;
1093 u32 max_address_range; 1187 u16 maximum;
1094 u32 address_translation_offset; 1188 u16 translation_offset;
1095 u32 address_length; 1189 u16 address_length;
1096 struct acpi_resource_source resource_source; 1190 struct acpi_resource_source resource_source;
1097}; 1191};
1098 1192
1099struct acpi_resource_address32 { 1193struct acpi_resource_address32 {
1100 ACPI_RESOURCE_ADDRESS_COMMON u32 granularity; 1194 ACPI_RESOURCE_ADDRESS_COMMON u32 granularity;
1101 u32 min_address_range; 1195 u32 minimum;
1102 u32 max_address_range; 1196 u32 maximum;
1103 u32 address_translation_offset; 1197 u32 translation_offset;
1104 u32 address_length; 1198 u32 address_length;
1105 struct acpi_resource_source resource_source; 1199 struct acpi_resource_source resource_source;
1106}; 1200};
1107 1201
1108struct acpi_resource_address64 { 1202struct acpi_resource_address64 {
1109 ACPI_RESOURCE_ADDRESS_COMMON u64 granularity; 1203 ACPI_RESOURCE_ADDRESS_COMMON u64 granularity;
1110 u64 min_address_range; 1204 u64 minimum;
1111 u64 max_address_range; 1205 u64 maximum;
1112 u64 address_translation_offset; 1206 u64 translation_offset;
1113 u64 address_length; 1207 u64 address_length;
1114 u64 type_specific_attributes;
1115 struct acpi_resource_source resource_source; 1208 struct acpi_resource_source resource_source;
1116}; 1209};
1117 1210
1118struct acpi_resource_ext_irq { 1211struct acpi_resource_extended_address64 {
1119 u32 producer_consumer; 1212 ACPI_RESOURCE_ADDRESS_COMMON u8 revision_iD;
1120 u32 edge_level; 1213 u64 granularity;
1121 u32 active_high_low; 1214 u64 minimum;
1122 u32 shared_exclusive; 1215 u64 maximum;
1123 u32 number_of_interrupts; 1216 u64 translation_offset;
1217 u64 address_length;
1218 u64 type_specific;
1219};
1220
1221struct acpi_resource_extended_irq {
1222 u8 producer_consumer;
1223 u8 triggering;
1224 u8 polarity;
1225 u8 sharable;
1226 u8 interrupt_count;
1124 struct acpi_resource_source resource_source; 1227 struct acpi_resource_source resource_source;
1125 u32 interrupts[1]; 1228 u32 interrupts[1];
1126}; 1229};
1127 1230
1231struct acpi_resource_generic_register {
1232 u8 space_id;
1233 u8 bit_width;
1234 u8 bit_offset;
1235 u8 access_size;
1236 u64 address;
1237};
1238
1128/* ACPI_RESOURCE_TYPEs */ 1239/* ACPI_RESOURCE_TYPEs */
1129 1240
1130#define ACPI_RSTYPE_IRQ 0 1241#define ACPI_RESOURCE_TYPE_IRQ 0
1131#define ACPI_RSTYPE_DMA 1 1242#define ACPI_RESOURCE_TYPE_DMA 1
1132#define ACPI_RSTYPE_START_DPF 2 1243#define ACPI_RESOURCE_TYPE_START_DEPENDENT 2
1133#define ACPI_RSTYPE_END_DPF 3 1244#define ACPI_RESOURCE_TYPE_END_DEPENDENT 3
1134#define ACPI_RSTYPE_IO 4 1245#define ACPI_RESOURCE_TYPE_IO 4
1135#define ACPI_RSTYPE_FIXED_IO 5 1246#define ACPI_RESOURCE_TYPE_FIXED_IO 5
1136#define ACPI_RSTYPE_VENDOR 6 1247#define ACPI_RESOURCE_TYPE_VENDOR 6
1137#define ACPI_RSTYPE_END_TAG 7 1248#define ACPI_RESOURCE_TYPE_END_TAG 7
1138#define ACPI_RSTYPE_MEM24 8 1249#define ACPI_RESOURCE_TYPE_MEMORY24 8
1139#define ACPI_RSTYPE_MEM32 9 1250#define ACPI_RESOURCE_TYPE_MEMORY32 9
1140#define ACPI_RSTYPE_FIXED_MEM32 10 1251#define ACPI_RESOURCE_TYPE_FIXED_MEMORY32 10
1141#define ACPI_RSTYPE_ADDRESS16 11 1252#define ACPI_RESOURCE_TYPE_ADDRESS16 11
1142#define ACPI_RSTYPE_ADDRESS32 12 1253#define ACPI_RESOURCE_TYPE_ADDRESS32 12
1143#define ACPI_RSTYPE_ADDRESS64 13 1254#define ACPI_RESOURCE_TYPE_ADDRESS64 13
1144#define ACPI_RSTYPE_EXT_IRQ 14 1255#define ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 14 /* ACPI 3.0 */
1145 1256#define ACPI_RESOURCE_TYPE_EXTENDED_IRQ 15
1146typedef u32 acpi_resource_type; 1257#define ACPI_RESOURCE_TYPE_GENERIC_REGISTER 16
1258#define ACPI_RESOURCE_TYPE_MAX 16
1147 1259
1148union acpi_resource_data { 1260union acpi_resource_data {
1149 struct acpi_resource_irq irq; 1261 struct acpi_resource_irq irq;
1150 struct acpi_resource_dma dma; 1262 struct acpi_resource_dma dma;
1151 struct acpi_resource_start_dpf start_dpf; 1263 struct acpi_resource_start_dependent start_dpf;
1152 struct acpi_resource_io io; 1264 struct acpi_resource_io io;
1153 struct acpi_resource_fixed_io fixed_io; 1265 struct acpi_resource_fixed_io fixed_io;
1154 struct acpi_resource_vendor vendor_specific; 1266 struct acpi_resource_vendor vendor;
1267 struct acpi_resource_vendor_typed vendor_typed;
1155 struct acpi_resource_end_tag end_tag; 1268 struct acpi_resource_end_tag end_tag;
1156 struct acpi_resource_mem24 memory24; 1269 struct acpi_resource_memory24 memory24;
1157 struct acpi_resource_mem32 memory32; 1270 struct acpi_resource_memory32 memory32;
1158 struct acpi_resource_fixed_mem32 fixed_memory32; 1271 struct acpi_resource_fixed_memory32 fixed_memory32;
1159 struct acpi_resource_address address; /* Common 16/32/64 address fields */
1160 struct acpi_resource_address16 address16; 1272 struct acpi_resource_address16 address16;
1161 struct acpi_resource_address32 address32; 1273 struct acpi_resource_address32 address32;
1162 struct acpi_resource_address64 address64; 1274 struct acpi_resource_address64 address64;
1163 struct acpi_resource_ext_irq extended_irq; 1275 struct acpi_resource_extended_address64 ext_address64;
1276 struct acpi_resource_extended_irq extended_irq;
1277 struct acpi_resource_generic_register generic_reg;
1278
1279 /* Common fields */
1280
1281 struct acpi_resource_address address; /* Common 16/32/64 address fields */
1164}; 1282};
1165 1283
1166struct acpi_resource { 1284struct acpi_resource {
1167 acpi_resource_type id; 1285 u32 type;
1168 u32 length; 1286 u32 length;
1169 union acpi_resource_data data; 1287 union acpi_resource_data data;
1170}; 1288};
1171 1289
1172#define ACPI_RESOURCE_LENGTH 12 1290/* restore default alignment */
1173#define ACPI_RESOURCE_LENGTH_NO_DATA 8 /* Id + Length fields */ 1291
1292#pragma pack()
1174 1293
1175#define ACPI_SIZEOF_RESOURCE(type) (ACPI_RESOURCE_LENGTH_NO_DATA + sizeof (type)) 1294#define ACPI_RS_SIZE_MIN 12
1295#define ACPI_RS_SIZE_NO_DATA 8 /* Id + Length fields */
1296#define ACPI_RS_SIZE(type) (u32) (ACPI_RS_SIZE_NO_DATA + sizeof (type))
1176 1297
1177#define ACPI_NEXT_RESOURCE(res) (struct acpi_resource *)((u8 *) res + res->length) 1298#define ACPI_NEXT_RESOURCE(res) (struct acpi_resource *)((u8 *) res + res->length)
1178 1299
1179#ifdef ACPI_MISALIGNED_TRANSFERS 1300#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
1180#define ACPI_ALIGN_RESOURCE_SIZE(length) (length) 1301#define ACPI_ALIGN_RESOURCE_SIZE(length) (length)
1181#else 1302#else
1182#define ACPI_ALIGN_RESOURCE_SIZE(length) ACPI_ROUND_UP_TO_NATIVE_WORD(length) 1303#define ACPI_ALIGN_RESOURCE_SIZE(length) ACPI_ROUND_UP_TO_NATIVE_WORD(length)
diff --git a/include/acpi/acutils.h b/include/acpi/acutils.h
index c1086452696e..0927765df6aa 100644
--- a/include/acpi/acutils.h
+++ b/include/acpi/acutils.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -44,6 +44,39 @@
44#ifndef _ACUTILS_H 44#ifndef _ACUTILS_H
45#define _ACUTILS_H 45#define _ACUTILS_H
46 46
47extern const u8 acpi_gbl_resource_aml_sizes[];
48
49/* Strings used by the disassembler and debugger resource dump routines */
50
51#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
52
53extern const char *acpi_gbl_BMdecode[2];
54extern const char *acpi_gbl_config_decode[4];
55extern const char *acpi_gbl_consume_decode[2];
56extern const char *acpi_gbl_DECdecode[2];
57extern const char *acpi_gbl_HEdecode[2];
58extern const char *acpi_gbl_io_decode[2];
59extern const char *acpi_gbl_LLdecode[2];
60extern const char *acpi_gbl_max_decode[2];
61extern const char *acpi_gbl_MEMdecode[4];
62extern const char *acpi_gbl_min_decode[2];
63extern const char *acpi_gbl_MTPdecode[4];
64extern const char *acpi_gbl_RNGdecode[4];
65extern const char *acpi_gbl_RWdecode[2];
66extern const char *acpi_gbl_SHRdecode[2];
67extern const char *acpi_gbl_SIZdecode[4];
68extern const char *acpi_gbl_TRSdecode[2];
69extern const char *acpi_gbl_TTPdecode[2];
70extern const char *acpi_gbl_TYPdecode[4];
71#endif
72
73/* Types for Resource descriptor entries */
74
75#define ACPI_INVALID_RESOURCE 0
76#define ACPI_FIXED_LENGTH 1
77#define ACPI_VARIABLE_LENGTH 2
78#define ACPI_SMALL_VARIABLE_LENGTH 3
79
47typedef 80typedef
48acpi_status(*acpi_pkg_callback) (u8 object_type, 81acpi_status(*acpi_pkg_callback) (u8 object_type,
49 union acpi_operand_object * source_object, 82 union acpi_operand_object * source_object,
@@ -159,7 +192,6 @@ extern const u8 _acpi_ctype[];
159#define ACPI_IS_LOWER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO)) 192#define ACPI_IS_LOWER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO))
160#define ACPI_IS_PRINT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_SP | _ACPI_PU)) 193#define ACPI_IS_PRINT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_SP | _ACPI_PU))
161#define ACPI_IS_ALPHA(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP)) 194#define ACPI_IS_ALPHA(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP))
162#define ACPI_IS_ASCII(c) ((c) < 0x80)
163 195
164#endif /* ACPI_USE_SYSTEM_CLIBRARY */ 196#endif /* ACPI_USE_SYSTEM_CLIBRARY */
165 197
@@ -243,21 +275,22 @@ acpi_ut_ptr_exit(u32 line_number,
243 const char *function_name, 275 const char *function_name,
244 char *module_name, u32 component_id, u8 * ptr); 276 char *module_name, u32 component_id, u8 * ptr);
245 277
246void acpi_ut_report_info(char *module_name, u32 line_number, u32 component_id); 278void acpi_ut_dump_buffer(u8 * buffer, u32 count, u32 display, u32 component_id);
247 279
248void acpi_ut_report_error(char *module_name, u32 line_number, u32 component_id); 280void acpi_ut_report_error(char *module_name, u32 line_number);
249 281
250void 282void acpi_ut_report_info(char *module_name, u32 line_number);
251acpi_ut_report_warning(char *module_name, u32 line_number, u32 component_id);
252 283
253void acpi_ut_dump_buffer(u8 * buffer, u32 count, u32 display, u32 component_id); 284void acpi_ut_report_warning(char *module_name, u32 line_number);
285
286/* Error and message reporting interfaces */
254 287
255void ACPI_INTERNAL_VAR_XFACE 288void ACPI_INTERNAL_VAR_XFACE
256acpi_ut_debug_print(u32 requested_debug_level, 289acpi_ut_debug_print(u32 requested_debug_level,
257 u32 line_number, 290 u32 line_number,
258 const char *function_name, 291 const char *function_name,
259 char *module_name, 292 char *module_name,
260 u32 component_id, char *format, ...) ACPI_PRINTF_LIKE_FUNC; 293 u32 component_id, char *format, ...) ACPI_PRINTF_LIKE(6);
261 294
262void ACPI_INTERNAL_VAR_XFACE 295void ACPI_INTERNAL_VAR_XFACE
263acpi_ut_debug_print_raw(u32 requested_debug_level, 296acpi_ut_debug_print_raw(u32 requested_debug_level,
@@ -265,7 +298,24 @@ acpi_ut_debug_print_raw(u32 requested_debug_level,
265 const char *function_name, 298 const char *function_name,
266 char *module_name, 299 char *module_name,
267 u32 component_id, 300 u32 component_id,
268 char *format, ...) ACPI_PRINTF_LIKE_FUNC; 301 char *format, ...) ACPI_PRINTF_LIKE(6);
302
303void ACPI_INTERNAL_VAR_XFACE
304acpi_ut_error(char *module_name,
305 u32 line_number, char *format, ...) ACPI_PRINTF_LIKE(3);
306
307void ACPI_INTERNAL_VAR_XFACE
308acpi_ut_exception(char *module_name,
309 u32 line_number,
310 acpi_status status, char *format, ...) ACPI_PRINTF_LIKE(4);
311
312void ACPI_INTERNAL_VAR_XFACE
313acpi_ut_warning(char *module_name,
314 u32 line_number, char *format, ...) ACPI_PRINTF_LIKE(3);
315
316void ACPI_INTERNAL_VAR_XFACE
317acpi_ut_info(char *module_name,
318 u32 line_number, char *format, ...) ACPI_PRINTF_LIKE(3);
269 319
270/* 320/*
271 * utdelete - Object deletion and reference counts 321 * utdelete - Object deletion and reference counts
@@ -419,7 +469,19 @@ acpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer);
419 469
420#define ACPI_ANY_BASE 0 470#define ACPI_ANY_BASE 0
421 471
422u8 *acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc); 472acpi_status acpi_ut_validate_resource(void *aml, u8 * return_index);
473
474u32 acpi_ut_get_descriptor_length(void *aml);
475
476u16 acpi_ut_get_resource_length(void *aml);
477
478u8 acpi_ut_get_resource_header_length(void *aml);
479
480u8 acpi_ut_get_resource_type(void *aml);
481
482acpi_status
483acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc,
484 u8 ** end_tag);
423 485
424u8 acpi_ut_generate_checksum(u8 * buffer, u32 length); 486u8 acpi_ut_generate_checksum(u8 * buffer, u32 length);
425 487
diff --git a/include/acpi/amlcode.h b/include/acpi/amlcode.h
index 7fdf5299f501..37964a59aef8 100644
--- a/include/acpi/amlcode.h
+++ b/include/acpi/amlcode.h
@@ -7,7 +7,7 @@
7 *****************************************************************************/ 7 *****************************************************************************/
8 8
9/* 9/*
10 * Copyright (C) 2000 - 2005, R. Byron Moore 10 * Copyright (C) 2000 - 2006, R. Byron Moore
11 * All rights reserved. 11 * All rights reserved.
12 * 12 *
13 * Redistribution and use in source and binary forms, with or without 13 * Redistribution and use in source and binary forms, with or without
diff --git a/include/acpi/amlresrc.h b/include/acpi/amlresrc.h
index 051786e4b210..fb4735315ad3 100644
--- a/include/acpi/amlresrc.h
+++ b/include/acpi/amlresrc.h
@@ -6,7 +6,7 @@
6 *****************************************************************************/ 6 *****************************************************************************/
7 7
8/* 8/*
9 * Copyright (C) 2000 - 2005, R. Byron Moore 9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved. 10 * All rights reserved.
11 * 11 *
12 * Redistribution and use in source and binary forms, with or without 12 * Redistribution and use in source and binary forms, with or without
@@ -92,182 +92,168 @@ struct asl_resource_node {
92 struct asl_resource_node *next; 92 struct asl_resource_node *next;
93}; 93};
94 94
95/* Macros used to generate AML resource length fields */
96
97#define ACPI_AML_SIZE_LARGE(r) (sizeof (r) - sizeof (struct aml_resource_large_header))
98#define ACPI_AML_SIZE_SMALL(r) (sizeof (r) - sizeof (struct aml_resource_small_header))
99
95/* 100/*
96 * Resource descriptors defined in the ACPI specification. 101 * Resource descriptors defined in the ACPI specification.
97 * 102 *
98 * Packing/alignment must be BYTE because these descriptors 103 * Packing/alignment must be BYTE because these descriptors
99 * are used to overlay the AML byte stream. 104 * are used to overlay the raw AML byte stream.
100 */ 105 */
101#pragma pack(1) 106#pragma pack(1)
102 107
103struct asl_irq_format_desc { 108/*
104 u8 descriptor_type; 109 * SMALL descriptors
105 u16 irq_mask; 110 */
111#define AML_RESOURCE_SMALL_HEADER_COMMON \
112 u8 descriptor_type;
113
114struct aml_resource_small_header {
115AML_RESOURCE_SMALL_HEADER_COMMON};
116
117struct aml_resource_irq {
118 AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask;
106 u8 flags; 119 u8 flags;
107}; 120};
108 121
109struct asl_irq_noflags_desc { 122struct aml_resource_irq_noflags {
110 u8 descriptor_type; 123 AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask;
111 u16 irq_mask;
112}; 124};
113 125
114struct asl_dma_format_desc { 126struct aml_resource_dma {
115 u8 descriptor_type; 127 AML_RESOURCE_SMALL_HEADER_COMMON u8 dma_channel_mask;
116 u8 dma_channel_mask;
117 u8 flags; 128 u8 flags;
118}; 129};
119 130
120struct asl_start_dependent_desc { 131struct aml_resource_start_dependent {
121 u8 descriptor_type; 132 AML_RESOURCE_SMALL_HEADER_COMMON u8 flags;
122 u8 flags;
123}; 133};
124 134
125struct asl_start_dependent_noprio_desc { 135struct aml_resource_start_dependent_noprio {
126 u8 descriptor_type; 136AML_RESOURCE_SMALL_HEADER_COMMON};
127};
128 137
129struct asl_end_dependent_desc { 138struct aml_resource_end_dependent {
130 u8 descriptor_type; 139AML_RESOURCE_SMALL_HEADER_COMMON};
131};
132 140
133struct asl_io_port_desc { 141struct aml_resource_io {
134 u8 descriptor_type; 142 AML_RESOURCE_SMALL_HEADER_COMMON u8 flags;
135 u8 information; 143 u16 minimum;
136 u16 address_min; 144 u16 maximum;
137 u16 address_max;
138 u8 alignment; 145 u8 alignment;
139 u8 length; 146 u8 address_length;
140}; 147};
141 148
142struct asl_fixed_io_port_desc { 149struct aml_resource_fixed_io {
143 u8 descriptor_type; 150 AML_RESOURCE_SMALL_HEADER_COMMON u16 address;
144 u16 base_address; 151 u8 address_length;
145 u8 length;
146}; 152};
147 153
148struct asl_small_vendor_desc { 154struct aml_resource_vendor_small {
149 u8 descriptor_type; 155AML_RESOURCE_SMALL_HEADER_COMMON};
150 u8 vendor_defined[7];
151};
152 156
153struct asl_end_tag_desc { 157struct aml_resource_end_tag {
154 u8 descriptor_type; 158 AML_RESOURCE_SMALL_HEADER_COMMON u8 checksum;
155 u8 checksum;
156}; 159};
157 160
158/* LARGE descriptors */ 161/*
162 * LARGE descriptors
163 */
164#define AML_RESOURCE_LARGE_HEADER_COMMON \
165 u8 descriptor_type;\
166 u16 resource_length;
167
168struct aml_resource_large_header {
169AML_RESOURCE_LARGE_HEADER_COMMON};
159 170
160struct asl_memory_24_desc { 171struct aml_resource_memory24 {
161 u8 descriptor_type; 172 AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
162 u16 length; 173 u16 minimum;
163 u8 information; 174 u16 maximum;
164 u16 address_min;
165 u16 address_max;
166 u16 alignment; 175 u16 alignment;
167 u16 range_length; 176 u16 address_length;
168}; 177};
169 178
170struct asl_large_vendor_desc { 179struct aml_resource_vendor_large {
171 u8 descriptor_type; 180AML_RESOURCE_LARGE_HEADER_COMMON};
172 u16 length;
173 u8 vendor_defined[1];
174};
175 181
176struct asl_memory_32_desc { 182struct aml_resource_memory32 {
177 u8 descriptor_type; 183 AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
178 u16 length; 184 u32 minimum;
179 u8 information; 185 u32 maximum;
180 u32 address_min;
181 u32 address_max;
182 u32 alignment; 186 u32 alignment;
183 u32 range_length; 187 u32 address_length;
184}; 188};
185 189
186struct asl_fixed_memory_32_desc { 190struct aml_resource_fixed_memory32 {
187 u8 descriptor_type; 191 AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
188 u16 length; 192 u32 address;
189 u8 information; 193 u32 address_length;
190 u32 base_address;
191 u32 range_length;
192}; 194};
193 195
194struct asl_extended_address_desc { 196#define AML_RESOURCE_ADDRESS_COMMON \
195 u8 descriptor_type; 197 u8 resource_type; \
196 u16 length; 198 u8 flags; \
197 u8 resource_type; 199 u8 specific_flags;
198 u8 flags; 200
199 u8 specific_flags; 201struct aml_resource_address {
200 u8 revision_iD; 202AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_ADDRESS_COMMON};
203
204struct aml_resource_extended_address64 {
205 AML_RESOURCE_LARGE_HEADER_COMMON
206 AML_RESOURCE_ADDRESS_COMMON u8 revision_iD;
201 u8 reserved; 207 u8 reserved;
202 u64 granularity; 208 u64 granularity;
203 u64 address_min; 209 u64 minimum;
204 u64 address_max; 210 u64 maximum;
205 u64 translation_offset; 211 u64 translation_offset;
206 u64 address_length; 212 u64 address_length;
207 u64 type_specific_attributes; 213 u64 type_specific;
208 u8 optional_fields[2]; /* Used for length calculation only */
209}; 214};
210 215
211#define ASL_EXTENDED_ADDRESS_DESC_REVISION 1 /* ACPI 3.0 */ 216#define AML_RESOURCE_EXTENDED_ADDRESS_REVISION 1 /* ACPI 3.0 */
212 217
213struct asl_qword_address_desc { 218struct aml_resource_address64 {
214 u8 descriptor_type; 219 AML_RESOURCE_LARGE_HEADER_COMMON
215 u16 length; 220 AML_RESOURCE_ADDRESS_COMMON u64 granularity;
216 u8 resource_type; 221 u64 minimum;
217 u8 flags; 222 u64 maximum;
218 u8 specific_flags;
219 u64 granularity;
220 u64 address_min;
221 u64 address_max;
222 u64 translation_offset; 223 u64 translation_offset;
223 u64 address_length; 224 u64 address_length;
224 u8 optional_fields[2];
225}; 225};
226 226
227struct asl_dword_address_desc { 227struct aml_resource_address32 {
228 u8 descriptor_type; 228 AML_RESOURCE_LARGE_HEADER_COMMON
229 u16 length; 229 AML_RESOURCE_ADDRESS_COMMON u32 granularity;
230 u8 resource_type; 230 u32 minimum;
231 u8 flags; 231 u32 maximum;
232 u8 specific_flags;
233 u32 granularity;
234 u32 address_min;
235 u32 address_max;
236 u32 translation_offset; 232 u32 translation_offset;
237 u32 address_length; 233 u32 address_length;
238 u8 optional_fields[2];
239}; 234};
240 235
241struct asl_word_address_desc { 236struct aml_resource_address16 {
242 u8 descriptor_type; 237 AML_RESOURCE_LARGE_HEADER_COMMON
243 u16 length; 238 AML_RESOURCE_ADDRESS_COMMON u16 granularity;
244 u8 resource_type; 239 u16 minimum;
245 u8 flags; 240 u16 maximum;
246 u8 specific_flags;
247 u16 granularity;
248 u16 address_min;
249 u16 address_max;
250 u16 translation_offset; 241 u16 translation_offset;
251 u16 address_length; 242 u16 address_length;
252 u8 optional_fields[2];
253}; 243};
254 244
255struct asl_extended_xrupt_desc { 245struct aml_resource_extended_irq {
256 u8 descriptor_type; 246 AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
257 u16 length; 247 u8 interrupt_count;
258 u8 flags; 248 u32 interrupts[1];
259 u8 table_length;
260 u32 interrupt_number[1];
261 /* res_source_index, res_source optional fields follow */ 249 /* res_source_index, res_source optional fields follow */
262}; 250};
263 251
264struct asl_general_register_desc { 252struct aml_resource_generic_register {
265 u8 descriptor_type; 253 AML_RESOURCE_LARGE_HEADER_COMMON u8 address_space_id;
266 u16 length;
267 u8 address_space_id;
268 u8 bit_width; 254 u8 bit_width;
269 u8 bit_offset; 255 u8 bit_offset;
270 u8 access_size; /* ACPI 3.0, was Reserved */ 256 u8 access_size; /* ACPI 3.0, was previously Reserved */
271 u64 address; 257 u64 address;
272}; 258};
273 259
@@ -277,26 +263,39 @@ struct asl_general_register_desc {
277 263
278/* Union of all resource descriptors, so we can allocate the worst case */ 264/* Union of all resource descriptors, so we can allocate the worst case */
279 265
280union asl_resource_desc { 266union aml_resource {
281 struct asl_irq_format_desc irq; 267 /* Descriptor headers */
282 struct asl_dma_format_desc dma; 268
283 struct asl_start_dependent_desc std; 269 struct aml_resource_small_header small_header;
284 struct asl_end_dependent_desc end; 270 struct aml_resource_large_header large_header;
285 struct asl_io_port_desc iop; 271
286 struct asl_fixed_io_port_desc fio; 272 /* Small resource descriptors */
287 struct asl_small_vendor_desc smv; 273
288 struct asl_end_tag_desc et; 274 struct aml_resource_irq irq;
289 275 struct aml_resource_dma dma;
290 struct asl_memory_24_desc M24; 276 struct aml_resource_start_dependent start_dpf;
291 struct asl_large_vendor_desc lgv; 277 struct aml_resource_end_dependent end_dpf;
292 struct asl_memory_32_desc M32; 278 struct aml_resource_io io;
293 struct asl_fixed_memory_32_desc F32; 279 struct aml_resource_fixed_io fixed_io;
294 struct asl_qword_address_desc qas; 280 struct aml_resource_vendor_small vendor_small;
295 struct asl_dword_address_desc das; 281 struct aml_resource_end_tag end_tag;
296 struct asl_word_address_desc was; 282
297 struct asl_extended_address_desc eas; 283 /* Large resource descriptors */
298 struct asl_extended_xrupt_desc exx; 284
299 struct asl_general_register_desc grg; 285 struct aml_resource_memory24 memory24;
286 struct aml_resource_generic_register generic_reg;
287 struct aml_resource_vendor_large vendor_large;
288 struct aml_resource_memory32 memory32;
289 struct aml_resource_fixed_memory32 fixed_memory32;
290 struct aml_resource_address16 address16;
291 struct aml_resource_address32 address32;
292 struct aml_resource_address64 address64;
293 struct aml_resource_extended_address64 ext_address64;
294 struct aml_resource_extended_irq extended_irq;
295
296 /* Utility overlays */
297
298 struct aml_resource_address address;
300 u32 u32_item; 299 u32 u32_item;
301 u16 u16_item; 300 u16 u16_item;
302 u8 U8item; 301 u8 U8item;
diff --git a/include/acpi/pdc_intel.h b/include/acpi/pdc_intel.h
index 91f4a12a99a1..3fa81d55cd0c 100644
--- a/include/acpi/pdc_intel.h
+++ b/include/acpi/pdc_intel.h
@@ -15,9 +15,7 @@
15#define ACPI_PDC_C_C1_FFH (0x0100) 15#define ACPI_PDC_C_C1_FFH (0x0100)
16 16
17#define ACPI_PDC_EST_CAPABILITY_SMP (ACPI_PDC_SMP_C1PT | \ 17#define ACPI_PDC_EST_CAPABILITY_SMP (ACPI_PDC_SMP_C1PT | \
18 ACPI_PDC_C_C1_HALT) 18 ACPI_PDC_C_C1_HALT | \
19
20#define ACPI_PDC_EST_CAPABILITY_SMP_MSR (ACPI_PDC_EST_CAPABILITY_SMP | \
21 ACPI_PDC_P_FFH) 19 ACPI_PDC_P_FFH)
22 20
23#define ACPI_PDC_C_CAPABILITY_SMP (ACPI_PDC_SMP_C2C3 | \ 21#define ACPI_PDC_C_CAPABILITY_SMP (ACPI_PDC_SMP_C2C3 | \
diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h
index 16609c1ab2eb..223ec6467108 100644
--- a/include/acpi/platform/acenv.h
+++ b/include/acpi/platform/acenv.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -68,6 +68,7 @@
68#define ACPI_APPLICATION 68#define ACPI_APPLICATION
69#define ACPI_DEBUGGER 69#define ACPI_DEBUGGER
70#define ACPI_DISASSEMBLER 70#define ACPI_DISASSEMBLER
71#define ACPI_MUTEX_DEBUG
71#endif 72#endif
72 73
73#ifdef ACPI_ASL_COMPILER 74#ifdef ACPI_ASL_COMPILER
@@ -148,6 +149,9 @@
148#elif defined(NETWARE) 149#elif defined(NETWARE)
149#include "acnetware.h" 150#include "acnetware.h"
150 151
152#elif defined(__sun)
153#include "acsolaris.h"
154
151#else 155#else
152 156
153/* All other environments */ 157/* All other environments */
@@ -157,13 +161,6 @@
157#define COMPILER_DEPENDENT_INT64 long long 161#define COMPILER_DEPENDENT_INT64 long long
158#define COMPILER_DEPENDENT_UINT64 unsigned long long 162#define COMPILER_DEPENDENT_UINT64 unsigned long long
159 163
160/*
161 * This macro is used to tag functions as "printf-like" because
162 * some compilers can catch printf format string problems. MSVC
163 * doesn't, so this is proprocessed away.
164 */
165#define ACPI_PRINTF_LIKE_FUNC
166
167#endif 164#endif
168 165
169/* 166/*
@@ -205,6 +202,8 @@
205 * 202 *
206 *****************************************************************************/ 203 *****************************************************************************/
207 204
205#define ACPI_IS_ASCII(c) ((c) < 0x80)
206
208#ifdef ACPI_USE_SYSTEM_CLIBRARY 207#ifdef ACPI_USE_SYSTEM_CLIBRARY
209/* 208/*
210 * Use the standard C library headers. 209 * Use the standard C library headers.
@@ -234,7 +233,7 @@
234#define ACPI_STRCAT(d,s) (void) strcat((d), (s)) 233#define ACPI_STRCAT(d,s) (void) strcat((d), (s))
235#define ACPI_STRNCAT(d,s,n) strncat((d), (s), (acpi_size)(n)) 234#define ACPI_STRNCAT(d,s,n) strncat((d), (s), (acpi_size)(n))
236#define ACPI_STRTOUL(d,s,n) strtoul((d), (s), (acpi_size)(n)) 235#define ACPI_STRTOUL(d,s,n) strtoul((d), (s), (acpi_size)(n))
237#define ACPI_MEMCMP(s1,s2,n) memcmp((s1), (s2), (acpi_size)(n)) 236#define ACPI_MEMCMP(s1,s2,n) memcmp((const char *)(s1), (const char *)(s2), (acpi_size)(n))
238#define ACPI_MEMCPY(d,s,n) (void) memcpy((d), (s), (acpi_size)(n)) 237#define ACPI_MEMCPY(d,s,n) (void) memcpy((d), (s), (acpi_size)(n))
239#define ACPI_MEMSET(d,s,n) (void) memset((d), (s), (acpi_size)(n)) 238#define ACPI_MEMSET(d,s,n) (void) memset((d), (s), (acpi_size)(n))
240 239
@@ -246,7 +245,6 @@
246#define ACPI_IS_UPPER(i) isupper((int) (i)) 245#define ACPI_IS_UPPER(i) isupper((int) (i))
247#define ACPI_IS_PRINT(i) isprint((int) (i)) 246#define ACPI_IS_PRINT(i) isprint((int) (i))
248#define ACPI_IS_ALPHA(i) isalpha((int) (i)) 247#define ACPI_IS_ALPHA(i) isalpha((int) (i))
249#define ACPI_IS_ASCII(i) isascii((int) (i))
250 248
251#else 249#else
252 250
@@ -273,8 +271,8 @@ typedef char *va_list;
273/* 271/*
274 * Storage alignment properties 272 * Storage alignment properties
275 */ 273 */
276#define _AUPBND (sizeof (acpi_native_int) - 1) 274#define _AUPBND (sizeof (acpi_native_uint) - 1)
277#define _ADNBND (sizeof (acpi_native_int) - 1) 275#define _ADNBND (sizeof (acpi_native_uint) - 1)
278 276
279/* 277/*
280 * Variable argument list macro definitions 278 * Variable argument list macro definitions
@@ -296,7 +294,7 @@ typedef char *va_list;
296#define ACPI_STRCAT(d,s) (void) acpi_ut_strcat ((d), (s)) 294#define ACPI_STRCAT(d,s) (void) acpi_ut_strcat ((d), (s))
297#define ACPI_STRNCAT(d,s,n) acpi_ut_strncat ((d), (s), (acpi_size)(n)) 295#define ACPI_STRNCAT(d,s,n) acpi_ut_strncat ((d), (s), (acpi_size)(n))
298#define ACPI_STRTOUL(d,s,n) acpi_ut_strtoul ((d), (s), (acpi_size)(n)) 296#define ACPI_STRTOUL(d,s,n) acpi_ut_strtoul ((d), (s), (acpi_size)(n))
299#define ACPI_MEMCMP(s1,s2,n) acpi_ut_memcmp((s1), (s2), (acpi_size)(n)) 297#define ACPI_MEMCMP(s1,s2,n) acpi_ut_memcmp((const char *)(s1), (const char *)(s2), (acpi_size)(n))
300#define ACPI_MEMCPY(d,s,n) (void) acpi_ut_memcpy ((d), (s), (acpi_size)(n)) 298#define ACPI_MEMCPY(d,s,n) (void) acpi_ut_memcpy ((d), (s), (acpi_size)(n))
301#define ACPI_MEMSET(d,v,n) (void) acpi_ut_memset ((d), (v), (acpi_size)(n)) 299#define ACPI_MEMSET(d,v,n) (void) acpi_ut_memset ((d), (v), (acpi_size)(n))
302#define ACPI_TOUPPER acpi_ut_to_upper 300#define ACPI_TOUPPER acpi_ut_to_upper
diff --git a/include/acpi/platform/acgcc.h b/include/acpi/platform/acgcc.h
index 4c0e0ba09ba0..da80933963db 100644
--- a/include/acpi/platform/acgcc.h
+++ b/include/acpi/platform/acgcc.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -48,12 +48,14 @@
48 48
49#define ACPI_GET_FUNCTION_NAME __FUNCTION__ 49#define ACPI_GET_FUNCTION_NAME __FUNCTION__
50 50
51/* This macro is used to tag functions as "printf-like" because 51/*
52 * This macro is used to tag functions as "printf-like" because
52 * some compilers (like GCC) can catch printf format string problems. 53 * some compilers (like GCC) can catch printf format string problems.
53 */ 54 */
54#define ACPI_PRINTF_LIKE_FUNC __attribute__ ((__format__ (__printf__, 6, 7))) 55#define ACPI_PRINTF_LIKE(c) __attribute__ ((__format__ (__printf__, c, c+1)))
55 56
56/* Some compilers complain about unused variables. Sometimes we don't want to 57/*
58 * Some compilers complain about unused variables. Sometimes we don't want to
57 * use all the variables (for example, _acpi_module_name). This allows us 59 * use all the variables (for example, _acpi_module_name). This allows us
58 * to to tell the compiler warning in a per-variable manner that a variable 60 * to to tell the compiler warning in a per-variable manner that a variable
59 * is unused. 61 * is unused.
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h
index c93e6562f0e1..2e6d54569ee8 100644
--- a/include/acpi/platform/aclinux.h
+++ b/include/acpi/platform/aclinux.h
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -71,6 +71,10 @@
71#define acpi_cache_t kmem_cache_t 71#define acpi_cache_t kmem_cache_t
72#endif 72#endif
73 73
74/* Full namespace pathname length limit - arbitrary */
75
76#define ACPI_PATHNAME_MAX 256
77
74#else /* !__KERNEL__ */ 78#else /* !__KERNEL__ */
75 79
76#include <stdarg.h> 80#include <stdarg.h>
@@ -98,4 +102,6 @@
98 102
99#include "acgcc.h" 103#include "acgcc.h"
100 104
105#define acpi_cpu_flags unsigned long
106
101#endif /* __ACLINUX_H__ */ 107#endif /* __ACLINUX_H__ */
diff --git a/include/acpi/processor.h b/include/acpi/processor.h
index 7a00d5089de9..badf0277b1be 100644
--- a/include/acpi/processor.h
+++ b/include/acpi/processor.h
@@ -62,9 +62,6 @@ struct acpi_processor_power {
62 u32 bm_activity; 62 u32 bm_activity;
63 int count; 63 int count;
64 struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER]; 64 struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER];
65
66 /* the _PDC objects passed by the driver, if any */
67 struct acpi_object_list *pdc;
68}; 65};
69 66
70/* Performance Management */ 67/* Performance Management */
@@ -96,8 +93,6 @@ struct acpi_processor_performance {
96 unsigned int state_count; 93 unsigned int state_count;
97 struct acpi_processor_px *states; 94 struct acpi_processor_px *states;
98 95
99 /* the _PDC objects passed by the driver, if any */
100 struct acpi_object_list *pdc;
101}; 96};
102 97
103/* Throttling Control */ 98/* Throttling Control */
@@ -151,6 +146,9 @@ struct acpi_processor {
151 struct acpi_processor_performance *performance; 146 struct acpi_processor_performance *performance;
152 struct acpi_processor_throttling throttling; 147 struct acpi_processor_throttling throttling;
153 struct acpi_processor_limit limit; 148 struct acpi_processor_limit limit;
149
150 /* the _PDC objects for this processor, if any */
151 struct acpi_object_list *pdc;
154}; 152};
155 153
156struct acpi_processor_errata { 154struct acpi_processor_errata {
@@ -178,22 +176,12 @@ int acpi_processor_notify_smm(struct module *calling_module);
178extern struct acpi_processor *processors[NR_CPUS]; 176extern struct acpi_processor *processors[NR_CPUS];
179extern struct acpi_processor_errata errata; 177extern struct acpi_processor_errata errata;
180 178
181int acpi_processor_set_pdc(struct acpi_processor *pr, 179void arch_acpi_processor_init_pdc(struct acpi_processor *pr);
182 struct acpi_object_list *pdc_in);
183 180
184#ifdef ARCH_HAS_POWER_PDC_INIT 181#ifdef ARCH_HAS_POWER_INIT
185void acpi_processor_power_init_pdc(struct acpi_processor_power *pow,
186 unsigned int cpu);
187void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags, 182void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags,
188 unsigned int cpu); 183 unsigned int cpu);
189#else 184#else
190static inline void acpi_processor_power_init_pdc(struct acpi_processor_power
191 *pow, unsigned int cpu)
192{
193 pow->pdc = NULL;
194 return;
195}
196
197static inline void acpi_processor_power_init_bm_check(struct 185static inline void acpi_processor_power_init_bm_check(struct
198 acpi_processor_flags 186 acpi_processor_flags
199 *flags, unsigned int cpu) 187 *flags, unsigned int cpu)
@@ -235,9 +223,6 @@ static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr)
235/* in processor_throttling.c */ 223/* in processor_throttling.c */
236int acpi_processor_get_throttling_info(struct acpi_processor *pr); 224int acpi_processor_get_throttling_info(struct acpi_processor *pr);
237int acpi_processor_set_throttling(struct acpi_processor *pr, int state); 225int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
238ssize_t acpi_processor_write_throttling(struct file *file,
239 const char __user * buffer,
240 size_t count, loff_t * data);
241extern struct file_operations acpi_processor_throttling_fops; 226extern struct file_operations acpi_processor_throttling_fops;
242 227
243/* in processor_idle.c */ 228/* in processor_idle.c */
@@ -249,9 +234,6 @@ int acpi_processor_power_exit(struct acpi_processor *pr,
249 234
250/* in processor_thermal.c */ 235/* in processor_thermal.c */
251int acpi_processor_get_limit_info(struct acpi_processor *pr); 236int acpi_processor_get_limit_info(struct acpi_processor *pr);
252ssize_t acpi_processor_write_limit(struct file *file,
253 const char __user * buffer,
254 size_t count, loff_t * data);
255extern struct file_operations acpi_processor_limit_fops; 237extern struct file_operations acpi_processor_limit_fops;
256 238
257#ifdef CONFIG_CPU_FREQ 239#ifdef CONFIG_CPU_FREQ
diff --git a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h
index df4ed323aa4d..55059abf9c95 100644
--- a/include/asm-i386/acpi.h
+++ b/include/asm-i386/acpi.h
@@ -179,7 +179,7 @@ extern void acpi_reserve_bootmem(void);
179 179
180extern u8 x86_acpiid_to_apicid[]; 180extern u8 x86_acpiid_to_apicid[];
181 181
182#define ARCH_HAS_POWER_PDC_INIT 1 182#define ARCH_HAS_POWER_INIT 1
183 183
184#endif /*__KERNEL__*/ 184#endif /*__KERNEL__*/
185 185
diff --git a/include/asm-x86_64/mpspec.h b/include/asm-x86_64/mpspec.h
index 10248a9a0582..14fc3ddd9031 100644
--- a/include/asm-x86_64/mpspec.h
+++ b/include/asm-x86_64/mpspec.h
@@ -188,7 +188,7 @@ extern void mp_register_lapic_address (u64 address);
188extern void mp_register_ioapic (u8 id, u32 address, u32 gsi_base); 188extern void mp_register_ioapic (u8 id, u32 address, u32 gsi_base);
189extern void mp_override_legacy_irq (u8 bus_irq, u8 polarity, u8 trigger, u32 gsi); 189extern void mp_override_legacy_irq (u8 bus_irq, u8 polarity, u8 trigger, u32 gsi);
190extern void mp_config_acpi_legacy_irqs (void); 190extern void mp_config_acpi_legacy_irqs (void);
191extern int mp_register_gsi (u32 gsi, int edge_level, int active_high_low); 191extern int mp_register_gsi (u32 gsi, int triggering, int polarity);
192#endif /*CONFIG_X86_IO_APIC*/ 192#endif /*CONFIG_X86_IO_APIC*/
193#endif 193#endif
194 194
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 026c3c011dc0..84d3d9f034ce 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -435,7 +435,7 @@ extern int sbf_port ;
435 435
436#endif /* !CONFIG_ACPI */ 436#endif /* !CONFIG_ACPI */
437 437
438int acpi_register_gsi (u32 gsi, int edge_level, int active_high_low); 438int acpi_register_gsi (u32 gsi, int triggering, int polarity);
439int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); 439int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
440 440
441/* 441/*
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index a5363324cf95..b49affa0ac5a 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -185,6 +185,7 @@ extern enum system_states {
185 SYSTEM_HALT, 185 SYSTEM_HALT,
186 SYSTEM_POWER_OFF, 186 SYSTEM_POWER_OFF,
187 SYSTEM_RESTART, 187 SYSTEM_RESTART,
188 SYSTEM_SUSPEND_DISK,
188} system_state; 189} system_state;
189 190
190#define TAINT_PROPRIETARY_MODULE (1<<0) 191#define TAINT_PROPRIETARY_MODULE (1<<0)
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index 7ab2cdb83ef0..015297ff73fa 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -60,8 +60,7 @@ extern void machine_crash_shutdown(struct pt_regs *);
60 */ 60 */
61 61
62extern void kernel_restart_prepare(char *cmd); 62extern void kernel_restart_prepare(char *cmd);
63extern void kernel_halt_prepare(void); 63extern void kernel_shutdown_prepare(enum system_states state);
64extern void kernel_power_off_prepare(void);
65 64
66extern void kernel_restart(char *cmd); 65extern void kernel_restart(char *cmd);
67extern void kernel_halt(void); 66extern void kernel_halt(void);
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index fdbd436b24cc..3877209d23c3 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -559,12 +559,12 @@ asmlinkage long sys_newfstatat(int dfd, char __user *filename,
559 struct stat __user *statbuf, int flag); 559 struct stat __user *statbuf, int flag);
560asmlinkage long sys_readlinkat(int dfd, const char __user *path, char __user *buf, 560asmlinkage long sys_readlinkat(int dfd, const char __user *path, char __user *buf,
561 int bufsiz); 561 int bufsiz);
562asmlinkage long compat_sys_futimesat(int dfd, char __user *filename, 562asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename,
563 struct compat_timeval __user *t); 563 struct compat_timeval __user *t);
564asmlinkage long compat_sys_newfstatat(int dfd, char __user * filename, 564asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename,
565 struct compat_stat __user *statbuf, 565 struct compat_stat __user *statbuf,
566 int flag); 566 int flag);
567asmlinkage long compat_sys_openat(int dfd, const char __user *filename, 567asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,
568 int flags, int mode); 568 int flags, int mode);
569 569
570#endif 570#endif
diff --git a/kernel/power/disk.c b/kernel/power/disk.c
index f2b3b0ea512a..0b43847dc980 100644
--- a/kernel/power/disk.c
+++ b/kernel/power/disk.c
@@ -53,7 +53,7 @@ static void power_down(suspend_disk_method_t mode)
53 53
54 switch(mode) { 54 switch(mode) {
55 case PM_DISK_PLATFORM: 55 case PM_DISK_PLATFORM:
56 kernel_power_off_prepare(); 56 kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK);
57 error = pm_ops->enter(PM_SUSPEND_DISK); 57 error = pm_ops->enter(PM_SUSPEND_DISK);
58 break; 58 break;
59 case PM_DISK_SHUTDOWN: 59 case PM_DISK_SHUTDOWN:
@@ -95,13 +95,6 @@ static int prepare_processes(void)
95 goto thaw; 95 goto thaw;
96 } 96 }
97 97
98 if (pm_disk_mode == PM_DISK_PLATFORM) {
99 if (pm_ops && pm_ops->prepare) {
100 if ((error = pm_ops->prepare(PM_SUSPEND_DISK)))
101 goto thaw;
102 }
103 }
104
105 /* Free memory before shutting down devices. */ 98 /* Free memory before shutting down devices. */
106 if (!(error = swsusp_shrink_memory())) 99 if (!(error = swsusp_shrink_memory()))
107 return 0; 100 return 0;
diff --git a/kernel/power/main.c b/kernel/power/main.c
index d253f3ae2fa5..9cb235cba4a9 100644
--- a/kernel/power/main.c
+++ b/kernel/power/main.c
@@ -133,10 +133,10 @@ static int suspend_enter(suspend_state_t state)
133static void suspend_finish(suspend_state_t state) 133static void suspend_finish(suspend_state_t state)
134{ 134{
135 device_resume(); 135 device_resume();
136 if (pm_ops && pm_ops->finish)
137 pm_ops->finish(state);
138 thaw_processes(); 136 thaw_processes();
139 enable_nonboot_cpus(); 137 enable_nonboot_cpus();
138 if (pm_ops && pm_ops->finish)
139 pm_ops->finish(state);
140 pm_restore_console(); 140 pm_restore_console();
141} 141}
142 142
diff --git a/kernel/sys.c b/kernel/sys.c
index d09cac23fdfd..0929c698affc 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -440,23 +440,25 @@ void kernel_kexec(void)
440} 440}
441EXPORT_SYMBOL_GPL(kernel_kexec); 441EXPORT_SYMBOL_GPL(kernel_kexec);
442 442
443void kernel_shutdown_prepare(enum system_states state)
444{
445 notifier_call_chain(&reboot_notifier_list,
446 (state == SYSTEM_HALT)?SYS_HALT:SYS_POWER_OFF, NULL);
447 system_state = state;
448 device_shutdown();
449}
443/** 450/**
444 * kernel_halt - halt the system 451 * kernel_halt - halt the system
445 * 452 *
446 * Shutdown everything and perform a clean system halt. 453 * Shutdown everything and perform a clean system halt.
447 */ 454 */
448void kernel_halt_prepare(void)
449{
450 notifier_call_chain(&reboot_notifier_list, SYS_HALT, NULL);
451 system_state = SYSTEM_HALT;
452 device_shutdown();
453}
454void kernel_halt(void) 455void kernel_halt(void)
455{ 456{
456 kernel_halt_prepare(); 457 kernel_shutdown_prepare(SYSTEM_HALT);
457 printk(KERN_EMERG "System halted.\n"); 458 printk(KERN_EMERG "System halted.\n");
458 machine_halt(); 459 machine_halt();
459} 460}
461
460EXPORT_SYMBOL_GPL(kernel_halt); 462EXPORT_SYMBOL_GPL(kernel_halt);
461 463
462/** 464/**
@@ -464,20 +466,13 @@ EXPORT_SYMBOL_GPL(kernel_halt);
464 * 466 *
465 * Shutdown everything and perform a clean system power_off. 467 * Shutdown everything and perform a clean system power_off.
466 */ 468 */
467void kernel_power_off_prepare(void)
468{
469 notifier_call_chain(&reboot_notifier_list, SYS_POWER_OFF, NULL);
470 system_state = SYSTEM_POWER_OFF;
471 device_shutdown();
472}
473void kernel_power_off(void) 469void kernel_power_off(void)
474{ 470{
475 kernel_power_off_prepare(); 471 kernel_shutdown_prepare(SYSTEM_POWER_OFF);
476 printk(KERN_EMERG "Power down.\n"); 472 printk(KERN_EMERG "Power down.\n");
477 machine_power_off(); 473 machine_power_off();
478} 474}
479EXPORT_SYMBOL_GPL(kernel_power_off); 475EXPORT_SYMBOL_GPL(kernel_power_off);
480
481/* 476/*
482 * Reboot system call: for obvious reasons only root may call it, 477 * Reboot system call: for obvious reasons only root may call it,
483 * and even root needs to set up some magic numbers in the registers 478 * and even root needs to set up some magic numbers in the registers
diff --git a/sound/core/info.c b/sound/core/info.c
index ae8853921464..af123e3bdb24 100644
--- a/sound/core/info.c
+++ b/sound/core/info.c
@@ -444,8 +444,8 @@ static unsigned int snd_info_entry_poll(struct file *file, poll_table * wait)
444 return mask; 444 return mask;
445} 445}
446 446
447static inline int _snd_info_entry_ioctl(struct inode *inode, struct file *file, 447static long snd_info_entry_ioctl(struct file *file, unsigned int cmd,
448 unsigned int cmd, unsigned long arg) 448 unsigned long arg)
449{ 449{
450 struct snd_info_private_data *data; 450 struct snd_info_private_data *data;
451 struct snd_info_entry *entry; 451 struct snd_info_entry *entry;
@@ -465,17 +465,6 @@ static inline int _snd_info_entry_ioctl(struct inode *inode, struct file *file,
465 return -ENOTTY; 465 return -ENOTTY;
466} 466}
467 467
468/* FIXME: need to unlock BKL to allow preemption */
469static int snd_info_entry_ioctl(struct inode *inode, struct file *file,
470 unsigned int cmd, unsigned long arg)
471{
472 int err;
473 unlock_kernel();
474 err = _snd_info_entry_ioctl(inode, file, cmd, arg);
475 lock_kernel();
476 return err;
477}
478
479static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma) 468static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma)
480{ 469{
481 struct inode *inode = file->f_dentry->d_inode; 470 struct inode *inode = file->f_dentry->d_inode;
@@ -499,15 +488,15 @@ static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma)
499 488
500static struct file_operations snd_info_entry_operations = 489static struct file_operations snd_info_entry_operations =
501{ 490{
502 .owner = THIS_MODULE, 491 .owner = THIS_MODULE,
503 .llseek = snd_info_entry_llseek, 492 .llseek = snd_info_entry_llseek,
504 .read = snd_info_entry_read, 493 .read = snd_info_entry_read,
505 .write = snd_info_entry_write, 494 .write = snd_info_entry_write,
506 .poll = snd_info_entry_poll, 495 .poll = snd_info_entry_poll,
507 .ioctl = snd_info_entry_ioctl, 496 .unlocked_ioctl = snd_info_entry_ioctl,
508 .mmap = snd_info_entry_mmap, 497 .mmap = snd_info_entry_mmap,
509 .open = snd_info_entry_open, 498 .open = snd_info_entry_open,
510 .release = snd_info_entry_release, 499 .release = snd_info_entry_release,
511}; 500};
512 501
513/** 502/**
diff --git a/sound/drivers/serial-u16550.c b/sound/drivers/serial-u16550.c
index 29676d800cae..112ddf705402 100644
--- a/sound/drivers/serial-u16550.c
+++ b/sound/drivers/serial-u16550.c
@@ -789,7 +789,7 @@ static int __init snd_uart16550_create(struct snd_card *card,
789 789
790 if ((err = snd_uart16550_detect(uart)) <= 0) { 790 if ((err = snd_uart16550_detect(uart)) <= 0) {
791 printk(KERN_ERR "no UART detected at 0x%lx\n", iobase); 791 printk(KERN_ERR "no UART detected at 0x%lx\n", iobase);
792 return err; 792 return -ENODEV;
793 } 793 }
794 794
795 if (irq >= 0 && irq != SNDRV_AUTO_IRQ) { 795 if (irq >= 0 && irq != SNDRV_AUTO_IRQ) {
diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c
index bd8e23818460..fd9bb2575de8 100644
--- a/sound/isa/cmi8330.c
+++ b/sound/isa/cmi8330.c
@@ -109,7 +109,9 @@ module_param_array(wssdma, int, NULL, 0444);
109MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver."); 109MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");
110 110
111static struct platform_device *platform_devices[SNDRV_CARDS]; 111static struct platform_device *platform_devices[SNDRV_CARDS];
112#ifdef CONFIG_PNP
112static int pnp_registered; 113static int pnp_registered;
114#endif
113 115
114#define CMI8330_RMUX3D 16 116#define CMI8330_RMUX3D 16
115#define CMI8330_MUTEMUX 17 117#define CMI8330_MUTEMUX 17
@@ -672,8 +674,10 @@ static void __init_or_module snd_cmi8330_unregister_all(void)
672{ 674{
673 int i; 675 int i;
674 676
677#ifdef CONFIG_PNP
675 if (pnp_registered) 678 if (pnp_registered)
676 pnp_unregister_card_driver(&cmi8330_pnpc_driver); 679 pnp_unregister_card_driver(&cmi8330_pnpc_driver);
680#endif
677 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) 681 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
678 platform_device_unregister(platform_devices[i]); 682 platform_device_unregister(platform_devices[i]);
679 platform_driver_unregister(&snd_cmi8330_driver); 683 platform_driver_unregister(&snd_cmi8330_driver);
@@ -700,11 +704,13 @@ static int __init alsa_card_cmi8330_init(void)
700 cards++; 704 cards++;
701 } 705 }
702 706
707#ifdef CONFIG_PNP
703 err = pnp_register_card_driver(&cmi8330_pnpc_driver); 708 err = pnp_register_card_driver(&cmi8330_pnpc_driver);
704 if (err >= 0) { 709 if (err >= 0) {
705 pnp_registered = 1; 710 pnp_registered = 1;
706 cards += err; 711 cards += err;
707 } 712 }
713#endif
708 714
709 if (!cards) { 715 if (!cards) {
710#ifdef MODULE 716#ifdef MODULE
diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c
index e1683337e6cd..4fa431040564 100644
--- a/sound/isa/cs423x/cs4236.c
+++ b/sound/isa/cs423x/cs4236.c
@@ -75,8 +75,10 @@ MODULE_SUPPORTED_DEVICE("{{Crystal Semiconductors,CS4235},"
75 75
76#ifdef CS4232 76#ifdef CS4232
77#define IDENT "CS4232" 77#define IDENT "CS4232"
78#define CS423X_DRIVER "snd_cs4232"
78#else 79#else
79#define IDENT "CS4236+" 80#define IDENT "CS4236+"
81#define CS423X_DRIVER "snd_cs4236"
80#endif 82#endif
81 83
82static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ 84static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
@@ -125,10 +127,12 @@ module_param_array(dma2, int, NULL, 0444);
125MODULE_PARM_DESC(dma2, "DMA2 # for " IDENT " driver."); 127MODULE_PARM_DESC(dma2, "DMA2 # for " IDENT " driver.");
126 128
127static struct platform_device *platform_devices[SNDRV_CARDS]; 129static struct platform_device *platform_devices[SNDRV_CARDS];
130#ifdef CONFIG_PNP
128static int pnpc_registered; 131static int pnpc_registered;
129#ifdef CS4232 132#ifdef CS4232
130static int pnp_registered; 133static int pnp_registered;
131#endif 134#endif
135#endif /* CONFIG_PNP */
132 136
133struct snd_card_cs4236 { 137struct snd_card_cs4236 {
134 struct snd_cs4231 *chip; 138 struct snd_cs4231 *chip;
@@ -158,7 +162,6 @@ MODULE_DEVICE_TABLE(pnp, snd_cs4232_pnpbiosids);
158#endif /* CS4232 */ 162#endif /* CS4232 */
159 163
160#ifdef CS4232 164#ifdef CS4232
161#define CS423X_DRIVER "snd_cs4232"
162#define CS423X_ISAPNP_DRIVER "cs4232_isapnp" 165#define CS423X_ISAPNP_DRIVER "cs4232_isapnp"
163static struct pnp_card_device_id snd_cs423x_pnpids[] = { 166static struct pnp_card_device_id snd_cs423x_pnpids[] = {
164 /* Philips PCA70PS */ 167 /* Philips PCA70PS */
@@ -175,11 +178,12 @@ static struct pnp_card_device_id snd_cs423x_pnpids[] = {
175 { .id = "CSC7632", .devs = { { "CSC0000" }, { "CSC0010" }, { "PNPb006" } } }, 178 { .id = "CSC7632", .devs = { { "CSC0000" }, { "CSC0010" }, { "PNPb006" } } },
176 /* SIC CrystalWave 32 (CS4232) */ 179 /* SIC CrystalWave 32 (CS4232) */
177 { .id = "CSCf032", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } }, 180 { .id = "CSCf032", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
181 /* Netfinity 3000 on-board soundcard */
182 { .id = "CSCe825", .devs = { { "CSC0100" }, { "CSC0110" }, { "CSC010f" } } },
178 /* --- */ 183 /* --- */
179 { .id = "" } /* end */ 184 { .id = "" } /* end */
180}; 185};
181#else /* CS4236 */ 186#else /* CS4236 */
182#define CS423X_DRIVER "snd_cs4236"
183#define CS423X_ISAPNP_DRIVER "cs4236_isapnp" 187#define CS423X_ISAPNP_DRIVER "cs4236_isapnp"
184static struct pnp_card_device_id snd_cs423x_pnpids[] = { 188static struct pnp_card_device_id snd_cs423x_pnpids[] = {
185 /* Intel Marlin Spike Motherboard - CS4235 */ 189 /* Intel Marlin Spike Motherboard - CS4235 */
@@ -747,12 +751,14 @@ static void __init_or_module snd_cs423x_unregister_all(void)
747{ 751{
748 int i; 752 int i;
749 753
754#ifdef CONFIG_PNP
750 if (pnpc_registered) 755 if (pnpc_registered)
751 pnp_unregister_card_driver(&cs423x_pnpc_driver); 756 pnp_unregister_card_driver(&cs423x_pnpc_driver);
752#ifdef CS4232 757#ifdef CS4232
753 if (pnp_registered) 758 if (pnp_registered)
754 pnp_unregister_driver(&cs4232_pnp_driver); 759 pnp_unregister_driver(&cs4232_pnp_driver);
755#endif 760#endif
761#endif /* CONFIG_PNP */
756 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) 762 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
757 platform_device_unregister(platform_devices[i]); 763 platform_device_unregister(platform_devices[i]);
758 platform_driver_unregister(&cs423x_nonpnp_driver); 764 platform_driver_unregister(&cs423x_nonpnp_driver);
@@ -778,6 +784,7 @@ static int __init alsa_card_cs423x_init(void)
778 platform_devices[i] = device; 784 platform_devices[i] = device;
779 cards++; 785 cards++;
780 } 786 }
787#ifdef CONFIG_PNP
781#ifdef CS4232 788#ifdef CS4232
782 i = pnp_register_driver(&cs4232_pnp_driver); 789 i = pnp_register_driver(&cs4232_pnp_driver);
783 if (i >= 0) { 790 if (i >= 0) {
@@ -790,6 +797,8 @@ static int __init alsa_card_cs423x_init(void)
790 pnpc_registered = 1; 797 pnpc_registered = 1;
791 cards += i; 798 cards += i;
792 } 799 }
800#endif /* CONFIG_PNP */
801
793 if (!cards) { 802 if (!cards) {
794#ifdef MODULE 803#ifdef MODULE
795 printk(KERN_ERR IDENT " soundcard not found or device busy\n"); 804 printk(KERN_ERR IDENT " soundcard not found or device busy\n");
diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c
index bf5de0782eb0..08f032b51107 100644
--- a/sound/isa/es18xx.c
+++ b/sound/isa/es18xx.c
@@ -1878,9 +1878,9 @@ module_param_array(dma2, int, NULL, 0444);
1878MODULE_PARM_DESC(dma2, "DMA 2 # for ES18xx driver."); 1878MODULE_PARM_DESC(dma2, "DMA 2 # for ES18xx driver.");
1879 1879
1880static struct platform_device *platform_devices[SNDRV_CARDS]; 1880static struct platform_device *platform_devices[SNDRV_CARDS];
1881static int pnp_registered;
1882 1881
1883#ifdef CONFIG_PNP 1882#ifdef CONFIG_PNP
1883static int pnp_registered;
1884 1884
1885static struct pnp_card_device_id snd_audiodrive_pnpids[] = { 1885static struct pnp_card_device_id snd_audiodrive_pnpids[] = {
1886 /* ESS 1868 (integrated on Compaq dual P-Pro motherboard and Genius 18PnP 3D) */ 1886 /* ESS 1868 (integrated on Compaq dual P-Pro motherboard and Genius 18PnP 3D) */
@@ -2209,8 +2209,10 @@ static void __init_or_module snd_es18xx_unregister_all(void)
2209{ 2209{
2210 int i; 2210 int i;
2211 2211
2212#ifdef CONFIG_PNP
2212 if (pnp_registered) 2213 if (pnp_registered)
2213 pnp_unregister_card_driver(&es18xx_pnpc_driver); 2214 pnp_unregister_card_driver(&es18xx_pnpc_driver);
2215#endif
2214 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) 2216 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
2215 platform_device_unregister(platform_devices[i]); 2217 platform_device_unregister(platform_devices[i]);
2216 platform_driver_unregister(&snd_es18xx_nonpnp_driver); 2218 platform_driver_unregister(&snd_es18xx_nonpnp_driver);
@@ -2237,11 +2239,13 @@ static int __init alsa_card_es18xx_init(void)
2237 cards++; 2239 cards++;
2238 } 2240 }
2239 2241
2242#ifdef CONFIG_PNP
2240 i = pnp_register_card_driver(&es18xx_pnpc_driver); 2243 i = pnp_register_card_driver(&es18xx_pnpc_driver);
2241 if (i >= 0) { 2244 if (i >= 0) {
2242 pnp_registered = 1; 2245 pnp_registered = 1;
2243 cards += i; 2246 cards += i;
2244 } 2247 }
2248#endif
2245 2249
2246 if(!cards) { 2250 if(!cards) {
2247#ifdef MODULE 2251#ifdef MODULE
diff --git a/sound/isa/gus/gusclassic.c b/sound/isa/gus/gusclassic.c
index d1165b96fa3f..91c219116d7a 100644
--- a/sound/isa/gus/gusclassic.c
+++ b/sound/isa/gus/gusclassic.c
@@ -195,7 +195,7 @@ static int __init snd_gusclassic_probe(struct platform_device *pdev)
195 goto _err; 195 goto _err;
196 } 196 }
197 sprintf(card->longname + strlen(card->longname), " at 0x%lx, irq %d, dma %d", gus->gf1.port, xirq, xdma1); 197 sprintf(card->longname + strlen(card->longname), " at 0x%lx, irq %d, dma %d", gus->gf1.port, xirq, xdma1);
198 if (dma2 >= 0) 198 if (xdma2 >= 0)
199 sprintf(card->longname + strlen(card->longname), "&%d", xdma2); 199 sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
200 200
201 snd_card_set_dev(card, &pdev->dev); 201 snd_card_set_dev(card, &pdev->dev);
diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c
index ca359e0c674b..9d8431978501 100644
--- a/sound/isa/opl3sa2.c
+++ b/sound/isa/opl3sa2.c
@@ -91,8 +91,10 @@ module_param_array(opl3sa3_ymode, int, NULL, 0444);
91MODULE_PARM_DESC(opl3sa3_ymode, "Speaker size selection for 3D Enhancement mode: Desktop/Large Notebook/Small Notebook/HiFi."); 91MODULE_PARM_DESC(opl3sa3_ymode, "Speaker size selection for 3D Enhancement mode: Desktop/Large Notebook/Small Notebook/HiFi.");
92 92
93static struct platform_device *platform_devices[SNDRV_CARDS]; 93static struct platform_device *platform_devices[SNDRV_CARDS];
94#ifdef CONFIG_PNP
94static int pnp_registered; 95static int pnp_registered;
95static int pnpc_registered; 96static int pnpc_registered;
97#endif
96 98
97/* control ports */ 99/* control ports */
98#define OPL3SA2_PM_CTRL 0x01 100#define OPL3SA2_PM_CTRL 0x01
@@ -721,7 +723,7 @@ static int __devinit snd_opl3sa2_probe(struct snd_card *card, int dev)
721 } 723 }
722 sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d", 724 sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
723 card->shortname, chip->port, xirq, xdma1); 725 card->shortname, chip->port, xirq, xdma1);
724 if (dma2 >= 0) 726 if (xdma2 >= 0)
725 sprintf(card->longname + strlen(card->longname), "&%d", xdma2); 727 sprintf(card->longname + strlen(card->longname), "&%d", xdma2);
726 728
727 return snd_card_register(card); 729 return snd_card_register(card);
@@ -779,7 +781,7 @@ static int snd_opl3sa2_pnp_resume(struct pnp_dev *pdev)
779#endif 781#endif
780 782
781static struct pnp_driver opl3sa2_pnp_driver = { 783static struct pnp_driver opl3sa2_pnp_driver = {
782 .name = "opl3sa2-pnpbios", 784 .name = "snd-opl3sa2-pnpbios",
783 .id_table = snd_opl3sa2_pnpbiosids, 785 .id_table = snd_opl3sa2_pnpbiosids,
784 .probe = snd_opl3sa2_pnp_detect, 786 .probe = snd_opl3sa2_pnp_detect,
785 .remove = __devexit_p(snd_opl3sa2_pnp_remove), 787 .remove = __devexit_p(snd_opl3sa2_pnp_remove),
@@ -846,7 +848,7 @@ static int snd_opl3sa2_pnp_cresume(struct pnp_card_link *pcard)
846 848
847static struct pnp_card_driver opl3sa2_pnpc_driver = { 849static struct pnp_card_driver opl3sa2_pnpc_driver = {
848 .flags = PNP_DRIVER_RES_DISABLE, 850 .flags = PNP_DRIVER_RES_DISABLE,
849 .name = "opl3sa2", 851 .name = "snd-opl3sa2-cpnp",
850 .id_table = snd_opl3sa2_pnpids, 852 .id_table = snd_opl3sa2_pnpids,
851 .probe = snd_opl3sa2_pnp_cdetect, 853 .probe = snd_opl3sa2_pnp_cdetect,
852 .remove = __devexit_p(snd_opl3sa2_pnp_cremove), 854 .remove = __devexit_p(snd_opl3sa2_pnp_cremove),
@@ -929,10 +931,12 @@ static void __init_or_module snd_opl3sa2_unregister_all(void)
929{ 931{
930 int i; 932 int i;
931 933
934#ifdef CONFIG_PNP
932 if (pnpc_registered) 935 if (pnpc_registered)
933 pnp_unregister_card_driver(&opl3sa2_pnpc_driver); 936 pnp_unregister_card_driver(&opl3sa2_pnpc_driver);
934 if (pnp_registered) 937 if (pnp_registered)
935 pnp_unregister_driver(&opl3sa2_pnp_driver); 938 pnp_unregister_driver(&opl3sa2_pnp_driver);
939#endif
936 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) 940 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
937 platform_device_unregister(platform_devices[i]); 941 platform_device_unregister(platform_devices[i]);
938 platform_driver_unregister(&snd_opl3sa2_nonpnp_driver); 942 platform_driver_unregister(&snd_opl3sa2_nonpnp_driver);
@@ -961,6 +965,7 @@ static int __init alsa_card_opl3sa2_init(void)
961 cards++; 965 cards++;
962 } 966 }
963 967
968#ifdef CONFIG_PNP
964 err = pnp_register_driver(&opl3sa2_pnp_driver); 969 err = pnp_register_driver(&opl3sa2_pnp_driver);
965 if (err >= 0) { 970 if (err >= 0) {
966 pnp_registered = 1; 971 pnp_registered = 1;
@@ -971,6 +976,7 @@ static int __init alsa_card_opl3sa2_init(void)
971 pnpc_registered = 1; 976 pnpc_registered = 1;
972 cards += err; 977 cards += err;
973 } 978 }
979#endif
974 980
975 if (!cards) { 981 if (!cards) {
976#ifdef MODULE 982#ifdef MODULE
diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
index 1ea3944ef7ab..63d96be11b2b 100644
--- a/sound/isa/opti9xx/opti92x-ad1848.c
+++ b/sound/isa/opti9xx/opti92x-ad1848.c
@@ -1349,7 +1349,7 @@ static int snd_opti93x_pcm(struct snd_opti93x *codec, int device, struct snd_pcm
1349 int error; 1349 int error;
1350 struct snd_pcm *pcm; 1350 struct snd_pcm *pcm;
1351 1351
1352 if ((error = snd_pcm_new(codec->card, "OPTi 82C93X", device, 1, 1, &pcm))) 1352 if ((error = snd_pcm_new(codec->card, "OPTi 82C93X", device, 1, 1, &pcm)) < 0)
1353 return error; 1353 return error;
1354 1354
1355 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_opti93x_playback_ops); 1355 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_opti93x_playback_ops);
diff --git a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c
index c0be7a5a3425..0667bd14ad60 100644
--- a/sound/isa/sb/sb16.c
+++ b/sound/isa/sb/sb16.c
@@ -179,6 +179,8 @@ static struct pnp_card_device_id snd_sb16_pnpids[] = {
179 { .id = "CTL0086", .devs = { { "CTL0041" } } }, 179 { .id = "CTL0086", .devs = { { "CTL0041" } } },
180 /* Sound Blaster Vibra16X */ 180 /* Sound Blaster Vibra16X */
181 { .id = "CTL00f0", .devs = { { "CTL0043" } } }, 181 { .id = "CTL00f0", .devs = { { "CTL0043" } } },
182 /* Sound Blaster 16 (Virtual PC 2004) */
183 { .id = "tBA03b0", .devs = { {.id="PNPb003" } } },
182#else /* SNDRV_SBAWE defined */ 184#else /* SNDRV_SBAWE defined */
183 /* Sound Blaster AWE 32 PnP */ 185 /* Sound Blaster AWE 32 PnP */
184 { .id = "CTL0035", .devs = { { "CTL0031" }, { "CTL0021" } } }, 186 { .id = "CTL0035", .devs = { { "CTL0031" }, { "CTL0021" } } },
@@ -235,8 +237,6 @@ static struct pnp_card_device_id snd_sb16_pnpids[] = {
235 { .id = "CTLXXXX" , .devs = { { "CTL0044" }, { "CTL0023" } } }, 237 { .id = "CTLXXXX" , .devs = { { "CTL0044" }, { "CTL0023" } } },
236 { .id = "CTLXXXX" , .devs = { { "CTL0045" }, { "CTL0022" } } }, 238 { .id = "CTLXXXX" , .devs = { { "CTL0045" }, { "CTL0022" } } },
237#endif /* SNDRV_SBAWE */ 239#endif /* SNDRV_SBAWE */
238 /* Sound Blaster 16 PnP (Virtual PC 2004)*/
239 { .id = "tBA03b0", .devs = { { "PNPb003" } } },
240 { .id = "", } 240 { .id = "", }
241}; 241};
242 242
diff --git a/sound/isa/sscape.c b/sound/isa/sscape.c
index 5fb981c0a281..29bba8cc3ef3 100644
--- a/sound/isa/sscape.c
+++ b/sound/isa/sscape.c
@@ -69,9 +69,9 @@ module_param_array(dma, int, NULL, 0444);
69MODULE_PARM_DESC(dma, "DMA # for SoundScape driver."); 69MODULE_PARM_DESC(dma, "DMA # for SoundScape driver.");
70 70
71static struct platform_device *platform_devices[SNDRV_CARDS]; 71static struct platform_device *platform_devices[SNDRV_CARDS];
72static int pnp_registered;
73 72
74#ifdef CONFIG_PNP 73#ifdef CONFIG_PNP
74static int pnp_registered;
75static struct pnp_card_device_id sscape_pnpids[] = { 75static struct pnp_card_device_id sscape_pnpids[] = {
76 { .id = "ENS3081", .devs = { { "ENS0000" } } }, 76 { .id = "ENS3081", .devs = { { "ENS0000" } } },
77 { .id = "" } /* end */ 77 { .id = "" } /* end */
@@ -1391,8 +1391,10 @@ static void __init_or_module sscape_unregister_all(void)
1391{ 1391{
1392 int i; 1392 int i;
1393 1393
1394#ifdef CONFIG_PNP
1394 if (pnp_registered) 1395 if (pnp_registered)
1395 pnp_unregister_card_driver(&sscape_pnpc_driver); 1396 pnp_unregister_card_driver(&sscape_pnpc_driver);
1397#endif
1396 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) 1398 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
1397 platform_device_unregister(platform_devices[i]); 1399 platform_device_unregister(platform_devices[i]);
1398 platform_driver_unregister(&snd_sscape_driver); 1400 platform_driver_unregister(&snd_sscape_driver);
@@ -1466,8 +1468,10 @@ static int __init sscape_init(void)
1466 ret = sscape_manual_probe(); 1468 ret = sscape_manual_probe();
1467 if (ret < 0) 1469 if (ret < 0)
1468 return ret; 1470 return ret;
1471#ifdef CONFIG_PNP
1469 if (pnp_register_card_driver(&sscape_pnpc_driver) >= 0) 1472 if (pnp_register_card_driver(&sscape_pnpc_driver) >= 0)
1470 pnp_registered = 1; 1473 pnp_registered = 1;
1474#endif
1471 return 0; 1475 return 0;
1472} 1476}
1473 1477
diff --git a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c
index a6dcb2f970ca..fa3ab960de17 100644
--- a/sound/isa/wavefront/wavefront.c
+++ b/sound/isa/wavefront/wavefront.c
@@ -84,10 +84,9 @@ module_param_array(use_cs4232_midi, bool, NULL, 0444);
84MODULE_PARM_DESC(use_cs4232_midi, "Use CS4232 MPU-401 interface (inaccessibly located inside your computer)"); 84MODULE_PARM_DESC(use_cs4232_midi, "Use CS4232 MPU-401 interface (inaccessibly located inside your computer)");
85 85
86static struct platform_device *platform_devices[SNDRV_CARDS]; 86static struct platform_device *platform_devices[SNDRV_CARDS];
87static int pnp_registered;
88
89 87
90#ifdef CONFIG_PNP 88#ifdef CONFIG_PNP
89static int pnp_registered;
91 90
92static struct pnp_card_device_id snd_wavefront_pnpids[] = { 91static struct pnp_card_device_id snd_wavefront_pnpids[] = {
93 /* Tropez */ 92 /* Tropez */
@@ -695,8 +694,10 @@ static void __init_or_module snd_wavefront_unregister_all(void)
695{ 694{
696 int i; 695 int i;
697 696
697#ifdef CONFIG_PNP
698 if (pnp_registered) 698 if (pnp_registered)
699 pnp_unregister_card_driver(&wavefront_pnpc_driver); 699 pnp_unregister_card_driver(&wavefront_pnpc_driver);
700#endif
700 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) 701 for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)
701 platform_device_unregister(platform_devices[i]); 702 platform_device_unregister(platform_devices[i]);
702 platform_driver_unregister(&snd_wavefront_driver); 703 platform_driver_unregister(&snd_wavefront_driver);
@@ -725,11 +726,13 @@ static int __init alsa_card_wavefront_init(void)
725 cards++; 726 cards++;
726 } 727 }
727 728
729#ifdef CONFIG_PNP
728 i = pnp_register_card_driver(&wavefront_pnpc_driver); 730 i = pnp_register_card_driver(&wavefront_pnpc_driver);
729 if (i >= 0) { 731 if (i >= 0) {
730 pnp_registered = 1; 732 pnp_registered = 1;
731 cards += i; 733 cards += i;
732 } 734 }
735#endif
733 736
734 if (!cards) { 737 if (!cards) {
735#ifdef MODULE 738#ifdef MODULE
diff --git a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c
index ed81eec6e732..68aa091e8961 100644
--- a/sound/isa/wavefront/wavefront_synth.c
+++ b/sound/isa/wavefront/wavefront_synth.c
@@ -866,7 +866,7 @@ wavefront_send_sample (snd_wavefront_t *dev,
866 divided by 2. 866 divided by 2.
867 */ 867 */
868 868
869 u16 sample_short; 869 u16 sample_short = 0;
870 u32 length; 870 u32 length;
871 u16 __user *data_end = NULL; 871 u16 __user *data_end = NULL;
872 unsigned int i; 872 unsigned int i;
diff --git a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c
index 4aa5fdc5688e..a444a78c7c94 100644
--- a/sound/pci/ac97/ac97_patch.c
+++ b/sound/pci/ac97/ac97_patch.c
@@ -1621,8 +1621,27 @@ static const struct snd_kcontrol_new snd_ac97_ad1981x_jack_sense[] = {
1621 AC97_SINGLE("Line Jack Sense", AC97_AD_JACK_SPDIF, 12, 1, 0), 1621 AC97_SINGLE("Line Jack Sense", AC97_AD_JACK_SPDIF, 12, 1, 0),
1622}; 1622};
1623 1623
1624/* black list to avoid HP/Line jack-sense controls
1625 * (SS vendor << 16 | device)
1626 */
1627static unsigned int ad1981_jacks_blacklist[] = {
1628 0x10140554, /* Thinkpad T42p/R50p */
1629 0 /* end */
1630};
1631
1632static int check_list(struct snd_ac97 *ac97, const unsigned int *list)
1633{
1634 u32 subid = ((u32)ac97->subsystem_vendor << 16) | ac97->subsystem_device;
1635 for (; *list; list++)
1636 if (*list == subid)
1637 return 1;
1638 return 0;
1639}
1640
1624static int patch_ad1981a_specific(struct snd_ac97 * ac97) 1641static int patch_ad1981a_specific(struct snd_ac97 * ac97)
1625{ 1642{
1643 if (check_list(ac97, ad1981_jacks_blacklist))
1644 return 0;
1626 return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense, 1645 return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense,
1627 ARRAY_SIZE(snd_ac97_ad1981x_jack_sense)); 1646 ARRAY_SIZE(snd_ac97_ad1981x_jack_sense));
1628} 1647}
@@ -1635,22 +1654,26 @@ static struct snd_ac97_build_ops patch_ad1981a_build_ops = {
1635#endif 1654#endif
1636}; 1655};
1637 1656
1657/* white list to enable HP jack-sense bits
1658 * (SS vendor << 16 | device)
1659 */
1660static unsigned int ad1981_jacks_whitelist[] = {
1661 0x0e11005a, /* HP nc4000/4010 */
1662 0x103c0890, /* HP nc6000 */
1663 0x103c0938, /* HP nc4220 */
1664 0x103c099c, /* HP nx6110 */
1665 0x103c0944, /* HP nc6220 */
1666 0x103c0934, /* HP nc8220 */
1667 0x103c006d, /* HP nx9105 */
1668 0x17340088, /* FSC Scenic-W */
1669 0 /* end */
1670};
1671
1638static void check_ad1981_hp_jack_sense(struct snd_ac97 *ac97) 1672static void check_ad1981_hp_jack_sense(struct snd_ac97 *ac97)
1639{ 1673{
1640 u32 subid = ((u32)ac97->subsystem_vendor << 16) | ac97->subsystem_device; 1674 if (check_list(ac97, ad1981_jacks_whitelist))
1641 switch (subid) {
1642 case 0x0e11005a: /* HP nc4000/4010 */
1643 case 0x103c0890: /* HP nc6000 */
1644 case 0x103c0938: /* HP nc4220 */
1645 case 0x103c099c: /* HP nx6110 */
1646 case 0x103c0944: /* HP nc6220 */
1647 case 0x103c0934: /* HP nc8220 */
1648 case 0x103c006d: /* HP nx9105 */
1649 case 0x17340088: /* FSC Scenic-W */
1650 /* enable headphone jack sense */ 1675 /* enable headphone jack sense */
1651 snd_ac97_update_bits(ac97, AC97_AD_JACK_SPDIF, 1<<11, 1<<11); 1676 snd_ac97_update_bits(ac97, AC97_AD_JACK_SPDIF, 1<<11, 1<<11);
1652 break;
1653 }
1654} 1677}
1655 1678
1656int patch_ad1981a(struct snd_ac97 *ac97) 1679int patch_ad1981a(struct snd_ac97 *ac97)
@@ -1672,6 +1695,8 @@ static int patch_ad1981b_specific(struct snd_ac97 *ac97)
1672 1695
1673 if ((err = patch_build_controls(ac97, &snd_ac97_ad198x_2cmic, 1)) < 0) 1696 if ((err = patch_build_controls(ac97, &snd_ac97_ad198x_2cmic, 1)) < 0)
1674 return err; 1697 return err;
1698 if (check_list(ac97, ad1981_jacks_blacklist))
1699 return 0;
1675 return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense, 1700 return patch_build_controls(ac97, snd_ac97_ad1981x_jack_sense,
1676 ARRAY_SIZE(snd_ac97_ad1981x_jack_sense)); 1701 ARRAY_SIZE(snd_ac97_ad1981x_jack_sense));
1677} 1702}
@@ -2210,9 +2235,9 @@ static void alc850_update_jacks(struct snd_ac97 *ac97)
2210 /* Vref disable (bit12), 1kOhm (bit13) */ 2235 /* Vref disable (bit12), 1kOhm (bit13) */
2211 snd_ac97_update_bits(ac97, AC97_ALC850_MISC1, (1<<12)|(1<<13), 2236 snd_ac97_update_bits(ac97, AC97_ALC850_MISC1, (1<<12)|(1<<13),
2212 shared ? (1<<12) : (1<<13)); 2237 shared ? (1<<12) : (1<<13));
2213 /* MIC-IN = 1, CENTER-LFE = 2 */ 2238 /* MIC-IN = 1, CENTER-LFE = 5 */
2214 snd_ac97_update_bits(ac97, AC97_ALC850_JACK_SELECT, 7 << 4, 2239 snd_ac97_update_bits(ac97, AC97_ALC850_JACK_SELECT, 7 << 4,
2215 shared ? (2<<4) : (1<<4)); 2240 shared ? (5<<4) : (1<<4));
2216} 2241}
2217 2242
2218static const struct snd_kcontrol_new snd_ac97_controls_alc850[] = { 2243static const struct snd_kcontrol_new snd_ac97_controls_alc850[] = {
diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c
index bc4d1ef08efa..e264136e8fb4 100644
--- a/sound/pci/ali5451/ali5451.c
+++ b/sound/pci/ali5451/ali5451.c
@@ -279,7 +279,7 @@ struct snd_ali {
279}; 279};
280 280
281static struct pci_device_id snd_ali_ids[] = { 281static struct pci_device_id snd_ali_ids[] = {
282 {0x10b9, 0x5451, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, 282 {PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M5451), 0, 0, 0},
283 {0, } 283 {0, }
284}; 284};
285MODULE_DEVICE_TABLE(pci, snd_ali_ids); 285MODULE_DEVICE_TABLE(pci, snd_ali_ids);
diff --git a/sound/pci/au88x0/au88x0_eq.c b/sound/pci/au88x0/au88x0_eq.c
index 13bc8ed301c5..c8280f82eb5a 100644
--- a/sound/pci/au88x0/au88x0_eq.c
+++ b/sound/pci/au88x0/au88x0_eq.c
@@ -849,7 +849,7 @@ static int
849snd_vortex_peaks_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 849snd_vortex_peaks_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
850{ 850{
851 vortex_t *vortex = snd_kcontrol_chip(kcontrol); 851 vortex_t *vortex = snd_kcontrol_chip(kcontrol);
852 int i, count; 852 int i, count = 0;
853 u16 peaks[20]; 853 u16 peaks[20];
854 854
855 vortex_Eqlzr_GetAllPeaks(vortex, peaks, &count); 855 vortex_Eqlzr_GetAllPeaks(vortex, peaks, &count);
diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c
index dc9cd3079b14..c840a4c08e98 100644
--- a/sound/pci/bt87x.c
+++ b/sound/pci/bt87x.c
@@ -781,6 +781,8 @@ static struct pci_device_id snd_bt87x_ids[] = {
781 BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, 32000), 781 BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, 32000),
782 /* Viewcast Osprey 200 */ 782 /* Viewcast Osprey 200 */
783 BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, 44100), 783 BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, 44100),
784 /* AVerMedia Studio No. 103, 203, ...? */
785 BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1461, 0x0003, 48000),
784 { } 786 { }
785}; 787};
786MODULE_DEVICE_TABLE(pci, snd_bt87x_ids); 788MODULE_DEVICE_TABLE(pci, snd_bt87x_ids);
@@ -808,7 +810,7 @@ static int __devinit snd_bt87x_detect_card(struct pci_dev *pci)
808 const struct pci_device_id *supported; 810 const struct pci_device_id *supported;
809 811
810 supported = pci_match_device(&driver, pci); 812 supported = pci_match_device(&driver, pci);
811 if (supported) 813 if (supported && supported->driver_data > 0)
812 return supported->driver_data; 814 return supported->driver_data;
813 815
814 for (i = 0; i < ARRAY_SIZE(blacklist); ++i) 816 for (i = 0; i < ARRAY_SIZE(blacklist); ++i)
diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c
index 6ed7c0bfa091..9477838a9c88 100644
--- a/sound/pci/ca0106/ca0106_main.c
+++ b/sound/pci/ca0106/ca0106_main.c
@@ -199,7 +199,8 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
199 .name = "MSI K8N Diamond MB [SB0438]", 199 .name = "MSI K8N Diamond MB [SB0438]",
200 .gpio_type = 1, 200 .gpio_type = 1,
201 .i2c_adc = 1 } , 201 .i2c_adc = 1 } ,
202 /* Shuttle XPC SD31P which has an onboard Creative Labs Sound Blaster Live! 24-bit EAX 202 /* Shuttle XPC SD31P which has an onboard Creative Labs
203 * Sound Blaster Live! 24-bit EAX
203 * high-definition 7.1 audio processor". 204 * high-definition 7.1 audio processor".
204 * Added using info from andrewvegan in alsa bug #1298 205 * Added using info from andrewvegan in alsa bug #1298
205 */ 206 */
@@ -207,6 +208,15 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
207 .name = "Shuttle XPC SD31P [SD31P]", 208 .name = "Shuttle XPC SD31P [SD31P]",
208 .gpio_type = 1, 209 .gpio_type = 1,
209 .i2c_adc = 1 } , 210 .i2c_adc = 1 } ,
211 /* Shuttle XPC SD11G5 which has an onboard Creative Labs
212 * Sound Blaster Live! 24-bit EAX
213 * high-definition 7.1 audio processor".
214 * Fixes ALSA bug#1600
215 */
216 { .serial = 0x30411297,
217 .name = "Shuttle XPC SD11G5 [SD11G5]",
218 .gpio_type = 1,
219 .i2c_adc = 1 } ,
210 { .serial = 0, 220 { .serial = 0,
211 .name = "AudigyLS [Unknown]" } 221 .name = "AudigyLS [Unknown]" }
212}; 222};
diff --git a/sound/pci/cs46xx/dsp_spos_scb_lib.c b/sound/pci/cs46xx/dsp_spos_scb_lib.c
index 509aa2b63331..d4e0fb39bd06 100644
--- a/sound/pci/cs46xx/dsp_spos_scb_lib.c
+++ b/sound/pci/cs46xx/dsp_spos_scb_lib.c
@@ -675,7 +675,7 @@ cs46xx_dsp_create_src_task_scb(struct snd_cs46xx * chip, char * scb_name,
675 if (pass_through) { 675 if (pass_through) {
676 /* wont work with any other rate than 676 /* wont work with any other rate than
677 the native DSP rate */ 677 the native DSP rate */
678 snd_assert (rate = 48000); 678 snd_assert (rate == 48000);
679 679
680 scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&src_task_scb, 680 scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&src_task_scb,
681 dest,"DMAREADER",parent_scb, 681 dest,"DMAREADER",parent_scb,
diff --git a/sound/pci/cs5535audio/cs5535audio.c b/sound/pci/cs5535audio/cs5535audio.c
index f36ede827479..02e3721030b7 100644
--- a/sound/pci/cs5535audio/cs5535audio.c
+++ b/sound/pci/cs5535audio/cs5535audio.c
@@ -46,8 +46,10 @@ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
46static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; 46static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
47 47
48static struct pci_device_id snd_cs5535audio_ids[] = { 48static struct pci_device_id snd_cs5535audio_ids[] = {
49 { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_AUDIO, PCI_ANY_ID, 49 { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_AUDIO,
50 PCI_ANY_ID, 0, 0, 0, }, 50 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
51 { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_AUDIO,
52 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
51 {} 53 {}
52}; 54};
53 55
diff --git a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c
index 2e86a901a0a4..2a9d12d10680 100644
--- a/sound/pci/emu10k1/emumixer.c
+++ b/sound/pci/emu10k1/emumixer.c
@@ -759,6 +759,8 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
759 "Master Mono Playback Volume", 759 "Master Mono Playback Volume",
760 "PCM Out Path & Mute", 760 "PCM Out Path & Mute",
761 "Mono Output Select", 761 "Mono Output Select",
762 "Front Playback Switch",
763 "Front Playback Volume",
762 "Surround Playback Switch", 764 "Surround Playback Switch",
763 "Surround Playback Volume", 765 "Surround Playback Volume",
764 "Center Playback Switch", 766 "Center Playback Switch",
@@ -829,9 +831,9 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
829 } 831 }
830 if (emu->audigy) { 832 if (emu->audigy) {
831 /* set master volume to 0 dB */ 833 /* set master volume to 0 dB */
832 snd_ac97_write(emu->ac97, AC97_MASTER, 0x0000); 834 snd_ac97_write_cache(emu->ac97, AC97_MASTER, 0x0000);
833 /* set capture source to mic */ 835 /* set capture source to mic */
834 snd_ac97_write(emu->ac97, AC97_REC_SEL, 0x0000); 836 snd_ac97_write_cache(emu->ac97, AC97_REC_SEL, 0x0000);
835 c = audigy_remove_ctls; 837 c = audigy_remove_ctls;
836 } else { 838 } else {
837 /* 839 /*
@@ -844,8 +846,8 @@ int __devinit snd_emu10k1_mixer(struct snd_emu10k1 *emu,
844 snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT); 846 snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_CNTR|AC97SLOT_LFE|AC97SLOT_REAR_LEFT|AC97SLOT_REAR_RIGHT);
845 } 847 }
846 /* remove unused AC97 controls */ 848 /* remove unused AC97 controls */
847 snd_ac97_write(emu->ac97, AC97_SURROUND_MASTER, 0x0202); 849 snd_ac97_write_cache(emu->ac97, AC97_SURROUND_MASTER, 0x0202);
848 snd_ac97_write(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202); 850 snd_ac97_write_cache(emu->ac97, AC97_CENTER_LFE_MASTER, 0x0202);
849 c = emu10k1_remove_ctls; 851 c = emu10k1_remove_ctls;
850 } 852 }
851 for (; *c; c++) 853 for (; *c; c++)
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index a983deba4025..fd12b6991fe4 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -75,6 +75,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
75 "{Intel, ICH6M}," 75 "{Intel, ICH6M},"
76 "{Intel, ICH7}," 76 "{Intel, ICH7},"
77 "{Intel, ESB2}," 77 "{Intel, ESB2},"
78 "{Intel, ICH8},"
78 "{ATI, SB450}," 79 "{ATI, SB450},"
79 "{VIA, VT8251}," 80 "{VIA, VT8251},"
80 "{VIA, VT8237A}," 81 "{VIA, VT8237A},"
@@ -1586,6 +1587,7 @@ static struct pci_device_id azx_ids[] = {
1586 { 0x8086, 0x2668, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH6 */ 1587 { 0x8086, 0x2668, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH6 */
1587 { 0x8086, 0x27d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH7 */ 1588 { 0x8086, 0x27d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH7 */
1588 { 0x8086, 0x269a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ESB2 */ 1589 { 0x8086, 0x269a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ESB2 */
1590 { 0x8086, 0x284b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH8 */
1589 { 0x1002, 0x437b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB450 */ 1591 { 0x1002, 0x437b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB450 */
1590 { 0x1106, 0x3288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_VIA }, /* VIA VT8251/VT8237A */ 1592 { 0x1106, 0x3288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_VIA }, /* VIA VT8251/VT8237A */
1591 { 0x1039, 0x7502, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_SIS }, /* SIS966 */ 1593 { 0x1039, 0x7502, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_SIS }, /* SIS966 */
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index ad9e501a9818..b76755264730 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -1668,6 +1668,7 @@ static struct hda_board_config alc880_cfg_tbl[] = {
1668 { .pci_subvendor = 0x1043, .pci_subdevice = 0x8196, .config = ALC880_6ST }, /* ASUS P5GD1-HVM */ 1668 { .pci_subvendor = 0x1043, .pci_subdevice = 0x8196, .config = ALC880_6ST }, /* ASUS P5GD1-HVM */
1669 { .pci_subvendor = 0x1043, .pci_subdevice = 0x81b4, .config = ALC880_6ST }, 1669 { .pci_subvendor = 0x1043, .pci_subdevice = 0x81b4, .config = ALC880_6ST },
1670 { .pci_subvendor = 0x1019, .pci_subdevice = 0xa884, .config = ALC880_6ST }, /* Acer APFV */ 1670 { .pci_subvendor = 0x1019, .pci_subdevice = 0xa884, .config = ALC880_6ST }, /* Acer APFV */
1671 { .pci_subvendor = 0x1458, .pci_subdevice = 0xa102, .config = ALC880_6ST }, /* Gigabyte K8N51 */
1671 1672
1672 { .modelname = "6stack-digout", .config = ALC880_6ST_DIG }, 1673 { .modelname = "6stack-digout", .config = ALC880_6ST_DIG },
1673 { .pci_subvendor = 0x2668, .pci_subdevice = 0x8086, .config = ALC880_6ST_DIG }, 1674 { .pci_subvendor = 0x2668, .pci_subdevice = 0x8086, .config = ALC880_6ST_DIG },
@@ -2475,7 +2476,7 @@ static struct hda_verb alc260_init_verbs[] = {
2475 /* LINE-2 is used for line-out in rear */ 2476 /* LINE-2 is used for line-out in rear */
2476 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2477 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2477 /* select line-out */ 2478 /* select line-out */
2478 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 2479 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
2479 /* LINE-OUT pin */ 2480 /* LINE-OUT pin */
2480 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2481 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2481 /* enable HP */ 2482 /* enable HP */
@@ -2945,6 +2946,8 @@ static int alc260_auto_init(struct hda_codec *codec)
2945 */ 2946 */
2946static struct hda_board_config alc260_cfg_tbl[] = { 2947static struct hda_board_config alc260_cfg_tbl[] = {
2947 { .modelname = "basic", .config = ALC260_BASIC }, 2948 { .modelname = "basic", .config = ALC260_BASIC },
2949 { .pci_subvendor = 0x104d, .pci_subdevice = 0x81bb,
2950 .config = ALC260_BASIC }, /* Sony VAIO */
2948 { .modelname = "hp", .config = ALC260_HP }, 2951 { .modelname = "hp", .config = ALC260_HP },
2949 { .pci_subvendor = 0x103c, .pci_subdevice = 0x3010, .config = ALC260_HP }, 2952 { .pci_subvendor = 0x103c, .pci_subdevice = 0x3010, .config = ALC260_HP },
2950 { .pci_subvendor = 0x103c, .pci_subdevice = 0x3011, .config = ALC260_HP }, 2953 { .pci_subvendor = 0x103c, .pci_subdevice = 0x3011, .config = ALC260_HP },
@@ -3414,12 +3417,12 @@ static struct snd_kcontrol_new alc882_capture_mixer[] = {
3414 * configuration and preset 3417 * configuration and preset
3415 */ 3418 */
3416static struct hda_board_config alc882_cfg_tbl[] = { 3419static struct hda_board_config alc882_cfg_tbl[] = {
3417 { .modelname = "3stack-dig", .config = ALC861_3ST_DIG }, 3420 { .modelname = "3stack-dig", .config = ALC882_3ST_DIG },
3418 { .modelname = "6stack-dig", .config = ALC861_6ST_DIG }, 3421 { .modelname = "6stack-dig", .config = ALC882_6ST_DIG },
3419 { .pci_subvendor = 0x1462, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* MSI */ 3422 { .pci_subvendor = 0x1462, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* MSI */
3420 { .pci_subvendor = 0x105b, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* Foxconn */ 3423 { .pci_subvendor = 0x105b, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* Foxconn */
3421 { .pci_subvendor = 0x1019, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* ECS */ 3424 { .pci_subvendor = 0x1019, .pci_subdevice = 0x6668, .config = ALC882_6ST_DIG }, /* ECS */
3422 { .modelname = "auto", .config = ALC861_AUTO }, 3425 { .modelname = "auto", .config = ALC882_AUTO },
3423 {} 3426 {}
3424}; 3427};
3425 3428
diff --git a/sound/pci/hda/patch_si3054.c b/sound/pci/hda/patch_si3054.c
index 8f8840e6002b..250242cd6c70 100644
--- a/sound/pci/hda/patch_si3054.c
+++ b/sound/pci/hda/patch_si3054.c
@@ -297,6 +297,7 @@ static int patch_si3054(struct hda_codec *codec)
297struct hda_codec_preset snd_hda_preset_si3054[] = { 297struct hda_codec_preset snd_hda_preset_si3054[] = {
298 { .id = 0x163c3055, .name = "Si3054", .patch = patch_si3054 }, 298 { .id = 0x163c3055, .name = "Si3054", .patch = patch_si3054 },
299 { .id = 0x163c3155, .name = "Si3054", .patch = patch_si3054 }, 299 { .id = 0x163c3155, .name = "Si3054", .patch = patch_si3054 },
300 { .id = 0x11c13026, .name = "Si3054", .patch = patch_si3054 },
300 {} 301 {}
301}; 302};
302 303
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
index 61903848cd43..35c2823a0a2b 100644
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -50,10 +50,11 @@ struct sigmatel_spec {
50 unsigned int surr_switch: 1; 50 unsigned int surr_switch: 1;
51 unsigned int line_switch: 1; 51 unsigned int line_switch: 1;
52 unsigned int mic_switch: 1; 52 unsigned int mic_switch: 1;
53 unsigned int alt_switch: 1;
53 54
54 /* playback */ 55 /* playback */
55 struct hda_multi_out multiout; 56 struct hda_multi_out multiout;
56 hda_nid_t dac_nids[4]; 57 hda_nid_t dac_nids[5];
57 58
58 /* capture */ 59 /* capture */
59 hda_nid_t *adc_nids; 60 hda_nid_t *adc_nids;
@@ -73,7 +74,7 @@ struct sigmatel_spec {
73 74
74 /* capture source */ 75 /* capture source */
75 struct hda_input_mux *input_mux; 76 struct hda_input_mux *input_mux;
76 unsigned int cur_mux[2]; 77 unsigned int cur_mux[3];
77 78
78 /* i/o switches */ 79 /* i/o switches */
79 unsigned int io_switch[2]; 80 unsigned int io_switch[2];
@@ -107,6 +108,14 @@ static hda_nid_t stac922x_mux_nids[2] = {
107 0x12, 0x13, 108 0x12, 0x13,
108}; 109};
109 110
111static hda_nid_t stac927x_adc_nids[3] = {
112 0x07, 0x08, 0x09
113};
114
115static hda_nid_t stac927x_mux_nids[3] = {
116 0x15, 0x16, 0x17
117};
118
110static hda_nid_t stac9200_pin_nids[8] = { 119static hda_nid_t stac9200_pin_nids[8] = {
111 0x08, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 120 0x08, 0x09, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
112}; 121};
@@ -116,6 +125,12 @@ static hda_nid_t stac922x_pin_nids[10] = {
116 0x0f, 0x10, 0x11, 0x15, 0x1b, 125 0x0f, 0x10, 0x11, 0x15, 0x1b,
117}; 126};
118 127
128static hda_nid_t stac927x_pin_nids[14] = {
129 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
130 0x0f, 0x10, 0x11, 0x12, 0x13,
131 0x14, 0x21, 0x22, 0x23,
132};
133
119static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) 134static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
120{ 135{
121 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 136 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
@@ -155,6 +170,12 @@ static struct hda_verb stac922x_core_init[] = {
155 {} 170 {}
156}; 171};
157 172
173static struct hda_verb stac927x_core_init[] = {
174 /* set master volume and direct control */
175 { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
176 {}
177};
178
158static struct snd_kcontrol_new stac9200_mixer[] = { 179static struct snd_kcontrol_new stac9200_mixer[] = {
159 HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT), 180 HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
160 HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT), 181 HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
@@ -183,10 +204,26 @@ static struct snd_kcontrol_new stac922x_mixer[] = {
183 .put = stac92xx_mux_enum_put, 204 .put = stac92xx_mux_enum_put,
184 }, 205 },
185 HDA_CODEC_VOLUME("Capture Volume", 0x17, 0x0, HDA_INPUT), 206 HDA_CODEC_VOLUME("Capture Volume", 0x17, 0x0, HDA_INPUT),
207 HDA_CODEC_MUTE("Capture Switch", 0x17, 0x0, HDA_INPUT),
186 HDA_CODEC_VOLUME("Mux Capture Volume", 0x12, 0x0, HDA_OUTPUT), 208 HDA_CODEC_VOLUME("Mux Capture Volume", 0x12, 0x0, HDA_OUTPUT),
187 { } /* end */ 209 { } /* end */
188}; 210};
189 211
212static snd_kcontrol_new_t stac927x_mixer[] = {
213 {
214 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
215 .name = "Input Source",
216 .count = 1,
217 .info = stac92xx_mux_enum_info,
218 .get = stac92xx_mux_enum_get,
219 .put = stac92xx_mux_enum_put,
220 },
221 HDA_CODEC_VOLUME("InMux Capture Volume", 0x15, 0x0, HDA_OUTPUT),
222 HDA_CODEC_VOLUME("InVol Capture Volume", 0x18, 0x0, HDA_INPUT),
223 HDA_CODEC_MUTE("ADCMux Capture Switch", 0x1b, 0x0, HDA_OUTPUT),
224 { } /* end */
225};
226
190static int stac92xx_build_controls(struct hda_codec *codec) 227static int stac92xx_build_controls(struct hda_codec *codec)
191{ 228{
192 struct sigmatel_spec *spec = codec->spec; 229 struct sigmatel_spec *spec = codec->spec;
@@ -240,14 +277,14 @@ static unsigned int ref922x_pin_configs[10] = {
240}; 277};
241 278
242static unsigned int d945gtp3_pin_configs[10] = { 279static unsigned int d945gtp3_pin_configs[10] = {
243 0x0221401f, 0x01a19022, 0x01813021, 0x01114010, 280 0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
244 0x40000100, 0x40000100, 0x40000100, 0x40000100, 281 0x40000100, 0x40000100, 0x40000100, 0x40000100,
245 0x02a19120, 0x40000100, 282 0x02a19120, 0x40000100,
246}; 283};
247 284
248static unsigned int d945gtp5_pin_configs[10] = { 285static unsigned int d945gtp5_pin_configs[10] = {
249 0x0221401f, 0x01111012, 0x01813024, 0x01114010, 286 0x0221401f, 0x01011012, 0x01813024, 0x01014010,
250 0x01a19021, 0x01116011, 0x01452130, 0x40000100, 287 0x01a19021, 0x01016011, 0x01452130, 0x40000100,
251 0x02a19320, 0x40000100, 288 0x02a19320, 0x40000100,
252}; 289};
253 290
@@ -274,6 +311,28 @@ static struct hda_board_config stac922x_cfg_tbl[] = {
274 { .pci_subvendor = PCI_VENDOR_ID_INTEL, 311 { .pci_subvendor = PCI_VENDOR_ID_INTEL,
275 .pci_subdevice = 0x0013, 312 .pci_subdevice = 0x0013,
276 .config = STAC_D945GTP5 }, /* Intel D955XBK - 5 Stack */ 313 .config = STAC_D945GTP5 }, /* Intel D955XBK - 5 Stack */
314 { .pci_subvendor = PCI_VENDOR_ID_INTEL,
315 .pci_subdevice = 0x0417,
316 .config = STAC_D945GTP5 }, /* Intel D975XBK - 5 Stack */
317 {} /* terminator */
318};
319
320static unsigned int ref927x_pin_configs[14] = {
321 0x01813122, 0x01a19021, 0x01014010, 0x01016011,
322 0x01012012, 0x01011014, 0x40000100, 0x40000100,
323 0x40000100, 0x40000100, 0x40000100, 0x01441030,
324 0x01c41030, 0x40000100,
325};
326
327static unsigned int *stac927x_brd_tbl[] = {
328 ref927x_pin_configs,
329};
330
331static struct hda_board_config stac927x_cfg_tbl[] = {
332 { .modelname = "ref",
333 .pci_subvendor = PCI_VENDOR_ID_INTEL,
334 .pci_subdevice = 0x2668, /* DFI LanParty */
335 .config = STAC_REF }, /* SigmaTel reference board */
277 {} /* terminator */ 336 {} /* terminator */
278}; 337};
279 338
@@ -408,11 +467,23 @@ static struct hda_pcm_stream stac92xx_pcm_analog_playback = {
408 }, 467 },
409}; 468};
410 469
470static struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
471 .substreams = 1,
472 .channels_min = 2,
473 .channels_max = 2,
474 .nid = 0x06, /* NID to query formats and rates */
475 .ops = {
476 .open = stac92xx_playback_pcm_open,
477 .prepare = stac92xx_playback_pcm_prepare,
478 .cleanup = stac92xx_playback_pcm_cleanup
479 },
480};
481
411static struct hda_pcm_stream stac92xx_pcm_analog_capture = { 482static struct hda_pcm_stream stac92xx_pcm_analog_capture = {
412 .substreams = 2, 483 .substreams = 2,
413 .channels_min = 2, 484 .channels_min = 2,
414 .channels_max = 2, 485 .channels_max = 2,
415 .nid = 0x06, /* NID to query formats and rates */ 486 /* NID is set in stac92xx_build_pcms */
416 .ops = { 487 .ops = {
417 .prepare = stac92xx_capture_pcm_prepare, 488 .prepare = stac92xx_capture_pcm_prepare,
418 .cleanup = stac92xx_capture_pcm_cleanup 489 .cleanup = stac92xx_capture_pcm_cleanup
@@ -430,6 +501,14 @@ static int stac92xx_build_pcms(struct hda_codec *codec)
430 info->name = "STAC92xx Analog"; 501 info->name = "STAC92xx Analog";
431 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback; 502 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
432 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture; 503 info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
504 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
505
506 if (spec->alt_switch) {
507 codec->num_pcms++;
508 info++;
509 info->name = "STAC92xx Analog Alt";
510 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
511 }
433 512
434 if (spec->multiout.dig_out_nid || spec->dig_in_nid) { 513 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
435 codec->num_pcms++; 514 codec->num_pcms++;
@@ -588,6 +667,16 @@ static int stac92xx_add_dyn_out_pins(struct hda_codec *codec, struct auto_pin_cf
588 return 0; 667 return 0;
589} 668}
590 669
670/*
671 * XXX The line_out pin widget connection list may not be set to the
672 * desired DAC nid. This is the case on 927x where ports A and B can
673 * be routed to several DACs.
674 *
675 * This requires an analysis of the line-out/hp pin configuration
676 * to provide a best fit for pin/DAC configurations that are routable.
677 * For now, 927x DAC4 is not supported and 927x DAC1 output to ports
678 * A and B is not supported.
679 */
591/* fill in the dac_nids table from the parsed pin configuration */ 680/* fill in the dac_nids table from the parsed pin configuration */
592static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, const struct auto_pin_cfg *cfg) 681static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
593{ 682{
@@ -602,7 +691,13 @@ static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec, const struct aut
602 AC_VERB_GET_CONNECT_LIST, 0) & 0xff; 691 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
603 } 692 }
604 693
605 spec->multiout.num_dacs = cfg->line_outs; 694 if (cfg->line_outs)
695 spec->multiout.num_dacs = cfg->line_outs;
696 else if (cfg->hp_pin) {
697 spec->multiout.dac_nids[0] = snd_hda_codec_read(codec, cfg->hp_pin, 0,
698 AC_VERB_GET_CONNECT_LIST, 0) & 0xff;
699 spec->multiout.num_dacs = 1;
700 }
606 701
607 return 0; 702 return 0;
608} 703}
@@ -753,19 +848,21 @@ static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
753 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN); 848 stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
754} 849}
755 850
756static int stac922x_parse_auto_config(struct hda_codec *codec) 851static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
757{ 852{
758 struct sigmatel_spec *spec = codec->spec; 853 struct sigmatel_spec *spec = codec->spec;
759 int err; 854 int err;
760 855
761 if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0) 856 if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
762 return err; 857 return err;
858 if (! spec->autocfg.line_outs && ! spec->autocfg.hp_pin)
859 return 0; /* can't find valid pin config */
860 stac92xx_auto_init_multi_out(codec);
861 stac92xx_auto_init_hp_out(codec);
763 if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0) 862 if ((err = stac92xx_add_dyn_out_pins(codec, &spec->autocfg)) < 0)
764 return err; 863 return err;
765 if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0) 864 if ((err = stac92xx_auto_fill_dac_nids(codec, &spec->autocfg)) < 0)
766 return err; 865 return err;
767 if (! spec->autocfg.line_outs && ! spec->autocfg.hp_pin)
768 return 0; /* can't find valid pin config */
769 866
770 if ((err = stac92xx_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 || 867 if ((err = stac92xx_auto_create_multi_out_ctls(spec, &spec->autocfg)) < 0 ||
771 (err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg)) < 0 || 868 (err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg)) < 0 ||
@@ -777,11 +874,11 @@ static int stac922x_parse_auto_config(struct hda_codec *codec)
777 spec->surr_switch = 1; 874 spec->surr_switch = 1;
778 875
779 if (spec->autocfg.dig_out_pin) { 876 if (spec->autocfg.dig_out_pin) {
780 spec->multiout.dig_out_nid = 0x08; 877 spec->multiout.dig_out_nid = dig_out;
781 stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_out_pin, AC_PINCTL_OUT_EN); 878 stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_out_pin, AC_PINCTL_OUT_EN);
782 } 879 }
783 if (spec->autocfg.dig_in_pin) { 880 if (spec->autocfg.dig_in_pin) {
784 spec->dig_in_nid = 0x09; 881 spec->dig_in_nid = dig_in;
785 stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_in_pin, AC_PINCTL_IN_EN); 882 stac92xx_auto_set_pinctl(codec, spec->autocfg.dig_in_pin, AC_PINCTL_IN_EN);
786 } 883 }
787 884
@@ -827,9 +924,6 @@ static int stac92xx_init(struct hda_codec *codec)
827 924
828 snd_hda_sequence_write(codec, spec->init); 925 snd_hda_sequence_write(codec, spec->init);
829 926
830 stac92xx_auto_init_multi_out(codec);
831 stac92xx_auto_init_hp_out(codec);
832
833 return 0; 927 return 0;
834} 928}
835 929
@@ -996,7 +1090,47 @@ static int patch_stac922x(struct hda_codec *codec)
996 1090
997 spec->multiout.dac_nids = spec->dac_nids; 1091 spec->multiout.dac_nids = spec->dac_nids;
998 1092
999 err = stac922x_parse_auto_config(codec); 1093 err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
1094 if (err < 0) {
1095 stac92xx_free(codec);
1096 return err;
1097 }
1098
1099 codec->patch_ops = stac92xx_patch_ops;
1100
1101 return 0;
1102}
1103
1104static int patch_stac927x(struct hda_codec *codec)
1105{
1106 struct sigmatel_spec *spec;
1107 int err;
1108
1109 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1110 if (spec == NULL)
1111 return -ENOMEM;
1112
1113 codec->spec = spec;
1114 spec->board_config = snd_hda_check_board_config(codec, stac927x_cfg_tbl);
1115 if (spec->board_config < 0)
1116 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC927x, using BIOS defaults\n");
1117 else {
1118 spec->num_pins = 14;
1119 spec->pin_nids = stac927x_pin_nids;
1120 spec->pin_configs = stac927x_brd_tbl[spec->board_config];
1121 stac92xx_set_config_regs(codec);
1122 }
1123
1124 spec->adc_nids = stac927x_adc_nids;
1125 spec->mux_nids = stac927x_mux_nids;
1126 spec->num_muxes = 3;
1127
1128 spec->init = stac927x_core_init;
1129 spec->mixer = stac927x_mixer;
1130
1131 spec->multiout.dac_nids = spec->dac_nids;
1132
1133 err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
1000 if (err < 0) { 1134 if (err < 0) {
1001 stac92xx_free(codec); 1135 stac92xx_free(codec);
1002 return err; 1136 return err;
@@ -1018,5 +1152,15 @@ struct hda_codec_preset snd_hda_preset_sigmatel[] = {
1018 { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x }, 1152 { .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
1019 { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x }, 1153 { .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
1020 { .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x }, 1154 { .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
1155 { .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
1156 { .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
1157 { .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
1158 { .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
1159 { .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
1160 { .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
1161 { .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
1162 { .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
1163 { .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
1164 { .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
1021 {} /* terminator */ 1165 {} /* terminator */
1022}; 1166};
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
index 5466b1fa0cd5..174237f4a22c 100644
--- a/sound/pci/intel8x0.c
+++ b/sound/pci/intel8x0.c
@@ -427,6 +427,7 @@ static struct pci_device_id snd_intel8x0_ids[] = {
427 { 0x10de, 0x008a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8 */ 427 { 0x10de, 0x008a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8 */
428 { 0x10de, 0x00da, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE3 */ 428 { 0x10de, 0x00da, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE3 */
429 { 0x10de, 0x00ea, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8S */ 429 { 0x10de, 0x00ea, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8S */
430 { 0x10de, 0x026b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* MCP51 */
430 { 0x1022, 0x746d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD8111 */ 431 { 0x1022, 0x746d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD8111 */
431 { 0x1022, 0x7445, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD768 */ 432 { 0x1022, 0x7445, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD768 */
432 { 0x10b9, 0x5455, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALI }, /* Ali5455 */ 433 { 0x10b9, 0x5455, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALI }, /* Ali5455 */
@@ -1805,6 +1806,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
1805 }, 1806 },
1806 { 1807 {
1807 .subvendor = 0x1028, 1808 .subvendor = 0x1028,
1809 .subdevice = 0x0151,
1810 .name = "Dell Optiplex GX270", /* AD1981B */
1811 .type = AC97_TUNE_HP_ONLY
1812 },
1813 {
1814 .subvendor = 0x1028,
1808 .subdevice = 0x0163, 1815 .subdevice = 0x0163,
1809 .name = "Dell Unknown", /* STAC9750/51 */ 1816 .name = "Dell Unknown", /* STAC9750/51 */
1810 .type = AC97_TUNE_HP_ONLY 1817 .type = AC97_TUNE_HP_ONLY
@@ -1847,12 +1854,6 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
1847 }, 1854 },
1848 { 1855 {
1849 .subvendor = 0x103c, 1856 .subvendor = 0x103c,
1850 .subdevice = 0x099c,
1851 .name = "HP nx6110", /* AD1981B */
1852 .type = AC97_TUNE_HP_ONLY
1853 },
1854 {
1855 .subvendor = 0x103c,
1856 .subdevice = 0x129d, 1857 .subdevice = 0x129d,
1857 .name = "HP xw8000", 1858 .name = "HP xw8000",
1858 .type = AC97_TUNE_HP_ONLY 1859 .type = AC97_TUNE_HP_ONLY
@@ -1866,7 +1867,7 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
1866 { 1867 {
1867 .subvendor = 0x103c, 1868 .subvendor = 0x103c,
1868 .subdevice = 0x099c, 1869 .subdevice = 0x099c,
1869 .name = "HP nc6120", 1870 .name = "HP nx6110/nc6120",
1870 .type = AC97_TUNE_HP_MUTE_LED 1871 .type = AC97_TUNE_HP_MUTE_LED
1871 }, 1872 },
1872 { 1873 {
diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c
index b8c0853a8278..b2cba75b6b16 100644
--- a/sound/pci/pcxhr/pcxhr.c
+++ b/sound/pci/pcxhr/pcxhr.c
@@ -454,7 +454,7 @@ static int pcxhr_update_r_buffer(struct pcxhr_stream *stream)
454 is_capture = (subs->stream == SNDRV_PCM_STREAM_CAPTURE); 454 is_capture = (subs->stream == SNDRV_PCM_STREAM_CAPTURE);
455 stream_num = is_capture ? 0 : subs->number; 455 stream_num = is_capture ? 0 : subs->number;
456 456
457 snd_printdd("pcxhr_update_r_buffer(pcm%c%d) : addr(%p) bytes(%x) subs(%d)\n", 457 snd_printdd("pcxhr_update_r_buffer(pcm%c%d) : addr(%p) bytes(%zx) subs(%d)\n",
458 is_capture ? 'c' : 'p', 458 is_capture ? 'c' : 'p',
459 chip->chip_idx, (void*)subs->runtime->dma_addr, 459 chip->chip_idx, (void*)subs->runtime->dma_addr,
460 subs->runtime->dma_bytes, subs->number); 460 subs->runtime->dma_bytes, subs->number);
@@ -744,13 +744,14 @@ static int pcxhr_prepare(struct snd_pcm_substream *subs)
744 /* only the first stream can choose the sample rate */ 744 /* only the first stream can choose the sample rate */
745 /* the further opened streams will be limited to its frequency (see open) */ 745 /* the further opened streams will be limited to its frequency (see open) */
746 /* set the clock only once (first stream) */ 746 /* set the clock only once (first stream) */
747 if (mgr->sample_rate == 0) { 747 if (mgr->sample_rate != subs->runtime->rate) {
748 err = pcxhr_set_clock(mgr, subs->runtime->rate); 748 err = pcxhr_set_clock(mgr, subs->runtime->rate);
749 if (err) 749 if (err)
750 break; 750 break;
751 if (mgr->sample_rate == 0)
752 /* start the DSP-timer */
753 err = pcxhr_hardware_timer(mgr, 1);
751 mgr->sample_rate = subs->runtime->rate; 754 mgr->sample_rate = subs->runtime->rate;
752
753 err = pcxhr_hardware_timer(mgr, 1); /* start the DSP-timer */
754 } 755 }
755 } while(0); /* do only once (so we can use break instead of goto) */ 756 } while(0); /* do only once (so we can use break instead of goto) */
756 757
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c
index 3dec616bad6b..103b4d715ff4 100644
--- a/sound/pci/rme9652/hdspm.c
+++ b/sound/pci/rme9652/hdspm.c
@@ -3324,11 +3324,11 @@ static int __devinit snd_hdspm_preallocate_memory(struct hdspm * hdspm)
3324 snd_dma_pci_data(hdspm->pci), 3324 snd_dma_pci_data(hdspm->pci),
3325 wanted, 3325 wanted,
3326 wanted)) < 0) { 3326 wanted)) < 0) {
3327 snd_printdd("Could not preallocate %d Bytes\n", wanted); 3327 snd_printdd("Could not preallocate %zd Bytes\n", wanted);
3328 3328
3329 return err; 3329 return err;
3330 } else 3330 } else
3331 snd_printdd(" Preallocated %d Bytes\n", wanted); 3331 snd_printdd(" Preallocated %zd Bytes\n", wanted);
3332 3332
3333 return 0; 3333 return 0;
3334} 3334}
@@ -3510,7 +3510,7 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp
3510 3510
3511 hdspm->monitor_outs = enable_monitor; 3511 hdspm->monitor_outs = enable_monitor;
3512 3512
3513 snd_printdd("kmalloc Mixer memory of %d Bytes\n", 3513 snd_printdd("kmalloc Mixer memory of %zd Bytes\n",
3514 sizeof(struct hdspm_mixer)); 3514 sizeof(struct hdspm_mixer));
3515 if ((hdspm->mixer = kmalloc(sizeof(struct hdspm_mixer), GFP_KERNEL)) 3515 if ((hdspm->mixer = kmalloc(sizeof(struct hdspm_mixer), GFP_KERNEL))
3516 == NULL) { 3516 == NULL) {
diff --git a/sound/pci/trident/trident.c b/sound/pci/trident/trident.c
index 2b21df16ad6a..b4538045049f 100644
--- a/sound/pci/trident/trident.c
+++ b/sound/pci/trident/trident.c
@@ -64,9 +64,11 @@ module_param_array(wavetable_size, int, NULL, 0444);
64MODULE_PARM_DESC(wavetable_size, "Maximum memory size in kB for wavetable synth."); 64MODULE_PARM_DESC(wavetable_size, "Maximum memory size in kB for wavetable synth.");
65 65
66static struct pci_device_id snd_trident_ids[] = { 66static struct pci_device_id snd_trident_ids[] = {
67 { 0x1023, 0x2000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Trident 4DWave DX PCI Audio */ 67 {PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_DX),
68 { 0x1023, 0x2001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Trident 4DWave NX PCI Audio */ 68 PCI_CLASS_MULTIMEDIA_AUDIO << 8, 0xffff00, 0},
69 { 0x1039, 0x7018, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* SiS SI7018 PCI Audio */ 69 {PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_TRIDENT_4DWAVE_NX),
70 0, 0, 0},
71 {PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7018), 0, 0, 0},
70 { 0, } 72 { 0, }
71}; 73};
72 74
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c
index ed26a155c344..423741371191 100644
--- a/sound/pci/via82xx.c
+++ b/sound/pci/via82xx.c
@@ -2340,6 +2340,7 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
2340 { .subvendor = 0x1043, .subdevice = 0x80b0, .action = VIA_DXS_NO_VRA }, /* ASUS A7V600 & K8V*/ 2340 { .subvendor = 0x1043, .subdevice = 0x80b0, .action = VIA_DXS_NO_VRA }, /* ASUS A7V600 & K8V*/
2341 { .subvendor = 0x1043, .subdevice = 0x810d, .action = VIA_DXS_SRC }, /* ASUS */ 2341 { .subvendor = 0x1043, .subdevice = 0x810d, .action = VIA_DXS_SRC }, /* ASUS */
2342 { .subvendor = 0x1043, .subdevice = 0x812a, .action = VIA_DXS_SRC }, /* ASUS A8V Deluxe */ 2342 { .subvendor = 0x1043, .subdevice = 0x812a, .action = VIA_DXS_SRC }, /* ASUS A8V Deluxe */
2343 { .subvendor = 0x1043, .subdevice = 0x8174, .action = VIA_DXS_SRC }, /* ASUS */
2343 { .subvendor = 0x1071, .subdevice = 0x8375, .action = VIA_DXS_NO_VRA }, /* Vobis/Yakumo/Mitac notebook */ 2344 { .subvendor = 0x1071, .subdevice = 0x8375, .action = VIA_DXS_NO_VRA }, /* Vobis/Yakumo/Mitac notebook */
2344 { .subvendor = 0x1071, .subdevice = 0x8399, .action = VIA_DXS_NO_VRA }, /* Umax AB 595T (VIA K8N800A - VT8237) */ 2345 { .subvendor = 0x1071, .subdevice = 0x8399, .action = VIA_DXS_NO_VRA }, /* Umax AB 595T (VIA K8N800A - VT8237) */
2345 { .subvendor = 0x10cf, .subdevice = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */ 2346 { .subvendor = 0x10cf, .subdevice = 0x118e, .action = VIA_DXS_ENABLE }, /* FSC laptop */
@@ -2358,6 +2359,7 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
2358 { .subvendor = 0x1462, .subdevice = 0x7023, .action = VIA_DXS_NO_VRA }, /* MSI K8T Neo2-FI */ 2359 { .subvendor = 0x1462, .subdevice = 0x7023, .action = VIA_DXS_NO_VRA }, /* MSI K8T Neo2-FI */
2359 { .subvendor = 0x1462, .subdevice = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */ 2360 { .subvendor = 0x1462, .subdevice = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */
2360 { .subvendor = 0x1462, .subdevice = 0x7142, .action = VIA_DXS_ENABLE }, /* MSI K8MM-V */ 2361 { .subvendor = 0x1462, .subdevice = 0x7142, .action = VIA_DXS_ENABLE }, /* MSI K8MM-V */
2362 { .subvendor = 0x1462, .subdevice = 0xb012, .action = VIA_DXS_SRC }, /* P4M800/VIA8237R */
2361 { .subvendor = 0x147b, .subdevice = 0x1401, .action = VIA_DXS_ENABLE }, /* ABIT KD7(-RAID) */ 2363 { .subvendor = 0x147b, .subdevice = 0x1401, .action = VIA_DXS_ENABLE }, /* ABIT KD7(-RAID) */
2362 { .subvendor = 0x147b, .subdevice = 0x1411, .action = VIA_DXS_ENABLE }, /* ABIT VA-20 */ 2364 { .subvendor = 0x147b, .subdevice = 0x1411, .action = VIA_DXS_ENABLE }, /* ABIT VA-20 */
2363 { .subvendor = 0x147b, .subdevice = 0x1413, .action = VIA_DXS_ENABLE }, /* ABIT KV8 Pro */ 2365 { .subvendor = 0x147b, .subdevice = 0x1413, .action = VIA_DXS_ENABLE }, /* ABIT KV8 Pro */
@@ -2371,6 +2373,9 @@ static int __devinit check_dxs_list(struct pci_dev *pci)
2371 { .subvendor = 0x161f, .subdevice = 0x2032, .action = VIA_DXS_48K }, /* m680x machines */ 2373 { .subvendor = 0x161f, .subdevice = 0x2032, .action = VIA_DXS_48K }, /* m680x machines */
2372 { .subvendor = 0x1631, .subdevice = 0xe004, .action = VIA_DXS_ENABLE }, /* Easy Note 3174, Packard Bell */ 2374 { .subvendor = 0x1631, .subdevice = 0xe004, .action = VIA_DXS_ENABLE }, /* Easy Note 3174, Packard Bell */
2373 { .subvendor = 0x1695, .subdevice = 0x3005, .action = VIA_DXS_ENABLE }, /* EPoX EP-8K9A */ 2375 { .subvendor = 0x1695, .subdevice = 0x3005, .action = VIA_DXS_ENABLE }, /* EPoX EP-8K9A */
2376 { .subvendor = 0x1695, .subdevice = 0x300e, .action = VIA_DXS_SRC }, /* EPoX 9HEAI */
2377 { .subvendor = 0x16f3, .subdevice = 0x6405, .action = VIA_DXS_SRC }, /* Jetway K8M8MS */
2378 { .subvendor = 0x1734, .subdevice = 0x1093, .action = VIA_DXS_SRC }, /* FSC */
2374 { .subvendor = 0x1849, .subdevice = 0x3059, .action = VIA_DXS_NO_VRA }, /* ASRock K7VM2 */ 2379 { .subvendor = 0x1849, .subdevice = 0x3059, .action = VIA_DXS_NO_VRA }, /* ASRock K7VM2 */
2375 { .subvendor = 0x1849, .subdevice = 0x9761, .action = VIA_DXS_SRC }, /* ASRock mobo(?) */ 2380 { .subvendor = 0x1849, .subdevice = 0x9761, .action = VIA_DXS_SRC }, /* ASRock mobo(?) */
2376 { .subvendor = 0x1919, .subdevice = 0x200a, .action = VIA_DXS_NO_VRA }, /* Soltek SL-K8Tpro-939 */ 2381 { .subvendor = 0x1919, .subdevice = 0x200a, .action = VIA_DXS_NO_VRA }, /* Soltek SL-K8Tpro-939 */
diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c
index 1dfc7233c6a8..a1aa74b79b3d 100644
--- a/sound/pci/ymfpci/ymfpci_main.c
+++ b/sound/pci/ymfpci/ymfpci_main.c
@@ -1229,6 +1229,7 @@ static int snd_ymfpci_spdif_default_get(struct snd_kcontrol *kcontrol,
1229 spin_lock_irq(&chip->reg_lock); 1229 spin_lock_irq(&chip->reg_lock);
1230 ucontrol->value.iec958.status[0] = (chip->spdif_bits >> 0) & 0xff; 1230 ucontrol->value.iec958.status[0] = (chip->spdif_bits >> 0) & 0xff;
1231 ucontrol->value.iec958.status[1] = (chip->spdif_bits >> 8) & 0xff; 1231 ucontrol->value.iec958.status[1] = (chip->spdif_bits >> 8) & 0xff;
1232 ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS_48000;
1232 spin_unlock_irq(&chip->reg_lock); 1233 spin_unlock_irq(&chip->reg_lock);
1233 return 0; 1234 return 0;
1234} 1235}
@@ -1303,6 +1304,7 @@ static int snd_ymfpci_spdif_stream_get(struct snd_kcontrol *kcontrol,
1303 spin_lock_irq(&chip->reg_lock); 1304 spin_lock_irq(&chip->reg_lock);
1304 ucontrol->value.iec958.status[0] = (chip->spdif_pcm_bits >> 0) & 0xff; 1305 ucontrol->value.iec958.status[0] = (chip->spdif_pcm_bits >> 0) & 0xff;
1305 ucontrol->value.iec958.status[1] = (chip->spdif_pcm_bits >> 8) & 0xff; 1306 ucontrol->value.iec958.status[1] = (chip->spdif_pcm_bits >> 8) & 0xff;
1307 ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS_48000;
1306 spin_unlock_irq(&chip->reg_lock); 1308 spin_unlock_irq(&chip->reg_lock);
1307 return 0; 1309 return 0;
1308} 1310}
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index a1bd8040dea4..d5013383fad7 100644
--- a/sound/usb/usbaudio.c
+++ b/sound/usb/usbaudio.c
@@ -478,22 +478,38 @@ static int retire_playback_sync_urb_hs(struct snd_usb_substream *subs,
478/* 478/*
479 * Prepare urb for streaming before playback starts. 479 * Prepare urb for streaming before playback starts.
480 * 480 *
481 * We don't care about (or have) any data, so we just send a transfer delimiter. 481 * We don't yet have data, so we send a frame of silence.
482 */ 482 */
483static int prepare_startup_playback_urb(struct snd_usb_substream *subs, 483static int prepare_startup_playback_urb(struct snd_usb_substream *subs,
484 struct snd_pcm_runtime *runtime, 484 struct snd_pcm_runtime *runtime,
485 struct urb *urb) 485 struct urb *urb)
486{ 486{
487 unsigned int i; 487 unsigned int i, offs, counts;
488 struct snd_urb_ctx *ctx = urb->context; 488 struct snd_urb_ctx *ctx = urb->context;
489 int stride = runtime->frame_bits >> 3;
489 490
491 offs = 0;
490 urb->dev = ctx->subs->dev; 492 urb->dev = ctx->subs->dev;
491 urb->number_of_packets = subs->packs_per_ms; 493 urb->number_of_packets = subs->packs_per_ms;
492 for (i = 0; i < subs->packs_per_ms; ++i) { 494 for (i = 0; i < subs->packs_per_ms; ++i) {
493 urb->iso_frame_desc[i].offset = 0; 495 /* calculate the size of a packet */
494 urb->iso_frame_desc[i].length = 0; 496 if (subs->fill_max)
497 counts = subs->maxframesize; /* fixed */
498 else {
499 subs->phase = (subs->phase & 0xffff)
500 + (subs->freqm << subs->datainterval);
501 counts = subs->phase >> 16;
502 if (counts > subs->maxframesize)
503 counts = subs->maxframesize;
504 }
505 urb->iso_frame_desc[i].offset = offs * stride;
506 urb->iso_frame_desc[i].length = counts * stride;
507 offs += counts;
495 } 508 }
496 urb->transfer_buffer_length = 0; 509 urb->transfer_buffer_length = offs * stride;
510 memset(urb->transfer_buffer,
511 subs->cur_audiofmt->format == SNDRV_PCM_FORMAT_U8 ? 0x80 : 0,
512 offs * stride);
497 return 0; 513 return 0;
498} 514}
499 515
@@ -2477,12 +2493,13 @@ static int parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp
2477 if (err < 0) 2493 if (err < 0)
2478 return err; 2494 return err;
2479#if 1 2495#if 1
2480 /* FIXME: temporary hack for extigy/audigy 2 nx */ 2496 /* FIXME: temporary hack for extigy/audigy 2 nx/zs */
2481 /* extigy apparently supports sample rates other than 48k 2497 /* extigy apparently supports sample rates other than 48k
2482 * but not in ordinary way. so we enable only 48k atm. 2498 * but not in ordinary way. so we enable only 48k atm.
2483 */ 2499 */
2484 if (chip->usb_id == USB_ID(0x041e, 0x3000) || 2500 if (chip->usb_id == USB_ID(0x041e, 0x3000) ||
2485 chip->usb_id == USB_ID(0x041e, 0x3020)) { 2501 chip->usb_id == USB_ID(0x041e, 0x3020) ||
2502 chip->usb_id == USB_ID(0x041e, 0x3061)) {
2486 if (fmt[3] == USB_FORMAT_TYPE_I && 2503 if (fmt[3] == USB_FORMAT_TYPE_I &&
2487 fp->rates != SNDRV_PCM_RATE_48000 && 2504 fp->rates != SNDRV_PCM_RATE_48000 &&
2488 fp->rates != SNDRV_PCM_RATE_96000) 2505 fp->rates != SNDRV_PCM_RATE_96000)