]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/perex/alsa
authorLinus Torvalds <torvalds@g5.osdl.org>
Thu, 2 Feb 2006 06:08:23 +0000 (22:08 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 2 Feb 2006 06:08:23 +0000 (22:08 -0800)
479 files changed:
Documentation/RCU/RTFP.txt
Documentation/RCU/checklist.txt
Documentation/RCU/listRCU.txt
Documentation/RCU/rcu.txt
Documentation/RCU/rcuref.txt
Documentation/RCU/whatisRCU.txt
Documentation/kernel-doc-nano-HOWTO.txt
Documentation/kernel-parameters.txt
Documentation/power/interface.txt
Documentation/power/swsusp.txt
Documentation/powerpc/booting-without-of.txt [new file with mode: 0644]
Documentation/sysctl/vm.txt
Documentation/vm/page_migration [new file with mode: 0644]
arch/alpha/kernel/asm-offsets.c
arch/alpha/kernel/entry.S
arch/alpha/kernel/irq.c
arch/arm26/Kconfig
arch/arm26/kernel/fiq.c
arch/arm26/kernel/signal.c
arch/i386/Kconfig
arch/i386/kernel/acpi/Makefile
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/acpi/cstate.c
arch/i386/kernel/acpi/processor.c [new file with mode: 0644]
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
arch/i386/kernel/mpparse.c
arch/i386/kernel/timers/timer_tsc.c
arch/ia64/kernel/Makefile
arch/ia64/kernel/acpi-ext.c
arch/ia64/kernel/acpi-processor.c [new file with mode: 0644]
arch/ia64/kernel/acpi.c
arch/ia64/kernel/cpufreq/Makefile
arch/ia64/kernel/cpufreq/acpi-cpufreq.c
arch/ia64/pci/pci.c
arch/mips/kernel/gdb-stub.c
arch/powerpc/kernel/legacy_serial.c
arch/powerpc/kernel/signal_32.c
arch/powerpc/platforms/powermac/pfunc_core.c
arch/powerpc/platforms/pseries/pci_dlpar.c
arch/s390/defconfig
arch/s390/kernel/compat_signal.c
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/entry.S
arch/s390/kernel/entry64.S
arch/s390/kernel/signal.c
arch/s390/kernel/syscalls.S
arch/s390/kernel/time.c
arch/s390/lib/Makefile
arch/sh/Kconfig
arch/sh/boards/superh/microdev/io.c
arch/sh/boards/superh/microdev/irq.c
arch/sh/boards/superh/microdev/setup.c
arch/sh/boards/unknown/Makefile
arch/sh/boards/unknown/io.c [deleted file]
arch/sh/boards/unknown/mach.c [deleted file]
arch/sh/boards/unknown/setup.c
arch/sh/cchips/voyagergx/consistent.c
arch/sh/cchips/voyagergx/irq.c
arch/sh/configs/microdev_defconfig
arch/sh/kernel/Makefile
arch/sh/kernel/cpu/Makefile
arch/sh/kernel/cpu/bus.c [deleted file]
arch/sh/kernel/cpu/clock.c
arch/sh/kernel/cpu/irq/ipr.c
arch/sh/kernel/entry.S
arch/sh/kernel/process.c
arch/sh/kernel/setup.c
arch/sh64/kernel/time.c
arch/um/Makefile
arch/um/drivers/chan_kern.c
arch/um/drivers/daemon_kern.c
arch/um/drivers/line.c
arch/um/drivers/mcast_kern.c
arch/um/drivers/mconsole_kern.c
arch/um/drivers/slip_common.h
arch/um/drivers/slip_kern.c
arch/um/drivers/slirp_kern.c
arch/um/drivers/ssl.c
arch/um/include/kern_util.h
arch/um/kernel/exec_kern.c
arch/um/kernel/physmem.c
arch/um/kernel/reboot.c
arch/um/kernel/tt/syscall_kern.c
arch/um/sys-i386/ldt.c
arch/x86_64/ia32/ia32entry.S
arch/x86_64/kernel/acpi/Makefile
arch/x86_64/kernel/acpi/processor.c [new file with mode: 0644]
arch/x86_64/kernel/io_apic.c
arch/x86_64/kernel/mpparse.c
arch/x86_64/lib/Makefile
arch/x86_64/lib/iomap_copy.S [new file with mode: 0644]
block/ll_rw_blk.c
drivers/acpi/Kconfig
drivers/acpi/acpi_memhotplug.c
drivers/acpi/asus_acpi.c
drivers/acpi/dispatcher/dsfield.c
drivers/acpi/dispatcher/dsinit.c
drivers/acpi/dispatcher/dsmethod.c
drivers/acpi/dispatcher/dsmthdat.c
drivers/acpi/dispatcher/dsobject.c
drivers/acpi/dispatcher/dsopcode.c
drivers/acpi/dispatcher/dsutils.c
drivers/acpi/dispatcher/dswexec.c
drivers/acpi/dispatcher/dswload.c
drivers/acpi/dispatcher/dswscope.c
drivers/acpi/dispatcher/dswstate.c
drivers/acpi/ec.c
drivers/acpi/events/evevent.c
drivers/acpi/events/evgpe.c
drivers/acpi/events/evgpeblk.c
drivers/acpi/events/evmisc.c
drivers/acpi/events/evregion.c
drivers/acpi/events/evrgnini.c
drivers/acpi/events/evsci.c
drivers/acpi/events/evxface.c
drivers/acpi/events/evxfevnt.c
drivers/acpi/events/evxfregn.c
drivers/acpi/executer/exconfig.c
drivers/acpi/executer/exconvrt.c
drivers/acpi/executer/excreate.c
drivers/acpi/executer/exdump.c
drivers/acpi/executer/exfield.c
drivers/acpi/executer/exfldio.c
drivers/acpi/executer/exmisc.c
drivers/acpi/executer/exmutex.c
drivers/acpi/executer/exnames.c
drivers/acpi/executer/exoparg1.c
drivers/acpi/executer/exoparg2.c
drivers/acpi/executer/exoparg3.c
drivers/acpi/executer/exoparg6.c
drivers/acpi/executer/exprep.c
drivers/acpi/executer/exregion.c
drivers/acpi/executer/exresnte.c
drivers/acpi/executer/exresolv.c
drivers/acpi/executer/exresop.c
drivers/acpi/executer/exstore.c
drivers/acpi/executer/exstoren.c
drivers/acpi/executer/exstorob.c
drivers/acpi/executer/exsystem.c
drivers/acpi/executer/exutils.c
drivers/acpi/glue.c
drivers/acpi/hardware/hwacpi.c
drivers/acpi/hardware/hwgpe.c
drivers/acpi/hardware/hwregs.c
drivers/acpi/hardware/hwsleep.c
drivers/acpi/hardware/hwtimer.c
drivers/acpi/motherboard.c
drivers/acpi/namespace/nsaccess.c
drivers/acpi/namespace/nsalloc.c
drivers/acpi/namespace/nsdump.c
drivers/acpi/namespace/nsdumpdv.c
drivers/acpi/namespace/nseval.c
drivers/acpi/namespace/nsinit.c
drivers/acpi/namespace/nsload.c
drivers/acpi/namespace/nsnames.c
drivers/acpi/namespace/nsobject.c
drivers/acpi/namespace/nsparse.c
drivers/acpi/namespace/nssearch.c
drivers/acpi/namespace/nsutils.c
drivers/acpi/namespace/nswalk.c
drivers/acpi/namespace/nsxfeval.c
drivers/acpi/namespace/nsxfname.c
drivers/acpi/namespace/nsxfobj.c
drivers/acpi/osl.c
drivers/acpi/parser/psargs.c
drivers/acpi/parser/psloop.c
drivers/acpi/parser/psopcode.c
drivers/acpi/parser/psparse.c
drivers/acpi/parser/psscope.c
drivers/acpi/parser/pstree.c
drivers/acpi/parser/psutils.c
drivers/acpi/parser/pswalk.c
drivers/acpi/parser/psxface.c
drivers/acpi/pci_irq.c
drivers/acpi/pci_link.c
drivers/acpi/pci_root.c
drivers/acpi/processor_core.c
drivers/acpi/processor_idle.c
drivers/acpi/processor_perflib.c
drivers/acpi/processor_thermal.c
drivers/acpi/processor_throttling.c
drivers/acpi/resources/Makefile
drivers/acpi/resources/rsaddr.c
drivers/acpi/resources/rscalc.c
drivers/acpi/resources/rscreate.c
drivers/acpi/resources/rsdump.c
drivers/acpi/resources/rsinfo.c [new file with mode: 0644]
drivers/acpi/resources/rsio.c
drivers/acpi/resources/rsirq.c
drivers/acpi/resources/rslist.c
drivers/acpi/resources/rsmemory.c
drivers/acpi/resources/rsmisc.c
drivers/acpi/resources/rsutils.c
drivers/acpi/resources/rsxface.c
drivers/acpi/scan.c
drivers/acpi/sleep/poweroff.c
drivers/acpi/sleep/sleep.h
drivers/acpi/sleep/wakeup.c
drivers/acpi/tables/tbconvrt.c
drivers/acpi/tables/tbget.c
drivers/acpi/tables/tbgetall.c
drivers/acpi/tables/tbinstal.c
drivers/acpi/tables/tbrsdt.c
drivers/acpi/tables/tbutils.c
drivers/acpi/tables/tbxface.c
drivers/acpi/tables/tbxfroot.c
drivers/acpi/utilities/Makefile
drivers/acpi/utilities/utalloc.c
drivers/acpi/utilities/utcache.c
drivers/acpi/utilities/utcopy.c
drivers/acpi/utilities/utdebug.c
drivers/acpi/utilities/utdelete.c
drivers/acpi/utilities/uteval.c
drivers/acpi/utilities/utglobal.c
drivers/acpi/utilities/utinit.c
drivers/acpi/utilities/utmath.c
drivers/acpi/utilities/utmisc.c
drivers/acpi/utilities/utmutex.c
drivers/acpi/utilities/utobject.c
drivers/acpi/utilities/utresrc.c [new file with mode: 0644]
drivers/acpi/utilities/utstate.c
drivers/acpi/utilities/utxface.c
drivers/acpi/video.c
drivers/char/Kconfig
drivers/char/hangcheck-timer.c
drivers/char/hpet.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/tpm/tpm_bios.c
drivers/char/tpm/tpm_infineon.c
drivers/char/vt.c
drivers/macintosh/macio_asic.c
drivers/md/dm-ioctl.c
drivers/md/dm-log.c
drivers/md/dm-snap.c
drivers/md/dm-snap.h
drivers/md/dm-table.c
drivers/md/dm.c
drivers/media/video/hexium_orion.c
drivers/mtd/maps/tsunami_flash.c
drivers/net/lp486e.c
drivers/net/wireless/ipw2200.c
drivers/pci/hotplug/rpaphp_slot.c
drivers/pnp/pnpacpi/core.c
drivers/pnp/pnpacpi/rsparser.c
drivers/s390/Kconfig
drivers/s390/block/dasd.c
drivers/s390/block/dasd_3370_erp.c
drivers/s390/block/dasd_3990_erp.c
drivers/s390/block/dasd_9336_erp.c
drivers/s390/block/dasd_9343_erp.c
drivers/s390/block/dasd_cmb.c
drivers/s390/block/dasd_devmap.c
drivers/s390/block/dasd_diag.c
drivers/s390/block/dasd_diag.h
drivers/s390/block/dasd_eckd.c
drivers/s390/block/dasd_eckd.h
drivers/s390/block/dasd_erp.c
drivers/s390/block/dasd_fba.c
drivers/s390/block/dasd_fba.h
drivers/s390/block/dasd_genhd.c
drivers/s390/block/dasd_int.h
drivers/s390/block/dasd_ioctl.c
drivers/s390/block/dasd_proc.c
drivers/s390/char/con3215.c
drivers/s390/char/con3270.c
drivers/s390/char/keyboard.c
drivers/s390/char/tape_34xx.c
drivers/s390/char/tape_class.c
drivers/s390/char/tape_class.h
drivers/s390/char/tape_core.c
drivers/s390/cio/airq.c
drivers/s390/cio/blacklist.c
drivers/s390/cio/ccwgroup.c
drivers/s390/cio/chsc.c
drivers/s390/cio/cio.c
drivers/s390/cio/cmf.c
drivers/s390/cio/css.c
drivers/s390/cio/device.c
drivers/s390/cio/device_ops.c
drivers/s390/cio/qdio.c
drivers/s390/cio/qdio.h
drivers/s390/crypto/z90common.h
drivers/s390/crypto/z90crypt.h
drivers/s390/crypto/z90hardware.c
drivers/s390/crypto/z90main.c
drivers/s390/net/claw.c
drivers/s390/net/claw.h
drivers/s390/net/ctcdbug.c
drivers/s390/net/ctcdbug.h
drivers/s390/net/ctcmain.c
drivers/s390/net/ctcmain.h
drivers/s390/net/ctctty.c
drivers/s390/net/ctctty.h
drivers/s390/net/cu3088.c
drivers/s390/net/fsm.c
drivers/s390/net/fsm.h
drivers/s390/net/iucv.c
drivers/s390/net/lcs.c
drivers/s390/net/lcs.h
drivers/s390/net/netiucv.c
drivers/s390/net/qeth.h
drivers/s390/net/qeth_eddp.c
drivers/s390/net/qeth_eddp.h
drivers/s390/net/qeth_fs.h
drivers/s390/net/qeth_main.c
drivers/s390/net/qeth_mpc.c
drivers/s390/net/qeth_mpc.h
drivers/s390/net/qeth_proc.c
drivers/s390/net/qeth_sys.c
drivers/s390/net/qeth_tso.h
drivers/s390/s390_rdev.c
drivers/s390/s390mach.h
drivers/s390/scsi/zfcp_aux.c
drivers/s390/scsi/zfcp_ccw.c
drivers/s390/scsi/zfcp_dbf.c
drivers/s390/scsi/zfcp_def.h
drivers/s390/scsi/zfcp_erp.c
drivers/s390/scsi/zfcp_ext.h
drivers/s390/scsi/zfcp_fsf.c
drivers/s390/scsi/zfcp_qdio.c
drivers/s390/scsi/zfcp_scsi.c
drivers/s390/scsi/zfcp_sysfs_adapter.c
drivers/s390/scsi/zfcp_sysfs_driver.c
drivers/s390/scsi/zfcp_sysfs_port.c
drivers/s390/scsi/zfcp_sysfs_unit.c
drivers/scsi/ide-scsi.c
drivers/serial/8250_acpi.c
drivers/serial/jsm/jsm_neo.c
drivers/serial/sh-sci.c
drivers/serial/sh-sci.h
drivers/sn/ioc3.c
drivers/video/backlight/Kconfig
drivers/video/backlight/Makefile
drivers/video/backlight/hp680_bl.c [new file with mode: 0644]
drivers/video/i810/i810-i2c.c
drivers/video/i810/i810.h
drivers/video/i810/i810_main.c
fs/Kconfig
fs/buffer.c
fs/cifs/connect.c
fs/cifs/file.c
fs/cifs/transport.c
fs/compat.c
fs/ext2/inode.c
fs/ext3/inode.c
fs/fuse/file.c
fs/fuse/fuse_i.h
fs/fuse/inode.c
fs/hugetlbfs/inode.c
fs/inode.c
fs/namei.c
fs/nfsd/nfssvc.c
fs/reiserfs/dir.c
fs/reiserfs/file.c
fs/reiserfs/fix_node.c
fs/reiserfs/inode.c
fs/reiserfs/journal.c
fs/reiserfs/namei.c
fs/reiserfs/procfs.c
fs/reiserfs/super.c
fs/reiserfs/xattr.c
fs/smbfs/dir.c
fs/xfs/linux-2.6/xfs_aops.c
fs/xfs/linux-2.6/xfs_buf.c
include/acpi/acconfig.h
include/acpi/acdebug.h
include/acpi/acdisasm.h
include/acpi/acdispat.h
include/acpi/acevents.h
include/acpi/acexcep.h
include/acpi/acglobal.h
include/acpi/achware.h
include/acpi/acinterp.h
include/acpi/aclocal.h
include/acpi/acmacros.h
include/acpi/acnames.h
include/acpi/acnamesp.h
include/acpi/acobject.h
include/acpi/acopcode.h
include/acpi/acoutput.h
include/acpi/acparser.h
include/acpi/acpi.h
include/acpi/acpi_drivers.h
include/acpi/acpiosxf.h
include/acpi/acpixf.h
include/acpi/acresrc.h
include/acpi/acstruct.h
include/acpi/actables.h
include/acpi/actbl.h
include/acpi/actbl1.h
include/acpi/actbl2.h
include/acpi/actypes.h
include/acpi/acutils.h
include/acpi/amlcode.h
include/acpi/amlresrc.h
include/acpi/pdc_intel.h
include/acpi/platform/acenv.h
include/acpi/platform/acgcc.h
include/acpi/platform/aclinux.h
include/acpi/processor.h
include/asm-alpha/dma-mapping.h
include/asm-arm26/bitops.h
include/asm-arm26/hardirq.h
include/asm-arm26/posix_types.h
include/asm-arm26/system.h
include/asm-i386/acpi.h
include/asm-i386/page.h
include/asm-powerpc/kexec.h
include/asm-powerpc/pmac_pfunc.h
include/asm-s390/dasd.h
include/asm-s390/qdio.h
include/asm-s390/thread_info.h
include/asm-s390/unistd.h
include/asm-sh/bus-sh.h [deleted file]
include/asm-sh/cpu-sh3/mmu_context.h
include/asm-sh/cpu-sh4/mmu_context.h
include/asm-sh/ioctls.h
include/asm-sh/irq-sh73180.h
include/asm-sh/irq-sh7780.h
include/asm-sh/irq.h
include/asm-sh/microdev.h [moved from include/asm-sh/microdev/irq.h with 65% similarity]
include/asm-sh/microdev/io.h [deleted file]
include/asm-sh/processor.h
include/asm-sh64/ioctls.h
include/asm-um/ldt-x86_64.h
include/asm-um/smp.h
include/asm-x86_64/ia32_unistd.h
include/asm-x86_64/mpspec.h
include/asm-xtensa/futex.h [new file with mode: 0644]
include/linux/acpi.h
include/linux/device-mapper.h
include/linux/fs.h
include/linux/fuse.h
include/linux/hrtimer.h
include/linux/io.h [new file with mode: 0644]
include/linux/kernel.h
include/linux/ktime.h
include/linux/mmzone.h
include/linux/posix-timers.h
include/linux/reboot.h
include/linux/reiserfs_fs.h
include/linux/reiserfs_fs_sb.h
include/linux/reiserfs_xattr.h
include/linux/rmap.h
include/linux/security.h
include/linux/slab.h
include/linux/swap.h
include/linux/syscalls.h
include/linux/sysctl.h
include/linux/types.h
kernel/fork.c
kernel/hrtimer.c
kernel/itimer.c
kernel/posix-timers.c
kernel/power/console.c
kernel/power/disk.c
kernel/power/main.c
kernel/power/power.h
kernel/power/swsusp.c
kernel/sched.c
kernel/sys.c
kernel/sysctl.c
lib/Makefile
lib/iomap_copy.c [new file with mode: 0644]
mm/memory.c
mm/mempolicy.c
mm/oom_kill.c
mm/page_alloc.c
mm/rmap.c
mm/shmem.c
mm/slab.c
mm/swap_state.c
mm/swapfile.c
mm/vmscan.c
net/sunrpc/sched.c
scripts/kernel-doc
security/selinux/hooks.c
security/selinux/include/objsec.h

index fcbcbc35b122fda0223e22c267f7bca240e48b5b..6221464d1a7e4a39539ba30fdf40b4b00279a60b 100644 (file)
@@ -90,16 +90,20 @@ at OLS.  The resulting abundance of RCU patches was presented the
 following year [McKenney02a], and use of RCU in dcache was first
 described that same year [Linder02a].
 
-Also in 2002, Michael [Michael02b,Michael02a] presented techniques
-that defer the destruction of data structures to simplify non-blocking
-synchronization (wait-free synchronization, lock-free synchronization,
-and obstruction-free synchronization are all examples of non-blocking
-synchronization).  In particular, this technique eliminates locking,
-reduces contention, reduces memory latency for readers, and parallelizes
-pipeline stalls and memory latency for writers.  However, these
-techniques still impose significant read-side overhead in the form of
-memory barriers.  Researchers at Sun worked along similar lines in the
-same timeframe [HerlihyLM02,HerlihyLMS03].
+Also in 2002, Michael [Michael02b,Michael02a] presented "hazard-pointer"
+techniques that defer the destruction of data structures to simplify
+non-blocking synchronization (wait-free synchronization, lock-free
+synchronization, and obstruction-free synchronization are all examples of
+non-blocking synchronization).  In particular, this technique eliminates
+locking, reduces contention, reduces memory latency for readers, and
+parallelizes pipeline stalls and memory latency for writers.  However,
+these techniques still impose significant read-side overhead in the
+form of memory barriers.  Researchers at Sun worked along similar lines
+in the same timeframe [HerlihyLM02,HerlihyLMS03].  These techniques
+can be thought of as inside-out reference counts, where the count is
+represented by the number of hazard pointers referencing a given data
+structure (rather than the more conventional counter field within the
+data structure itself).
 
 In 2003, the K42 group described how RCU could be used to create
 hot-pluggable implementations of operating-system functions.  Later that
@@ -113,7 +117,6 @@ number of operating-system kernels [PaulEdwardMcKenneyPhD], a paper
 describing how to make RCU safe for soft-realtime applications [Sarma04c],
 and a paper describing SELinux performance with RCU [JamesMorris04b].
 
-
 2005 has seen further adaptation of RCU to realtime use, permitting
 preemption of RCU realtime critical sections [PaulMcKenney05a,
 PaulMcKenney05b].
index e118a7c1a0928d9aadc5f4cd34d4e110a930a1ee..49e27cc19385385c25618d661566c13024a6c2fa 100644 (file)
@@ -177,3 +177,9 @@ over a rather long period of time, but improvements are always welcome!
 
        If you want to wait for some of these other things, you might
        instead need to use synchronize_irq() or synchronize_sched().
+
+12.    Any lock acquired by an RCU callback must be acquired elsewhere
+       with irq disabled, e.g., via spin_lock_irqsave().  Failing to
+       disable irq on a given acquisition of that lock will result in
+       deadlock as soon as the RCU callback happens to interrupt that
+       acquisition's critical section.
index f8a54fa0d8ab57f20e3d6103bc9a79cef6982ee1..1fd175368a875107892f72f412a980e9a93f7d77 100644 (file)
@@ -232,7 +232,7 @@ entry does not exist.  For this to be helpful, the search function must
 return holding the per-entry spinlock, as ipc_lock() does in fact do.
 
 Quick Quiz:  Why does the search function need to return holding the
-per-entry lock for this deleted-flag technique to be helpful?
+       per-entry lock for this deleted-flag technique to be helpful?
 
 If the system-call audit module were to ever need to reject stale data,
 one way to accomplish this would be to add a "deleted" flag and a "lock"
@@ -275,8 +275,8 @@ flag under the spinlock as follows:
        {
                struct audit_entry  *e;
 
-               /* Do not use the _rcu iterator here, since this is the only
-                * deletion routine. */
+               /* Do not need to use the _rcu iterator here, since this
+                * is the only deletion routine. */
                list_for_each_entry(e, list, list) {
                        if (!audit_compare_rule(rule, &e->rule)) {
                                spin_lock(&e->lock);
@@ -304,9 +304,12 @@ function to reject newly deleted data.
 
 
 Answer to Quick Quiz
-
-If the search function drops the per-entry lock before returning, then
-the caller will be processing stale data in any case.  If it is really
-OK to be processing stale data, then you don't need a "deleted" flag.
-If processing stale data really is a problem, then you need to hold the
-per-entry lock across all of the code that uses the value looked up.
+       Why does the search function need to return holding the per-entry
+       lock for this deleted-flag technique to be helpful?
+
+       If the search function drops the per-entry lock before returning,
+       then the caller will be processing stale data in any case.  If it
+       is really OK to be processing stale data, then you don't need a
+       "deleted" flag.  If processing stale data really is a problem,
+       then you need to hold the per-entry lock across all of the code
+       that uses the value that was returned.
index 6fa092251586e14930c6d51d8bde1d4566512138..02e27bf1d36554d35038bdb6c962c2f091618d0a 100644 (file)
@@ -111,6 +111,11 @@ o  What are all these files in this directory?
 
                You are reading it!
 
+       rcuref.txt
+
+               Describes how to combine use of reference counts
+               with RCU.
+
        whatisRCU.txt
 
                Overview of how the RCU implementation works.  Along
index 3f60db41b2f0fdce0f6944cf527b3594f2ff8e8e..451de2ad8329022e3164f26cfa138f9a05dc1d33 100644 (file)
@@ -1,7 +1,7 @@
-Refcounter design for elements of lists/arrays protected by RCU.
+Reference-count design for elements of lists/arrays protected by RCU.
 
-Refcounting on elements of  lists which are protected by traditional
-reader/writer spinlocks or semaphores are straight forward as in:
+Reference counting on elements of lists which are protected by traditional
+reader/writer spinlocks or semaphores are straightforward:
 
 1.                             2.
 add()                          search_and_reference()
@@ -28,12 +28,12 @@ release_referenced()                        delete()
                                            ...
                                        }
 
-If this list/array is made lock free using rcu as in changing the
-write_lock in add() and delete() to spin_lock and changing read_lock
+If this list/array is made lock free using RCU as in changing the
+write_lock() in add() and delete() to spin_lock and changing read_lock
 in search_and_reference to rcu_read_lock(), the atomic_get in
 search_and_reference could potentially hold reference to an element which
-has already been deleted from the list/array.  atomic_inc_not_zero takes
-care of this scenario. search_and_reference should look as;
+has already been deleted from the list/array.  Use atomic_inc_not_zero()
+in this scenario as follows:
 
 1.                                     2.
 add()                                  search_and_reference()
@@ -51,17 +51,16 @@ add()                                       search_and_reference()
 release_referenced()                   delete()
 {                                      {
     ...                                            write_lock(&list_lock);
-    atomic_dec(&el->rc, relfunc)           ...
-    ...                                            delete_element
-}                                          write_unlock(&list_lock);
-                                           ...
+    if (atomic_dec_and_test(&el->rc))       ...
+        call_rcu(&el->head, el_free);       delete_element
+    ...                                     write_unlock(&list_lock);
+}                                          ...
                                            if (atomic_dec_and_test(&el->rc))
                                                call_rcu(&el->head, el_free);
                                            ...
                                        }
 
-Sometimes, reference to the element need to be obtained in the
-update (write) stream.  In such cases, atomic_inc_not_zero might be an
-overkill since the spinlock serialising list updates are held. atomic_inc
-is to be used in such cases.
-
+Sometimes, a reference to the element needs to be obtained in the
+update (write) stream.  In such cases, atomic_inc_not_zero() might be
+overkill, since we hold the update-side spinlock.  One might instead
+use atomic_inc() in such cases.
index 15da16861fa3d6bfbec2e3f192ece4a22ace5b7f..5ed85af88789afc46c0f1065ca701552d96cfebc 100644 (file)
@@ -200,10 +200,11 @@ rcu_assign_pointer()
        the new value, and also executes any memory-barrier instructions
        required for a given CPU architecture.
 
-       Perhaps more important, it serves to document which pointers
-       are protected by RCU.  That said, rcu_assign_pointer() is most
-       frequently used indirectly, via the _rcu list-manipulation
-       primitives such as list_add_rcu().
+       Perhaps just as important, it serves to document (1) which
+       pointers are protected by RCU and (2) the point at which a
+       given structure becomes accessible to other CPUs.  That said,
+       rcu_assign_pointer() is most frequently used indirectly, via
+       the _rcu list-manipulation primitives such as list_add_rcu().
 
 rcu_dereference()
 
@@ -258,9 +259,11 @@ rcu_dereference()
        locking.
 
        As with rcu_assign_pointer(), an important function of
-       rcu_dereference() is to document which pointers are protected
-       by RCU.  And, again like rcu_assign_pointer(), rcu_dereference()
-       is typically used indirectly, via the _rcu list-manipulation
+       rcu_dereference() is to document which pointers are protected by
+       RCU, in particular, flagging a pointer that is subject to changing
+       at any time, including immediately after the rcu_dereference().
+       And, again like rcu_assign_pointer(), rcu_dereference() is
+       typically used indirectly, via the _rcu list-manipulation
        primitives, such as list_for_each_entry_rcu().
 
 The following diagram shows how each API communicates among the
@@ -327,7 +330,7 @@ for specialized uses, but are relatively uncommon.
 3.  WHAT ARE SOME EXAMPLE USES OF CORE RCU API?
 
 This section shows a simple use of the core RCU API to protect a
-global pointer to a dynamically allocated structure.  More typical
+global pointer to a dynamically allocated structure.  More-typical
 uses of RCU may be found in listRCU.txt, arrayRCU.txt, and NMI-RCU.txt.
 
        struct foo {
@@ -410,6 +413,8 @@ o   Use synchronize_rcu() -after- removing a data element from an
        data item.
 
 See checklist.txt for additional rules to follow when using RCU.
+And again, more-typical uses of RCU may be found in listRCU.txt,
+arrayRCU.txt, and NMI-RCU.txt.
 
 
 4.  WHAT IF MY UPDATING THREAD CANNOT BLOCK?
@@ -513,7 +518,7 @@ production-quality implementation, and see:
 
 for papers describing the Linux kernel RCU implementation.  The OLS'01
 and OLS'02 papers are a good introduction, and the dissertation provides
-more details on the current implementation.
+more details on the current implementation as of early 2004.
 
 
 5A.  "TOY" IMPLEMENTATION #1: LOCKING
@@ -768,7 +773,6 @@ RCU pointer/list traversal:
        rcu_dereference
        list_for_each_rcu               (to be deprecated in favor of
                                         list_for_each_entry_rcu)
-       list_for_each_safe_rcu          (deprecated, not used)
        list_for_each_entry_rcu
        list_for_each_continue_rcu      (to be deprecated in favor of new
                                         list_for_each_entry_continue_rcu)
@@ -807,7 +811,8 @@ Quick Quiz #1:      Why is this argument naive?  How could a deadlock
 Answer:                Consider the following sequence of events:
 
                1.      CPU 0 acquires some unrelated lock, call it
-                       "problematic_lock".
+                       "problematic_lock", disabling irq via
+                       spin_lock_irqsave().
 
                2.      CPU 1 enters synchronize_rcu(), write-acquiring
                        rcu_gp_mutex.
@@ -894,7 +899,7 @@ Answer:             Just as PREEMPT_RT permits preemption of spinlock
 ACKNOWLEDGEMENTS
 
 My thanks to the people who helped make this human-readable, including
-Jon Walpole, Josh Triplett, Serge Hallyn, and Suzanne Wood.
+Jon Walpole, Josh Triplett, Serge Hallyn, Suzanne Wood, and Alan Stern.
 
 
 For more information, see http://www.rdrop.com/users/paulmck/RCU.
index c406ce67edd0c80e5ea4f9a580c056c8cb1a9730..c65233d430f0bb6888117c251576422d3fa9811f 100644 (file)
@@ -45,10 +45,10 @@ How to extract the documentation
 
 If you just want to read the ready-made books on the various
 subsystems (see Documentation/DocBook/*.tmpl), just type 'make
-psdocs', or 'make pdfdocs', or 'make htmldocs', depending on your 
-preference.  If you would rather read a different format, you can type 
-'make sgmldocs' and then use DocBook tools to convert 
-Documentation/DocBook/*.sgml to a format of your choice (for example, 
+psdocs', or 'make pdfdocs', or 'make htmldocs', depending on your
+preference.  If you would rather read a different format, you can type
+'make sgmldocs' and then use DocBook tools to convert
+Documentation/DocBook/*.sgml to a format of your choice (for example,
 'db2html ...' if 'make htmldocs' was not defined).
 
 If you want to see man pages instead, you can do this:
@@ -124,6 +124,36 @@ patterns, which are highlighted appropriately.
 Take a look around the source tree for examples.
 
 
+kernel-doc for structs, unions, enums, and typedefs
+---------------------------------------------------
+
+Beside functions you can also write documentation for structs, unions,
+enums and typedefs. Instead of the function name you must write the name
+of the declaration;  the struct/union/enum/typedef must always precede
+the name. Nesting of declarations is not supported.
+Use the argument mechanism to document members or constants.
+
+Inside a struct description, you can use the "private:" and "public:"
+comment tags.  Structure fields that are inside a "private:" area
+are not listed in the generated output documentation.
+
+Example:
+
+/**
+ * struct my_struct - short description
+ * @a: first member
+ * @b: second member
+ *
+ * Longer description
+ */
+struct my_struct {
+    int a;
+    int b;
+/* private: */
+    int c;
+};
+
+
 How to make new SGML template files
 -----------------------------------
 
@@ -147,4 +177,3 @@ documentation, in <filename>, for the functions listed.
 
 Tim.
 */ <twaugh@redhat.com>
-
index 1cbcf65b764b47137b0db013654e55f224c3c32c..84370363da809a67733cd346e429af2e56bef91c 100644 (file)
@@ -452,6 +452,11 @@ running once the system is up.
 
        eata=           [HW,SCSI]
 
+       ec_intr=        [HW,ACPI] ACPI Embedded Controller interrupt mode
+                       Format: <int>
+                       0: polling mode
+                       non-0: interrupt mode (default)
+
        eda=            [HW,PS2]
 
        edb=            [HW,PS2]
index bd4ffb5bd49a1d4e79fbceff8d9dc8fdcaef4200..4117802af0f8ce560316d557045566a5f0ea8494 100644 (file)
@@ -44,7 +44,7 @@ it.
 /sys/power/image_size controls the size of the image created by
 the suspend-to-disk mechanism.  It can be written a string
 representing a non-negative integer that will be used as an upper
-limit of the image size, in megabytes.  The suspend-to-disk mechanism will
+limit of the image size, in bytes.  The suspend-to-disk mechanism will
 do its best to ensure the image size will not exceed that number.  However,
 if this turns out to be impossible, it will try to suspend anyway using the
 smallest image possible.  In particular, if "0" is written to this file, the
index 08c79d4dc54036af80bb6ac0bc8b9e6e3528fabf..b28b7f04abb8022a75bb6646c544212562a9c754 100644 (file)
@@ -27,7 +27,7 @@ echo shutdown > /sys/power/disk; echo disk > /sys/power/state
 
 echo platform > /sys/power/disk; echo disk > /sys/power/state
 
-If you want to limit the suspend image size to N megabytes, do
+If you want to limit the suspend image size to N bytes, do
 
 echo N > /sys/power/image_size
 
diff --git a/Documentation/powerpc/booting-without-of.txt b/Documentation/powerpc/booting-without-of.txt
new file mode 100644 (file)
index 0000000..1284498
--- /dev/null
@@ -0,0 +1,1420 @@
+           Booting the Linux/ppc kernel without Open Firmware
+           --------------------------------------------------
+
+
+(c) 2005 Benjamin Herrenschmidt <benh at kernel.crashing.org>,
+    IBM Corp.
+(c) 2005 Becky Bruce <becky.bruce at freescale.com>,
+    Freescale Semiconductor, FSL SOC and 32-bit additions
+
+   May 18, 2005: Rev 0.1 - Initial draft, no chapter III yet.
+
+   May 19, 2005: Rev 0.2 - Add chapter III and bits & pieces here or
+                           clarifies the fact that a lot of things are
+                           optional, the kernel only requires a very
+                           small device tree, though it is encouraged
+                           to provide an as complete one as possible.
+
+   May 24, 2005: Rev 0.3 - Precise that DT block has to be in RAM
+                        - Misc fixes
+                        - Define version 3 and new format version 16
+                          for the DT block (version 16 needs kernel
+                          patches, will be fwd separately).
+                          String block now has a size, and full path
+                          is replaced by unit name for more
+                          compactness.
+                          linux,phandle is made optional, only nodes
+                          that are referenced by other nodes need it.
+                          "name" property is now automatically
+                          deduced from the unit name
+
+   June 1, 2005: Rev 0.4 - Correct confusion between OF_DT_END and
+                           OF_DT_END_NODE in structure definition.
+                         - Change version 16 format to always align
+                           property data to 4 bytes. Since tokens are
+                           already aligned, that means no specific
+                           required alignement between property size
+                           and property data. The old style variable
+                           alignment would make it impossible to do
+                           "simple" insertion of properties using
+                           memove (thanks Milton for
+                           noticing). Updated kernel patch as well
+                        - Correct a few more alignement constraints
+                        - Add a chapter about the device-tree
+                           compiler and the textural representation of
+                           the tree that can be "compiled" by dtc.
+
+
+   November 21, 2005: Rev 0.5
+                        - Additions/generalizations for 32-bit
+                        - Changed to reflect the new arch/powerpc
+                          structure
+                        - Added chapter VI
+
+
+ ToDo:
+       - Add some definitions of interrupt tree (simple/complex)
+       - Add some definitions for pci host bridges
+       - Add some common address format examples
+       - Add definitions for standard properties and "compatible"
+         names for cells that are not already defined by the existing
+         OF spec.
+       - Compare FSL SOC use of PCI to standard and make sure no new
+         node definition required.
+       - Add more information about node definitions for SOC devices
+         that currently have no standard, like the FSL CPM.
+
+
+I - Introduction
+================
+
+During the recent development of the Linux/ppc64 kernel, and more
+specifically, the addition of new platform types outside of the old
+IBM pSeries/iSeries pair, it was decided to enforce some strict rules
+regarding the kernel entry and bootloader <-> kernel interfaces, in
+order to avoid the degeneration that had become the ppc32 kernel entry
+point and the way a new platform should be added to the kernel. The
+legacy iSeries platform breaks those rules as it predates this scheme,
+but no new board support will be accepted in the main tree that
+doesn't follows them properly.  In addition, since the advent of the
+arch/powerpc merged architecture for ppc32 and ppc64, new 32-bit
+platforms and 32-bit platforms which move into arch/powerpc will be
+required to use these rules as well.
+
+The main requirement that will be defined in more detail below is
+the presence of a device-tree whose format is defined after Open
+Firmware specification. However, in order to make life easier
+to embedded board vendors, the kernel doesn't require the device-tree
+to represent every device in the system and only requires some nodes
+and properties to be present. This will be described in detail in
+section III, but, for example, the kernel does not require you to
+create a node for every PCI device in the system. It is a requirement
+to have a node for PCI host bridges in order to provide interrupt
+routing informations and memory/IO ranges, among others. It is also
+recommended to define nodes for on chip devices and other busses that
+don't specifically fit in an existing OF specification. This creates a
+great flexibility in the way the kernel can then probe those and match
+drivers to device, without having to hard code all sorts of tables. It
+also makes it more flexible for board vendors to do minor hardware
+upgrades without significantly impacting the kernel code or cluttering
+it with special cases.
+
+
+1) Entry point for arch/powerpc
+-------------------------------
+
+   There is one and one single entry point to the kernel, at the start
+   of the kernel image. That entry point supports two calling
+   conventions:
+
+        a) Boot from Open Firmware. If your firmware is compatible
+        with Open Firmware (IEEE 1275) or provides an OF compatible
+        client interface API (support for "interpret" callback of
+        forth words isn't required), you can enter the kernel with:
+
+              r5 : OF callback pointer as defined by IEEE 1275
+              bindings to powerpc. Only the 32 bit client interface
+              is currently supported
+
+              r3, r4 : address & length of an initrd if any or 0
+
+              The MMU is either on or off; the kernel will run the
+              trampoline located in arch/powerpc/kernel/prom_init.c to
+              extract the device-tree and other information from open
+              firmware and build a flattened device-tree as described
+              in b). prom_init() will then re-enter the kernel using
+              the second method. This trampoline code runs in the
+              context of the firmware, which is supposed to handle all
+              exceptions during that time.
+
+        b) Direct entry with a flattened device-tree block. This entry
+        point is called by a) after the OF trampoline and can also be
+        called directly by a bootloader that does not support the Open
+        Firmware client interface. It is also used by "kexec" to
+        implement "hot" booting of a new kernel from a previous
+        running one. This method is what I will describe in more
+        details in this document, as method a) is simply standard Open
+        Firmware, and thus should be implemented according to the
+        various standard documents defining it and its binding to the
+        PowerPC platform. The entry point definition then becomes:
+
+                r3 : physical pointer to the device-tree block
+                (defined in chapter II) in RAM
+
+                r4 : physical pointer to the kernel itself. This is
+                used by the assembly code to properly disable the MMU
+                in case you are entering the kernel with MMU enabled
+                and a non-1:1 mapping.
+
+                r5 : NULL (as to differenciate with method a)
+
+        Note about SMP entry: Either your firmware puts your other
+        CPUs in some sleep loop or spin loop in ROM where you can get
+        them out via a soft reset or some other means, in which case
+        you don't need to care, or you'll have to enter the kernel
+        with all CPUs. The way to do that with method b) will be
+        described in a later revision of this document.
+
+
+2) Board support
+----------------
+
+64-bit kernels:
+
+   Board supports (platforms) are not exclusive config options. An
+   arbitrary set of board supports can be built in a single kernel
+   image. The kernel will "know" what set of functions to use for a
+   given platform based on the content of the device-tree. Thus, you
+   should:
+
+        a) add your platform support as a _boolean_ option in
+        arch/powerpc/Kconfig, following the example of PPC_PSERIES,
+        PPC_PMAC and PPC_MAPLE. The later is probably a good
+        example of a board support to start from.
+
+        b) create your main platform file as
+        "arch/powerpc/platforms/myplatform/myboard_setup.c" and add it
+        to the Makefile under the condition of your CONFIG_
+        option. This file will define a structure of type "ppc_md"
+        containing the various callbacks that the generic code will
+        use to get to your platform specific code
+
+        c) Add a reference to your "ppc_md" structure in the
+        "machines" table in arch/powerpc/kernel/setup_64.c if you are
+        a 64-bit platform.
+
+        d) request and get assigned a platform number (see PLATFORM_*
+        constants in include/asm-powerpc/processor.h
+
+32-bit embedded kernels:
+
+  Currently, board support is essentially an exclusive config option.
+  The kernel is configured for a single platform.  Part of the reason
+  for this is to keep kernels on embedded systems small and efficient;
+  part of this is due to the fact the code is already that way. In the
+  future, a kernel may support multiple platforms, but only if the
+  platforms feature the same core architectire.  A single kernel build
+  cannot support both configurations with Book E and configurations
+  with classic Powerpc architectures.
+
+  32-bit embedded platforms that are moved into arch/powerpc using a
+  flattened device tree should adopt the merged tree practice of
+  setting ppc_md up dynamically, even though the kernel is currently
+  built with support for only a single platform at a time.  This allows
+  unification of the setup code, and will make it easier to go to a
+  multiple-platform-support model in the future.
+
+NOTE: I believe the above will be true once Ben's done with the merge
+of the boot sequences.... someone speak up if this is wrong!
+
+  To add a 32-bit embedded platform support, follow the instructions
+  for 64-bit platforms above, with the exception that the Kconfig
+  option should be set up such that the kernel builds exclusively for
+  the platform selected.  The processor type for the platform should
+  enable another config option to select the specific board
+  supported.
+
+NOTE: If ben doesn't merge the setup files, may need to change this to
+point to setup_32.c
+
+
+   I will describe later the boot process and various callbacks that
+   your platform should implement.
+
+
+II - The DT block format
+========================
+
+
+This chapter defines the actual format of the flattened device-tree
+passed to the kernel. The actual content of it and kernel requirements
+are described later. You can find example of code manipulating that
+format in various places, including arch/powerpc/kernel/prom_init.c
+which will generate a flattened device-tree from the Open Firmware
+representation, or the fs2dt utility which is part of the kexec tools
+which will generate one from a filesystem representation. It is
+expected that a bootloader like uboot provides a bit more support,
+that will be discussed later as well.
+
+Note: The block has to be in main memory. It has to be accessible in
+both real mode and virtual mode with no mapping other than main
+memory. If you are writing a simple flash bootloader, it should copy
+the block to RAM before passing it to the kernel.
+
+
+1) Header
+---------
+
+   The kernel is entered with r3 pointing to an area of memory that is
+   roughtly described in include/asm-powerpc/prom.h by the structure
+   boot_param_header:
+
+struct boot_param_header {
+        u32     magic;                  /* magic word OF_DT_HEADER */
+        u32     totalsize;              /* total size of DT block */
+        u32     off_dt_struct;          /* offset to structure */
+        u32     off_dt_strings;         /* offset to strings */
+        u32     off_mem_rsvmap;         /* offset to memory reserve map
+*/
+        u32     version;                /* format version */
+        u32     last_comp_version;      /* last compatible version */
+
+        /* version 2 fields below */
+        u32     boot_cpuid_phys;        /* Which physical CPU id we're
+                                           booting on */
+        /* version 3 fields below */
+        u32     size_dt_strings;        /* size of the strings block */
+};
+
+   Along with the constants:
+
+/* Definitions used by the flattened device tree */
+#define OF_DT_HEADER            0xd00dfeed      /* 4: version,
+                                                  4: total size */
+#define OF_DT_BEGIN_NODE        0x1             /* Start node: full name
+*/
+#define OF_DT_END_NODE          0x2             /* End node */
+#define OF_DT_PROP              0x3             /* Property: name off,
+                                                   size, content */
+#define OF_DT_END               0x9
+
+   All values in this header are in big endian format, the various
+   fields in this header are defined more precisely below. All
+   "offset" values are in bytes from the start of the header; that is
+   from the value of r3.
+
+   - magic
+
+     This is a magic value that "marks" the beginning of the
+     device-tree block header. It contains the value 0xd00dfeed and is
+     defined by the constant OF_DT_HEADER
+
+   - totalsize
+
+     This is the total size of the DT block including the header. The
+     "DT" block should enclose all data structures defined in this
+     chapter (who are pointed to by offsets in this header). That is,
+     the device-tree structure, strings, and the memory reserve map.
+
+   - off_dt_struct
+
+     This is an offset from the beginning of the header to the start
+     of the "structure" part the device tree. (see 2) device tree)
+
+   - off_dt_strings
+
+     This is an offset from the beginning of the header to the start
+     of the "strings" part of the device-tree
+
+   - off_mem_rsvmap
+
+     This is an offset from the beginning of the header to the start
+     of the reserved memory map. This map is a list of pairs of 64
+     bit integers. Each pair is a physical address and a size. The
+
+     list is terminated by an entry of size 0. This map provides the
+     kernel with a list of physical memory areas that are "reserved"
+     and thus not to be used for memory allocations, especially during
+     early initialization. The kernel needs to allocate memory during
+     boot for things like un-flattening the device-tree, allocating an
+     MMU hash table, etc... Those allocations must be done in such a
+     way to avoid overriding critical things like, on Open Firmware
+     capable machines, the RTAS instance, or on some pSeries, the TCE
+     tables used for the iommu. Typically, the reserve map should
+     contain _at least_ this DT block itself (header,total_size). If
+     you are passing an initrd to the kernel, you should reserve it as
+     well. You do not need to reserve the kernel image itself. The map
+     should be 64 bit aligned.
+
+   - version
+
+     This is the version of this structure. Version 1 stops
+     here. Version 2 adds an additional field boot_cpuid_phys.
+     Version 3 adds the size of the strings block, allowing the kernel
+     to reallocate it easily at boot and free up the unused flattened
+     structure after expansion. Version 16 introduces a new more
+     "compact" format for the tree itself that is however not backward
+     compatible. You should always generate a structure of the highest
+     version defined at the time of your implementation. Currently
+     that is version 16, unless you explicitely aim at being backward
+     compatible.
+
+   - last_comp_version
+
+     Last compatible version. This indicates down to what version of
+     the DT block you are backward compatible. For example, version 2
+     is backward compatible with version 1 (that is, a kernel build
+     for version 1 will be able to boot with a version 2 format). You
+     should put a 1 in this field if you generate a device tree of
+     version 1 to 3, or 0x10 if you generate a tree of version 0x10
+     using the new unit name format.
+
+   - boot_cpuid_phys
+
+     This field only exist on version 2 headers. It indicate which
+     physical CPU ID is calling the kernel entry point. This is used,
+     among others, by kexec. If you are on an SMP system, this value
+     should match the content of the "reg" property of the CPU node in
+     the device-tree corresponding to the CPU calling the kernel entry
+     point (see further chapters for more informations on the required
+     device-tree contents)
+
+
+   So the typical layout of a DT block (though the various parts don't
+   need to be in that order) looks like this (addresses go from top to
+   bottom):
+
+
+             ------------------------------
+       r3 -> |  struct boot_param_header  |
+             ------------------------------
+             |      (alignment gap) (*)   |
+             ------------------------------
+             |      memory reserve map    |
+             ------------------------------
+             |      (alignment gap)       |
+             ------------------------------
+             |                            |
+             |    device-tree structure   |
+             |                            |
+             ------------------------------
+             |      (alignment gap)       |
+             ------------------------------
+             |                            |
+             |     device-tree strings    |
+             |                            |
+      -----> ------------------------------
+      |
+      |
+      --- (r3 + totalsize)
+
+  (*) The alignment gaps are not necessarily present; their presence
+      and size are dependent on the various alignment requirements of
+      the individual data blocks.
+
+
+2) Device tree generalities
+---------------------------
+
+This device-tree itself is separated in two different blocks, a
+structure block and a strings block. Both need to be aligned to a 4
+byte boundary.
+
+First, let's quickly describe the device-tree concept before detailing
+the storage format. This chapter does _not_ describe the detail of the
+required types of nodes & properties for the kernel, this is done
+later in chapter III.
+
+The device-tree layout is strongly inherited from the definition of
+the Open Firmware IEEE 1275 device-tree. It's basically a tree of
+nodes, each node having two or more named properties. A property can
+have a value or not.
+
+It is a tree, so each node has one and only one parent except for the
+root node who has no parent.
+
+A node has 2 names. The actual node name is generally contained in a
+property of type "name" in the node property list whose value is a
+zero terminated string and is mandatory for version 1 to 3 of the
+format definition (as it is in Open Firmware). Version 0x10 makes it
+optional as it can generate it from the unit name defined below.
+
+There is also a "unit name" that is used to differenciate nodes with
+the same name at the same level, it is usually made of the node
+name's, the "@" sign, and a "unit address", which definition is
+specific to the bus type the node sits on.
+
+The unit name doesn't exist as a property per-se but is included in
+the device-tree structure. It is typically used to represent "path" in
+the device-tree. More details about the actual format of these will be
+below.
+
+The kernel powerpc generic code does not make any formal use of the
+unit address (though some board support code may do) so the only real
+requirement here for the unit address is to ensure uniqueness of
+the node unit name at a given level of the tree. Nodes with no notion
+of address and no possible sibling of the same name (like /memory or
+/cpus) may omit the unit address in the context of this specification,
+or use the "@0" default unit address. The unit name is used to define
+a node "full path", which is the concatenation of all parent node
+unit names separated with "/".
+
+The root node doesn't have a defined name, and isn't required to have
+a name property either if you are using version 3 or earlier of the
+format. It also has no unit address (no @ symbol followed by a unit
+address). The root node unit name is thus an empty string. The full
+path to the root node is "/".
+
+Every node which actually represents an actual device (that is, a node
+which isn't only a virtual "container" for more nodes, like "/cpus"
+is) is also required to have a "device_type" property indicating the
+type of node .
+
+Finally, every node that can be referenced from a property in another
+node is required to have a "linux,phandle" property. Real open
+firmware implementations provide a unique "phandle" value for every
+node that the "prom_init()" trampoline code turns into
+"linux,phandle" properties. However, this is made optional if the
+flattened device tree is used directly. An example of a node
+referencing another node via "phandle" is when laying out the
+interrupt tree which will be described in a further version of this
+document.
+
+This "linux, phandle" property is a 32 bit value that uniquely
+identifies a node. You are free to use whatever values or system of
+values, internal pointers, or whatever to generate these, the only
+requirement is that every node for which you provide that property has
+a unique value for it.
+
+Here is an example of a simple device-tree. In this example, an "o"
+designates a node followed by the node unit name. Properties are
+presented with their name followed by their content. "content"
+represents an ASCII string (zero terminated) value, while <content>
+represents a 32 bit hexadecimal value. The various nodes in this
+example will be discussed in a later chapter. At this point, it is
+only meant to give you a idea of what a device-tree looks like. I have
+purposefully kept the "name" and "linux,phandle" properties which
+aren't necessary in order to give you a better idea of what the tree
+looks like in practice.
+
+  / o device-tree
+      |- name = "device-tree"
+      |- model = "MyBoardName"
+      |- compatible = "MyBoardFamilyName"
+      |- #address-cells = <2>
+      |- #size-cells = <2>
+      |- linux,phandle = <0>
+      |
+      o cpus
+      | | - name = "cpus"
+      | | - linux,phandle = <1>
+      | | - #address-cells = <1>
+      | | - #size-cells = <0>
+      | |
+      | o PowerPC,970@0
+      |   |- name = "PowerPC,970"
+      |   |- device_type = "cpu"
+      |   |- reg = <0>
+      |   |- clock-frequency = <5f5e1000>
+      |   |- linux,boot-cpu
+      |   |- linux,phandle = <2>
+      |
+      o memory@0
+      | |- name = "memory"
+      | |- device_type = "memory"
+      | |- reg = <00000000 00000000 00000000 20000000>
+      | |- linux,phandle = <3>
+      |
+      o chosen
+        |- name = "chosen"
+        |- bootargs = "root=/dev/sda2"
+        |- linux,platform = <00000600>
+        |- linux,phandle = <4>
+
+This tree is almost a minimal tree. It pretty much contains the
+minimal set of required nodes and properties to boot a linux kernel;
+that is, some basic model informations at the root, the CPUs, and the
+physical memory layout.  It also includes misc information passed
+through /chosen, like in this example, the platform type (mandatory)
+and the kernel command line arguments (optional).
+
+The /cpus/PowerPC,970@0/linux,boot-cpu property is an example of a
+property without a value. All other properties have a value. The
+significance of the #address-cells and #size-cells properties will be
+explained in chapter IV which defines precisely the required nodes and
+properties and their content.
+
+
+3) Device tree "structure" block
+
+The structure of the device tree is a linearized tree structure. The
+"OF_DT_BEGIN_NODE" token starts a new node, and the "OF_DT_END_NODE"
+ends that node definition. Child nodes are simply defined before
+"OF_DT_END_NODE" (that is nodes within the node). A 'token' is a 32
+bit value. The tree has to be "finished" with a OF_DT_END token
+
+Here's the basic structure of a single node:
+
+     * token OF_DT_BEGIN_NODE (that is 0x00000001)
+     * for version 1 to 3, this is the node full path as a zero
+       terminated string, starting with "/". For version 16 and later,
+       this is the node unit name only (or an empty string for the
+       root node)
+     * [align gap to next 4 bytes boundary]
+     * for each property:
+        * token OF_DT_PROP (that is 0x00000003)
+        * 32 bit value of property value size in bytes (or 0 of no
+     * value)
+        * 32 bit value of offset in string block of property name
+        * property value data if any
+        * [align gap to next 4 bytes boundary]
+     * [child nodes if any]
+     * token OF_DT_END_NODE (that is 0x00000002)
+
+So the node content can be summmarised as a start token, a full path,
+a list of properties, a list of child node and an end token. Every
+child node is a full node structure itself as defined above.
+
+4) Device tree 'strings" block
+
+In order to save space, property names, which are generally redundant,
+are stored separately in the "strings" block. This block is simply the
+whole bunch of zero terminated strings for all property names
+concatenated together. The device-tree property definitions in the
+structure block will contain offset values from the beginning of the
+strings block.
+
+
+III - Required content of the device tree
+=========================================
+
+WARNING: All "linux,*" properties defined in this document apply only
+to a flattened device-tree. If your platform uses a real
+implementation of Open Firmware or an implementation compatible with
+the Open Firmware client interface, those properties will be created
+by the trampoline code in the kernel's prom_init() file. For example,
+that's where you'll have to add code to detect your board model and
+set the platform number. However, when using the flatenned device-tree
+entry point, there is no prom_init() pass, and thus you have to
+provide those properties yourself.
+
+
+1) Note about cells and address representation
+----------------------------------------------
+
+The general rule is documented in the various Open Firmware
+documentations. If you chose to describe a bus with the device-tree
+and there exist an OF bus binding, then you should follow the
+specification. However, the kernel does not require every single
+device or bus to be described by the device tree.
+
+In general, the format of an address for a device is defined by the
+parent bus type, based on the #address-cells and #size-cells
+property. In the absence of such a property, the parent's parent
+values are used, etc... The kernel requires the root node to have
+those properties defining addresses format for devices directly mapped
+on the processor bus.
+
+Those 2 properties define 'cells' for representing an address and a
+size. A "cell" is a 32 bit number. For example, if both contain 2
+like the example tree given above, then an address and a size are both
+composed of 2 cells, and each is a 64 bit number (cells are
+concatenated and expected to be in big endian format). Another example
+is the way Apple firmware defines them, with 2 cells for an address
+and one cell for a size.  Most 32-bit implementations should define
+#address-cells and #size-cells to 1, which represents a 32-bit value.
+Some 32-bit processors allow for physical addresses greater than 32
+bits; these processors should define #address-cells as 2.
+
+"reg" properties are always a tuple of the type "address size" where
+the number of cells of address and size is specified by the bus
+#address-cells and #size-cells. When a bus supports various address
+spaces and other flags relative to a given address allocation (like
+prefetchable, etc...) those flags are usually added to the top level
+bits of the physical address. For example, a PCI physical address is
+made of 3 cells, the bottom two containing the actual address itself
+while the top cell contains address space indication, flags, and pci
+bus & device numbers.
+
+For busses that support dynamic allocation, it's the accepted practice
+to then not provide the address in "reg" (keep it 0) though while
+providing a flag indicating the address is dynamically allocated, and
+then, to provide a separate "assigned-addresses" property that
+contains the fully allocated addresses. See the PCI OF bindings for
+details.
+
+In general, a simple bus with no address space bits and no dynamic
+allocation is preferred if it reflects your hardware, as the existing
+kernel address parsing functions will work out of the box. If you
+define a bus type with a more complex address format, including things
+like address space bits, you'll have to add a bus translator to the
+prom_parse.c file of the recent kernels for your bus type.
+
+The "reg" property only defines addresses and sizes (if #size-cells
+is
+non-0) within a given bus. In order to translate addresses upward
+(that is into parent bus addresses, and possibly into cpu physical
+addresses), all busses must contain a "ranges" property. If the
+"ranges" property is missing at a given level, it's assumed that
+translation isn't possible. The format of the "ranges" proprety for a
+bus is a list of:
+
+       bus address, parent bus address, size
+
+"bus address" is in the format of the bus this bus node is defining,
+that is, for a PCI bridge, it would be a PCI address. Thus, (bus
+address, size) defines a range of addresses for child devices. "parent
+bus address" is in the format of the parent bus of this bus. For
+example, for a PCI host controller, that would be a CPU address. For a
+PCI<->ISA bridge, that would be a PCI address. It defines the base
+address in the parent bus where the beginning of that range is mapped.
+
+For a new 64 bit powerpc board, I recommend either the 2/2 format or
+Apple's 2/1 format which is slightly more compact since sizes usually
+fit in a single 32 bit word.   New 32 bit powerpc boards should use a
+1/1 format, unless the processor supports physical addresses greater
+than 32-bits, in which case a 2/1 format is recommended.
+
+
+2) Note about "compatible" properties
+-------------------------------------
+
+These properties are optional, but recommended in devices and the root
+node. The format of a "compatible" property is a list of concatenated
+zero terminated strings. They allow a device to express its
+compatibility with a family of similar devices, in some cases,
+allowing a single driver to match against several devices regardless
+of their actual names.
+
+3) Note about "name" properties
+-------------------------------
+
+While earlier users of Open Firmware like OldWorld macintoshes tended
+to use the actual device name for the "name" property, it's nowadays
+considered a good practice to use a name that is closer to the device
+class (often equal to device_type). For example, nowadays, ethernet
+controllers are named "ethernet", an additional "model" property
+defining precisely the chip type/model, and "compatible" property
+defining the family in case a single driver can driver more than one
+of these chips. However, the kernel doesn't generally put any
+restriction on the "name" property; it is simply considered good
+practice to follow the standard and its evolutions as closely as
+possible.
+
+Note also that the new format version 16 makes the "name" property
+optional. If it's absent for a node, then the node's unit name is then
+used to reconstruct the name. That is, the part of the unit name
+before the "@" sign is used (or the entire unit name if no "@" sign
+is present).
+
+4) Note about node and property names and character set
+-------------------------------------------------------
+
+While open firmware provides more flexibe usage of 8859-1, this
+specification enforces more strict rules. Nodes and properties should
+be comprised only of ASCII characters 'a' to 'z', '0' to
+'9', ',', '.', '_', '+', '#', '?', and '-'. Node names additionally
+allow uppercase characters 'A' to 'Z' (property names should be
+lowercase. The fact that vendors like Apple don't respect this rule is
+irrelevant here). Additionally, node and property names should always
+begin with a character in the range 'a' to 'z' (or 'A' to 'Z' for node
+names).
+
+The maximum number of characters for both nodes and property names
+is 31. In the case of node names, this is only the leftmost part of
+a unit name (the pure "name" property), it doesn't include the unit
+address which can extend beyond that limit.
+
+
+5) Required nodes and properties
+--------------------------------
+  These are all that are currently required. However, it is strongly
+  recommended that you expose PCI host bridges as documented in the
+  PCI binding to open firmware, and your interrupt tree as documented
+  in OF interrupt tree specification.
+
+  a) The root node
+
+  The root node requires some properties to be present:
+
+    - model : this is your board name/model
+    - #address-cells : address representation for "root" devices
+    - #size-cells: the size representation for "root" devices
+
+  Additionally, some recommended properties are:
+
+    - compatible : the board "family" generally finds its way here,
+      for example, if you have 2 board models with a similar layout,
+      that typically get driven by the same platform code in the
+      kernel, you would use a different "model" property but put a
+      value in "compatible". The kernel doesn't directly use that
+      value (see /chosen/linux,platform for how the kernel choses a
+      platform type) but it is generally useful.
+
+  The root node is also generally where you add additional properties
+  specific to your board like the serial number if any, that sort of
+  thing. it is recommended that if you add any "custom" property whose
+  name may clash with standard defined ones, you prefix them with your
+  vendor name and a comma.
+
+  b) The /cpus node
+
+  This node is the parent of all individual CPU nodes. It doesn't
+  have any specific requirements, though it's generally good practice
+  to have at least:
+
+               #address-cells = <00000001>
+               #size-cells    = <00000000>
+
+  This defines that the "address" for a CPU is a single cell, and has
+  no meaningful size. This is not necessary but the kernel will assume
+  that format when reading the "reg" properties of a CPU node, see
+  below
+
+  c) The /cpus/* nodes
+
+  So under /cpus, you are supposed to create a node for every CPU on
+  the machine. There is no specific restriction on the name of the
+  CPU, though It's common practice to call it PowerPC,<name>. For
+  example, Apple uses PowerPC,G5 while IBM uses PowerPC,970FX.
+
+  Required properties:
+
+    - device_type : has to be "cpu"
+    - reg : This is the physical cpu number, it's a single 32 bit cell
+      and is also used as-is as the unit number for constructing the
+      unit name in the full path. For example, with 2 CPUs, you would
+      have the full path:
+        /cpus/PowerPC,970FX@0
+        /cpus/PowerPC,970FX@1
+      (unit addresses do not require leading zeroes)
+    - d-cache-line-size : one cell, L1 data cache line size in bytes
+    - i-cache-line-size : one cell, L1 instruction cache line size in
+      bytes
+    - d-cache-size : one cell, size of L1 data cache in bytes
+    - i-cache-size : one cell, size of L1 instruction cache in bytes
+    - linux, boot-cpu : Should be defined if this cpu is the boot cpu.
+
+  Recommended properties:
+
+    - timebase-frequency : a cell indicating the frequency of the
+      timebase in Hz. This is not directly used by the generic code,
+      but you are welcome to copy/paste the pSeries code for setting
+      the kernel timebase/decrementer calibration based on this
+      value.
+    - clock-frequency : a cell indicating the CPU core clock frequency
+      in Hz. A new property will be defined for 64 bit values, but if
+      your frequency is < 4Ghz, one cell is enough. Here as well as
+      for the above, the common code doesn't use that property, but
+      you are welcome to re-use the pSeries or Maple one. A future
+      kernel version might provide a common function for this.
+
+  You are welcome to add any property you find relevant to your board,
+  like some information about the mechanism used to soft-reset the
+  CPUs. For example, Apple puts the GPIO number for CPU soft reset
+  lines in there as a "soft-reset" property since they start secondary
+  CPUs by soft-resetting them.
+
+
+  d) the /memory node(s)
+
+  To define the physical memory layout of your board, you should
+  create one or more memory node(s). You can either create a single
+  node with all memory ranges in its reg property, or you can create
+  several nodes, as you wish. The unit address (@ part) used for the
+  full path is the address of the first range of memory defined by a
+  given node. If you use a single memory node, this will typically be
+  @0.
+
+  Required properties:
+
+    - device_type : has to be "memory"
+    - reg : This property contains all the physical memory ranges of
+      your board. It's a list of addresses/sizes concatenated
+      together, with the number of cells of each defined by the
+      #address-cells and #size-cells of the root node. For example,
+      with both of these properties beeing 2 like in the example given
+      earlier, a 970 based machine with 6Gb of RAM could typically
+      have a "reg" property here that looks like:
+
+      00000000 00000000 00000000 80000000
+      00000001 00000000 00000001 00000000
+
+      That is a range starting at 0 of 0x80000000 bytes and a range
+      starting at 0x100000000 and of 0x100000000 bytes. You can see
+      that there is no memory covering the IO hole between 2Gb and
+      4Gb. Some vendors prefer splitting those ranges into smaller
+      segments, but the kernel doesn't care.
+
+  e) The /chosen node
+
+  This node is a bit "special". Normally, that's where open firmware
+  puts some variable environment information, like the arguments, or
+  phandle pointers to nodes like the main interrupt controller, or the
+  default input/output devices.
+
+  This specification makes a few of these mandatory, but also defines
+  some linux-specific properties that would be normally constructed by
+  the prom_init() trampoline when booting with an OF client interface,
+  but that you have to provide yourself when using the flattened format.
+
+  Required properties:
+
+    - linux,platform : This is your platform number as assigned by the
+      architecture maintainers
+
+  Recommended properties:
+
+    - bootargs : This zero-terminated string is passed as the kernel
+      command line
+    - linux,stdout-path : This is the full path to your standard
+      console device if any. Typically, if you have serial devices on
+      your board, you may want to put the full path to the one set as
+      the default console in the firmware here, for the kernel to pick
+      it up as it's own default console. If you look at the funciton
+      set_preferred_console() in arch/ppc64/kernel/setup.c, you'll see
+      that the kernel tries to find out the default console and has
+      knowledge of various types like 8250 serial ports. You may want
+      to extend this function to add your own.
+    - interrupt-controller : This is one cell containing a phandle
+      value that matches the "linux,phandle" property of your main
+      interrupt controller node. May be used for interrupt routing.
+
+
+  Note that u-boot creates and fills in the chosen node for platforms
+  that use it.
+
+  f) the /soc<SOCname> node
+
+  This node is used to represent a system-on-a-chip (SOC) and must be
+  present if the processor is a SOC. The top-level soc node contains
+  information that is global to all devices on the SOC. The node name
+  should contain a unit address for the SOC, which is the base address
+  of the memory-mapped register set for the SOC. The name of an soc
+  node should start with "soc", and the remainder of the name should
+  represent the part number for the soc.  For example, the MPC8540's
+  soc node would be called "soc8540".
+
+  Required properties:
+
+    - device_type : Should be "soc"
+    - ranges : Should be defined as specified in 1) to describe the
+      translation of SOC addresses for memory mapped SOC registers.
+
+  Recommended properties:
+
+    - reg : This property defines the address and size of the
+      memory-mapped registers that are used for the SOC node itself.
+      It does not include the child device registers - these will be
+      defined inside each child node.  The address specified in the
+      "reg" property should match the unit address of the SOC node.
+    - #address-cells : Address representation for "soc" devices.  The
+      format of this field may vary depending on whether or not the
+      device registers are memory mapped.  For memory mapped
+      registers, this field represents the number of cells needed to
+      represent the address of the registers.  For SOCs that do not
+      use MMIO, a special address format should be defined that
+      contains enough cells to represent the required information.
+      See 1) above for more details on defining #address-cells.
+    - #size-cells : Size representation for "soc" devices
+    - #interrupt-cells : Defines the width of cells used to represent
+       interrupts.  Typically this value is <2>, which includes a
+       32-bit number that represents the interrupt number, and a
+       32-bit number that represents the interrupt sense and level.
+       This field is only needed if the SOC contains an interrupt
+       controller.
+
+  The SOC node may contain child nodes for each SOC device that the
+  platform uses.  Nodes should not be created for devices which exist
+  on the SOC but are not used by a particular platform. See chapter VI
+  for more information on how to specify devices that are part of an
+SOC.
+
+  Example SOC node for the MPC8540:
+
+       soc8540@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               ranges = <00000000 e0000000 00100000>
+               reg = <e0000000 00003000>;
+       }
+
+
+
+IV - "dtc", the device tree compiler
+====================================
+
+
+dtc source code can be found at
+<http://ozlabs.org/~dgibson/dtc/dtc.tar.gz>
+
+WARNING: This version is still in early development stage; the
+resulting device-tree "blobs" have not yet been validated with the
+kernel. The current generated bloc lacks a useful reserve map (it will
+be fixed to generate an empty one, it's up to the bootloader to fill
+it up) among others. The error handling needs work, bugs are lurking,
+etc...
+
+dtc basically takes a device-tree in a given format and outputs a
+device-tree in another format. The currently supported formats are:
+
+  Input formats:
+  -------------
+
+     - "dtb": "blob" format, that is a flattened device-tree block
+       with
+        header all in a binary blob.
+     - "dts": "source" format. This is a text file containing a
+       "source" for a device-tree. The format is defined later in this
+        chapter.
+     - "fs" format. This is a representation equivalent to the
+        output of /proc/device-tree, that is nodes are directories and
+       properties are files
+
+ Output formats:
+ ---------------
+
+     - "dtb": "blob" format
+     - "dts": "source" format
+     - "asm": assembly language file. This is a file that can be
+       sourced by gas to generate a device-tree "blob". That file can
+       then simply be added to your Makefile. Additionally, the
+       assembly file exports some symbols that can be use
+
+
+The syntax of the dtc tool is
+
+    dtc [-I <input-format>] [-O <output-format>]
+        [-o output-filename] [-V output_version] input_filename
+
+
+The "output_version" defines what versio of the "blob" format will be
+generated. Supported versions are 1,2,3 and 16. The default is
+currently version 3 but that may change in the future to version 16.
+
+Additionally, dtc performs various sanity checks on the tree, like the
+uniqueness of linux,phandle properties, validity of strings, etc...
+
+The format of the .dts "source" file is "C" like, supports C and C++
+style commments.
+
+/ {
+}
+
+The above is the "device-tree" definition. It's the only statement
+supported currently at the toplevel.
+
+/ {
+  property1 = "string_value";  /* define a property containing a 0
+                                 * terminated string
+                                */
+
+  property2 = <1234abcd>;      /* define a property containing a
+                                 * numerical 32 bits value (hexadecimal)
+                                */
+
+  property3 = <12345678 12345678 deadbeef>;
+                                /* define a property containing 3
+                                 * numerical 32 bits values (cells) in
+                                 * hexadecimal
+                                */
+  property4 = [0a 0b 0c 0d de ea ad be ef];
+                                /* define a property whose content is
+                                 * an arbitrary array of bytes
+                                 */
+
+  childnode@addresss { /* define a child node named "childnode"
+                                 * whose unit name is "childnode at
+                                * address"
+                                 */
+
+    childprop = "hello\n";      /* define a property "childprop" of
+                                 * childnode (in this case, a string)
+                                 */
+  };
+};
+
+Nodes can contain other nodes etc... thus defining the hierarchical
+structure of the tree.
+
+Strings support common escape sequences from C: "\n", "\t", "\r",
+"\(octal value)", "\x(hex value)".
+
+It is also suggested that you pipe your source file through cpp (gcc
+preprocessor) so you can use #include's, #define for constants, etc...
+
+Finally, various options are planned but not yet implemented, like
+automatic generation of phandles, labels (exported to the asm file so
+you can point to a property content and change it easily from whatever
+you link the device-tree with), label or path instead of numeric value
+in some cells to "point" to a node (replaced by a phandle at compile
+time), export of reserve map address to the asm file, ability to
+specify reserve map content at compile time, etc...
+
+We may provide a .h include file with common definitions of that
+proves useful for some properties (like building PCI properties or
+interrupt maps) though it may be better to add a notion of struct
+definitions to the compiler...
+
+
+V - Recommendations for a bootloader
+====================================
+
+
+Here are some various ideas/recommendations that have been proposed
+while all this has been defined and implemented.
+
+  - The bootloader may want to be able to use the device-tree itself
+    and may want to manipulate it (to add/edit some properties,
+    like physical memory size or kernel arguments). At this point, 2
+    choices can be made. Either the bootloader works directly on the
+    flattened format, or the bootloader has its own internal tree
+    representation with pointers (similar to the kernel one) and
+    re-flattens the tree when booting the kernel. The former is a bit
+    more difficult to edit/modify, the later requires probably a bit
+    more code to handle the tree structure. Note that the structure
+    format has been designed so it's relatively easy to "insert"
+    properties or nodes or delete them by just memmoving things
+    around. It contains no internal offsets or pointers for this
+    purpose.
+
+  - An example of code for iterating nodes & retreiving properties
+    directly from the flattened tree format can be found in the kernel
+    file arch/ppc64/kernel/prom.c, look at scan_flat_dt() function,
+    it's usage in early_init_devtree(), and the corresponding various
+    early_init_dt_scan_*() callbacks. That code can be re-used in a
+    GPL bootloader, and as the author of that code, I would be happy
+    do discuss possible free licencing to any vendor who wishes to
+    integrate all or part of this code into a non-GPL bootloader.
+
+
+
+VI - System-on-a-chip devices and nodes
+=======================================
+
+Many companies are now starting to develop system-on-a-chip
+processors, where the processor core (cpu) and many peripheral devices
+exist on a single piece of silicon.  For these SOCs, an SOC node
+should be used that defines child nodes for the devices that make
+up the SOC. While platforms are not required to use this model in
+order to boot the kernel, it is highly encouraged that all SOC
+implementations define as complete a flat-device-tree as possible to
+describe the devices on the SOC.  This will allow for the
+genericization of much of the kernel code.
+
+
+1) Defining child nodes of an SOC
+---------------------------------
+
+Each device that is part of an SOC may have its own node entry inside
+the SOC node.  For each device that is included in the SOC, the unit
+address property represents the address offset for this device's
+memory-mapped registers in the parent's address space.  The parent's
+address space is defined by the "ranges" property in the top-level soc
+node. The "reg" property for each node that exists directly under the
+SOC node should contain the address mapping from the child address space
+to the parent SOC address space and the size of the device's
+memory-mapped register file.
+
+For many devices that may exist inside an SOC, there are predefined
+specifications for the format of the device tree node.  All SOC child
+nodes should follow these specifications, except where noted in this
+document.
+
+See appendix A for an example partial SOC node definition for the
+MPC8540.
+
+
+2) Specifying interrupt information for SOC devices
+---------------------------------------------------
+
+Each device that is part of an SOC and which generates interrupts
+should have the following properties:
+
+       - interrupt-parent : contains the phandle of the interrupt
+          controller which handles interrupts for this device
+       - interrupts : a list of tuples representing the interrupt
+          number and the interrupt sense and level for each interupt
+          for this device.
+
+This information is used by the kernel to build the interrupt table
+for the interrupt controllers in the system.
+
+Sense and level information should be encoded as follows:
+
+   Devices connected to openPIC-compatible controllers should encode
+   sense and polarity as follows:
+
+       0 = high to low edge sensitive type enabled
+       1 = active low level sensitive type enabled
+       2 = low to high edge sensitive type enabled
+       3 = active high level sensitive type enabled
+
+   ISA PIC interrupt controllers should adhere to the ISA PIC
+   encodings listed below:
+
+       0 =  active low level sensitive type enabled
+       1 =  active high level sensitive type enabled
+       2 =  high to low edge sensitive type enabled
+       3 =  low to high edge sensitive type enabled
+
+
+
+3) Representing devices without a current OF specification
+----------------------------------------------------------
+
+Currently, there are many devices on SOCs that do not have a standard
+representation pre-defined as part of the open firmware
+specifications, mainly because the boards that contain these SOCs are
+not currently booted using open firmware.   This section contains
+descriptions for the SOC devices for which new nodes have been
+defined; this list will expand as more and more SOC-containing
+platforms are moved over to use the flattened-device-tree model.
+
+  a) MDIO IO device
+
+  The MDIO is a bus to which the PHY devices are connected.  For each
+  device that exists on this bus, a child node should be created.  See
+  the definition of the PHY node below for an example of how to define
+  a PHY.
+
+  Required properties:
+    - reg : Offset and length of the register set for the device
+    - device_type : Should be "mdio"
+    - compatible : Should define the compatible device type for the
+      mdio.  Currently, this is most likely to be "gianfar"
+
+  Example:
+
+       mdio@24520 {
+               reg = <24520 20>;
+
+               ethernet-phy@0 {
+                       ......
+               };
+       };
+
+
+  b) Gianfar-compatible ethernet nodes
+
+  Required properties:
+
+    - device_type : Should be "network"
+    - model : Model of the device.  Can be "TSEC", "eTSEC", or "FEC"
+    - compatible : Should be "gianfar"
+    - reg : Offset and length of the register set for the device
+    - address : List of bytes representing the ethernet address of
+      this controller
+    - interrupts : <a b> where a is the interrupt number and b is a
+      field that represents an encoding of the sense and level
+      information for the interrupt.  This should be encoded based on
+      the information in section 2) depending on the type of interrupt
+      controller you have.
+    - interrupt-parent : the phandle for the interrupt controller that
+      services interrupts for this device.
+    - phy-handle : The phandle for the PHY connected to this ethernet
+      controller.
+
+  Example:
+
+       ethernet@24000 {
+               #size-cells = <0>;
+               device_type = "network";
+               model = "TSEC";
+               compatible = "gianfar";
+               reg = <24000 1000>;
+               address = [ 00 E0 0C 00 73 00 ];
+               interrupts = <d 3 e 3 12 3>;
+               interrupt-parent = <40000>;
+               phy-handle = <2452000>
+       };
+
+
+
+   c) PHY nodes
+
+   Required properties:
+
+    - device_type : Should be "ethernet-phy"
+    - interrupts : <a b> where a is the interrupt number and b is a
+      field that represents an encoding of the sense and level
+      information for the interrupt.  This should be encoded based on
+      the information in section 2) depending on the type of interrupt
+      controller you have.
+    - interrupt-parent : the phandle for the interrupt controller that
+      services interrupts for this device.
+    - reg : The ID number for the phy, usually a small integer
+    - linux,phandle :  phandle for this node; likely referenced by an
+      ethernet controller node.
+
+
+   Example:
+
+       ethernet-phy@0 {
+               linux,phandle = <2452000>
+               interrupt-parent = <40000>;
+               interrupts = <35 1>;
+               reg = <0>;
+               device_type = "ethernet-phy";
+       };
+
+
+   d) Interrupt controllers
+
+   Some SOC devices contain interrupt controllers that are different
+   from the standard Open PIC specification.  The SOC device nodes for
+   these types of controllers should be specified just like a standard
+   OpenPIC controller.  Sense and level information should be encoded
+   as specified in section 2) of this chapter for each device that
+   specifies an interrupt.
+
+   Example :
+
+       pic@40000 {
+               linux,phandle = <40000>;
+               clock-frequency = <0>;
+               interrupt-controller;
+               #address-cells = <0>;
+               reg = <40000 40000>;
+               built-in;
+               compatible = "chrp,open-pic";
+               device_type = "open-pic";
+               big-endian;
+       };
+
+
+   e) I2C
+
+   Required properties :
+
+    - device_type : Should be "i2c"
+    - reg : Offset and length of the register set for the device
+
+   Recommended properties :
+
+    - compatible : Should be "fsl-i2c" for parts compatible with
+      Freescale I2C specifications.
+    - interrupts : <a b> where a is the interrupt number and b is a
+      field that represents an encoding of the sense and level
+      information for the interrupt.  This should be encoded based on
+      the information in section 2) depending on the type of interrupt
+      controller you have.
+    - interrupt-parent : the phandle for the interrupt controller that
+      services interrupts for this device.
+    - dfsrr : boolean; if defined, indicates that this I2C device has
+      a digital filter sampling rate register
+    - fsl5200-clocking : boolean; if defined, indicated that this device
+      uses the FSL 5200 clocking mechanism.
+
+   Example :
+
+       i2c@3000 {
+               interrupt-parent = <40000>;
+               interrupts = <1b 3>;
+               reg = <3000 18>;
+               device_type = "i2c";
+               compatible  = "fsl-i2c";
+               dfsrr;
+       };
+
+
+   More devices will be defined as this spec matures.
+
+
+Appendix A - Sample SOC node for MPC8540
+========================================
+
+Note that the #address-cells and #size-cells for the SoC node
+in this example have been explicitly listed; these are likely
+not necessary as they are usually the same as the root node.
+
+       soc8540@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               ranges = <00000000 e0000000 00100000>
+               reg = <e0000000 00003000>;
+
+               mdio@24520 {
+                       reg = <24520 20>;
+                       device_type = "mdio";
+                       compatible = "gianfar";
+
+                       ethernet-phy@0 {
+                               linux,phandle = <2452000>
+                               interrupt-parent = <40000>;
+                               interrupts = <35 1>;
+                               reg = <0>;
+                               device_type = "ethernet-phy";
+                       };
+
+                       ethernet-phy@1 {
+                               linux,phandle = <2452001>
+                               interrupt-parent = <40000>;
+                               interrupts = <35 1>;
+                               reg = <1>;
+                               device_type = "ethernet-phy";
+                       };
+
+                       ethernet-phy@3 {
+                               linux,phandle = <2452002>
+                               interrupt-parent = <40000>;
+                               interrupts = <35 1>;
+                               reg = <3>;
+                               device_type = "ethernet-phy";
+                       };
+
+               };
+
+               ethernet@24000 {
+                       #size-cells = <0>;
+                       device_type = "network";
+                       model = "TSEC";
+                       compatible = "gianfar";
+                       reg = <24000 1000>;
+                       address = [ 00 E0 0C 00 73 00 ];
+                       interrupts = <d 3 e 3 12 3>;
+                       interrupt-parent = <40000>;
+                       phy-handle = <2452000>;
+               };
+
+               ethernet@25000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "network";
+                       model = "TSEC";
+                       compatible = "gianfar";
+                       reg = <25000 1000>;
+                       address = [ 00 E0 0C 00 73 01 ];
+                       interrupts = <13 3 14 3 18 3>;
+                       interrupt-parent = <40000>;
+                       phy-handle = <2452001>;
+               };
+
+               ethernet@26000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "network";
+                       model = "FEC";
+                       compatible = "gianfar";
+                       reg = <26000 1000>;
+                       address = [ 00 E0 0C 00 73 02 ];
+                       interrupts = <19 3>;
+                       interrupt-parent = <40000>;
+                       phy-handle = <2452002>;
+               };
+
+               serial@4500 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4500 100>;
+                       clock-frequency = <0>;
+                       interrupts = <1a 3>;
+                       interrupt-parent = <40000>;
+               };
+
+               pic@40000 {
+                       linux,phandle = <40000>;
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       reg = <40000 40000>;
+                       built-in;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                        big-endian;
+               };
+
+               i2c@3000 {
+                       interrupt-parent = <40000>;
+                       interrupts = <1b 3>;
+                       reg = <3000 18>;
+                       device_type = "i2c";
+                       compatible  = "fsl-i2c";
+                       dfsrr;
+               };
+
+       };
index 391dd64363e75b560f68bdd69879946b07cf03da..a46c10fcddfcf17969d42fb472af306d9e9eab6f 100644 (file)
@@ -28,6 +28,7 @@ Currently, these files are in /proc/sys/vm:
 - block_dump
 - drop-caches
 - zone_reclaim_mode
+- zone_reclaim_interval
 
 ==============================================================
 
@@ -126,15 +127,54 @@ the high water marks for each per cpu page list.
 
 zone_reclaim_mode:
 
-This is set during bootup to 1 if it is determined that pages from
-remote zones will cause a significant performance reduction. The
+Zone_reclaim_mode allows to set more or less agressive approaches to
+reclaim memory when a zone runs out of memory. If it is set to zero then no
+zone reclaim occurs. Allocations will be satisfied from other zones / nodes
+in the system.
+
+This is value ORed together of
+
+1      = Zone reclaim on
+2      = Zone reclaim writes dirty pages out
+4      = Zone reclaim swaps pages
+8      = Also do a global slab reclaim pass
+
+zone_reclaim_mode is set during bootup to 1 if it is determined that pages
+from remote zones will cause a measurable performance reduction. The
 page allocator will then reclaim easily reusable pages (those page
-cache pages that are currently not used) before going off node.
+cache pages that are currently not used) before allocating off node pages.
+
+It may be beneficial to switch off zone reclaim if the system is
+used for a file server and all of memory should be used for caching files
+from disk. In that case the caching effect is more important than
+data locality.
+
+Allowing zone reclaim to write out pages stops processes that are
+writing large amounts of data from dirtying pages on other nodes. Zone
+reclaim will write out dirty pages if a zone fills up and so effectively
+throttle the process. This may decrease the performance of a single process
+since it cannot use all of system memory to buffer the outgoing writes
+anymore but it preserve the memory on other nodes so that the performance
+of other processes running on other nodes will not be affected.
+
+Allowing regular swap effectively restricts allocations to the local
+node unless explicitly overridden by memory policies or cpuset
+configurations.
+
+It may be advisable to allow slab reclaim if the system makes heavy
+use of files and builds up large slab caches. However, the slab
+shrink operation is global, may take a long time and free slabs
+in all nodes of the system.
+
+================================================================
+
+zone_reclaim_interval:
+
+The time allowed for off node allocations after zone reclaim
+has failed to reclaim enough pages to allow a local allocation.
 
-The user can override this setting. It may be beneficial to switch
-off zone reclaim if the system is used for a file server and all
-of memory should be used for caching files from disk.
+Time is set in seconds and set by default to 30 seconds.
 
-It may be beneficial to switch this on if one wants to do zone
-reclaim regardless of the numa distances in the system.
+Reduce the interval if undesired off node allocations occur. However, too
+frequent scans will have a negative impact onoff node allocation performance.
 
diff --git a/Documentation/vm/page_migration b/Documentation/vm/page_migration
new file mode 100644 (file)
index 0000000..c52820f
--- /dev/null
@@ -0,0 +1,129 @@
+Page migration
+--------------
+
+Page migration allows the moving of the physical location of pages between
+nodes in a numa system while the process is running. This means that the
+virtual addresses that the process sees do not change. However, the
+system rearranges the physical location of those pages.
+
+The main intend of page migration is to reduce the latency of memory access
+by moving pages near to the processor where the process accessing that memory
+is running.
+
+Page migration allows a process to manually relocate the node on which its
+pages are located through the MF_MOVE and MF_MOVE_ALL options while setting
+a new memory policy. The pages of process can also be relocated
+from another process using the sys_migrate_pages() function call. The
+migrate_pages function call takes two sets of nodes and moves pages of a
+process that are located on the from nodes to the destination nodes.
+
+Manual migration is very useful if for example the scheduler has relocated
+a process to a processor on a distant node. A batch scheduler or an
+administrator may detect the situation and move the pages of the process
+nearer to the new processor. At some point in the future we may have
+some mechanism in the scheduler that will automatically move the pages.
+
+Larger installations usually partition the system using cpusets into
+sections of nodes. Paul Jackson has equipped cpusets with the ability to
+move pages when a task is moved to another cpuset. This allows automatic
+control over locality of a process. If a task is moved to a new cpuset
+then also all its pages are moved with it so that the performance of the
+process does not sink dramatically (as is the case today).
+
+Page migration allows the preservation of the relative location of pages
+within a group of nodes for all migration techniques which will preserve a
+particular memory allocation pattern generated even after migrating a
+process. This is necessary in order to preserve the memory latencies.
+Processes will run with similar performance after migration.
+
+Page migration occurs in several steps. First a high level
+description for those trying to use migrate_pages() and then
+a low level description of how the low level details work.
+
+A. Use of migrate_pages()
+-------------------------
+
+1. Remove pages from the LRU.
+
+   Lists of pages to be migrated are generated by scanning over
+   pages and moving them into lists. This is done by
+   calling isolate_lru_page() or __isolate_lru_page().
+   Calling isolate_lru_page increases the references to the page
+   so that it cannot vanish under us.
+
+2. Generate a list of newly allocates page to move the contents
+   of the first list to.
+
+3. The migrate_pages() function is called which attempts
+   to do the migration. It returns the moved pages in the
+   list specified as the third parameter and the failed
+   migrations in the fourth parameter. The first parameter
+   will contain the pages that could still be retried.
+
+4. The leftover pages of various types are returned
+   to the LRU using putback_to_lru_pages() or otherwise
+   disposed of. The pages will still have the refcount as
+   increased by isolate_lru_pages()!
+
+B. Operation of migrate_pages()
+--------------------------------
+
+migrate_pages does several passes over its list of pages. A page is moved
+if all references to a page are removable at the time.
+
+Steps:
+
+1. Lock the page to be migrated
+
+2. Insure that writeback is complete.
+
+3. Make sure that the page has assigned swap cache entry if
+   it is an anonyous page. The swap cache reference is necessary
+   to preserve the information contain in the page table maps.
+
+4. Prep the new page that we want to move to. It is locked
+   and set to not being uptodate so that all accesses to the new
+   page immediately lock while we are moving references.
+
+5. All the page table references to the page are either dropped (file backed)
+   or converted to swap references (anonymous pages). This should decrease the
+   reference count.
+
+6. The radix tree lock is taken
+
+7. The refcount of the page is examined and we back out if references remain
+   otherwise we know that we are the only one referencing this page.
+
+8. The radix tree is checked and if it does not contain the pointer to this
+   page then we back out.
+
+9. The mapping is checked. If the mapping is gone then a truncate action may
+   be in progress and we back out.
+
+10. The new page is prepped with some settings from the old page so that accesses
+   to the new page will be discovered to have the correct settings.
+
+11. The radix tree is changed to point to the new page.
+
+12. The reference count of the old page is dropped because the reference has now
+    been removed.
+
+13. The radix tree lock is dropped.
+
+14. The page contents are copied to the new page.
+
+15. The remaining page flags are copied to the new page.
+
+16. The old page flags are cleared to indicate that the page does
+    not use any information anymore.
+
+17. Queued up writeback on the new page is triggered.
+
+18. If swap pte's were generated for the page then remove them again.
+
+19. The locks are dropped from the old and new page.
+
+20. The new page is moved to the LRU.
+
+Christoph Lameter, December 19, 2005.
+
index 8f2e5c718b50fc6a2e081876581f0788f1d25d6c..6c56c754a0b53c2947f662c0e3adde986ebdc513 100644 (file)
@@ -28,6 +28,7 @@ void foo(void)
         DEFINE(TASK_GID, offsetof(struct task_struct, gid));
         DEFINE(TASK_EGID, offsetof(struct task_struct, egid));
         DEFINE(TASK_REAL_PARENT, offsetof(struct task_struct, real_parent));
+        DEFINE(TASK_GROUP_LEADER, offsetof(struct task_struct, group_leader));
         DEFINE(TASK_TGID, offsetof(struct task_struct, tgid));
         BLANK();
 
index e38671c922bc673016771d1ec94e18edf34b8b9f..7af15bf7e5ab64e9e4ad5e0abc2d1ef4be962f34 100644 (file)
@@ -879,17 +879,19 @@ sys_getxpid:
 
        /* See linux/kernel/timer.c sys_getppid for discussion
           about this loop.  */
-       ldq     $3, TASK_REAL_PARENT($2)
-1:     ldl     $1, TASK_TGID($3)
+       ldq     $3, TASK_GROUP_LEADER($2)
+       ldq     $4, TASK_REAL_PARENT($3)
+       ldl     $0, TASK_TGID($2)
+1:     ldl     $1, TASK_TGID($4)
 #ifdef CONFIG_SMP
-       mov     $3, $4
+       mov     $4, $5
        mb
-       ldq     $3, TASK_REAL_PARENT($2)
-       cmpeq   $3, $4, $4
-       beq     $4, 1b
+       ldq     $3, TASK_GROUP_LEADER($2)
+       ldq     $4, TASK_REAL_PARENT($3)
+       cmpeq   $4, $5, $5
+       beq     $5, 1b
 #endif
        stq     $1, 80($sp)
-       ldl     $0, TASK_TGID($2)
        ret
 .end sys_getxpid
 
index 76be5cf0de13234ea413451dfccc53c62eed3e39..9006063e73691da7b68449955a135f7c9317e2cd 100644 (file)
@@ -68,34 +68,32 @@ show_interrupts(struct seq_file *p, void *v)
 #ifdef CONFIG_SMP
        int j;
 #endif
-       int i = *(loff_t *) v;
+       int irq = *(loff_t *) v;
        struct irqaction * action;
        unsigned long flags;
 
 #ifdef CONFIG_SMP
-       if (i == 0) {
+       if (irq == 0) {
                seq_puts(p, "           ");
-               for (i = 0; i < NR_CPUS; i++)
-                       if (cpu_online(i))
-                               seq_printf(p, "CPU%d       ", i);
+               for_each_online_cpu(j)
+                       seq_printf(p, "CPU%d       ", j);
                seq_putc(p, '\n');
        }
 #endif
 
-       if (i < ACTUAL_NR_IRQS) {
-               spin_lock_irqsave(&irq_desc[i].lock, flags);
-               action = irq_desc[i].action;
+       if (irq < ACTUAL_NR_IRQS) {
+               spin_lock_irqsave(&irq_desc[irq].lock, flags);
+               action = irq_desc[irq].action;
                if (!action) 
                        goto unlock;
-               seq_printf(p, "%3d: ",i);
+               seq_printf(p, "%3d: ", irq);
 #ifndef CONFIG_SMP
-               seq_printf(p, "%10u ", kstat_irqs(i));
+               seq_printf(p, "%10u ", kstat_irqs(irq));
 #else
-               for (j = 0; j < NR_CPUS; j++)
-                       if (cpu_online(j))
-                               seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
+               for_each_online_cpu(j)
+                       seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq]);
 #endif
-               seq_printf(p, " %14s", irq_desc[i].handler->typename);
+               seq_printf(p, " %14s", irq_desc[irq].handler->typename);
                seq_printf(p, "  %c%s",
                        (action->flags & SA_INTERRUPT)?'+':' ',
                        action->name);
@@ -108,13 +106,12 @@ show_interrupts(struct seq_file *p, void *v)
 
                seq_putc(p, '\n');
 unlock:
-               spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-       } else if (i == ACTUAL_NR_IRQS) {
+               spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
+       } else if (irq == ACTUAL_NR_IRQS) {
 #ifdef CONFIG_SMP
                seq_puts(p, "IPI: ");
-               for (i = 0; i < NR_CPUS; i++)
-                       if (cpu_online(i))
-                               seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
+               for_each_online_cpu(j)
+                       seq_printf(p, "%10lu ", cpu_data[j].ipi_count);
                seq_putc(p, '\n');
 #endif
                seq_printf(p, "ERR: %10lu\n", irq_err_count);
@@ -122,7 +119,6 @@ unlock:
        return 0;
 }
 
-
 /*
  * handle_irq handles all normal device IRQ's (the special
  * SMP cross-CPU interrupts have their own specific
index 274e07019b461040660a0f10d6ed308c742813b9..dee23d87fc5acf482af0ed3d68afc26d4fc6b2ea 100644 (file)
@@ -53,14 +53,14 @@ config GENERIC_ISA_DMA
 
 config ARCH_MAY_HAVE_PC_FDC
        bool
-       default y
 
 source "init/Kconfig"
 
 
 menu "System Type"
 
-comment "Archimedes/A5000 Implementations (select only ONE)"
+choice
+       prompt "Archimedes/A5000 Implementations"
 
 config ARCH_ARC
         bool "Archimedes"
@@ -73,6 +73,7 @@ config ARCH_ARC
 
 config ARCH_A5K
         bool "A5000"
+       select ARCH_MAY_HAVE_PC_FDC
         help
           Say Y here to to support the Acorn A5000.
 
@@ -87,6 +88,7 @@ config PAGESIZE_16
           Say Y here if your Archimedes or A5000 system has only 2MB of
           memory, otherwise say N.  The resulting kernel will not run on a
           machine with 4MB of memory.
+endchoice
 endmenu
 
 config ISA_DMA_API
index 08a97c9498ff30c93310d934b424ea07e8125e4e..a24272b61f302c5aefc96b7c868b0ae297d9cb4f 100644 (file)
@@ -104,14 +104,14 @@ void set_fiq_regs(struct pt_regs *regs)
 {
        register unsigned long tmp, tmp2;
        __asm__ volatile (
-       "mov    %0, pc
-       bic     %1, %0, #0x3
-       orr     %1, %1, %3
-       teqp    %1, #0          @ select FIQ mode
-       mov     r0, r0
-       ldmia   %2, {r8 - r14}
-       teqp    %0, #0          @ return to SVC mode
-       mov     r0, r0"
+       "mov    %0, pc                                  \n"
+       "bic    %1, %0, #0x3                            \n"
+       "orr    %1, %1, %3                              \n"
+       "teqp   %1, #0          @ select FIQ mode       \n"
+       "mov    r0, r0                                  \n"
+       "ldmia  %2, {r8 - r14}                          \n"
+       "teqp   %0, #0          @ return to SVC mode    \n"
+       "mov    r0, r0                                  "
        : "=&r" (tmp), "=&r" (tmp2)
        : "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | MODE_FIQ26)
        /* These registers aren't modified by the above code in a way
@@ -125,14 +125,14 @@ void get_fiq_regs(struct pt_regs *regs)
 {
        register unsigned long tmp, tmp2;
        __asm__ volatile (
-       "mov    %0, pc
-       bic     %1, %0, #0x3
-       orr     %1, %1, %3
-       teqp    %1, #0          @ select FIQ mode
-       mov     r0, r0
-       stmia   %2, {r8 - r14}
-       teqp    %0, #0          @ return to SVC mode
-       mov     r0, r0"
+       "mov    %0, pc                                  \n"
+       "bic    %1, %0, #0x3                            \n"
+       "orr    %1, %1, %3                              \n"
+       "teqp   %1, #0          @ select FIQ mode       \n"
+       "mov    r0, r0                                  \n"
+       "stmia  %2, {r8 - r14}                          \n"
+       "teqp   %0, #0          @ return to SVC mode    \n"
+       "mov    r0, r0                                  "
        : "=&r" (tmp), "=&r" (tmp2)
        : "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | MODE_FIQ26)
        /* These registers aren't modified by the above code in a way
index ce2055bdc9ee82c342e35f63ca98835d66c9715b..2a48c12100c0144039a00b3182c06c057ebc8c3a 100644 (file)
@@ -480,6 +480,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
 {
        siginfo_t info;
        int signr;
+       struct k_sigaction ka;
 
        /*
         * We want the common case to go fast, which
@@ -493,7 +494,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
         if (current->ptrace & PT_SINGLESTEP)
                 ptrace_cancel_bpt(current);
        
-        signr = get_signal_to_deliver(&info, regs, NULL);
+        signr = get_signal_to_deliver(&info, &ka, regs, NULL);
         if (signr > 0) {
                 handle_signal(signr, &info, oldset, regs, syscall);
                 if (current->ptrace & PT_SINGLESTEP)
index cbde675bc95c869d6bd06dc21b36a338a00c61b4..d86c865a7cd22b1d1892e03d3473b45767539677 100644 (file)
@@ -47,15 +47,6 @@ config DMI
 
 source "init/Kconfig"
 
-config DOUBLEFAULT
-       default y
-       bool "Enable doublefault exception handler" if EMBEDDED
-       help
-          This option allows trapping of rare doublefault exceptions that
-          would otherwise cause a system to silently reboot. Disabling this
-          option saves about 4k and might cause you much additional grey
-          hair.
-
 menu "Processor type and features"
 
 choice
@@ -457,6 +448,43 @@ config HIGHMEM64G
 
 endchoice
 
+choice
+       depends on EXPERIMENTAL && !X86_PAE
+       prompt "Memory split"
+       default VMSPLIT_3G
+       help
+         Select the desired split between kernel and user memory.
+
+         If the address range available to the kernel is less than the
+         physical memory installed, the remaining memory will be available
+         as "high memory". Accessing high memory is a little more costly
+         than low memory, as it needs to be mapped into the kernel first.
+         Note that increasing the kernel address space limits the range
+         available to user programs, making the address space there
+         tighter.  Selecting anything other than the default 3G/1G split
+         will also likely make your kernel incompatible with binary-only
+         kernel modules.
+
+         If you are not absolutely sure what you are doing, leave this
+         option alone!
+
+       config VMSPLIT_3G
+               bool "3G/1G user/kernel split"
+       config VMSPLIT_3G_OPT
+               bool "3G/1G user/kernel split (for full 1G low memory)"
+       config VMSPLIT_2G
+               bool "2G/2G user/kernel split"
+       config VMSPLIT_1G
+               bool "1G/3G user/kernel split"
+endchoice
+
+config PAGE_OFFSET
+       hex
+       default 0xB0000000 if VMSPLIT_3G_OPT
+       default 0x78000000 if VMSPLIT_2G
+       default 0x40000000 if VMSPLIT_1G
+       default 0xC0000000
+
 config HIGHMEM
        bool
        depends on HIGHMEM64G || HIGHMEM4G
@@ -711,6 +739,15 @@ config HOTPLUG_CPU
 
          Say N.
 
+config DOUBLEFAULT
+       default y
+       bool "Enable doublefault exception handler" if EMBEDDED
+       help
+          This option allows trapping of rare doublefault exceptions that
+          would otherwise cause a system to silently reboot. Disabling this
+          option saves about 4k and might cause you much additional grey
+          hair.
+
 endmenu
 
 
index 267ca48e1b6c740cc63e86669ee0b992c627cd00..d51c7313cae8ac621c69f4be28718142d12b370e 100644 (file)
@@ -3,6 +3,6 @@ obj-$(CONFIG_X86_IO_APIC)       += earlyquirk.o
 obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wakeup.o
 
 ifneq ($(CONFIG_ACPI_PROCESSOR),)
-obj-y                          += cstate.o
+obj-y                          += cstate.o processor.o
 endif
 
index 2111529dea77821ff595ce4a21edb369102b9b93..f21fa0d4482f4f5d91d31047c5c402433bb7e8b5 100644 (file)
@@ -464,7 +464,7 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
  * success: return IRQ number (>=0)
  * failure: return < 0
  */
-int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
+int acpi_register_gsi(u32 gsi, int triggering, int polarity)
 {
        unsigned int irq;
        unsigned int plat_gsi = gsi;
@@ -476,14 +476,14 @@ int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
        if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) {
                extern void eisa_set_level_irq(unsigned int irq);
 
-               if (edge_level == ACPI_LEVEL_SENSITIVE)
+               if (triggering == ACPI_LEVEL_SENSITIVE)
                        eisa_set_level_irq(gsi);
        }
 #endif
 
 #ifdef CONFIG_X86_IO_APIC
        if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) {
-               plat_gsi = mp_register_gsi(gsi, edge_level, active_high_low);
+               plat_gsi = mp_register_gsi(gsi, triggering, polarity);
        }
 #endif
        acpi_gsi_to_irq(plat_gsi, &irq);
index 4c3036ba65dfeee76f85730e39222d1d10410974..25db49ef1770aa11ce148f1d35789e85bc125151 100644 (file)
 #include <acpi/processor.h>
 #include <asm/acpi.h>
 
-static void acpi_processor_power_init_intel_pdc(struct acpi_processor_power
-                                               *pow)
-{
-       struct acpi_object_list *obj_list;
-       union acpi_object *obj;
-       u32 *buf;
-
-       /* allocate and initialize pdc. It will be used later. */
-       obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
-       if (!obj_list) {
-               printk(KERN_ERR "Memory allocation error\n");
-               return;
-       }
-
-       obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
-       if (!obj) {
-               printk(KERN_ERR "Memory allocation error\n");
-               kfree(obj_list);
-               return;
-       }
-
-       buf = kmalloc(12, GFP_KERNEL);
-       if (!buf) {
-               printk(KERN_ERR "Memory allocation error\n");
-               kfree(obj);
-               kfree(obj_list);
-               return;
-       }
-
-       buf[0] = ACPI_PDC_REVISION_ID;
-       buf[1] = 1;
-       buf[2] = ACPI_PDC_C_CAPABILITY_SMP;
-
-       obj->type = ACPI_TYPE_BUFFER;
-       obj->buffer.length = 12;
-       obj->buffer.pointer = (u8 *) buf;
-       obj_list->count = 1;
-       obj_list->pointer = obj;
-       pow->pdc = obj_list;
-
-       return;
-}
-
-/* Initialize _PDC data based on the CPU vendor */
-void acpi_processor_power_init_pdc(struct acpi_processor_power *pow,
-                                  unsigned int cpu)
-{
-       struct cpuinfo_x86 *c = cpu_data + cpu;
-
-       pow->pdc = NULL;
-       if (c->x86_vendor == X86_VENDOR_INTEL)
-               acpi_processor_power_init_intel_pdc(pow);
-
-       return;
-}
-
-EXPORT_SYMBOL(acpi_processor_power_init_pdc);
-
 /*
  * Initialize bm_flags based on the CPU cache properties
  * On SMP it depends on cache configuration
diff --git a/arch/i386/kernel/acpi/processor.c b/arch/i386/kernel/acpi/processor.c
new file mode 100644 (file)
index 0000000..9f4cc02
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * arch/i386/kernel/acpi/processor.c
+ *
+ * Copyright (C) 2005 Intel Corporation
+ *     Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
+ *     - Added _PDC for platforms with Intel CPUs
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/acpi.h>
+
+#include <acpi/processor.h>
+#include <asm/acpi.h>
+
+static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
+{
+       struct acpi_object_list *obj_list;
+       union acpi_object *obj;
+       u32 *buf;
+
+       /* allocate and initialize pdc. It will be used later. */
+       obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
+       if (!obj_list) {
+               printk(KERN_ERR "Memory allocation error\n");
+               return;
+       }
+
+       obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
+       if (!obj) {
+               printk(KERN_ERR "Memory allocation error\n");
+               kfree(obj_list);
+               return;
+       }
+
+       buf = kmalloc(12, GFP_KERNEL);
+       if (!buf) {
+               printk(KERN_ERR "Memory allocation error\n");
+               kfree(obj);
+               kfree(obj_list);
+               return;
+       }
+
+       buf[0] = ACPI_PDC_REVISION_ID;
+       buf[1] = 1;
+       buf[2] = ACPI_PDC_C_CAPABILITY_SMP;
+
+       if (cpu_has(c, X86_FEATURE_EST))
+               buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP;
+
+       obj->type = ACPI_TYPE_BUFFER;
+       obj->buffer.length = 12;
+       obj->buffer.pointer = (u8 *) buf;
+       obj_list->count = 1;
+       obj_list->pointer = obj;
+       pr->pdc = obj_list;
+
+       return;
+}
+
+/* Initialize _PDC data based on the CPU vendor */
+void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
+{
+       unsigned int cpu = pr->id;
+       struct cpuinfo_x86 *c = cpu_data + cpu;
+
+       pr->pdc = NULL;
+       if (c->x86_vendor == X86_VENDOR_INTEL)
+               init_intel_pdc(pr, c);
+
+       return;
+}
+
+EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
index 7975e79d5fa4e6e607117bc7b5b2fbd7e0e37389..3852d0a4c1b5e2f35dc168399d12b97882ca8938 100644 (file)
@@ -295,68 +295,6 @@ acpi_cpufreq_guess_freq (
 }
 
 
-/* 
- * acpi_processor_cpu_init_pdc_est - let BIOS know about the SMP capabilities
- * of this driver
- * @perf: processor-specific acpi_io_data struct
- * @cpu: CPU being initialized
- *
- * To avoid issues with legacy OSes, some BIOSes require to be informed of
- * the SMP capabilities of OS P-state driver. Here we set the bits in _PDC 
- * accordingly, for Enhanced Speedstep. Actual call to _PDC is done in
- * driver/acpi/processor.c
- */
-static void 
-acpi_processor_cpu_init_pdc_est(
-               struct acpi_processor_performance *perf, 
-               unsigned int cpu,
-               struct acpi_object_list *obj_list
-               )
-{
-       union acpi_object *obj;
-       u32 *buf;
-       struct cpuinfo_x86 *c = cpu_data + cpu;
-       dprintk("acpi_processor_cpu_init_pdc_est\n");
-
-       if (!cpu_has(c, X86_FEATURE_EST))
-               return;
-
-       /* Initialize pdc. It will be used later. */
-       if (!obj_list)
-               return;
-               
-       if (!(obj_list->count && obj_list->pointer))
-               return;
-
-       obj = obj_list->pointer;
-       if ((obj->buffer.length == 12) && obj->buffer.pointer) {
-               buf = (u32 *)obj->buffer.pointer;
-                       buf[0] = ACPI_PDC_REVISION_ID;
-                       buf[1] = 1;
-                       buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
-               perf->pdc = obj_list;
-       }
-       return;
-}
-
-/* CPU specific PDC initialization */
-static void 
-acpi_processor_cpu_init_pdc(
-               struct acpi_processor_performance *perf, 
-               unsigned int cpu,
-               struct acpi_object_list *obj_list
-               )
-{
-       struct cpuinfo_x86 *c = cpu_data + cpu;
-       dprintk("acpi_processor_cpu_init_pdc\n");
-       perf->pdc = NULL;
-       if (cpu_has(c, X86_FEATURE_EST))
-               acpi_processor_cpu_init_pdc_est(perf, cpu, obj_list);
-       return;
-}
-
-
 static int
 acpi_cpufreq_cpu_init (
        struct cpufreq_policy   *policy)
@@ -367,14 +305,7 @@ acpi_cpufreq_cpu_init (
        unsigned int            result = 0;
        struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
 
-       union acpi_object               arg0 = {ACPI_TYPE_BUFFER};
-       u32                             arg0_buf[3];
-       struct acpi_object_list         arg_list = {1, &arg0};
-
        dprintk("acpi_cpufreq_cpu_init\n");
-       /* setup arg_list for _PDC settings */
-        arg0.buffer.length = 12;
-        arg0.buffer.pointer = (u8 *) arg0_buf;
 
        data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
        if (!data)
@@ -382,9 +313,7 @@ acpi_cpufreq_cpu_init (
 
        acpi_io_data[cpu] = data;
 
-       acpi_processor_cpu_init_pdc(&data->acpi_data, cpu, &arg_list);
        result = acpi_processor_register_performance(&data->acpi_data, cpu);
-       data->acpi_data.pdc = NULL;
 
        if (result)
                goto err_free;
index 9a826cde4fd1074838faf4b3890a59567b96a7bf..c173c0fa117a927734bf9c2ee389c1d5f7ada91d 100644 (file)
@@ -362,22 +362,10 @@ static struct acpi_processor_performance p;
  */
 static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
 {
-       union acpi_object               arg0 = {ACPI_TYPE_BUFFER};
-       u32                             arg0_buf[3];
-       struct acpi_object_list         arg_list = {1, &arg0};
        unsigned long                   cur_freq;
        int                             result = 0, i;
        unsigned int                    cpu = policy->cpu;
 
-       /* _PDC settings */
-       arg0.buffer.length = 12;
-       arg0.buffer.pointer = (u8 *) arg0_buf;
-       arg0_buf[0] = ACPI_PDC_REVISION_ID;
-       arg0_buf[1] = 1;
-       arg0_buf[2] = ACPI_PDC_EST_CAPABILITY_SMP_MSR;
-
-       p.pdc = &arg_list;
-
        /* register with ACPI core */
        if (acpi_processor_register_performance(&p, cpu)) {
                dprintk(KERN_INFO PFX "obtaining ACPI data failed\n");
index 91a64016956e0d4fdbfc2698e0dd3925def58fe7..0102f3d50e574fd67184fff730f7f11a77be7b49 100644 (file)
@@ -1080,7 +1080,7 @@ void __init mp_config_acpi_legacy_irqs (void)
 
 #define MAX_GSI_NUM    4096
 
-int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
+int mp_register_gsi (u32 gsi, int triggering, int polarity)
 {
        int                     ioapic = -1;
        int                     ioapic_pin = 0;
@@ -1129,7 +1129,7 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
 
        mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
 
-       if (edge_level) {
+       if (triggering == ACPI_LEVEL_SENSITIVE) {
                /*
                 * For PCI devices assign IRQs in order, avoiding gaps
                 * due to unused I/O APIC pins.
@@ -1151,8 +1151,8 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
        }
 
        io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
-                   edge_level == ACPI_EDGE_SENSITIVE ? 0 : 1,
-                   active_high_low == ACPI_ACTIVE_HIGH ? 0 : 1);
+                   triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
+                   polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
        return gsi;
 }
 
index 47675bbbb316eedb7edd0ba6a0bd7982d8d982a0..7c86e3c5f1c1eb48fd4a30acba88416c488efcdd 100644 (file)
@@ -45,6 +45,15 @@ static unsigned long last_tsc_high; /* msb 32 bits of Time Stamp Counter */
 static unsigned long long monotonic_base;
 static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED;
 
+/* Avoid compensating for lost ticks before TSCs are synched */
+static int detect_lost_ticks;
+static int __init start_lost_tick_compensation(void)
+{
+       detect_lost_ticks = 1;
+       return 0;
+}
+late_initcall(start_lost_tick_compensation);
+
 /* convert from cycles(64bits) => nanoseconds (64bits)
  *  basic equation:
  *             ns = cycles / (freq / ns_per_sec)
@@ -196,7 +205,8 @@ static void mark_offset_tsc_hpet(void)
 
        /* lost tick compensation */
        offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
-       if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
+       if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))
+                                       && detect_lost_ticks) {
                int lost_ticks = (offset - hpet_last) / hpet_tick;
                jiffies_64 += lost_ticks;
        }
@@ -421,7 +431,7 @@ static void mark_offset_tsc(void)
        delta += delay_at_last_interrupt;
        lost = delta/(1000000/HZ);
        delay = delta%(1000000/HZ);
-       if (lost >= 2) {
+       if (lost >= 2 && detect_lost_ticks) {
                jiffies_64 += lost-1;
 
                /* sanity check to ensure we're not always losing ticks */
index 307514f7a2826207fc5e8da881f64c61c7f8a06c..09a0dbc17fb687bfc6e79ba6377e012246846180 100644 (file)
@@ -13,6 +13,11 @@ obj-$(CONFIG_IA64_BRL_EMU)   += brl_emu.o
 obj-$(CONFIG_IA64_GENERIC)     += acpi-ext.o
 obj-$(CONFIG_IA64_HP_ZX1)      += acpi-ext.o
 obj-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += acpi-ext.o
+
+ifneq ($(CONFIG_ACPI_PROCESSOR),)
+obj-y                          += acpi-processor.o
+endif
+
 obj-$(CONFIG_IA64_PALINFO)     += palinfo.o
 obj-$(CONFIG_IOSAPIC)          += iosapic.o
 obj-$(CONFIG_MODULES)          += module.o
index 13a5b3b49bf869f0fac90186151f00a5296c34d2..4a5574ff007b8a1f1d5b0205d417c936b86e23f6 100644 (file)
@@ -33,33 +33,33 @@ acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
        struct acpi_vendor_info *info = (struct acpi_vendor_info *)context;
        struct acpi_resource_vendor *vendor;
        struct acpi_vendor_descriptor *descriptor;
-       u32 length;
+       u32 byte_length;
 
-       if (resource->id != ACPI_RSTYPE_VENDOR)
+       if (resource->type != ACPI_RESOURCE_TYPE_VENDOR)
                return AE_OK;
 
        vendor = (struct acpi_resource_vendor *)&resource->data;
-       descriptor = (struct acpi_vendor_descriptor *)vendor->reserved;
-       if (vendor->length <= sizeof(*info->descriptor) ||
+       descriptor = (struct acpi_vendor_descriptor *)vendor->byte_data;
+       if (vendor->byte_length <= sizeof(*info->descriptor) ||
            descriptor->guid_id != info->descriptor->guid_id ||
            efi_guidcmp(descriptor->guid, info->descriptor->guid))
                return AE_OK;
 
-       length = vendor->length - sizeof(struct acpi_vendor_descriptor);
-       info->data = acpi_os_allocate(length);
+       byte_length = vendor->byte_length - sizeof(struct acpi_vendor_descriptor);
+       info->data = acpi_os_allocate(byte_length);
        if (!info->data)
                return AE_NO_MEMORY;
 
        memcpy(info->data,
-              vendor->reserved + sizeof(struct acpi_vendor_descriptor),
-              length);
-       info->length = length;
+              vendor->byte_data + sizeof(struct acpi_vendor_descriptor),
+              byte_length);
+       info->length = byte_length;
        return AE_CTRL_TERMINATE;
 }
 
 acpi_status
 acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor * id,
-                         u8 ** data, u32 * length)
+                         u8 ** data, u32 * byte_length)
 {
        struct acpi_vendor_info info;
 
@@ -72,7 +72,7 @@ acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor * id,
                return AE_NOT_FOUND;
 
        *data = info.data;
-       *length = info.length;
+       *byte_length = info.length;
        return AE_OK;
 }
 
diff --git a/arch/ia64/kernel/acpi-processor.c b/arch/ia64/kernel/acpi-processor.c
new file mode 100644 (file)
index 0000000..e683630
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * arch/ia64/kernel/cpufreq/processor.c
+ *
+ * Copyright (C) 2005 Intel Corporation
+ *     Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
+ *     - Added _PDC for platforms with Intel CPUs
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/acpi.h>
+
+#include <acpi/processor.h>
+#include <asm/acpi.h>
+
+static void init_intel_pdc(struct acpi_processor *pr)
+{
+       struct acpi_object_list *obj_list;
+       union acpi_object *obj;
+       u32 *buf;
+
+       /* allocate and initialize pdc. It will be used later. */
+       obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
+       if (!obj_list) {
+               printk(KERN_ERR "Memory allocation error\n");
+               return;
+       }
+
+       obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
+       if (!obj) {
+               printk(KERN_ERR "Memory allocation error\n");
+               kfree(obj_list);
+               return;
+       }
+
+       buf = kmalloc(12, GFP_KERNEL);
+       if (!buf) {
+               printk(KERN_ERR "Memory allocation error\n");
+               kfree(obj);
+               kfree(obj_list);
+               return;
+       }
+
+       buf[0] = ACPI_PDC_REVISION_ID;
+       buf[1] = 1;
+       buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP;
+
+       obj->type = ACPI_TYPE_BUFFER;
+       obj->buffer.length = 12;
+       obj->buffer.pointer = (u8 *) buf;
+       obj_list->count = 1;
+       obj_list->pointer = obj;
+       pr->pdc = obj_list;
+
+       return;
+}
+
+/* Initialize _PDC data based on the CPU vendor */
+void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
+{
+       pr->pdc = NULL;
+       init_intel_pdc(pr);
+       return;
+}
+
+EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
index 9ad94ddf668776c14092993335fc171ce5ed0664..d2702c419cf830450ad63621bccec1e50842e718 100644 (file)
@@ -567,16 +567,16 @@ void __init acpi_numa_arch_fixup(void)
  * success: return IRQ number (>=0)
  * failure: return < 0
  */
-int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
+int acpi_register_gsi(u32 gsi, int triggering, int polarity)
 {
        if (has_8259 && gsi < 16)
                return isa_irq_to_vector(gsi);
 
        return iosapic_register_intr(gsi,
-                                    (active_high_low ==
+                                    (polarity ==
                                      ACPI_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH :
                                     IOSAPIC_POL_LOW,
-                                    (edge_level ==
+                                    (triggering ==
                                      ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE :
                                     IOSAPIC_LEVEL);
 }
index f748d34c02f0b03174d1e21c4684268e25aed42b..4838f2a57c7af7b57f584e8fb34f1bb05958aed5 100644 (file)
@@ -1 +1,2 @@
 obj-$(CONFIG_IA64_ACPI_CPUFREQ)                += acpi-cpufreq.o
+
index da4d5cf80a480eb5b4be0518240db04e44776cf0..5a1bf815282d71fda393b82e6941710afbda0c27 100644 (file)
@@ -269,48 +269,6 @@ acpi_cpufreq_verify (
 }
 
 
-/*
- * processor_init_pdc - let BIOS know about the SMP capabilities
- * of this driver
- * @perf: processor-specific acpi_io_data struct
- * @cpu: CPU being initialized
- *
- * To avoid issues with legacy OSes, some BIOSes require to be informed of
- * the SMP capabilities of OS P-state driver. Here we set the bits in _PDC
- * accordingly. Actual call to _PDC is done in driver/acpi/processor.c
- */
-static void
-processor_init_pdc (
-               struct acpi_processor_performance *perf,
-               unsigned int cpu,
-               struct acpi_object_list *obj_list
-               )
-{
-       union acpi_object *obj;
-       u32 *buf;
-
-       dprintk("processor_init_pdc\n");
-
-       perf->pdc = NULL;
-       /* Initialize pdc. It will be used later. */
-       if (!obj_list)
-               return;
-
-       if (!(obj_list->count && obj_list->pointer))
-               return;
-
-       obj = obj_list->pointer;
-       if ((obj->buffer.length == 12) && obj->buffer.pointer) {
-               buf = (u32 *)obj->buffer.pointer;
-                       buf[0] = ACPI_PDC_REVISION_ID;
-                       buf[1] = 1;
-                       buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
-               perf->pdc = obj_list;
-       }
-       return;
-}
-
-
 static int
 acpi_cpufreq_cpu_init (
        struct cpufreq_policy   *policy)
@@ -320,14 +278,7 @@ acpi_cpufreq_cpu_init (
        struct cpufreq_acpi_io  *data;
        unsigned int            result = 0;
 
-       union acpi_object               arg0 = {ACPI_TYPE_BUFFER};
-       u32                             arg0_buf[3];
-       struct acpi_object_list         arg_list = {1, &arg0};
-
        dprintk("acpi_cpufreq_cpu_init\n");
-       /* setup arg_list for _PDC settings */
-        arg0.buffer.length = 12;
-        arg0.buffer.pointer = (u8 *) arg0_buf;
 
        data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
        if (!data)
@@ -337,9 +288,7 @@ acpi_cpufreq_cpu_init (
 
        acpi_io_data[cpu] = data;
 
-       processor_init_pdc(&data->acpi_data, cpu, &arg_list);
        result = acpi_processor_register_performance(&data->acpi_data, cpu);
-       data->acpi_data.pdc = NULL;
 
        if (result)
                goto err_free;
index d27ecdcb6fca8619405b9ffb1e2004f2186f67ec..0b30ca006286429448e418e7358cbfa4e1ab3dae 100644 (file)
@@ -193,12 +193,12 @@ add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr)
                goto free_resource;
        }
 
-       min = addr->min_address_range;
+       min = addr->minimum;
        max = min + addr->address_length - 1;
-       if (addr->attribute.io.translation_attribute == ACPI_SPARSE_TRANSLATION)
+       if (addr->info.io.translation_type == ACPI_SPARSE_TRANSLATION)
                sparse = 1;
 
-       space_nr = new_space(addr->address_translation_offset, sparse);
+       space_nr = new_space(addr->translation_offset, sparse);
        if (space_nr == ~0)
                goto free_name;
 
@@ -285,7 +285,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
        if (addr.resource_type == ACPI_MEMORY_RANGE) {
                flags = IORESOURCE_MEM;
                root = &iomem_resource;
-               offset = addr.address_translation_offset;
+               offset = addr.translation_offset;
        } else if (addr.resource_type == ACPI_IO_RANGE) {
                flags = IORESOURCE_IO;
                root = &ioport_resource;
@@ -298,7 +298,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
        window = &info->controller->window[info->controller->windows++];
        window->resource.name = info->name;
        window->resource.flags = flags;
-       window->resource.start = addr.min_address_range + offset;
+       window->resource.start = addr.minimum + offset;
        window->resource.end = window->resource.start + addr.address_length - 1;
        window->resource.child = NULL;
        window->offset = offset;
index 96d18c43dca0a0b47e68fd227413b7a28ea44276..d4f88e0af24c04fcb51271d50414242418f96ded 100644 (file)
@@ -178,7 +178,7 @@ int kgdb_enabled;
  */
 static DEFINE_SPINLOCK(kgdb_lock);
 static raw_spinlock_t kgdb_cpulock[NR_CPUS] = {
-       [0 ... NR_CPUS-1] = __RAW_SPIN_LOCK_UNLOCKED;
+       [0 ... NR_CPUS-1] = __RAW_SPIN_LOCK_UNLOCKED,
 };
 
 /*
index f970ace208d348bd0b8bafa70200da793be064cd..c7a799a095161b5fa8f57a03989c44126785aaef 100644 (file)
@@ -134,7 +134,6 @@ static int __init add_legacy_soc_port(struct device_node *np,
        return add_legacy_port(np, -1, UPIO_MEM, addr, addr, NO_IRQ, flags);
 }
 
-#ifdef CONFIG_ISA
 static int __init add_legacy_isa_port(struct device_node *np,
                                      struct device_node *isa_brg)
 {
@@ -168,7 +167,6 @@ static int __init add_legacy_isa_port(struct device_node *np,
        return add_legacy_port(np, index, UPIO_PORT, reg[1], taddr, NO_IRQ, UPF_BOOT_AUTOCONF);
 
 }
-#endif
 
 #ifdef CONFIG_PCI
 static int __init add_legacy_pci_port(struct device_node *np,
@@ -276,7 +274,6 @@ void __init find_legacy_serial_ports(void)
                of_node_put(soc);
        }
 
-#ifdef CONFIG_ISA
        /* First fill our array with ISA ports */
        for (np = NULL; (np = of_find_node_by_type(np, "serial"));) {
                struct device_node *isa = of_get_parent(np);
@@ -287,7 +284,6 @@ void __init find_legacy_serial_ports(void)
                }
                of_node_put(isa);
        }
-#endif
 
 #ifdef CONFIG_PCI
        /* Next, try to locate PCI ports */
index 3747ab0dac3fd66f1adf58b5365b62033b19ad62..c6d0595da6b5d74755d2eb8be8804672c862eae7 100644 (file)
@@ -254,11 +254,9 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs);
  */
 long sys_sigsuspend(old_sigset_t mask)
 {
-       sigset_t saveset;
-
        mask &= _BLOCKABLE;
        spin_lock_irq(&current->sighand->siglock);
-       saveset = current->blocked;
+       current->saved_sigmask = current->blocked;
        siginitset(&current->blocked, mask);
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
index c32c623001dced0c7a88ed4a30a20ed2650077b6..356a739e52b2d9c446b0c720c50f1d843faf90c5 100644 (file)
@@ -862,21 +862,28 @@ int pmf_register_irq_client(struct device_node *target,
                spin_unlock_irqrestore(&pmf_lock, flags);
                return -ENODEV;
        }
+       if (list_empty(&func->irq_clients))
+               func->dev->handlers->irq_enable(func);
        list_add(&client->link, &func->irq_clients);
+       client->func = func;
        spin_unlock_irqrestore(&pmf_lock, flags);
 
        return 0;
 }
 EXPORT_SYMBOL_GPL(pmf_register_irq_client);
 
-void pmf_unregister_irq_client(struct device_node *np,
-                             const char *name,
-                             struct pmf_irq_client *client)
+void pmf_unregister_irq_client(struct pmf_irq_client *client)
 {
+       struct pmf_function *func = client->func;
        unsigned long flags;
 
+       BUG_ON(func == NULL);
+
        spin_lock_irqsave(&pmf_lock, flags);
+       client->func = NULL;
        list_del(&client->link);
+       if (list_empty(&func->irq_clients))
+               func->dev->handlers->irq_disable(func);
        spin_unlock_irqrestore(&pmf_lock, flags);
 }
 EXPORT_SYMBOL_GPL(pmf_unregister_irq_client);
index 21934784f93679968076ebf8993c983528ac296b..bdaa8aabdaa64c4388c5ca4d933464a0293aa6f0 100644 (file)
@@ -58,6 +58,7 @@ pcibios_find_pci_bus(struct device_node *dn)
 
        return find_bus_among_children(pdn->phb->bus, dn);
 }
+EXPORT_SYMBOL_GPL(pcibios_find_pci_bus);
 
 /**
  * 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)
                }
        }
 }
+EXPORT_SYMBOL_GPL(pcibios_fixup_new_pci_devices);
 
 static int
 pcibios_pci_config_bridge(struct pci_dev *dev)
@@ -172,3 +174,4 @@ pcibios_add_pci_devices(struct pci_bus * bus)
                        pcibios_pci_config_bridge(dev);
        }
 }
+EXPORT_SYMBOL_GPL(pcibios_add_pci_devices);
index 7d23edc6facbc8f9b464be573b21873b48fd22a3..3525c91204d4f87d19af240ddfbc26b58ee1d660 100644 (file)
@@ -1,13 +1,12 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc2
-# Mon Nov 21 13:51:30 2005
+# Linux kernel version: 2.6.16-rc1
+# Thu Jan 19 10:58:53 2006
 #
 CONFIG_MMU=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_S390=y
-CONFIG_UID16=y
 
 #
 # Code maturity level options
@@ -29,18 +28,20 @@ CONFIG_POSIX_MQUEUE=y
 CONFIG_SYSCTL=y
 CONFIG_AUDIT=y
 # CONFIG_AUDITSYSCALL is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 # CONFIG_CPUSETS is not set
 CONFIG_INITRAMFS_SOURCE=""
+CONFIG_UID16=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
@@ -49,8 +50,10 @@ CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -76,11 +79,11 @@ CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
 # CONFIG_DEFAULT_CFQ is not set
 # CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
+CONFIG_DEFAULT_IOSCHED="deadline"
 
 #
 # Base setup
@@ -193,6 +196,11 @@ CONFIG_IPV6=y
 # SCTP Configuration (EXPERIMENTAL)
 #
 # CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_VLAN_8021Q is not set
@@ -362,6 +370,7 @@ CONFIG_DM_MULTIPATH=y
 #
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=2048
+# CONFIG_HANGCHECK_TIMER is not set
 
 #
 # Watchdog Cards
@@ -488,6 +497,7 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_JFS_FS is not set
 # CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
 CONFIG_INOTIFY=y
@@ -520,6 +530,7 @@ CONFIG_TMPFS=y
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
 # CONFIG_RELAYFS_FS is not set
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -584,6 +595,7 @@ CONFIG_MSDOS_PARTITION=y
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
 # CONFIG_EFI_PARTITION is not set
 
 #
@@ -592,7 +604,7 @@ CONFIG_MSDOS_PARTITION=y
 # CONFIG_NLS is not set
 
 #
-# Profiling support
+# Instrumentation Support
 #
 # CONFIG_PROFILING is not set
 
@@ -600,19 +612,21 @@ CONFIG_MSDOS_PARTITION=y
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
 CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_KERNEL=y
 CONFIG_LOG_BUF_SHIFT=17
-CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_DETECT_SOFTLOCKUP is not set
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
-CONFIG_DEBUG_PREEMPT=y
+# CONFIG_DEBUG_PREEMPT is not set
+CONFIG_DEBUG_MUTEXES=y
 # CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
-CONFIG_DEBUG_FS=y
+# CONFIG_DEBUG_FS is not set
 # CONFIG_DEBUG_VM is not set
+CONFIG_FORCED_INLINING=y
 # CONFIG_RCU_TORTURE_TEST is not set
 
 #
index fa2b3bc22f206983bf9b1d19ba13a8df635ec3f1..ef706694a0c1d3897ab28330576901214d8d3a62 100644 (file)
@@ -1,8 +1,7 @@
 /*
- *  arch/s390/kernel/signal32.c
+ *  arch/s390/kernel/compat_signal.c
  *
- *  S390 version
- *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Copyright (C) IBM Corp. 2000,2006
  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  *               Gerhard Tonn (ton@de.ibm.com)                  
  *
@@ -52,8 +51,6 @@ typedef struct
        struct ucontext32 uc;
 } rt_sigframe32;
 
-asmlinkage int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
-
 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
 {
        int err;
@@ -161,66 +158,6 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
        return err;
 }
 
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int
-sys32_sigsuspend(struct pt_regs * regs,int history0, int history1, old_sigset_t mask)
-{
-       sigset_t saveset;
-
-       mask &= _BLOCKABLE;
-       spin_lock_irq(&current->sighand->siglock);
-       saveset = current->blocked;
-       siginitset(&current->blocked, mask);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
-       regs->gprs[2] = -EINTR;
-
-       while (1) {
-               set_current_state(TASK_INTERRUPTIBLE);
-               schedule();
-               if (do_signal(regs, &saveset))
-                       return -EINTR;
-       }
-}
-
-asmlinkage int
-sys32_rt_sigsuspend(struct pt_regs * regs, compat_sigset_t __user *unewset,
-                                                               size_t sigsetsize)
-{
-       sigset_t saveset, newset;
-       compat_sigset_t set32;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(sigset_t))
-               return -EINVAL;
-
-       if (copy_from_user(&set32, unewset, sizeof(set32)))
-               return -EFAULT;
-       switch (_NSIG_WORDS) {
-       case 4: newset.sig[3] = set32.sig[6] + (((long)set32.sig[7]) << 32);
-       case 3: newset.sig[2] = set32.sig[4] + (((long)set32.sig[5]) << 32);
-       case 2: newset.sig[1] = set32.sig[2] + (((long)set32.sig[3]) << 32);
-       case 1: newset.sig[0] = set32.sig[0] + (((long)set32.sig[1]) << 32);
-       }
-        sigdelsetmask(&newset, ~_BLOCKABLE);
-
-        spin_lock_irq(&current->sighand->siglock);
-        saveset = current->blocked;
-        current->blocked = newset;
-        recalc_sigpending();
-        spin_unlock_irq(&current->sighand->siglock);
-        regs->gprs[2] = -EINTR;
-
-        while (1) {
-                set_current_state(TASK_INTERRUPTIBLE);
-                schedule();
-                if (do_signal(regs, &saveset))
-                        return -EINTR;
-        }
-}
-
 asmlinkage long
 sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
                 struct old_sigaction32 __user *oact)
@@ -520,7 +457,7 @@ static inline int map_signal(int sig)
                return sig;
 }
 
-static void setup_frame32(int sig, struct k_sigaction *ka,
+static int setup_frame32(int sig, struct k_sigaction *ka,
                        sigset_t *set, struct pt_regs * regs)
 {
        sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(sigframe32));
@@ -565,13 +502,14 @@ static void setup_frame32(int sig, struct k_sigaction *ka,
        /* Place signal number on stack to allow backtrace from handler.  */
        if (__put_user(regs->gprs[2], (int __user *) &frame->signo))
                goto give_sigsegv;
-       return;
+       return 0;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return -EFAULT;
 }
 
-static void setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
+static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
                           sigset_t *set, struct pt_regs * regs)
 {
        int err = 0;
@@ -615,31 +553,37 @@ static void setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
        regs->gprs[2] = map_signal(sig);
        regs->gprs[3] = (__u64) &frame->info;
        regs->gprs[4] = (__u64) &frame->uc;
-       return;
+       return 0;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return -EFAULT;
 }
 
 /*
  * OK, we're invoking a handler
  */    
 
-void
+int
 handle_signal32(unsigned long sig, struct k_sigaction *ka,
                siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
 {
+       int ret;
+
        /* Set up the stack frame */
        if (ka->sa.sa_flags & SA_SIGINFO)
-               setup_rt_frame32(sig, ka, info, oldset, regs);
+               ret = setup_rt_frame32(sig, ka, info, oldset, regs);
        else
-               setup_frame32(sig, ka, oldset, regs);
-
-       spin_lock_irq(&current->sighand->siglock);
-       sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-       if (!(ka->sa.sa_flags & SA_NODEFER))
-               sigaddset(&current->blocked,sig);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+               ret = setup_frame32(sig, ka, oldset, regs);
+
+       if (ret == 0) {
+               spin_lock_irq(&current->sighand->siglock);
+               sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
+               if (!(ka->sa.sa_flags & SA_NODEFER))
+                       sigaddset(&current->blocked,sig);
+               recalc_sigpending();
+               spin_unlock_irq(&current->sighand->siglock);
+       }
+       return ret;
 }
 
index cfde1905d07d77c5d2513e14a3c019e1d56f01d6..6e27ac68ec3f01060093a7fb98b3ff0899f7f0ca 100644 (file)
@@ -1,9 +1,8 @@
 /*
-*  arch/s390/kernel/sys_wrapper31.S
+*  arch/s390/kernel/compat_wrapper.S
 *    wrapper for 31 bit compatible system calls.
 *
-*  S390 version
-*    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+*    Copyright (C) IBM Corp. 2000,2006
 *    Author(s): Gerhard Tonn (ton@de.ibm.com),
 *               Thomas Spatzier (tspat@de.ibm.com)
 */ 
@@ -288,7 +287,12 @@ sys32_setregid16_wrapper:
        llgfr   %r3,%r3                 # __kernel_old_gid_emu31_t 
        jg      sys32_setregid16        # branch to system call
 
-#sys32_sigsuspend_wrapper              # done in sigsuspend_glue 
+       .globl sys_sigsuspend_wrapper
+sys_sigsuspend_wrapper:
+       lgfr    %r2,%r2                 # int
+       lgfr    %r3,%r3                 # int
+       llgfr   %r4,%r4                 # old_sigset_t
+       jg      sys_sigsuspend
 
        .globl  compat_sys_sigpending_wrapper 
 compat_sys_sigpending_wrapper:
@@ -855,7 +859,11 @@ sys32_rt_sigqueueinfo_wrapper:
        llgtr   %r4,%r4                 # siginfo_emu31_t *
        jg      sys32_rt_sigqueueinfo   # branch to system call
 
-#sys32_rt_sigsuspend_wrapper           # done in rt_sigsuspend_glue 
+       .globl compat_sys_rt_sigsuspend_wrapper
+compat_sys_rt_sigsuspend_wrapper:
+       llgtr   %r2,%r2                 # compat_sigset_t *
+       llgfr   %r3,%r3                 # compat_size_t
+       jg      compat_sys_rt_sigsuspend
 
        .globl  sys32_pread64_wrapper 
 sys32_pread64_wrapper:
@@ -1475,3 +1483,122 @@ sys_inotify_rm_watch_wrapper:
        lgfr    %r2,%r2                 # int
        llgfr   %r3,%r3                 # u32
        jg      sys_inotify_rm_watch
+
+       .globl compat_sys_openat_wrapper
+compat_sys_openat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       lgfr    %r4,%r4                 # int
+       lgfr    %r5,%r5                 # int
+       jg      compat_sys_openat
+
+       .globl sys_mkdirat_wrapper
+sys_mkdirat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       lgfr    %r4,%r4                 # int
+       jg      sys_mkdirat
+
+       .globl sys_mknodat_wrapper
+sys_mknodat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       lgfr    %r4,%r4                 # int
+       llgfr   %r5,%r5                 # unsigned int
+       jg      sys_mknodat
+
+       .globl sys_fchownat_wrapper
+sys_fchownat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       llgfr   %r4,%r4                 # uid_t
+       llgfr   %r5,%r5                 # gid_t
+       lgfr    %r6,%r6                 # int
+       jg      sys_fchownat
+
+       .globl compat_sys_futimesat_wrapper
+compat_sys_futimesat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # char *
+       llgtr   %r4,%r4                 # struct timeval *
+       jg      compat_sys_futimesat
+
+       .globl compat_sys_newfstatat_wrapper
+compat_sys_newfstatat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # char *
+       llgtr   %r4,%r4                 # struct stat *
+       lgfr    %r5,%r5                 # int
+       jg      compat_sys_newfstatat
+
+       .globl sys_unlinkat_wrapper
+sys_unlinkat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       lgfr    %r4,%r4                 # int
+       jg      sys_unlinkat
+
+       .globl sys_renameat_wrapper
+sys_renameat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       lgfr    %r4,%r4                 # int
+       llgtr   %r5,%r5                 # const char *
+       jg      sys_renameat
+
+       .globl sys_linkat_wrapper
+sys_linkat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       lgfr    %r4,%r4                 # int
+       llgtr   %r5,%r5                 # const char *
+       jg      sys_linkat
+
+       .globl sys_symlinkat_wrapper
+sys_symlinkat_wrapper:
+       llgtr   %r2,%r2                 # const char *
+       lgfr    %r3,%r3                 # int
+       llgtr   %r4,%r4                 # const char *
+       jg      sys_symlinkat
+
+       .globl sys_readlinkat_wrapper
+sys_readlinkat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       llgtr   %r4,%r4                 # char *
+       lgfr    %r5,%r5                 # int
+       jg      sys_readlinkat
+
+       .globl sys_fchmodat_wrapper
+sys_fchmodat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       llgfr   %r4,%r4                 # mode_t
+       jg      sys_fchmodat
+
+       .globl sys_faccessat_wrapper
+sys_faccessat_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # const char *
+       lgfr    %r4,%r4                 # int
+       jg      sys_faccessat
+
+       .globl compat_sys_pselect6_wrapper
+compat_sys_pselect6_wrapper:
+       lgfr    %r2,%r2                 # int
+       llgtr   %r3,%r3                 # fd_set *
+       llgtr   %r4,%r4                 # fd_set *
+       llgtr   %r5,%r5                 # fd_set *
+       llgtr   %r6,%r6                 # struct timespec *
+       llgt    %r0,164(%r15)           # void *
+       stg     %r0,160(%r15)
+       jg      compat_sys_pselect6
+
+       .globl compat_sys_ppoll_wrapper
+compat_sys_ppoll_wrapper:
+       llgtr   %r2,%r2                 # struct pollfd *
+       llgfr   %r3,%r3                 # unsigned int
+       llgtr   %r4,%r4                 # struct timespec *
+       llgtr   %r5,%r5                 # const sigset_t *
+       llgfr   %r6,%r6                 # size_t
+       jg      compat_sys_ppoll
index 27b07730b7b8d172f4330aaea690f53e82152628..b2448487854cfbd5a36aae778be1eebec9184211 100644 (file)
@@ -2,8 +2,7 @@
  *  arch/s390/kernel/entry.S
  *    S390 low-level entry points.
  *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Copyright (C) IBM Corp. 1999,2006
  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
  *               Hartmut Penner (hp@de.ibm.com),
  *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
@@ -50,9 +49,10 @@ SP_ILC       =  STACK_FRAME_OVERHEAD + __PT_ILC
 SP_TRAP      =  STACK_FRAME_OVERHEAD + __PT_TRAP
 SP_SIZE      =  STACK_FRAME_OVERHEAD + __PT_SIZE
 
-_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING | \
-                _TIF_RESTART_SVC | _TIF_SINGLE_STEP )
-_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)
+_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NEED_RESCHED | \
+                _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_SINGLE_STEP )
+_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NEED_RESCHED | \
+                _TIF_MCCK_PENDING)
 
 STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER
 STACK_SIZE  = 1 << STACK_SHIFT
@@ -251,8 +251,8 @@ sysc_work:
        bo      BASED(sysc_mcck_pending)
        tm      __TI_flags+3(%r9),_TIF_NEED_RESCHED
        bo      BASED(sysc_reschedule)
-       tm      __TI_flags+3(%r9),_TIF_SIGPENDING
-       b     BASED(sysc_sigpending)
+       tm      __TI_flags+3(%r9),(_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)
+       bnz     BASED(sysc_sigpending)
        tm      __TI_flags+3(%r9),_TIF_RESTART_SVC
        bo      BASED(sysc_restart)
        tm      __TI_flags+3(%r9),_TIF_SINGLE_STEP
@@ -276,12 +276,11 @@ sysc_mcck_pending:
        br      %r1                     # TIF bit will be cleared by handler
 
 #
-# _TIF_SIGPENDING is set, call do_signal
+# _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal
 #
 sysc_sigpending:     
        ni      __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP
         la      %r2,SP_PTREGS(%r15)    # load pt_regs
-        sr      %r3,%r3                # clear *oldset
         l       %r1,BASED(.Ldo_signal)
        basr    %r14,%r1               # call do_signal
        tm      __TI_flags+3(%r9),_TIF_RESTART_SVC
@@ -397,30 +396,6 @@ sys_rt_sigreturn_glue:
         l       %r1,BASED(.Lrt_sigreturn)
         br      %r1                   # branch to sys_sigreturn
 
-#
-# sigsuspend and rt_sigsuspend need pt_regs as an additional
-# parameter and they have to skip the store of %r2 into the
-# user register %r2 because the return value was set in 
-# sigsuspend and rt_sigsuspend already and must not be overwritten!
-#
-
-sys_sigsuspend_glue:    
-        lr      %r5,%r4               # move mask back
-        lr      %r4,%r3               # move history1 parameter
-        lr      %r3,%r2               # move history0 parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-        l       %r1,BASED(.Lsigsuspend)
-       la      %r14,4(%r14)          # skip store of return value
-        br      %r1                   # branch to sys_sigsuspend
-
-sys_rt_sigsuspend_glue: 
-        lr      %r4,%r3               # move sigsetsize parameter
-        lr      %r3,%r2               # move unewset parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-        l       %r1,BASED(.Lrt_sigsuspend)
-       la      %r14,4(%r14)          # skip store of return value
-        br      %r1                   # branch to sys_rt_sigsuspend
-
 sys_sigaltstack_glue:
         la      %r4,SP_PTREGS(%r15)   # load pt_regs as parameter
         l       %r1,BASED(.Lsigaltstack)
@@ -604,15 +579,16 @@ io_work:
        lr      %r15,%r1
 #
 # One of the work bits is on. Find out which one.
-# Checked are: _TIF_SIGPENDING, _TIF_NEED_RESCHED and _TIF_MCCK_PENDING
+# Checked are: _TIF_SIGPENDING, _TIF_RESTORE_SIGMASK, _TIF_NEED_RESCHED
+#              and _TIF_MCCK_PENDING
 #
 io_work_loop:
        tm      __TI_flags+3(%r9),_TIF_MCCK_PENDING
        bo      BASED(io_mcck_pending)
        tm      __TI_flags+3(%r9),_TIF_NEED_RESCHED
        bo      BASED(io_reschedule)
-       tm      __TI_flags+3(%r9),_TIF_SIGPENDING
-       b     BASED(io_sigpending)
+       tm      __TI_flags+3(%r9),(_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)
+       bnz     BASED(io_sigpending)
        b       BASED(io_leave)
 
 #
@@ -636,12 +612,11 @@ io_reschedule:
        b       BASED(io_work_loop)
 
 #
-# _TIF_SIGPENDING is set, call do_signal
+# _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal
 #
 io_sigpending:     
         stosm   __SF_EMPTY(%r15),0x03  # reenable interrupts
         la      %r2,SP_PTREGS(%r15)    # load pt_regs
-        sr      %r3,%r3                # clear *oldset
         l       %r1,BASED(.Ldo_signal)
        basr    %r14,%r1               # call do_signal
         stnsm   __SF_EMPTY(%r15),0xfc  # disable I/O and ext. interrupts
index 369ab4413ec71fe0123d16a2a2d187c2eb6603a9..2ac095bc0e250373588ba658916d0bdc700577fc 100644 (file)
@@ -1,9 +1,8 @@
 /*
- *  arch/s390/kernel/entry.S
+ *  arch/s390/kernel/entry64.S
  *    S390 low-level entry points.
  *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Copyright (C) IBM Corp. 1999,2006
  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
  *               Hartmut Penner (hp@de.ibm.com),
  *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
@@ -53,9 +52,10 @@ SP_SIZE      =  STACK_FRAME_OVERHEAD + __PT_SIZE
 STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER
 STACK_SIZE  = 1 << STACK_SHIFT
 
-_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING | \
-                _TIF_RESTART_SVC | _TIF_SINGLE_STEP )
-_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)
+_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NEED_RESCHED | \
+                _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_SINGLE_STEP )
+_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NEED_RESCHED | \
+                _TIF_MCCK_PENDING)
 
 #define BASED(name) name-system_call(%r13)
 
@@ -249,8 +249,8 @@ sysc_work:
        jo      sysc_mcck_pending
        tm      __TI_flags+7(%r9),_TIF_NEED_RESCHED
        jo      sysc_reschedule
-       tm      __TI_flags+7(%r9),_TIF_SIGPENDING
-       j     sysc_sigpending
+       tm      __TI_flags+7(%r9),(_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)
+       jnz     sysc_sigpending
        tm      __TI_flags+7(%r9),_TIF_RESTART_SVC
        jo      sysc_restart
        tm      __TI_flags+7(%r9),_TIF_SINGLE_STEP
@@ -272,12 +272,11 @@ sysc_mcck_pending:
        jg      s390_handle_mcck    # TIF bit will be cleared by handler
 
 #
-# _TIF_SIGPENDING is set, call do_signal
+# _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal
 #
 sysc_sigpending:     
        ni      __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP
         la      %r2,SP_PTREGS(%r15) # load pt_regs
-        sgr     %r3,%r3           # clear *oldset
        brasl   %r14,do_signal    # call do_signal
        tm      __TI_flags+7(%r9),_TIF_RESTART_SVC
        jo      sysc_restart
@@ -414,52 +413,6 @@ sys32_rt_sigreturn_glue:
         jg      sys32_rt_sigreturn    # branch to sys32_sigreturn
 #endif
 
-#
-# sigsuspend and rt_sigsuspend need pt_regs as an additional
-# parameter and they have to skip the store of %r2 into the
-# user register %r2 because the return value was set in 
-# sigsuspend and rt_sigsuspend already and must not be overwritten!
-#
-
-sys_sigsuspend_glue:    
-        lgr     %r5,%r4               # move mask back
-        lgr     %r4,%r3               # move history1 parameter
-        lgr     %r3,%r2               # move history0 parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-       la      %r14,6(%r14)          # skip store of return value
-        jg      sys_sigsuspend        # branch to sys_sigsuspend
-
-#ifdef CONFIG_COMPAT
-sys32_sigsuspend_glue:    
-       llgfr   %r4,%r4               # unsigned long                   
-        lgr     %r5,%r4               # move mask back
-       lgfr    %r3,%r3               # int                     
-        lgr     %r4,%r3               # move history1 parameter
-       lgfr    %r2,%r2               # int                     
-        lgr     %r3,%r2               # move history0 parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-       la      %r14,6(%r14)          # skip store of return value
-        jg      sys32_sigsuspend      # branch to sys32_sigsuspend
-#endif
-
-sys_rt_sigsuspend_glue: 
-        lgr     %r4,%r3               # move sigsetsize parameter
-        lgr     %r3,%r2               # move unewset parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-       la      %r14,6(%r14)          # skip store of return value
-        jg      sys_rt_sigsuspend     # branch to sys_rt_sigsuspend
-
-#ifdef CONFIG_COMPAT
-sys32_rt_sigsuspend_glue: 
-       llgfr   %r3,%r3               # size_t                  
-        lgr     %r4,%r3               # move sigsetsize parameter
-       llgtr   %r2,%r2               # sigset_emu31_t *
-        lgr     %r3,%r2               # move unewset parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-       la      %r14,6(%r14)          # skip store of return value
-        jg      sys32_rt_sigsuspend   # branch to sys32_rt_sigsuspend
-#endif
-
 sys_sigaltstack_glue:
         la      %r4,SP_PTREGS(%r15)   # load pt_regs as parameter
         jg      sys_sigaltstack       # branch to sys_sigreturn
@@ -646,15 +599,16 @@ io_work:
        lgr     %r15,%r1
 #
 # One of the work bits is on. Find out which one.
-# Checked are: _TIF_SIGPENDING, _TIF_NEED_RESCHED and _TIF_MCCK_PENDING
+# Checked are: _TIF_SIGPENDING, _TIF_RESTORE_SIGPENDING, _TIF_NEED_RESCHED
+#             and _TIF_MCCK_PENDING
 #
 io_work_loop:
        tm      __TI_flags+7(%r9),_TIF_MCCK_PENDING
        jo      io_mcck_pending
        tm      __TI_flags+7(%r9),_TIF_NEED_RESCHED
        jo      io_reschedule
-       tm      __TI_flags+7(%r9),_TIF_SIGPENDING
-       j     io_sigpending
+       tm      __TI_flags+7(%r9),(_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)
+       jnz     io_sigpending
        j       io_leave
 
 #
@@ -676,12 +630,11 @@ io_reschedule:
        j       io_work_loop
 
 #
-# _TIF_SIGPENDING is set, call do_signal
+# _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal
 #
 io_sigpending:     
        stosm   __SF_EMPTY(%r15),0x03   # reenable interrupts
        la      %r2,SP_PTREGS(%r15)     # load pt_regs
-       slgr    %r3,%r3                 # clear *oldset
        brasl   %r14,do_signal          # call do_signal
        stnsm   __SF_EMPTY(%r15),0xfc   # disable I/O and ext. interrupts
        j       io_work_loop
index 6ae4a77270b539023fd94dd00ead6d9decbb3778..ae1927e48cfb8fbef2fe082885245d3ed9c17e2a 100644 (file)
@@ -1,8 +1,7 @@
 /*
  *  arch/s390/kernel/signal.c
  *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Copyright (C) IBM Corp. 1999,2006
  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  *
  *    Based on Intel version
@@ -51,60 +50,24 @@ typedef struct
        struct ucontext uc;
 } rt_sigframe;
 
-int do_signal(struct pt_regs *regs, sigset_t *oldset);
-
 /*
  * Atomically swap in the new signal mask, and wait for a signal.
  */
 asmlinkage int
-sys_sigsuspend(struct pt_regs * regs, int history0, int history1,
-              old_sigset_t mask)
+sys_sigsuspend(int history0, int history1, old_sigset_t mask)
 {
-       sigset_t saveset;
-
        mask &= _BLOCKABLE;
        spin_lock_irq(&current->sighand->siglock);
-       saveset = current->blocked;
+       current->saved_sigmask = current->blocked;
        siginitset(&current->blocked, mask);
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
-       regs->gprs[2] = -EINTR;
-
-       while (1) {
-               set_current_state(TASK_INTERRUPTIBLE);
-               schedule();
-               if (do_signal(regs, &saveset))
-                       return -EINTR;
-       }
-}
-
-asmlinkage long
-sys_rt_sigsuspend(struct pt_regs *regs, sigset_t __user *unewset,
-                                               size_t sigsetsize)
-{
-       sigset_t saveset, newset;
 
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(sigset_t))
-               return -EINVAL;
+       current->state = TASK_INTERRUPTIBLE;
+       schedule();
+       set_thread_flag(TIF_RESTORE_SIGMASK);
 
-       if (copy_from_user(&newset, unewset, sizeof(newset)))
-               return -EFAULT;
-       sigdelsetmask(&newset, ~_BLOCKABLE);
-
-       spin_lock_irq(&current->sighand->siglock);
-       saveset = current->blocked;
-       current->blocked = newset;
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
-       regs->gprs[2] = -EINTR;
-
-       while (1) {
-               set_current_state(TASK_INTERRUPTIBLE);
-               schedule();
-               if (do_signal(regs, &saveset))
-                       return -EINTR;
-       }
+       return -ERESTARTNOHAND;
 }
 
 asmlinkage long
@@ -306,8 +269,8 @@ static inline int map_signal(int sig)
                return sig;
 }
 
-static void setup_frame(int sig, struct k_sigaction *ka,
-                       sigset_t *set, struct pt_regs * regs)
+static int setup_frame(int sig, struct k_sigaction *ka,
+                      sigset_t *set, struct pt_regs * regs)
 {
        sigframe __user *frame;
 
@@ -355,13 +318,14 @@ static void setup_frame(int sig, struct k_sigaction *ka,
        /* Place signal number on stack to allow backtrace from handler.  */
        if (__put_user(regs->gprs[2], (int __user *) &frame->signo))
                goto give_sigsegv;
-       return;
+       return 0;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return -EFAULT;
 }
 
-static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                           sigset_t *set, struct pt_regs * regs)
 {
        int err = 0;
@@ -409,32 +373,39 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
        regs->gprs[2] = map_signal(sig);
        regs->gprs[3] = (unsigned long) &frame->info;
        regs->gprs[4] = (unsigned long) &frame->uc;
-       return;
+       return 0;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return -EFAULT;
 }
 
 /*
  * OK, we're invoking a handler
  */    
 
-static void
+static int
 handle_signal(unsigned long sig, struct k_sigaction *ka,
              siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
 {
+       int ret;
+
        /* Set up the stack frame */
        if (ka->sa.sa_flags & SA_SIGINFO)
-               setup_rt_frame(sig, ka, info, oldset, regs);
+               ret = setup_rt_frame(sig, ka, info, oldset, regs);
        else
-               setup_frame(sig, ka, oldset, regs);
+               ret = setup_frame(sig, ka, oldset, regs);
+
+       if (ret == 0) {
+               spin_lock_irq(&current->sighand->siglock);
+               sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
+               if (!(ka->sa.sa_flags & SA_NODEFER))
+                       sigaddset(&current->blocked,sig);
+               recalc_sigpending();
+               spin_unlock_irq(&current->sighand->siglock);
+       }
 
-       spin_lock_irq(&current->sighand->siglock);
-       sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-       if (!(ka->sa.sa_flags & SA_NODEFER))
-               sigaddset(&current->blocked,sig);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+       return ret;
 }
 
 /*
@@ -446,12 +417,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
  * the kernel can handle, and then we build all the user-level signal handling
  * stack-frames in one go after that.
  */
-int do_signal(struct pt_regs *regs, sigset_t *oldset)
+void do_signal(struct pt_regs *regs)
 {
        unsigned long retval = 0, continue_addr = 0, restart_addr = 0;
        siginfo_t info;
        int signr;
        struct k_sigaction ka;
+       sigset_t *oldset;
 
        /*
         * We want the common case to go fast, which
@@ -460,9 +432,11 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
         * if so.
         */
        if (!user_mode(regs))
-               return 1;
+               return;
 
-       if (!oldset)
+       if (test_thread_flag(TIF_RESTORE_SIGMASK))
+               oldset = &current->saved_sigmask;
+       else
                oldset = &current->blocked;
 
        /* Are we from a system call? */
@@ -473,12 +447,14 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
 
                /* Prepare for system call restart.  We do this here so that a
                   debugger will see the already changed PSW. */
-               if (retval == -ERESTARTNOHAND ||
-                   retval == -ERESTARTSYS ||
-                   retval == -ERESTARTNOINTR) {
+               switch (retval) {
+               case -ERESTARTNOHAND:
+               case -ERESTARTSYS:
+               case -ERESTARTNOINTR:
                        regs->gprs[2] = regs->orig_gpr2;
                        regs->psw.addr = restart_addr;
-               } else if (retval == -ERESTART_RESTARTBLOCK) {
+                       break;
+               case -ERESTART_RESTARTBLOCK:
                        regs->gprs[2] = -EINTR;
                }
        }
@@ -503,17 +479,38 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
                /* Whee!  Actually deliver the signal.  */
 #ifdef CONFIG_COMPAT
                if (test_thread_flag(TIF_31BIT)) {
-                       extern void handle_signal32(unsigned long sig,
-                                                   struct k_sigaction *ka,
-                                                   siginfo_t *info,
-                                                   sigset_t *oldset,
-                                                   struct pt_regs *regs);
-                       handle_signal32(signr, &ka, &info, oldset, regs);
-                       return 1;
+                       extern int handle_signal32(unsigned long sig,
+                                                  struct k_sigaction *ka,
+                                                  siginfo_t *info,
+                                                  sigset_t *oldset,
+                                                  struct pt_regs *regs);
+                       if (handle_signal32(
+                                   signr, &ka, &info, oldset, regs) == 0) {
+                               if (test_thread_flag(TIF_RESTORE_SIGMASK))
+                                       clear_thread_flag(TIF_RESTORE_SIGMASK);
+                       }
+                       return;
                }
 #endif
-               handle_signal(signr, &ka, &info, oldset, regs);
-               return 1;
+               if (handle_signal(signr, &ka, &info, oldset, regs) == 0) {
+                       /*
+                        * A signal was successfully delivered; the saved
+                        * sigmask will have been stored in the signal frame,
+                        * and will be restored by sigreturn, so we can simply
+                        * clear the TIF_RESTORE_SIGMASK flag.
+                        */
+                       if (test_thread_flag(TIF_RESTORE_SIGMASK))
+                               clear_thread_flag(TIF_RESTORE_SIGMASK);
+               }
+               return;
+       }
+
+       /*
+        * If there's no signal to deliver, we just put the saved sigmask back.
+        */
+       if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
+               clear_thread_flag(TIF_RESTORE_SIGMASK);
+               sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
        }
 
        /* Restart a different system call. */
@@ -522,5 +519,4 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
                regs->gprs[2] = __NR_restart_syscall;
                set_thread_flag(TIF_RESTART_SVC);
        }
-       return 0;
 }
index 426d7cafdab307192219807fc565537cbfee848d..3280345efacd7c6e4c2cdd45c9f7e9b059748a13 100644 (file)
@@ -80,7 +80,7 @@ NI_SYSCALL                                                    /* old sgetmask syscall*/
 NI_SYSCALL                                                     /* old ssetmask syscall*/
 SYSCALL(sys_setreuid16,sys_ni_syscall,sys32_setreuid16_wrapper)        /* old setreuid16 syscall */
 SYSCALL(sys_setregid16,sys_ni_syscall,sys32_setregid16_wrapper)        /* old setregid16 syscall */
-SYSCALL(sys_sigsuspend_glue,sys_sigsuspend_glue,sys32_sigsuspend_glue)
+SYSCALL(sys_sigsuspend,sys_sigsuspend,sys_sigsuspend_wrapper)
 SYSCALL(sys_sigpending,sys_sigpending,compat_sys_sigpending_wrapper)
 SYSCALL(sys_sethostname,sys_sethostname,sys32_sethostname_wrapper)
 SYSCALL(sys_setrlimit,sys_setrlimit,compat_sys_setrlimit_wrapper)      /* 75 */
@@ -187,7 +187,7 @@ SYSCALL(sys_rt_sigprocmask,sys_rt_sigprocmask,sys32_rt_sigprocmask_wrapper) /* 1
 SYSCALL(sys_rt_sigpending,sys_rt_sigpending,sys32_rt_sigpending_wrapper)
 SYSCALL(sys_rt_sigtimedwait,sys_rt_sigtimedwait,compat_sys_rt_sigtimedwait_wrapper)
 SYSCALL(sys_rt_sigqueueinfo,sys_rt_sigqueueinfo,sys32_rt_sigqueueinfo_wrapper)
-SYSCALL(sys_rt_sigsuspend_glue,sys_rt_sigsuspend_glue,sys32_rt_sigsuspend_glue)
+SYSCALL(sys_rt_sigsuspend,sys_rt_sigsuspend,compat_sys_rt_sigsuspend_wrapper)
 SYSCALL(sys_pread64,sys_pread64,sys32_pread64_wrapper)         /* 180 */
 SYSCALL(sys_pwrite64,sys_pwrite64,sys32_pwrite64_wrapper)
 SYSCALL(sys_chown16,sys_ni_syscall,sys32_chown16_wrapper)      /* old chown16 syscall */
@@ -293,5 +293,21 @@ SYSCALL(sys_waitid,sys_waitid,compat_sys_waitid_wrapper)
 SYSCALL(sys_ioprio_set,sys_ioprio_set,sys_ioprio_set_wrapper)
 SYSCALL(sys_ioprio_get,sys_ioprio_get,sys_ioprio_get_wrapper)
 SYSCALL(sys_inotify_init,sys_inotify_init,sys_inotify_init)
-SYSCALL(sys_inotify_add_watch,sys_inotify_add_watch,sys_inotify_add_watch_wrapper)
+SYSCALL(sys_inotify_add_watch,sys_inotify_add_watch,sys_inotify_add_watch_wrapper)     /* 285 */
 SYSCALL(sys_inotify_rm_watch,sys_inotify_rm_watch,sys_inotify_rm_watch_wrapper)
+NI_SYSCALL                                                     /* 287 sys_migrate_pages */
+SYSCALL(sys_openat,sys_openat,compat_sys_openat_wrapper)
+SYSCALL(sys_mkdirat,sys_mkdirat,sys_mkdirat_wrapper)
+SYSCALL(sys_mknodat,sys_mknodat,sys_mknodat_wrapper)   /* 290 */
+SYSCALL(sys_fchownat,sys_fchownat,sys_fchownat_wrapper)
+SYSCALL(sys_futimesat,sys_futimesat,compat_sys_futimesat_wrapper)
+SYSCALL(sys_newfstatat,sys_newfstatat,compat_sys_newfstatat_wrapper)
+SYSCALL(sys_unlinkat,sys_unlinkat,sys_unlinkat_wrapper)
+SYSCALL(sys_renameat,sys_renameat,sys_renameat_wrapper)        /* 295 */
+SYSCALL(sys_linkat,sys_linkat,sys_linkat_wrapper)
+SYSCALL(sys_symlinkat,sys_symlinkat,sys_symlinkat_wrapper)
+SYSCALL(sys_readlinkat,sys_readlinkat,sys_readlinkat_wrapper)
+SYSCALL(sys_fchmodat,sys_fchmodat,sys_fchmodat_wrapper)
+SYSCALL(sys_faccessat,sys_faccessat,sys_faccessat_wrapper)     /* 300 */
+SYSCALL(sys_pselect6,sys_pselect6,compat_sys_pselect6_wrapper)
+SYSCALL(sys_ppoll,sys_ppoll,compat_sys_ppoll_wrapper)
index 7c0fe152a111f394b6310a6fbd535615388372fd..fea043b69b913953c95d5c9ab97307d26e0083c5 100644 (file)
@@ -61,9 +61,18 @@ extern unsigned long wall_jiffies;
  */
 unsigned long long sched_clock(void)
 {
-       return ((get_clock() - jiffies_timer_cc) * 1000) >> 12;
+       return ((get_clock() - jiffies_timer_cc) * 125) >> 9;
 }
 
+/*
+ * Monotonic_clock - returns # of nanoseconds passed since time_init()
+ */
+unsigned long long monotonic_clock(void)
+{
+       return sched_clock();
+}
+EXPORT_SYMBOL(monotonic_clock);
+
 void tod_to_timeval(__u64 todval, struct timespec *xtime)
 {
        unsigned long long sec;
index f20b51ff1d86ee24b9c65a098781d58d0c688387..e05d087a6eae3b0d5d8cb2cadb3d0c3aa719de17 100644 (file)
@@ -6,4 +6,4 @@ EXTRA_AFLAGS := -traditional
 
 lib-y += delay.o string.o
 lib-y += $(if $(CONFIG_64BIT),uaccess64.o,uaccess.o)
-lib-$(CONFIG_SMP) += spinlock.o
\ No newline at end of file
+lib-$(CONFIG_SMP) += spinlock.o
index 01bc7d589afe5afd4d43c0734548c89488f6aa85..504d56f8ca7fce9a674a8b8875714b446c7cb338 100644 (file)
@@ -396,14 +396,8 @@ source "arch/sh/boards/renesas/hs7751rvoip/Kconfig"
 
 source "arch/sh/boards/renesas/rts7751r2d/Kconfig"
 
-config SH_PCLK_FREQ_BOOL
-       bool "Set default pclk frequency"
-       default y if !SH_RTC
-       default n
-
 config SH_PCLK_FREQ
        int "Peripheral clock frequency (in Hz)"
-       depends on SH_PCLK_FREQ_BOOL
        default "50000000" if CPU_SUBTYPE_SH7750 || CPU_SUBTYPE_SH7780
        default "60000000" if CPU_SUBTYPE_SH7751
        default "33333333" if CPU_SUBTYPE_SH7300 || CPU_SUBTYPE_SH7770 || CPU_SUBTYPE_SH7760
index fe83b2c030764795742ee213866c78b87ca59c7c..1ed7f880b8c722142deb87cbdbb7be501c0caf94 100644 (file)
@@ -16,7 +16,7 @@
 #include <linux/pci.h>
 #include <linux/wait.h>
 #include <asm/io.h>
-#include <asm/mach/io.h>
+#include <asm/microdev.h>
 
        /*
         *      we need to have a 'safe' address to re-direct all I/O requests
 #define        IO_ISP1161_PHYS         0xa7700000ul    /* Physical address of Philips ISP1161x USB chip */
 #define        IO_SUPERIO_PHYS         0xa7800000ul    /* Physical address of SMSC FDC37C93xAPM SuperIO chip */
 
-#define PORT2ADDR(x) (microdev_isa_port2addr(x))
+/*
+ * map I/O ports to memory-mapped addresses
+ */
+static unsigned long microdev_isa_port2addr(unsigned long offset)
+{
+       unsigned long result;
+
+       if ((offset >= IO_LAN91C111_BASE) &&
+           (offset <  IO_LAN91C111_BASE + IO_LAN91C111_EXTENT)) {
+                       /*
+                        *      SMSC LAN91C111 Ethernet chip
+                        */
+               result = IO_LAN91C111_PHYS + offset - IO_LAN91C111_BASE;
+       } else if ((offset >= IO_SUPERIO_BASE) &&
+                  (offset <  IO_SUPERIO_BASE + IO_SUPERIO_EXTENT)) {
+                       /*
+                        *      SMSC FDC37C93xAPM SuperIO chip
+                        *
+                        *      Configuration Registers
+                        */
+               result = IO_SUPERIO_PHYS + (offset << 1);
+#if 0
+       } else if (offset == KBD_DATA_REG || offset == KBD_CNTL_REG ||
+                  offset == KBD_STATUS_REG) {
+                       /*
+                        *      SMSC FDC37C93xAPM SuperIO chip
+                        *
+                        *      PS/2 Keyboard + Mouse (ports 0x60 and 0x64).
+                        */
+               result = IO_SUPERIO_PHYS + (offset << 1);
+#endif
+       } else if (((offset >= IO_IDE1_BASE) &&
+                   (offset <  IO_IDE1_BASE + IO_IDE_EXTENT)) ||
+                   (offset == IO_IDE1_MISC)) {
+                       /*
+                        *      SMSC FDC37C93xAPM SuperIO chip
+                        *
+                        *      IDE #1
+                        */
+               result = IO_SUPERIO_PHYS + (offset << 1);
+       } else if (((offset >= IO_IDE2_BASE) &&
+                   (offset <  IO_IDE2_BASE + IO_IDE_EXTENT)) ||
+                   (offset == IO_IDE2_MISC)) {
+                       /*
+                        *      SMSC FDC37C93xAPM SuperIO chip
+                        *
+                        *      IDE #2
+                        */
+               result = IO_SUPERIO_PHYS + (offset << 1);
+       } else if ((offset >= IO_SERIAL1_BASE) &&
+                  (offset <  IO_SERIAL1_BASE + IO_SERIAL_EXTENT)) {
+                       /*
+                        *      SMSC FDC37C93xAPM SuperIO chip
+                        *
+                        *      Serial #1
+                        */
+               result = IO_SUPERIO_PHYS + (offset << 1);
+       } else if ((offset >= IO_SERIAL2_BASE) &&
+                  (offset <  IO_SERIAL2_BASE + IO_SERIAL_EXTENT)) {
+                       /*
+                        *      SMSC FDC37C93xAPM SuperIO chip
+                        *
+                        *      Serial #2
+                        */
+               result = IO_SUPERIO_PHYS + (offset << 1);
+       } else if ((offset >= IO_ISP1161_BASE) &&
+                  (offset < IO_ISP1161_BASE + IO_ISP1161_EXTENT)) {
+                       /*
+                        *      Philips USB ISP1161x chip
+                        */
+               result = IO_ISP1161_PHYS + offset - IO_ISP1161_BASE;
+       } else {
+                       /*
+                        *      safe default.
+                        */
+               printk("Warning: unexpected port in %s( offset = 0x%lx )\n",
+                      __FUNCTION__, offset);
+               result = PVR;
+       }
+
+       return result;
+}
 
+#define PORT2ADDR(x) (microdev_isa_port2addr(x))
 
 static inline void delay(void)
 {
@@ -94,6 +176,17 @@ unsigned int microdev_inl(unsigned long port)
        return *(volatile unsigned int*)PORT2ADDR(port);
 }
 
+void microdev_outw(unsigned short b, unsigned long port)
+{
+#ifdef CONFIG_PCI
+       if (port >= PCIBIOS_MIN_IO) {
+               microdev_pci_outw(b, port);
+               return;
+       }
+#endif
+       *(volatile unsigned short*)PORT2ADDR(port) = b;
+}
+
 void microdev_outb(unsigned char b, unsigned long port)
 {
 #ifdef CONFIG_PCI
@@ -158,17 +251,6 @@ void microdev_outb(unsigned char b, unsigned long port)
        }
 }
 
-void microdev_outw(unsigned short b, unsigned long port)
-{
-#ifdef CONFIG_PCI
-       if (port >= PCIBIOS_MIN_IO) {
-               microdev_pci_outw(b, port);
-               return;
-       }
-#endif
-       *(volatile unsigned short*)PORT2ADDR(port) = b;
-}
-
 void microdev_outl(unsigned int b, unsigned long port)
 {
 #ifdef CONFIG_PCI
@@ -284,87 +366,3 @@ void microdev_outsl(unsigned long port, const void *buffer, unsigned long count)
        while (count--)
                *port_addr = *buf++;
 }
-
-/*
- * map I/O ports to memory-mapped addresses
- */
-unsigned long microdev_isa_port2addr(unsigned long offset)
-{
-       unsigned long result;
-
-       if ((offset >= IO_LAN91C111_BASE) &&
-           (offset <  IO_LAN91C111_BASE + IO_LAN91C111_EXTENT)) {
-                       /*
-                        *      SMSC LAN91C111 Ethernet chip
-                        */
-               result = IO_LAN91C111_PHYS + offset - IO_LAN91C111_BASE;
-       } else if ((offset >= IO_SUPERIO_BASE) &&
-                  (offset <  IO_SUPERIO_BASE + IO_SUPERIO_EXTENT)) {
-                       /*
-                        *      SMSC FDC37C93xAPM SuperIO chip
-                        *
-                        *      Configuration Registers
-                        */
-               result = IO_SUPERIO_PHYS + (offset << 1);
-#if 0
-       } else if (offset == KBD_DATA_REG || offset == KBD_CNTL_REG ||
-                  offset == KBD_STATUS_REG) {
-                       /*
-                        *      SMSC FDC37C93xAPM SuperIO chip
-                        *
-                        *      PS/2 Keyboard + Mouse (ports 0x60 and 0x64).
-                        */
-               result = IO_SUPERIO_PHYS + (offset << 1);
-#endif
-       } else if (((offset >= IO_IDE1_BASE) &&
-                   (offset <  IO_IDE1_BASE + IO_IDE_EXTENT)) ||
-                   (offset == IO_IDE1_MISC)) {
-                       /*
-                        *      SMSC FDC37C93xAPM SuperIO chip
-                        *
-                        *      IDE #1
-                        */
-               result = IO_SUPERIO_PHYS + (offset << 1);
-       } else if (((offset >= IO_IDE2_BASE) &&
-                   (offset <  IO_IDE2_BASE + IO_IDE_EXTENT)) ||
-                   (offset == IO_IDE2_MISC)) {
-                       /*
-                        *      SMSC FDC37C93xAPM SuperIO chip
-                        *
-                        *      IDE #2
-                        */
-               result = IO_SUPERIO_PHYS + (offset << 1);
-       } else if ((offset >= IO_SERIAL1_BASE) &&
-                  (offset <  IO_SERIAL1_BASE + IO_SERIAL_EXTENT)) {
-                       /*
-                        *      SMSC FDC37C93xAPM SuperIO chip
-                        *
-                        *      Serial #1
-                        */
-               result = IO_SUPERIO_PHYS + (offset << 1);
-       } else if ((offset >= IO_SERIAL2_BASE) &&
-                  (offset <  IO_SERIAL2_BASE + IO_SERIAL_EXTENT)) {
-                       /*
-                        *      SMSC FDC37C93xAPM SuperIO chip
-                        *
-                        *      Serial #2
-                        */
-               result = IO_SUPERIO_PHYS + (offset << 1);
-       } else if ((offset >= IO_ISP1161_BASE) &&
-                  (offset < IO_ISP1161_BASE + IO_ISP1161_EXTENT)) {
-                       /*
-                        *      Philips USB ISP1161x chip
-                        */
-               result = IO_ISP1161_PHYS + offset - IO_ISP1161_BASE;
-       } else {
-                       /*
-                        *      safe default.
-                        */
-               printk("Warning: unexpected port in %s( offset = 0x%lx )\n",
-                      __FUNCTION__, offset);
-               result = PVR;
-       }
-
-       return result;
-}
-
index 1395c1e65da4546948548918473108d42ff0b4f6..efcbd86b7cd2ff0c546671aaa318916f3ba15def 100644 (file)
@@ -15,7 +15,7 @@
 
 #include <asm/system.h>
 #include <asm/io.h>
-#include <asm/mach/irq.h>
+#include <asm/microdev.h>
 
 #define NUM_EXTERNAL_IRQS 16   /* IRL0 .. IRL15 */
 
index 1c1d65fb12df8cd1b5266ee4e7554d586af441bd..892b14d31405f10809f0d8d734b1c09e8923bea6 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com)
  * Copyright (C) 2003, 2004 SuperH, Inc.
- * Copyright (C) 2004 Paul Mundt
+ * Copyright (C) 2004, 2005 Paul Mundt
  *
  * SuperH SH4-202 MicroDev board support.
  *
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/ioport.h>
+#include <video/s1d13xxxfb.h>
+#include <asm/microdev.h>
 #include <asm/io.h>
-#include <asm/mach/irq.h>
-#include <asm/mach/io.h>
 #include <asm/machvec.h>
-#include <asm/machvec_init.h>
 
 extern void microdev_heartbeat(void);
 
@@ -51,8 +50,6 @@ struct sh_machine_vector mv_sh4202_microdev __initmv = {
        .mv_outsw               = microdev_outsw,
        .mv_outsl               = microdev_outsl,
 
-       .mv_isa_port2addr       = microdev_isa_port2addr,
-
        .mv_init_irq            = init_microdev_irq,
 
 #ifdef CONFIG_HEARTBEAT
@@ -142,16 +139,161 @@ static struct platform_device smc91x_device = {
        .resource       = smc91x_resources,
 };
 
-static int __init smc91x_setup(void)
+#ifdef CONFIG_FB_S1D13XXX
+static struct s1d13xxxfb_regval s1d13806_initregs[] = {
+       { S1DREG_MISC,                  0x00 },
+       { S1DREG_COM_DISP_MODE,         0x00 },
+       { S1DREG_GPIO_CNF0,             0x00 },
+       { S1DREG_GPIO_CNF1,             0x00 },
+       { S1DREG_GPIO_CTL0,             0x00 },
+       { S1DREG_GPIO_CTL1,             0x00 },
+       { S1DREG_CLK_CNF,               0x02 },
+       { S1DREG_LCD_CLK_CNF,           0x01 },
+       { S1DREG_CRT_CLK_CNF,           0x03 },
+       { S1DREG_MPLUG_CLK_CNF,         0x03 },
+       { S1DREG_CPU2MEM_WST_SEL,       0x02 },
+       { S1DREG_SDRAM_REF_RATE,        0x03 },
+       { S1DREG_SDRAM_TC0,             0x00 },
+       { S1DREG_SDRAM_TC1,             0x01 },
+       { S1DREG_MEM_CNF,               0x80 },
+       { S1DREG_PANEL_TYPE,            0x25 },
+       { S1DREG_MOD_RATE,              0x00 },
+       { S1DREG_LCD_DISP_HWIDTH,       0x63 },
+       { S1DREG_LCD_NDISP_HPER,        0x1e },
+       { S1DREG_TFT_FPLINE_START,      0x06 },
+       { S1DREG_TFT_FPLINE_PWIDTH,     0x03 },
+       { S1DREG_LCD_DISP_VHEIGHT0,     0x57 },
+       { S1DREG_LCD_DISP_VHEIGHT1,     0x02 },
+       { S1DREG_LCD_NDISP_VPER,        0x00 },
+       { S1DREG_TFT_FPFRAME_START,     0x0a },
+       { S1DREG_TFT_FPFRAME_PWIDTH,    0x81 },
+       { S1DREG_LCD_DISP_MODE,         0x03 },
+       { S1DREG_LCD_MISC,              0x00 },
+       { S1DREG_LCD_DISP_START0,       0x00 },
+       { S1DREG_LCD_DISP_START1,       0x00 },
+       { S1DREG_LCD_DISP_START2,       0x00 },
+       { S1DREG_LCD_MEM_OFF0,          0x90 },
+       { S1DREG_LCD_MEM_OFF1,          0x01 },
+       { S1DREG_LCD_PIX_PAN,           0x00 },
+       { S1DREG_LCD_DISP_FIFO_HTC,     0x00 },
+       { S1DREG_LCD_DISP_FIFO_LTC,     0x00 },
+       { S1DREG_CRT_DISP_HWIDTH,       0x63 },
+       { S1DREG_CRT_NDISP_HPER,        0x1f },
+       { S1DREG_CRT_HRTC_START,        0x04 },
+       { S1DREG_CRT_HRTC_PWIDTH,       0x8f },
+       { S1DREG_CRT_DISP_VHEIGHT0,     0x57 },
+       { S1DREG_CRT_DISP_VHEIGHT1,     0x02 },
+       { S1DREG_CRT_NDISP_VPER,        0x1b },
+       { S1DREG_CRT_VRTC_START,        0x00 },
+       { S1DREG_CRT_VRTC_PWIDTH,       0x83 },
+       { S1DREG_TV_OUT_CTL,            0x10 },
+       { S1DREG_CRT_DISP_MODE,         0x05 },
+       { S1DREG_CRT_DISP_START0,       0x00 },
+       { S1DREG_CRT_DISP_START1,       0x00 },
+       { S1DREG_CRT_DISP_START2,       0x00 },
+       { S1DREG_CRT_MEM_OFF0,          0x20 },
+       { S1DREG_CRT_MEM_OFF1,          0x03 },
+       { S1DREG_CRT_PIX_PAN,           0x00 },
+       { S1DREG_CRT_DISP_FIFO_HTC,     0x00 },
+       { S1DREG_CRT_DISP_FIFO_LTC,     0x00 },
+       { S1DREG_LCD_CUR_CTL,           0x00 },
+       { S1DREG_LCD_CUR_START,         0x01 },
+       { S1DREG_LCD_CUR_XPOS0,         0x00 },
+       { S1DREG_LCD_CUR_XPOS1,         0x00 },
+       { S1DREG_LCD_CUR_YPOS0,         0x00 },
+       { S1DREG_LCD_CUR_YPOS1,         0x00 },
+       { S1DREG_LCD_CUR_BCTL0,         0x00 },
+       { S1DREG_LCD_CUR_GCTL0,         0x00 },
+       { S1DREG_LCD_CUR_RCTL0,         0x00 },
+       { S1DREG_LCD_CUR_BCTL1,         0x1f },
+       { S1DREG_LCD_CUR_GCTL1,         0x3f },
+       { S1DREG_LCD_CUR_RCTL1,         0x1f },
+       { S1DREG_LCD_CUR_FIFO_HTC,      0x00 },
+       { S1DREG_CRT_CUR_CTL,           0x00 },
+       { S1DREG_CRT_CUR_START,         0x01 },
+       { S1DREG_CRT_CUR_XPOS0,         0x00 },
+       { S1DREG_CRT_CUR_XPOS1,         0x00 },
+       { S1DREG_CRT_CUR_YPOS0,         0x00 },
+       { S1DREG_CRT_CUR_YPOS1,         0x00 },
+       { S1DREG_CRT_CUR_BCTL0,         0x00 },
+       { S1DREG_CRT_CUR_GCTL0,         0x00 },
+       { S1DREG_CRT_CUR_RCTL0,         0x00 },
+       { S1DREG_CRT_CUR_BCTL1,         0x1f },
+       { S1DREG_CRT_CUR_GCTL1,         0x3f },
+       { S1DREG_CRT_CUR_RCTL1,         0x1f },
+       { S1DREG_CRT_CUR_FIFO_HTC,      0x00 },
+       { S1DREG_BBLT_CTL0,             0x00 },
+       { S1DREG_BBLT_CTL1,             0x00 },
+       { S1DREG_BBLT_CC_EXP,           0x00 },
+       { S1DREG_BBLT_OP,               0x00 },
+       { S1DREG_BBLT_SRC_START0,       0x00 },
+       { S1DREG_BBLT_SRC_START1,       0x00 },
+       { S1DREG_BBLT_SRC_START2,       0x00 },
+       { S1DREG_BBLT_DST_START0,       0x00 },
+       { S1DREG_BBLT_DST_START1,       0x00 },
+       { S1DREG_BBLT_DST_START2,       0x00 },
+       { S1DREG_BBLT_MEM_OFF0,         0x00 },
+       { S1DREG_BBLT_MEM_OFF1,         0x00 },
+       { S1DREG_BBLT_WIDTH0,           0x00 },
+       { S1DREG_BBLT_WIDTH1,           0x00 },
+       { S1DREG_BBLT_HEIGHT0,          0x00 },
+       { S1DREG_BBLT_HEIGHT1,          0x00 },
+       { S1DREG_BBLT_BGC0,             0x00 },
+       { S1DREG_BBLT_BGC1,             0x00 },
+       { S1DREG_BBLT_FGC0,             0x00 },
+       { S1DREG_BBLT_FGC1,             0x00 },
+       { S1DREG_LKUP_MODE,             0x00 },
+       { S1DREG_LKUP_ADDR,             0x00 },
+       { S1DREG_PS_CNF,                0x10 },
+       { S1DREG_PS_STATUS,             0x00 },
+       { S1DREG_CPU2MEM_WDOGT,         0x00 },
+       { S1DREG_COM_DISP_MODE,         0x02 },
+};
+
+static struct s1d13xxxfb_pdata s1d13806_platform_data = {
+       .initregs       = s1d13806_initregs,
+       .initregssize   = ARRAY_SIZE(s1d13806_initregs),
+};
+
+static struct resource s1d13806_resources[] = {
+       [0] = {
+               .start          = 0x07200000,
+               .end            = 0x07200000 + 0x00200000 - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = 0x07000000,
+               .end            = 0x07000000 + 0x00200000 - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device s1d13806_device = {
+       .name           = "s1d13806fb",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(s1d13806_resources),
+       .resource       = s1d13806_resources,
+
+       .dev = {
+               .platform_data  = &s1d13806_platform_data,
+       },
+};
+#endif
+
+static struct platform_device *microdev_devices[] __initdata = {
+       &smc91x_device,
+#ifdef CONFIG_FB_S1D13XXX
+       &s1d13806_device,
+#endif
+};
+
+static int __init microdev_devices_setup(void)
 {
-       return platform_device_register(&smc91x_device);
+       return platform_add_devices(microdev_devices, ARRAY_SIZE(microdev_devices));
 }
 
-__initcall(smc91x_setup);
+__initcall(microdev_devices_setup);
 
-       /*
-        * Initialize the board
-        */
 void __init platform_setup(void)
 {
        int * const fpgaRevisionRegister = (int*)(MICRODEV_FPGA_GP_BASE + 0x8ul);
index cffc21031e71c08968c2e82731bf5717135d2910..7d18f408b0c59820be18fd8827171c400b797dcf 100644 (file)
@@ -2,5 +2,5 @@
 # Makefile for unknown SH boards 
 #
 
-obj-y   := mach.o io.o setup.o
+obj-y   := setup.o
 
diff --git a/arch/sh/boards/unknown/io.c b/arch/sh/boards/unknown/io.c
deleted file mode 100644 (file)
index 8f3f172..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * linux/arch/sh/kernel/io_unknown.c
- *
- * Copyright (C) 2000 Stuart Menefy (stuart.menefy@st.com)
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * I/O routine for unknown hardware.
- */
-
-static unsigned int unknown_handler(void)
-{
-       return 0;
-}
-
-#define UNKNOWN_ALIAS(fn) \
-       void unknown_##fn(void) __attribute__ ((alias ("unknown_handler")));
-
-UNKNOWN_ALIAS(inb)
-UNKNOWN_ALIAS(inw)
-UNKNOWN_ALIAS(inl)
-UNKNOWN_ALIAS(outb)
-UNKNOWN_ALIAS(outw)
-UNKNOWN_ALIAS(outl)
-UNKNOWN_ALIAS(inb_p)
-UNKNOWN_ALIAS(inw_p)
-UNKNOWN_ALIAS(inl_p)
-UNKNOWN_ALIAS(outb_p)
-UNKNOWN_ALIAS(outw_p)
-UNKNOWN_ALIAS(outl_p)
-UNKNOWN_ALIAS(insb)
-UNKNOWN_ALIAS(insw)
-UNKNOWN_ALIAS(insl)
-UNKNOWN_ALIAS(outsb)
-UNKNOWN_ALIAS(outsw)
-UNKNOWN_ALIAS(outsl)
-UNKNOWN_ALIAS(readb)
-UNKNOWN_ALIAS(readw)
-UNKNOWN_ALIAS(readl)
-UNKNOWN_ALIAS(writeb)
-UNKNOWN_ALIAS(writew)
-UNKNOWN_ALIAS(writel)
-UNKNOWN_ALIAS(isa_port2addr)
-UNKNOWN_ALIAS(ioremap)
-UNKNOWN_ALIAS(iounmap)
diff --git a/arch/sh/boards/unknown/mach.c b/arch/sh/boards/unknown/mach.c
deleted file mode 100644 (file)
index ad0bcc6..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * linux/arch/sh/kernel/mach_unknown.c
- *
- * Copyright (C) 2000 Stuart Menefy (stuart.menefy@st.com)
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * Machine specific code for an unknown machine (internal peripherials only)
- */
-
-#include <linux/config.h>
-#include <linux/init.h>
-
-#include <asm/machvec.h>
-#include <asm/machvec_init.h>
-
-#include <asm/io_unknown.h>
-
-#include <asm/rtc.h>
-/*
- * The Machine Vector
- */
-
-struct sh_machine_vector mv_unknown __initmv = {
-#if defined(CONFIG_CPU_SH4)
-       .mv_nr_irqs             = 48,
-#elif defined(CONFIG_CPU_SUBTYPE_SH7708)
-       .mv_nr_irqs             = 32,
-#elif defined(CONFIG_CPU_SUBTYPE_SH7709)
-       .mv_nr_irqs             = 61,
-#endif
-
-       .mv_inb                 = unknown_inb,
-       .mv_inw                 = unknown_inw,
-       .mv_inl                 = unknown_inl,
-       .mv_outb                = unknown_outb,
-       .mv_outw                = unknown_outw,
-       .mv_outl                = unknown_outl,
-
-       .mv_inb_p               = unknown_inb_p,
-       .mv_inw_p               = unknown_inw_p,
-       .mv_inl_p               = unknown_inl_p,
-       .mv_outb_p              = unknown_outb_p,
-       .mv_outw_p              = unknown_outw_p,
-       .mv_outl_p              = unknown_outl_p,
-
-       .mv_insb                = unknown_insb,
-       .mv_insw                = unknown_insw,
-       .mv_insl                = unknown_insl,
-       .mv_outsb               = unknown_outsb,
-       .mv_outsw               = unknown_outsw,
-       .mv_outsl               = unknown_outsl,
-
-       .mv_readb               = unknown_readb,
-       .mv_readw               = unknown_readw,
-       .mv_readl               = unknown_readl,
-       .mv_writeb              = unknown_writeb,
-       .mv_writew              = unknown_writew,
-       .mv_writel              = unknown_writel,
-
-       .mv_ioremap             = unknown_ioremap,
-       .mv_iounmap             = unknown_iounmap,
-
-       .mv_isa_port2addr       = unknown_isa_port2addr,
-};
-ALIAS_MV(unknown)
index 7d772a6f88657ab7974b253b9a932fbaeb46eb48..02e84f03f45c09bae860c94ff73b96485be5dc97 100644 (file)
@@ -7,10 +7,20 @@
  * License.  See linux/COPYING for more information.
  *
  * Setup code for an unknown machine (internal peripherials only)
+ *
+ * This is the simplest of all boards, and serves only as a quick and dirty
+ * method to start debugging a new board during bring-up until proper board
+ * setup code is written.
  */
-
 #include <linux/config.h>
 #include <linux/init.h>
+#include <asm/machvec.h>
+#include <asm/irq.h>
+
+struct sh_machine_vector mv_unknown __initmv = {
+       .mv_nr_irqs             = NR_IRQS,
+};
+ALIAS_MV(unknown)
 
 const char *get_system_type(void)
 {
index 3d9a02c093a39d948d0e43ff7b0e7da17199357e..07e8b9c5a5314ed437036ca54369b9c6ef61276e 100644 (file)
@@ -15,7 +15,7 @@
 #include <linux/module.h>
 #include <linux/device.h>
 #include <asm/io.h>
-#include <asm/bus-sh.h>
+
 
 struct voya_alloc_entry {
        struct list_head list;
@@ -30,12 +30,13 @@ static LIST_HEAD(voya_alloc_list);
 #define OHCI_HCCA_SIZE 0x100
 #define OHCI_SRAM_SIZE 0x10000
 
+#define VOYAGER_OHCI_NAME      "voyager-ohci"
+
 void *voyagergx_consistent_alloc(struct device *dev, size_t size,
                                 dma_addr_t *handle, gfp_t flag)
 {
        struct list_head *list = &voya_alloc_list;
        struct voya_alloc_entry *entry;
-       struct sh_dev *shdev = to_sh_dev(dev);
        unsigned long start, end;
        unsigned long flags;
 
@@ -46,9 +47,7 @@ void *voyagergx_consistent_alloc(struct device *dev, size_t size,
         *
         * Everything else goes through consistent_alloc().
         */
-       if (!dev || dev->bus != &sh_bus_types[SH_BUS_VIRT] ||
-                  (dev->bus == &sh_bus_types[SH_BUS_VIRT] &&
-                   shdev->dev_id != SH_DEV_ID_USB_OHCI))
+       if (!dev || strcmp(dev->driver->name, VOYAGER_OHCI_NAME))
                return NULL;
 
        start = OHCI_SRAM_START + OHCI_HCCA_SIZE;
@@ -98,12 +97,9 @@ int voyagergx_consistent_free(struct device *dev, size_t size,
                              void *vaddr, dma_addr_t handle)
 {
        struct voya_alloc_entry *entry;
-       struct sh_dev *shdev = to_sh_dev(dev);
        unsigned long flags;
 
-       if (!dev || dev->bus != &sh_bus_types[SH_BUS_VIRT] ||
-                  (dev->bus == &sh_bus_types[SH_BUS_VIRT] &&
-                   shdev->dev_id != SH_DEV_ID_USB_OHCI))
+       if (!dev || strcmp(dev->driver->name, VOYAGER_OHCI_NAME))
                return -EINVAL;
 
        spin_lock_irqsave(&voya_list_lock, flags);
@@ -123,4 +119,3 @@ int voyagergx_consistent_free(struct device *dev, size_t size,
 
 EXPORT_SYMBOL(voyagergx_consistent_alloc);
 EXPORT_SYMBOL(voyagergx_consistent_free);
-
index 1b6ac523b4584e7cf5518f992cb340d293859484..2ee330b3c38f68e5b2b3113ab1ffd56aaf54427e 100644 (file)
@@ -163,7 +163,12 @@ int voyagergx_irq_demux(int irq)
        return irq;
 }
 
-static struct irqaction irq0  = { voyagergx_interrupt, SA_INTERRUPT, 0, "VOYAGERGX", NULL, NULL};
+static struct irqaction irq0  = {
+       .name           = "voyagergx",
+       .handler        = voyagergx_interrupt,
+       .flags          = SA_INTERRUPT,
+       .mask           = CPU_MASK_NONE,
+};
 
 void __init setup_voyagergx_irq(void)
 {
index a3bd280b53d6c5ef5015d38da47a154f60cd4e8d..ab3db76d1e51b5d4d6c92bf87c1ab8337889f003 100644 (file)
@@ -1,10 +1,9 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.11-sh
-# Wed Mar  2 15:09:41 2005
+# Linux kernel version: 2.6.16-rc1
+# Fri Jan 27 19:43:20 2006
 #
 CONFIG_SUPERH=y
-CONFIG_UID16=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
@@ -17,11 +16,13 @@ CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 # CONFIG_SYSVIPC is not set
 # CONFIG_POSIX_MQUEUE is not set
@@ -29,28 +30,53 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_UID16=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
 CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
 # CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
 #
 # CONFIG_MODULES is not set
 
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
 #
 # System type
 #
@@ -61,9 +87,7 @@ CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_SH_7751_SYSTEMH is not set
 # CONFIG_SH_STB1_HARP is not set
 # CONFIG_SH_STB1_OVERDRIVE is not set
-# CONFIG_SH_HP620 is not set
-# CONFIG_SH_HP680 is not set
-# CONFIG_SH_HP690 is not set
+# CONFIG_SH_HP6XX is not set
 # CONFIG_SH_CQREEK is not set
 # CONFIG_SH_DMIDA is not set
 # CONFIG_SH_EC3104 is not set
@@ -78,45 +102,94 @@ CONFIG_CC_ALIGN_JUMPS=0
 # CONFIG_SH_SECUREEDGE5410 is not set
 # CONFIG_SH_HS7751RVOIP is not set
 # CONFIG_SH_RTS7751R2D is not set
+# CONFIG_SH_R7780RP is not set
 # CONFIG_SH_EDOSK7705 is not set
 CONFIG_SH_SH4202_MICRODEV=y
+# CONFIG_SH_LANDISK is not set
+# CONFIG_SH_TITAN is not set
 # CONFIG_SH_UNKNOWN is not set
-# CONFIG_CPU_SH2 is not set
-# CONFIG_CPU_SH3 is not set
+
+#
+# Processor selection
+#
 CONFIG_CPU_SH4=y
+
+#
+# SH-2 Processor Support
+#
 # CONFIG_CPU_SUBTYPE_SH7604 is not set
+
+#
+# SH-3 Processor Support
+#
 # CONFIG_CPU_SUBTYPE_SH7300 is not set
 # CONFIG_CPU_SUBTYPE_SH7705 is not set
 # CONFIG_CPU_SUBTYPE_SH7707 is not set
 # CONFIG_CPU_SUBTYPE_SH7708 is not set
 # CONFIG_CPU_SUBTYPE_SH7709 is not set
+
+#
+# SH-4 Processor Support
+#
 # CONFIG_CPU_SUBTYPE_SH7750 is not set
+# CONFIG_CPU_SUBTYPE_SH7091 is not set
+# CONFIG_CPU_SUBTYPE_SH7750R is not set
+# CONFIG_CPU_SUBTYPE_SH7750S is not set
 # CONFIG_CPU_SUBTYPE_SH7751 is not set
+# CONFIG_CPU_SUBTYPE_SH7751R is not set
 # CONFIG_CPU_SUBTYPE_SH7760 is not set
-# CONFIG_CPU_SUBTYPE_SH73180 is not set
+CONFIG_CPU_SUBTYPE_SH4_202=y
+
+#
+# ST40 Processor Support
+#
 # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
 # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
-CONFIG_CPU_SUBTYPE_SH4_202=y
+
+#
+# SH-4A Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH73180 is not set
+# CONFIG_CPU_SUBTYPE_SH7770 is not set
+# CONFIG_CPU_SUBTYPE_SH7780 is not set
+
+#
+# Memory management options
+#
 CONFIG_MMU=y
-CONFIG_CMDLINE_BOOL=y
-CONFIG_CMDLINE="console=ttySC0,115200"
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+
+#
+# Cache configuration
+#
+# CONFIG_SH_DIRECT_MAPPED is not set
+# CONFIG_SH_WRITETHROUGH is not set
+# CONFIG_SH_OCRAM is not set
 CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x04000000
-CONFIG_MEMORY_SET=y
-# CONFIG_MEMORY_OVERRIDE is not set
+
+#
+# Processor features
+#
+CONFIG_CPU_LITTLE_ENDIAN=y
 CONFIG_SH_RTC=y
 CONFIG_SH_FPU=y
-CONFIG_ZERO_PAGE_OFFSET=0x00001000
-CONFIG_BOOT_LINK_OFFSET=0x00800000
-CONFIG_CPU_LITTLE_ENDIAN=y
-CONFIG_PREEMPT=y
-# CONFIG_UBC_WAKEUP is not set
-# CONFIG_SH_WRITETHROUGH is not set
-# CONFIG_SH_OCRAM is not set
 # CONFIG_SH_STORE_QUEUES is not set
-# CONFIG_SMP is not set
-CONFIG_SH_PCLK_CALC=y
-CONFIG_SH_PCLK_FREQ=65986048
+CONFIG_CPU_HAS_INTEVT=y
+CONFIG_CPU_HAS_SR_RB=y
+
+#
+# Timer support
+#
+CONFIG_SH_TMU=y
+CONFIG_SH_PCLK_FREQ=66000000
 
 #
 # CPU Frequency scaling
@@ -137,20 +210,31 @@ CONFIG_NR_ONCHIP_DMA_CHANNELS=4
 CONFIG_HEARTBEAT=y
 
 #
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+# Kernel features
 #
-CONFIG_ISA=y
-# CONFIG_PCI is not set
+# CONFIG_KEXEC is not set
+CONFIG_PREEMPT=y
+# CONFIG_SMP is not set
 
 #
-# PCCARD (PCMCIA/CardBus) support
+# Boot options
 #
-# CONFIG_PCCARD is not set
+CONFIG_ZERO_PAGE_OFFSET=0x00001000
+CONFIG_BOOT_LINK_OFFSET=0x00800000
+# CONFIG_UBC_WAKEUP is not set
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE="console=ttySC0,115200"
 
 #
-# PC-card bridges
+# Bus options
 #
-CONFIG_PCMCIA_PROBE=y
+# CONFIG_SUPERHYWAY is not set
+# CONFIG_PCI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
 
 #
 # PCI Hotplug Support
@@ -164,9 +248,79 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
 #
-# SH initrd options
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+# CONFIG_UNIX is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_BIC=y
+# CONFIG_IPV6 is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
 #
-# CONFIG_EMBEDDED_RAMDISK is not set
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
 
 #
 # Device Drivers
@@ -179,6 +333,11 @@ CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_FW_LOADER is not set
 
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
 #
 # Memory Technology Devices (MTD)
 #
@@ -192,13 +351,10 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # Plug and Play support
 #
-# CONFIG_PNP is not set
 
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_XD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
@@ -206,17 +362,7 @@ CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_LBD is not set
 # CONFIG_CDROM_PKTCDVD is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
 # CONFIG_ATA_OVER_ETH is not set
 
 #
@@ -241,9 +387,7 @@ CONFIG_BLK_DEV_IDECD=y
 # IDE chipset support/bugfixes
 #
 CONFIG_IDE_GENERIC=y
-CONFIG_IDE_SH=y
 # CONFIG_IDE_ARM is not set
-# CONFIG_IDE_CHIPSETS is not set
 # CONFIG_BLK_DEV_IDEDMA is not set
 # CONFIG_IDEDMA_AUTO is not set
 # CONFIG_BLK_DEV_HD is not set
@@ -251,13 +395,9 @@ CONFIG_IDE_SH=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
 
-#
-# Old CD-ROM drivers (not SCSI, not IDE)
-#
-# CONFIG_CD_NO_IDESCSI is not set
-
 #
 # Multi-device support (RAID and LVM)
 #
@@ -266,6 +406,7 @@ CONFIG_IDE_SH=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -276,69 +417,8 @@ CONFIG_IDE_SH=y
 #
 
 #
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_PACKET is not set
-# CONFIG_NETLINK_DEV is not set
-# CONFIG_UNIX is not set
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-# CONFIG_IP_PNP_BOOTP is not set
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_TUNNEL is not set
-CONFIG_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_DECNET is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
+# Network device support
 #
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
@@ -346,9 +426,9 @@ CONFIG_NETDEVICES=y
 # CONFIG_TUN is not set
 
 #
-# ARCnet devices
+# PHY device support
 #
-# CONFIG_ARCNET is not set
+# CONFIG_PHYLIB is not set
 
 #
 # Ethernet (10 or 100Mbit)
@@ -356,17 +436,7 @@ CONFIG_NETDEVICES=y
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_STNIC is not set
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_LANCE is not set
-# CONFIG_NET_VENDOR_SMC is not set
 CONFIG_SMC91X=y
-# CONFIG_NET_VENDOR_RACAL is not set
-# CONFIG_AT1700 is not set
-# CONFIG_DEPCA is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_ISA is not set
-# CONFIG_NET_PCI is not set
-# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -379,7 +449,6 @@ CONFIG_SMC91X=y
 #
 # Token Ring devices
 #
-# CONFIG_TR is not set
 
 #
 # Wireless LAN (non-hamradio)
@@ -394,6 +463,8 @@ CONFIG_SMC91X=y
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
 # CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
@@ -411,20 +482,10 @@ CONFIG_SMC91X=y
 # CONFIG_INPUT is not set
 
 #
-# Userland interfaces
-#
-
-#
-# Input I/O drivers
+# Hardware I/O ports
 #
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 # CONFIG_SERIO is not set
-# CONFIG_SERIO_I8042 is not set
-
-#
-# Input Device Drivers
-#
+# CONFIG_GAMEPORT is not set
 
 #
 # Character devices
@@ -464,23 +525,45 @@ CONFIG_RTC=y
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
 
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
 #
 # Misc devices
 #
 
+#
+# Multimedia Capabilities Port drivers
+#
+
 #
 # Multimedia devices
 #
@@ -508,7 +591,7 @@ CONFIG_RTC=y
 # CONFIG_USB_ARCH_HAS_OHCI is not set
 
 #
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
 #
 
 #
@@ -524,13 +607,21 @@ CONFIG_RTC=y
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# SN Devices
+#
+
+#
+# EDAC - error detection and reporting (RAS)
+#
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
 CONFIG_EXT3_FS=y
 CONFIG_EXT3_FS_XATTR=y
 # CONFIG_EXT3_FS_POSIX_ACL is not set
@@ -540,17 +631,17 @@ CONFIG_JBD=y
 CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -574,16 +665,12 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-CONFIG_DEVPTS_FS_XATTR=y
-# CONFIG_DEVPTS_FS_SECURITY is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
 # CONFIG_HUGETLBFS is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_RELAYFS_FS is not set
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -607,12 +694,14 @@ CONFIG_RAMFS=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 CONFIG_NFS_V4=y
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 CONFIG_SUNRPC_GSS=y
 CONFIG_RPCSEC_GSS_KRB5=y
@@ -622,6 +711,7 @@ CONFIG_RPCSEC_GSS_KRB5=y
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
 
 #
 # Partition Types
@@ -681,8 +771,10 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Kernel hacking
 #
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_MAGIC_SYSRQ is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_DEBUG_PREEMPT=y
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_FRAME_POINTER is not set
 # CONFIG_SH_STANDARD_BIOS is not set
 # CONFIG_EARLY_SCIF_CONSOLE is not set
@@ -706,6 +798,7 @@ CONFIG_CRYPTO_MD5=y
 # CONFIG_CRYPTO_SHA256 is not set
 # CONFIG_CRYPTO_SHA512 is not set
 # CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
 CONFIG_CRYPTO_DES=y
 # CONFIG_CRYPTO_BLOWFISH is not set
 # CONFIG_CRYPTO_TWOFISH is not set
@@ -730,5 +823,6 @@ CONFIG_CRYPTO_DES=y
 # Library routines
 #
 # CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
index 7a86eeb226558829eef4cb0c67660e281e2e0d48..f05cd96f8867a5647b0adace1e3141bc1b38e405 100644 (file)
@@ -8,7 +8,7 @@ obj-y   := process.o signal.o entry.o traps.o irq.o \
        ptrace.o setup.o time.o sys_sh.o semaphore.o \
        io.o io_generic.o sh_ksyms.o
 
-obj-y                          += cpu/
+obj-y                          += cpu/ timers/
 
 obj-$(CONFIG_SMP)              += smp.o
 obj-$(CONFIG_CF_ENABLER)       += cf-enabler.o
index 5bfc33bec5d038a8471f3c2e0419e7730b509f88..59d5b748752fee2f271889b9150923d276763249 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the Linux/SuperH CPU-specifc backends.
 #
 
-obj-y  += irq/ init.o bus.o clock.o
+obj-y  += irq/ init.o clock.o
 
 obj-$(CONFIG_CPU_SH2)          += sh2/
 obj-$(CONFIG_CPU_SH3)          += sh3/
diff --git a/arch/sh/kernel/cpu/bus.c b/arch/sh/kernel/cpu/bus.c
deleted file mode 100644 (file)
index fc6c4bd..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * arch/sh/kernel/cpu/bus.c
- *
- * Virtual bus for SuperH.
- *
- * Copyright (C) 2004 Paul Mundt
- *
- * Shamelessly cloned from arch/arm/mach-omap/bus.c, which was written
- * by:
- *
- *     Copyright (C) 2003 - 2004 Nokia Corporation
- *     Written by Tony Lindgren <tony@atomide.com>
- *     Portions of code based on sa1111.c.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-#include <linux/kernel.h>
-#include <linux/device.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <asm/bus-sh.h>
-
-static int sh_bus_match(struct device *dev, struct device_driver *drv)
-{
-       struct sh_driver *shdrv = to_sh_driver(drv);
-       struct sh_dev *shdev = to_sh_dev(dev);
-
-       return shdev->dev_id == shdrv->dev_id;
-}
-
-static int sh_bus_suspend(struct device *dev, pm_message_t state)
-{
-       struct sh_dev *shdev = to_sh_dev(dev);
-       struct sh_driver *shdrv = to_sh_driver(dev->driver);
-
-       if (shdrv && shdrv->suspend)
-               return shdrv->suspend(shdev, state);
-
-       return 0;
-}
-
-static int sh_bus_resume(struct device *dev)
-{
-       struct sh_dev *shdev = to_sh_dev(dev);
-       struct sh_driver *shdrv = to_sh_driver(dev->driver);
-
-       if (shdrv && shdrv->resume)
-               return shdrv->resume(shdev);
-
-       return 0;
-}
-
-static int sh_device_probe(struct device *dev)
-{
-       struct sh_dev *shdev = to_sh_dev(dev);
-       struct sh_driver *shdrv = to_sh_driver(dev->driver);
-
-       if (shdrv && shdrv->probe)
-               return shdrv->probe(shdev);
-
-       return -ENODEV;
-}
-
-static int sh_device_remove(struct device *dev)
-{
-       struct sh_dev *shdev = to_sh_dev(dev);
-       struct sh_driver *shdrv = to_sh_driver(dev->driver);
-
-       if (shdrv && shdrv->remove)
-               return shdrv->remove(shdev);
-
-       return 0;
-}
-
-static struct device sh_bus_devices[SH_NR_BUSES] = {
-       {
-               .bus_id         = SH_BUS_NAME_VIRT,
-       },
-};
-
-struct bus_type sh_bus_types[SH_NR_BUSES] = {
-       {
-               .name           = SH_BUS_NAME_VIRT,
-               .match          = sh_bus_match,
-               .probe          = sh_bus_probe,
-               .remove         = sh_bus_remove,
-               .suspend        = sh_bus_suspend,
-               .resume         = sh_bus_resume,
-       },
-};
-
-int sh_device_register(struct sh_dev *dev)
-{
-       if (!dev)
-               return -EINVAL;
-
-       if (dev->bus_id < 0 || dev->bus_id >= SH_NR_BUSES) {
-               printk(KERN_ERR "%s: bus_id invalid: %s bus: %d\n",
-                      __FUNCTION__, dev->name, dev->bus_id);
-               return -EINVAL;
-       }
-
-       dev->dev.parent = &sh_bus_devices[dev->bus_id];
-       dev->dev.bus    = &sh_bus_types[dev->bus_id];
-
-       /* This is needed for USB OHCI to work */
-       if (dev->dma_mask)
-               dev->dev.dma_mask = dev->dma_mask;
-       if (dev->coherent_dma_mask)
-               dev->dev.coherent_dma_mask = dev->coherent_dma_mask;
-
-       snprintf(dev->dev.bus_id, BUS_ID_SIZE, "%s%u",
-                dev->name, dev->dev_id);
-
-       printk(KERN_INFO "Registering SH device '%s'. Parent at %s\n",
-              dev->dev.bus_id, dev->dev.parent->bus_id);
-
-       return device_register(&dev->dev);
-}
-
-void sh_device_unregister(struct sh_dev *dev)
-{
-       device_unregister(&dev->dev);
-}
-
-int sh_driver_register(struct sh_driver *drv)
-{
-       if (!drv)
-               return -EINVAL;
-
-       if (drv->bus_id < 0 || drv->bus_id >= SH_NR_BUSES) {
-               printk(KERN_ERR "%s: bus_id invalid: bus: %d device %d\n",
-                      __FUNCTION__, drv->bus_id, drv->dev_id);
-               return -EINVAL;
-       }
-
-       drv->drv.bus    = &sh_bus_types[drv->bus_id];
-
-       return driver_register(&drv->drv);
-}
-
-void sh_driver_unregister(struct sh_driver *drv)
-{
-       driver_unregister(&drv->drv);
-}
-
-static int __init sh_bus_init(void)
-{
-       int i, ret = 0;
-
-       for (i = 0; i < SH_NR_BUSES; i++) {
-               ret = device_register(&sh_bus_devices[i]);
-               if (ret != 0) {
-                       printk(KERN_ERR "Unable to register bus device %s\n",
-                              sh_bus_devices[i].bus_id);
-                       continue;
-               }
-
-               ret = bus_register(&sh_bus_types[i]);
-               if (ret != 0) {
-                       printk(KERN_ERR "Unable to register bus %s\n",
-                              sh_bus_types[i].name);
-                       device_unregister(&sh_bus_devices[i]);
-               }
-       }
-
-       printk(KERN_INFO "SH Virtual Bus initialized\n");
-
-       return ret;
-}
-
-static void __exit sh_bus_exit(void)
-{
-       int i;
-
-       for (i = 0; i < SH_NR_BUSES; i++) {
-               bus_unregister(&sh_bus_types[i]);
-               device_unregister(&sh_bus_devices[i]);
-       }
-}
-
-module_init(sh_bus_init);
-module_exit(sh_bus_exit);
-
-MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
-MODULE_DESCRIPTION("SH Virtual Bus");
-MODULE_LICENSE("GPL");
-
-EXPORT_SYMBOL(sh_bus_types);
-EXPORT_SYMBOL(sh_device_register);
-EXPORT_SYMBOL(sh_device_unregister);
-EXPORT_SYMBOL(sh_driver_register);
-EXPORT_SYMBOL(sh_driver_unregister);
-
index 989e7fdd524d458d69abdb73537a606fdb9ecaea..97fa37f42b841e2bcaabbef4e07a933fad0fb73b 100644 (file)
@@ -38,9 +38,7 @@ static DECLARE_MUTEX(clock_list_sem);
 static struct clk master_clk = {
        .name           = "master_clk",
        .flags          = CLK_ALWAYS_ENABLED | CLK_RATE_PROPAGATES,
-#ifdef CONFIG_SH_PCLK_FREQ_BOOL
        .rate           = CONFIG_SH_PCLK_FREQ,
-#endif
 };
 
 static struct clk module_clk = {
@@ -227,16 +225,7 @@ int __init clk_init(void)
 {
        int i, ret = 0;
 
-       if (unlikely(!master_clk.rate))
-               /*
-                * NOTE: This will break if the default divisor has been
-                * changed.
-                *
-                * No one should be changing the default on us however,
-                * expect that a sane value for CONFIG_SH_PCLK_FREQ will
-                * be defined in the event of a different divisor.
-                */
-               master_clk.rate = get_timer_frequency() * 4;
+       BUG_ON(unlikely(!master_clk.rate));
 
        for (i = 0; i < ARRAY_SIZE(onchip_clocks); i++) {
                struct clk *clk = onchip_clocks[i];
index fdbd718ae5c69d1a83b20379effd882359bb43c1..e55150ed085619d5962e039e1ebb2a4fdc2e9b15 100644 (file)
@@ -108,8 +108,7 @@ static void end_ipr_irq(unsigned int irq)
                enable_ipr_irq(irq);
 }
 
-void make_ipr_irq(unsigned int irq, unsigned int addr, int pos,
-                 int priority, int maskpos)
+void make_ipr_irq(unsigned int irq, unsigned int addr, int pos, int priority)
 {
        disable_irq_nosync(irq);
        ipr_data[irq].addr = addr;
@@ -123,44 +122,44 @@ void make_ipr_irq(unsigned int irq, unsigned int addr, int pos,
 void __init init_IRQ(void)
 {
 #ifndef CONFIG_CPU_SUBTYPE_SH7780
-       make_ipr_irq(TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY, 0);
-       make_ipr_irq(TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY, 0);
+       make_ipr_irq(TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY);
+       make_ipr_irq(TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY);
 #if defined(CONFIG_SH_RTC)
-       make_ipr_irq(RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY, 0);
+       make_ipr_irq(RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY);
 #endif
 
 #ifdef SCI_ERI_IRQ
-       make_ipr_irq(SCI_ERI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY, 0);
-       make_ipr_irq(SCI_RXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY, 0);
-       make_ipr_irq(SCI_TXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY, 0);
+       make_ipr_irq(SCI_ERI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY);
+       make_ipr_irq(SCI_RXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY);
+       make_ipr_irq(SCI_TXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY);
 #endif
 
 #ifdef SCIF1_ERI_IRQ
-       make_ipr_irq(SCIF1_ERI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY, 0);
-       make_ipr_irq(SCIF1_RXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY, 0);
-       make_ipr_irq(SCIF1_BRI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY, 0);
-       make_ipr_irq(SCIF1_TXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY, 0);
+       make_ipr_irq(SCIF1_ERI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY);
+       make_ipr_irq(SCIF1_RXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY);
+       make_ipr_irq(SCIF1_BRI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY);
+       make_ipr_irq(SCIF1_TXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY);
 #endif
 
 #if defined(CONFIG_CPU_SUBTYPE_SH7300)
-       make_ipr_irq(SCIF0_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY, 0);
-       make_ipr_irq(DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY, 0);
-       make_ipr_irq(DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY, 0);
-       make_ipr_irq(VIO_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY, 0);
+       make_ipr_irq(SCIF0_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY);
+       make_ipr_irq(DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY);
+       make_ipr_irq(DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY);
+       make_ipr_irq(VIO_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY);
 #endif
 
 #ifdef SCIF_ERI_IRQ
-       make_ipr_irq(SCIF_ERI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY, 0);
-       make_ipr_irq(SCIF_RXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY, 0);
-       make_ipr_irq(SCIF_BRI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY, 0);
-       make_ipr_irq(SCIF_TXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY, 0);
+       make_ipr_irq(SCIF_ERI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY);
+       make_ipr_irq(SCIF_RXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY);
+       make_ipr_irq(SCIF_BRI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY);
+       make_ipr_irq(SCIF_TXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY);
 #endif
 
 #ifdef IRDA_ERI_IRQ
-       make_ipr_irq(IRDA_ERI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY, 0);
-       make_ipr_irq(IRDA_RXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY, 0);
-       make_ipr_irq(IRDA_BRI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY, 0);
-       make_ipr_irq(IRDA_TXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY, 0);
+       make_ipr_irq(IRDA_ERI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY);
+       make_ipr_irq(IRDA_RXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY);
+       make_ipr_irq(IRDA_BRI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY);
+       make_ipr_irq(IRDA_TXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY);
 #endif
 
 #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \
@@ -175,12 +174,12 @@ void __init init_IRQ(void)
         * You should set corresponding bits of PFC to "00"
         * to enable these interrupts.
         */
-       make_ipr_irq(IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, IRQ0_PRIORITY, 0);
-       make_ipr_irq(IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY, 0);
-       make_ipr_irq(IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY, 0);
-       make_ipr_irq(IRQ3_IRQ, IRQ3_IPR_ADDR, IRQ3_IPR_POS, IRQ3_PRIORITY, 0);
-       make_ipr_irq(IRQ4_IRQ, IRQ4_IPR_ADDR, IRQ4_IPR_POS, IRQ4_PRIORITY, 0);
-       make_ipr_irq(IRQ5_IRQ, IRQ5_IPR_ADDR, IRQ5_IPR_POS, IRQ5_PRIORITY, 0);
+       make_ipr_irq(IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, IRQ0_PRIORITY);
+       make_ipr_irq(IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY);
+       make_ipr_irq(IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY);
+       make_ipr_irq(IRQ3_IRQ, IRQ3_IPR_ADDR, IRQ3_IPR_POS, IRQ3_PRIORITY);
+       make_ipr_irq(IRQ4_IRQ, IRQ4_IPR_ADDR, IRQ4_IPR_POS, IRQ4_PRIORITY);
+       make_ipr_irq(IRQ5_IRQ, IRQ5_IPR_ADDR, IRQ5_IPR_POS, IRQ5_PRIORITY);
 #endif
 #endif
 
index fb6368159dd08616da71a7fa788c4d663f7968b7..a440d36ee6187e3557edc577eea2f0c6bc59f60a 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/config.h>
 #include <asm/asm-offsets.h>
 #include <asm/thread_info.h>
+#include <asm/cpu/mmu_context.h>
 #include <asm/unistd.h>
 
 #if !defined(CONFIG_NFSD) && !defined(CONFIG_NFSD_MODULE)
 ENOSYS = 38
 EINVAL = 22
 
-#if defined(CONFIG_CPU_SH3)
-TRA     = 0xffffffd0
-EXPEVT  = 0xffffffd4
-#if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \
-    defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705)
-INTEVT  = 0xa4000000           ! INTEVTE2(0xa4000000)
-#else
-INTEVT  = 0xffffffd8
-#endif
-MMU_TEA = 0xfffffffc           ! TLB Exception Address Register
-#elif defined(CONFIG_CPU_SH4)
-TRA     = 0xff000020
-EXPEVT  = 0xff000024
-INTEVT  = 0xff000028
-MMU_TEA = 0xff00000c           ! TLB Exception Address Register
-#endif
-
 #if defined(CONFIG_KGDB_NMI)
 NMI_VEC = 0x1c0                        ! Must catch early for debounce
 #endif
index a4dc2b532e10842279dc8471118a4e2d0cb75309..9fd1723e62192dd524040589677541ed2ee186e1 100644 (file)
 #include <linux/unistd.h>
 #include <linux/mm.h>
 #include <linux/elfcore.h>
-#include <linux/slab.h>
 #include <linux/a.out.h>
+#include <linux/slab.h>
+#include <linux/pm.h>
 #include <linux/ptrace.h>
 #include <linux/platform.h>
 #include <linux/kallsyms.h>
+#include <linux/kexec.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
 #include <asm/elf.h>
-#if defined(CONFIG_SH_HS7751RVOIP)
-#include <asm/hs7751rvoip/hs7751rvoip.h>
-#elif defined(CONFIG_SH_RTS7751R2D)
-#include <asm/rts7751r2d/rts7751r2d.h>
-#endif
 
 static int hlt_counter=0;
 
@@ -37,6 +34,11 @@ int ubc_usercnt = 0;
 
 #define HARD_IDLE_TIMEOUT (HZ / 3)
 
+void (*pm_idle)(void);
+
+void (*pm_power_off)(void);
+EXPORT_SYMBOL(pm_power_off);
+
 void disable_hlt(void)
 {
        hlt_counter++;
@@ -51,17 +53,25 @@ void enable_hlt(void)
 
 EXPORT_SYMBOL(enable_hlt);
 
+void default_idle(void)
+{
+       if (!hlt_counter)
+               cpu_sleep();
+       else
+               cpu_relax();
+}
+
 void cpu_idle(void)
 {
        /* endless idle loop with no priority at all */
        while (1) {
-               if (hlt_counter) {
-                       while (!need_resched())
-                               cpu_relax();
-               } else {
-                       while (!need_resched())
-                               cpu_sleep();
-               }
+               void (*idle)(void) = pm_idle;
+
+               if (!idle)
+                       idle = default_idle;
+
+               while (!need_resched())
+                       idle();
 
                preempt_enable_no_resched();
                schedule();
@@ -88,28 +98,16 @@ void machine_restart(char * __unused)
 
 void machine_halt(void)
 {
-#if defined(CONFIG_SH_HS7751RVOIP)
-       unsigned short value;
+       local_irq_disable();
 
-       value = ctrl_inw(PA_OUTPORTR);
-       ctrl_outw((value & 0xffdf), PA_OUTPORTR);
-#elif defined(CONFIG_SH_RTS7751R2D)
-       ctrl_outw(0x0001, PA_POWOFF);
-#endif
        while (1)
                cpu_sleep();
 }
 
 void machine_power_off(void)
 {
-#if defined(CONFIG_SH_HS7751RVOIP)
-       unsigned short value;
-
-       value = ctrl_inw(PA_OUTPORTR);
-       ctrl_outw((value & 0xffdf), PA_OUTPORTR);
-#elif defined(CONFIG_SH_RTS7751R2D)
-       ctrl_outw(0x0001, PA_POWOFF);
-#endif
+       if (pm_power_off)
+               pm_power_off();
 }
 
 void show_regs(struct pt_regs * regs)
index 036050b377cdd6458ae1cf1858bfb445a4aad4aa..a067a34e0b64fe2e6cd23573b2cbecd975cf5a1a 100644 (file)
 #include <linux/cpu.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
-#include <asm/io_generic.h>
 #include <asm/sections.h>
 #include <asm/irq.h>
 #include <asm/setup.h>
+#include <asm/clock.h>
 
 #ifdef CONFIG_SH_KGDB
 #include <asm/kgdb.h>
@@ -41,7 +41,7 @@ extern void * __rd_start, * __rd_end;
  * This value will be used at the very early stage of serial setup.
  * The bigger value means no problem.
  */
-struct sh_cpuinfo boot_cpu_data = { CPU_SH_NONE, 0, 10000000, };
+struct sh_cpuinfo boot_cpu_data = { CPU_SH_NONE, 10000000, };
 struct screen_info screen_info;
 
 #if defined(CONFIG_SH_UNKNOWN)
@@ -186,7 +186,7 @@ static inline void parse_cmdline (char ** cmdline_p, char mv_name[MV_NAME_SIZE],
 
 static int __init sh_mv_setup(char **cmdline_p)
 {
-#if defined(CONFIG_SH_UNKNOWN)
+#ifdef CONFIG_SH_UNKNOWN
        extern struct sh_machine_vector mv_unknown;
 #endif
        struct sh_machine_vector *mv = NULL;
@@ -196,7 +196,7 @@ static int __init sh_mv_setup(char **cmdline_p)
 
        parse_cmdline(cmdline_p, mv_name, &mv, &mv_io_base, &mv_mmio_enable);
 
-#ifdef CONFIG_SH_GENERIC
+#ifdef CONFIG_SH_UNKNOWN
        if (mv == NULL) {
                mv = &mv_unknown;
                if (*mv_name != '\0') {
@@ -206,9 +206,6 @@ static int __init sh_mv_setup(char **cmdline_p)
        }
        sh_mv = *mv;
 #endif
-#ifdef CONFIG_SH_UNKNOWN
-       sh_mv = mv_unknown;
-#endif
 
        /*
         * Manually walk the vec, fill in anything that the board hasn't yet
@@ -231,10 +228,8 @@ static int __init sh_mv_setup(char **cmdline_p)
        mv_set(readb);  mv_set(readw);  mv_set(readl);
        mv_set(writeb); mv_set(writew); mv_set(writel);
 
-       mv_set(ioremap);
-       mv_set(iounmap);
-
-       mv_set(isa_port2addr);
+       mv_set(ioport_map);
+       mv_set(ioport_unmap);
        mv_set(irq_demux);
 
 #ifdef CONFIG_SH_UNKNOWN
@@ -273,10 +268,10 @@ void __init setup_arch(char **cmdline_p)
        init_mm.end_data = (unsigned long) _edata;
        init_mm.brk = (unsigned long) _end;
 
-       code_resource.start = virt_to_bus(_text);
-       code_resource.end = virt_to_bus(_etext)-1;
-       data_resource.start = virt_to_bus(_etext);
-       data_resource.end = virt_to_bus(_edata)-1;
+       code_resource.start = (unsigned long)virt_to_phys(_text);
+       code_resource.end = (unsigned long)virt_to_phys(_etext)-1;
+       data_resource.start = (unsigned long)virt_to_phys(_etext);
+       data_resource.end = (unsigned long)virt_to_phys(_edata)-1;
 
        sh_mv_setup(cmdline_p);
 
@@ -435,6 +430,9 @@ static const char *cpu_name[] = {
        [CPU_ST40GX1]   = "ST40GX1",
        [CPU_SH4_202]   = "SH4-202",
        [CPU_SH4_501]   = "SH4-501",
+       [CPU_SH7770]    = "SH7770",
+       [CPU_SH7780]    = "SH7780",
+       [CPU_SH7781]    = "SH7781",
        [CPU_SH_NONE]   = "Unknown"
 };
 
@@ -445,7 +443,7 @@ const char *get_cpu_subtype(void)
 
 #ifdef CONFIG_PROC_FS
 static const char *cpu_flags[] = {
-       "none", "fpu", "p2flush", "mmuassoc", "dsp", "perfctr",
+       "none", "fpu", "p2flush", "mmuassoc", "dsp", "perfctr", "ptea", NULL
 };
 
 static void show_cpuflags(struct seq_file *m)
@@ -459,7 +457,7 @@ static void show_cpuflags(struct seq_file *m)
                return;
        }
 
-       for (i = 0; i < cpu_data->flags; i++)
+       for (i = 0; cpu_flags[i]; i++)
                if ((cpu_data->flags & (1 << i)))
                        seq_printf(m, " %s", cpu_flags[i+1]);
 
@@ -472,7 +470,8 @@ static void show_cacheinfo(struct seq_file *m, const char *type, struct cache_in
 
        cache_size = info.ways * info.sets * info.linesz;
 
-       seq_printf(m, "%s size\t: %dKiB\n", type, cache_size >> 10);
+       seq_printf(m, "%s size\t: %2dKiB (%d-way)\n",
+                  type, cache_size >> 10, info.ways);
 }
 
 /*
@@ -511,21 +510,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                     boot_cpu_data.loops_per_jiffy/(500000/HZ),
                     (boot_cpu_data.loops_per_jiffy/(5000/HZ)) % 100);
 
-#define PRINT_CLOCK(name, value) \
-       seq_printf(m, name " clock\t: %d.%02dMHz\n", \
-                    ((value) / 1000000), ((value) % 1000000)/10000)
-       
-       PRINT_CLOCK("cpu", boot_cpu_data.cpu_clock);
-       PRINT_CLOCK("bus", boot_cpu_data.bus_clock);
-#ifdef CONFIG_CPU_SUBTYPE_ST40STB1
-       PRINT_CLOCK("memory", boot_cpu_data.memory_clock);
-#endif
-       PRINT_CLOCK("module", boot_cpu_data.module_clock);
-
-       return 0;
+       return show_clocks(m);
 }
 
-
 static void *c_start(struct seq_file *m, loff_t *pos)
 {
        return *pos < NR_CPUS ? cpu_data + *pos : NULL;
@@ -596,7 +583,7 @@ static int __init kgdb_parse_options(char *options)
                options += map->namelen + 1;
 
                options = (*options == ',') ? options+1 : options;
-               
+
                /* Read optional parameters (baud/parity/bits) */
                baud = simple_strtoul(options, &options, 10);
                if (baud != 0) {
index 1195af37ee5aef321aaf7789971e158898169a53..0773c9f389f3b14798b8f912e009b0503c103d2d 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/init.h>
 #include <linux/profile.h>
 #include <linux/smp.h>
+#include <linux/module.h>
 
 #include <asm/registers.h>      /* required by inline __asm__ stmt. */
 
index 6430a6383853494fecb56d562ada5918d9df424c..c58b657f00971e66c43fef5e8b2f1fed128439c5 100644 (file)
@@ -47,13 +47,16 @@ ARCH_INCLUDE        += -I$(srctree)/$(ARCH_DIR)/include
 endif
 SYS_DIR                := $(ARCH_DIR)/include/sysdep-$(SUBARCH)
 
-# -Dvmap=kernel_vmap affects everything, and prevents anything from
-# referencing the libpcap.o symbol so named.
+# -Dvmap=kernel_vmap prevents anything from referencing the libpcap.o symbol so
+# named - it's a common symbol in libpcap, so we get a binary which crashes.
 #
-# Same things for in6addr_loopback - found in libc.
+# Same things for in6addr_loopback and mktime - found in libc. For these two we
+# only get link-time error, luckily.
+#
+# These apply to USER_CFLAGS to.
 
-CFLAGS += $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \
-       $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \
+CFLAGS += $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\"   \
+       $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap      \
        -Din6addr_loopback=kernel_in6addr_loopback
 
 AFLAGS += $(ARCH_INCLUDE)
@@ -66,6 +69,7 @@ USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \
 # kernel_errno to separate them from the libc errno.  This allows -fno-common
 # in CFLAGS.  Otherwise, it would cause ld to complain about the two different
 # errnos.
+# These apply to kernelspace only.
 
 CFLAGS += -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask \
        -Dmktime=kernel_mktime
@@ -168,10 +172,13 @@ else
        $(Q)cd $(TOPDIR)/include/asm-um && ln -sf ../asm-$(SUBARCH) arch
 endif
 
-$(ARCH_DIR)/include/sysdep:
+$(objtree)/$(ARCH_DIR)/include:
+       @echo '  MKDIR $@'
+       $(Q)mkdir -p $@
+
+$(ARCH_DIR)/include/sysdep: $(objtree)/$(ARCH_DIR)/include
        @echo '  SYMLINK $@'
 ifneq ($(KBUILD_SRC),)
-       $(Q)mkdir -p $(ARCH_DIR)/include
        $(Q)ln -fsn $(srctree)/$(ARCH_DIR)/include/sysdep-$(SUBARCH) $(ARCH_DIR)/include/sysdep
 else
        $(Q)cd $(ARCH_DIR)/include && ln -sf sysdep-$(SUBARCH) sysdep
@@ -214,7 +221,7 @@ $(ARCH_DIR)/include/user_constants.h: $(ARCH_DIR)/user-offsets.s
 
 CLEAN_FILES += $(ARCH_DIR)/user-offsets.s
 
-$(ARCH_DIR)/include/kern_constants.h:
+$(ARCH_DIR)/include/kern_constants.h: $(objtree)/$(ARCH_DIR)/include
        @echo '  SYMLINK $@'
        $(Q) ln -sf ../../../include/asm-um/asm-offsets.h $@
 
index ab0d0b17081677eb9a2d2f0b0ddc21c28c1fbdb6..7218c754505bf99a4a9a1888398d32d1b8aa849d 100644 (file)
@@ -403,7 +403,7 @@ int chan_window_size(struct list_head *chans, unsigned short *rows_out,
        return 0;
 }
 
-void free_one_chan(struct chan *chan, int delay_free_irq)
+static void free_one_chan(struct chan *chan, int delay_free_irq)
 {
        list_del(&chan->list);
 
@@ -416,7 +416,7 @@ void free_one_chan(struct chan *chan, int delay_free_irq)
        kfree(chan);
 }
 
-void free_chan(struct list_head *chans, int delay_free_irq)
+static void free_chan(struct list_head *chans, int delay_free_irq)
 {
        struct list_head *ele, *next;
        struct chan *chan;
@@ -497,7 +497,7 @@ struct chan_type {
        struct chan_ops *ops;
 };
 
-struct chan_type chan_table[] = {
+static struct chan_type chan_table[] = {
        { "fd", &fd_ops },
 
 #ifdef CONFIG_NULL_CHAN
index 507e3cbac9d38a281d357f4c40c86309ce585f9e..a61b7b46bc025b217796e0a443336b63578dbb70 100644 (file)
@@ -18,7 +18,7 @@ struct daemon_init {
        char *ctl_sock;
 };
 
-void daemon_init(struct net_device *dev, void *data)
+static void daemon_init(struct net_device *dev, void *data)
 {
        struct uml_net_private *pri;
        struct daemon_data *dpri;
@@ -64,7 +64,7 @@ static struct net_kern_info daemon_kern_info = {
        .write                  = daemon_write,
 };
 
-int daemon_setup(char *str, char **mac_out, void *data)
+static int daemon_setup(char *str, char **mac_out, void *data)
 {
        struct daemon_init *init = data;
        char *remain;
index 46ceb25a9959e18f235aba63b7b05a2304c33e06..6c2d4ccaf20f63cc59ed049e4f960bf546665af6 100644 (file)
@@ -714,7 +714,7 @@ struct winch {
        struct tty_struct *tty;
 };
 
-irqreturn_t winch_interrupt(int irq, void *data, struct pt_regs *unused)
+static irqreturn_t winch_interrupt(int irq, void *data, struct pt_regs *unused)
 {
        struct winch *winch = data;
        struct tty_struct *tty;
index 217438cdef336fff7e609fbb63378a541c3e93f4..c9b078fba03e4812848b33f9c3c15ceee0192575 100644 (file)
@@ -26,7 +26,7 @@ struct mcast_init {
        int ttl;
 };
 
-void mcast_init(struct net_device *dev, void *data)
+static void mcast_init(struct net_device *dev, void *data)
 {
        struct uml_net_private *pri;
        struct mcast_data *dpri;
@@ -40,7 +40,7 @@ void mcast_init(struct net_device *dev, void *data)
        dpri->dev = dev;
 
        printk("mcast backend ");
-       printk("multicast adddress: %s:%u, TTL:%u ",
+       printk("multicast address: %s:%u, TTL:%u ",
               dpri->addr, dpri->port, dpri->ttl);
 
        printk("\n");
index e3d576567172bd9e64a854f7ab702eec34f05c6d..54388d10bcf98763976a8d2305fd2222e8b974a8 100644 (file)
@@ -273,7 +273,7 @@ void mconsole_proc(struct mc_request *req)
     config <dev> - Query the configuration of a device \n\
     remove <dev> - Remove a device from UML \n\
     sysrq <letter> - Performs the SysRq action controlled by the letter \n\
-    cad - invoke the Ctl-Alt-Del handler \n\
+    cad - invoke the Ctrl-Alt-Del handler \n\
     stop - pause the UML; it will do nothing until it receives a 'go' \n\
     go - continue the UML after a 'stop' \n\
     log <string> - make UML enter <string> into the kernel log\n\
@@ -327,7 +327,7 @@ void mconsole_stop(struct mc_request *req)
 
 /* This list is populated by __initcall routines. */
 
-LIST_HEAD(mconsole_devices);
+static LIST_HEAD(mconsole_devices);
 
 void mconsole_register_dev(struct mc_device *new)
 {
@@ -561,6 +561,8 @@ void mconsole_sysrq(struct mc_request *req)
 }
 #endif
 
+#ifdef CONFIG_MODE_SKAS
+
 static void stack_proc(void *arg)
 {
        struct task_struct *from = current, *to = arg;
@@ -574,7 +576,7 @@ static void stack_proc(void *arg)
  *  Dumps a stacks registers to the linux console.
  *  Usage stack <pid>.
  */
-void do_stack(struct mc_request *req)
+static void do_stack_trace(struct mc_request *req)
 {
        char *ptr = req->request.data;
        int pid_requested= -1;
@@ -605,6 +607,7 @@ void do_stack(struct mc_request *req)
        }
        with_console(req, stack_proc, to);
 }
+#endif /* CONFIG_MODE_SKAS */
 
 void mconsole_stack(struct mc_request *req)
 {
@@ -613,7 +616,7 @@ void mconsole_stack(struct mc_request *req)
         */
        CHOOSE_MODE(mconsole_reply(req, "Sorry, this doesn't work in TT mode",
                                   1, 0),
-                   do_stack(req));
+                   do_stack_trace(req));
 }
 
 /* Changed by mconsole_setup, which is __setup, and called before SMP is
index 2ae76d8f1be1ee594a74d54ea9a64c0f068803d9..d574e0a9dc13c307f7a78894a8f08713ff227817 100644 (file)
@@ -88,12 +88,13 @@ struct slip_proto {
        int esc;
 };
 
-#define SLIP_PROTO_INIT { \
-       .ibuf   = { '\0' }, \
-       .obuf   = { '\0' }, \
-        .more  = 0, \
-       .pos    = 0, \
-       .esc    = 0 \
+static inline void slip_proto_init(struct slip_proto * slip)
+{
+       memset(slip->ibuf, 0, sizeof(slip->ibuf));
+       memset(slip->obuf, 0, sizeof(slip->obuf));
+       slip->more = 0;
+       slip->pos = 0;
+       slip->esc = 0;
 }
 
 extern int slip_proto_read(int fd, void *buf, int len,
index 9a6f5c85f902ad997a11538a51c8015a99fb5209..a62f5ef445cfec0c06a266730d9e171dadb768fb 100644 (file)
@@ -21,13 +21,14 @@ void slip_init(struct net_device *dev, void *data)
 
        private = dev->priv;
        spri = (struct slip_data *) private->user;
-       *spri = ((struct slip_data)
-               { .name         = { '\0' },
-                 .addr         = NULL,
-                 .gate_addr    = init->gate_addr,
-                 .slave        = -1,
-                 .slip         = SLIP_PROTO_INIT,
-                 .dev          = dev });
+
+       memset(spri->name, 0, sizeof(spri->name));
+       spri->addr = NULL;
+       spri->gate_addr = init->gate_addr;
+       spri->slave = -1;
+       spri->dev = dev;
+
+       slip_proto_init(&spri->slip);
 
        dev->init = NULL;
        dev->header_cache_update = NULL;
index 9864d27afdbe22f27319042030116caef12f93d9..33d7982be5d3aebe901b993020eb1edfb2142c6d 100644 (file)
@@ -21,12 +21,13 @@ void slirp_init(struct net_device *dev, void *data)
 
        private = dev->priv;
        spri = (struct slirp_data *) private->user;
-       *spri = ((struct slirp_data)
-               { .argw         = init->argw,
-                 .pid          = -1,
-                 .slave        = -1,
-                 .slip         = SLIP_PROTO_INIT,
-                 .dev          = dev });
+
+       spri->argw = init->argw;
+       spri->pid = -1;
+       spri->slave = -1;
+       spri->dev = dev;
+
+       slip_proto_init(&spri->slip);
 
        dev->init = NULL;
        dev->hard_header_len = 0;
index a32ef55cb244e1e581c9eefd0cebc8b71ec0164c..a4d6415bc8c4820340a299a58e7b340ee33cbcf0 100644 (file)
@@ -33,7 +33,7 @@ static struct tty_driver *ssl_driver;
 
 #define NR_PORTS 64
 
-void ssl_announce(char *dev_name, int dev)
+static void ssl_announce(char *dev_name, int dev)
 {
        printk(KERN_INFO "Serial line %d assigned device '%s'\n", dev,
               dev_name);
@@ -98,7 +98,7 @@ static int ssl_remove(int n)
        return line_remove(serial_lines, ARRAY_SIZE(serial_lines), n);
 }
 
-int ssl_open(struct tty_struct *tty, struct file *filp)
+static int ssl_open(struct tty_struct *tty, struct file *filp)
 {
        return line_open(serial_lines, tty);
 }
@@ -182,7 +182,7 @@ static struct console ssl_cons = {
        .index          = -1,
 };
 
-int ssl_init(void)
+static int ssl_init(void)
 {
        char *new_title;
 
index c649108a9e9f298c4266c568ce88627bd8e2eab9..07176d92e1c92789daf5c75df5c901d7605bd5c5 100644 (file)
@@ -31,8 +31,6 @@ extern int timer_irq_inited;
 extern int jail;
 extern int nsyscalls;
 
-extern struct task_struct *idle_threads[NR_CPUS];
-
 #define UML_ROUND_DOWN(addr) ((void *)(((unsigned long) addr) & PAGE_MASK))
 #define UML_ROUND_UP(addr) \
        UML_ROUND_DOWN(((unsigned long) addr) + PAGE_SIZE - 1)
index 569fe8b9b0535d362d20e3b14d215f46aaae67cb..c264e1c05ab39314f8a78c90e081fe317f4e9a5a 100644 (file)
@@ -33,7 +33,7 @@ void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp)
 extern void log_exec(char **argv, void *tty);
 
 static long execve1(char *file, char __user * __user *argv,
-                   char *__user __user *env)
+                   char __user *__user *env)
 {
         long error;
 
index f3b583a878a6c9a4504e68f4bbce985251101fe6..544665e04513b33b4106ccd564be392e22d09b8f 100644 (file)
@@ -265,7 +265,7 @@ int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem)
        highmem_len = highmem_pages * sizeof(struct page);
 
        total_pages = phys_pages + iomem_pages + highmem_pages;
-       total_len = phys_len + iomem_pages + highmem_len;
+       total_len = phys_len + iomem_len + highmem_len;
 
        if(kmalloc_ok){
                map = kmalloc(total_len, GFP_KERNEL);
index 6f1a3a288117985e1b4bc9d73bda578284c26d09..3ef73bf2e781a79dbd039c623fc20c3dd3f289d5 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "linux/module.h"
 #include "linux/sched.h"
+#include "asm/smp.h"
 #include "user_util.h"
 #include "kern_util.h"
 #include "kern.h"
index 3d29c90514cc0e10093b15c40188281e9fe92e7b..3fda9a03c59aa5d0d767df04fe542d488e811171 100644 (file)
@@ -23,16 +23,20 @@ void syscall_handler_tt(int sig, struct pt_regs *regs)
        int syscall;
 #ifdef CONFIG_SYSCALL_DEBUG
        int index;
-       index = record_syscall_start(syscall);
 #endif
        sc = UPT_SC(&regs->regs);
        SC_START_SYSCALL(sc);
 
+       syscall = UPT_SYSCALL_NR(&regs->regs);
+
+#ifdef CONFIG_SYSCALL_DEBUG
+       index = record_syscall_start(syscall);
+#endif
+
        syscall_trace(&regs->regs, 0);
 
        current->thread.nsyscalls++;
        nsyscalls++;
-       syscall = UPT_SYSCALL_NR(&regs->regs);
 
        if((syscall >= NR_syscalls) || (syscall < 0))
                result = -ENOSYS;
index 0cdfd4481d5e4c4214e9dfaaaff8d965c3fbddad..1fa09a79a10b682fc74f81e9a4fcc072a5579b93 100644 (file)
@@ -16,7 +16,6 @@
 #include "choose-mode.h"
 #include "kern.h"
 #include "mode_kern.h"
-#include "proc_mm.h"
 #include "os.h"
 
 extern int modify_ldt(int func, void *ptr, unsigned long bytecount);
@@ -90,6 +89,7 @@ out:
 #include "skas.h"
 #include "skas_ptrace.h"
 #include "asm/mmu_context.h"
+#include "proc_mm.h"
 
 long write_ldt_entry(struct mm_id * mm_idp, int func, struct user_desc * desc,
                     void **addr, int done)
index f05c2a802489052d1db9000dc444f09dc5321ec4..067c0f47bd0d75baadbcfc4330519eb798826c48 100644 (file)
@@ -676,7 +676,7 @@ ia32_sys_call_table:
        .quad sys_mkdirat
        .quad sys_mknodat
        .quad sys_fchownat
-       .quad sys_futimesat
+       .quad compat_sys_futimesat
        .quad compat_sys_newfstatat     /* 300 */
        .quad sys_unlinkat
        .quad sys_renameat
index 7da9ace890bd1337b8fba3d0da149d6a43378fed..4fe97071f2974f28aaa2fb8ab1f9a7ebd292dfed 100644 (file)
@@ -1,3 +1,8 @@
 obj-y                  := boot.o
 boot-y                 := ../../../i386/kernel/acpi/boot.o
 obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wakeup.o
+
+ifneq ($(CONFIG_ACPI_PROCESSOR),)
+obj-y                  += processor.o
+endif
+
diff --git a/arch/x86_64/kernel/acpi/processor.c b/arch/x86_64/kernel/acpi/processor.c
new file mode 100644 (file)
index 0000000..3bdc2ba
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * arch/x86_64/kernel/acpi/processor.c
+ *
+ * Copyright (C) 2005 Intel Corporation
+ *     Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
+ *     - Added _PDC for platforms with Intel CPUs
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/acpi.h>
+
+#include <acpi/processor.h>
+#include <asm/acpi.h>
+
+static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
+{
+       struct acpi_object_list *obj_list;
+       union acpi_object *obj;
+       u32 *buf;
+
+       /* allocate and initialize pdc. It will be used later. */
+       obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
+       if (!obj_list) {
+               printk(KERN_ERR "Memory allocation error\n");
+               return;
+       }
+
+       obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
+       if (!obj) {
+               printk(KERN_ERR "Memory allocation error\n");
+               kfree(obj_list);
+               return;
+       }
+
+       buf = kmalloc(12, GFP_KERNEL);
+       if (!buf) {
+               printk(KERN_ERR "Memory allocation error\n");
+               kfree(obj);
+               kfree(obj_list);
+               return;
+       }
+
+       buf[0] = ACPI_PDC_REVISION_ID;
+       buf[1] = 1;
+       buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
+
+       obj->type = ACPI_TYPE_BUFFER;
+       obj->buffer.length = 12;
+       obj->buffer.pointer = (u8 *) buf;
+       obj_list->count = 1;
+       obj_list->pointer = obj;
+       pr->pdc = obj_list;
+
+       return;
+}
+
+/* Initialize _PDC data based on the CPU vendor */
+void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
+{
+       unsigned int cpu = pr->id;
+       struct cpuinfo_x86 *c = cpu_data + cpu;
+
+       pr->pdc = NULL;
+       if (c->x86_vendor == X86_VENDOR_INTEL && cpu_has(c, X86_FEATURE_EST))
+               init_intel_pdc(pr, c);
+
+       return;
+}
+
+EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
index e8cf44ef8778dc50adc3d71a92ba7665155da7ff..1a5060b434b8a8858d2be94d3aaa2eb05c4e32fd 100644 (file)
@@ -2027,7 +2027,7 @@ int __init io_apic_get_redir_entries (int ioapic)
 }
 
 
-int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
+int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int polarity)
 {
        struct IO_APIC_route_entry entry;
        unsigned long flags;
@@ -2049,8 +2049,8 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a
        entry.delivery_mode = INT_DELIVERY_MODE;
        entry.dest_mode = INT_DEST_MODE;
        entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-       entry.trigger = edge_level;
-       entry.polarity = active_high_low;
+       entry.trigger = triggering;
+       entry.polarity = polarity;
        entry.mask = 1;                                  /* Disabled (masked) */
 
        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
        apic_printk(APIC_VERBOSE,KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> "
                "IRQ %d Mode:%i Active:%i)\n", ioapic, 
               mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
-              edge_level, active_high_low);
+              triggering, polarity);
 
-       ioapic_register_intr(irq, entry.vector, edge_level);
+       ioapic_register_intr(irq, entry.vector, triggering);
 
        if (!ioapic && (irq < 16))
                disable_8259A_irq(irq);
index 1105250bf02c3ee26d8b1f8a54ab78904e85ca5a..dc49bfb6db0a92fc71349f0626887e5aaa6cee72 100644 (file)
@@ -915,7 +915,7 @@ void __init mp_config_acpi_legacy_irqs (void)
 
 #define MAX_GSI_NUM    4096
 
-int mp_register_gsi(u32 gsi, int edge_level, int active_high_low)
+int mp_register_gsi(u32 gsi, int triggering, int polarity)
 {
        int                     ioapic = -1;
        int                     ioapic_pin = 0;
@@ -964,7 +964,7 @@ int mp_register_gsi(u32 gsi, int edge_level, int active_high_low)
 
        mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
 
-       if (edge_level) {
+       if (triggering == ACPI_LEVEL_SENSITIVE) {
                /*
                 * For PCI devices assign IRQs in order, avoiding gaps
                 * due to unused I/O APIC pins.
@@ -986,8 +986,8 @@ int mp_register_gsi(u32 gsi, int edge_level, int active_high_low)
        }
 
        io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
-               edge_level == ACPI_EDGE_SENSITIVE ? 0 : 1,
-               active_high_low == ACPI_ACTIVE_HIGH ? 0 : 1);
+               triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
+               polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
        return gsi;
 }
 
index bba5db6cebd69aef528dcba68b60d0b4d5bd1581..ccef6ae747a3bd395ae2a0294fec8306604c29bd 100644 (file)
@@ -4,7 +4,7 @@
 
 CFLAGS_csum-partial.o := -funroll-loops
 
-obj-y := io.o
+obj-y := io.o iomap_copy.o
 
 lib-y := csum-partial.o csum-copy.o csum-wrappers.o delay.o \
        usercopy.o getuser.o putuser.o  \
diff --git a/arch/x86_64/lib/iomap_copy.S b/arch/x86_64/lib/iomap_copy.S
new file mode 100644 (file)
index 0000000..8bbade5
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2006 PathScale, Inc.  All Rights Reserved.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * override generic version in lib/iomap_copy.c
+ */
+       .globl __iowrite32_copy
+       .p2align 4
+__iowrite32_copy:
+       movl %edx,%ecx
+       rep movsd
+       ret
index d38b4afa37ef038dd8a7e0472b1150261972bf47..f9fc07efd2da995d933fda955895175ec1e5012d 100644 (file)
@@ -2579,6 +2579,8 @@ void disk_round_stats(struct gendisk *disk)
        disk->stamp = now;
 }
 
+EXPORT_SYMBOL_GPL(disk_round_stats);
+
 /*
  * queue lock must be held
  */
index 6d61945260a8d91b86843f0a8050aec9393bfc27..0cce28c4025b1814a57e467f1bef98e93fdeadce 100644 (file)
@@ -267,7 +267,6 @@ config ACPI_DEBUG
 
 config ACPI_EC
        bool
-       depends on X86
        default y
        help
          This driver is required on some systems for the proper operation of
index 2143609d29362f0b7896c7e5dc07dadfba8a64aa..d882bf87fa968fa191a8f647989ef954f89b581e 100644 (file)
@@ -71,8 +71,8 @@ static struct acpi_driver acpi_memory_device_driver = {
 struct acpi_memory_device {
        acpi_handle handle;
        unsigned int state;     /* State of the memory device */
-       unsigned short cache_attribute; /* memory cache attribute */
-       unsigned short read_write_attribute;    /* memory read/write attribute */
+       unsigned short caching; /* memory cache attribute */
+       unsigned short write_protect;   /* memory read/write attribute */
        u64 start_addr;         /* Memory Range start physical addr */
        u64 end_addr;           /* Memory Range end physical addr */
 };
@@ -97,12 +97,12 @@ acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
        if (ACPI_SUCCESS(status)) {
                if (address64.resource_type == ACPI_MEMORY_RANGE) {
                        /* Populate the structure */
-                       mem_device->cache_attribute =
-                           address64.attribute.memory.cache_attribute;
-                       mem_device->read_write_attribute =
-                           address64.attribute.memory.read_write_attribute;
-                       mem_device->start_addr = address64.min_address_range;
-                       mem_device->end_addr = address64.max_address_range;
+                       mem_device->caching =
+                           address64.info.mem.caching;
+                       mem_device->write_protect =
+                           address64.info.mem.write_protect;
+                       mem_device->start_addr = address64.minimum;
+                       mem_device->end_addr = address64.maximum;
                }
        }
 
@@ -250,7 +250,6 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
        int result;
        u64 start = mem_device->start_addr;
        u64 len = mem_device->end_addr - start + 1;
-       unsigned long attr = mem_device->read_write_attribute;
 
        ACPI_FUNCTION_TRACE("acpi_memory_disable_device");
 
index fec895af6ae6ccb86587876dd597fa6d25bba4b3..f4c87750dbf2bce15479c3a56bff51dba4c25a86 100644 (file)
@@ -78,9 +78,9 @@ MODULE_LICENSE("GPL");
 static uid_t asus_uid;
 static gid_t asus_gid;
 module_param(asus_uid, uint, 0);
-MODULE_PARM_DESC(uid, "UID for entries in /proc/acpi/asus.\n");
+MODULE_PARM_DESC(asus_uid, "UID for entries in /proc/acpi/asus.\n");
 module_param(asus_gid, uint, 0);
-MODULE_PARM_DESC(gid, "GID for entries in /proc/acpi/asus.\n");
+MODULE_PARM_DESC(asus_gid, "GID for entries in /proc/acpi/asus.\n");
 
 /* For each model, all features implemented, 
  * those marked with R are relative to HOTK, A for absolute */
@@ -302,7 +302,7 @@ static struct model_data model_conf[END_MODEL] = {
         .brightness_set = "SPLV",
         .brightness_get = "GPLV",
         .display_set = "SDSP",
-        .display_get = "\\SSTE"},
+        .display_get = "\\_SB.PCI0.P0P1.VGA.GETD"},
        {
         .name = "M6R",
         .mt_mled = "MLED",
@@ -851,6 +851,8 @@ static int __init asus_hotk_add_fs(struct acpi_device *device)
                mode = S_IFREG | S_IRUGO | S_IWUGO;
        } else {
                mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP;
+               printk(KERN_WARNING "  asus_uid and asus_gid parameters are "
+                      "deprecated, use chown and chmod instead!\n");
        }
 
        acpi_device_dir(device) = asus_proc_dir;
@@ -987,9 +989,21 @@ static int __init asus_hotk_get_info(void)
                printk(KERN_NOTICE "  BSTS called, 0x%02x returned\n",
                       bsts_result);
 
-       /* Samsung P30 has a device with a valid _HID whose INIT does not 
-        * return anything. Catch this one and any similar here */
-       if (buffer.pointer == NULL) {
+       /* This is unlikely with implicit return */
+       if (buffer.pointer == NULL)
+               return -EINVAL;
+
+       model = (union acpi_object *) buffer.pointer;
+       /*
+        * Samsung P30 has a device with a valid _HID whose INIT does not 
+        * return anything. It used to be possible to catch this exception,
+        * but the implicit return code will now happily confuse the 
+        * driver. We assume that every ACPI_TYPE_STRING is a valid model
+        * identifier but it's still possible to get completely bogus data.
+        */
+       if (model->type == ACPI_TYPE_STRING) {
+               printk(KERN_NOTICE "  %s model detected, ", model->string.pointer);
+       } else {
                if (asus_info &&        /* Samsung P30 */
                    strncmp(asus_info->oem_table_id, "ODEM", 4) == 0) {
                        hotk->model = P30;
@@ -1002,13 +1016,10 @@ static int __init asus_hotk_get_info(void)
                               "the developers with your DSDT\n");
                }
                hotk->methods = &model_conf[hotk->model];
-               return AE_OK;
-       }
+               
+               acpi_os_free(model);
 
-       model = (union acpi_object *)buffer.pointer;
-       if (model->type == ACPI_TYPE_STRING) {
-               printk(KERN_NOTICE "  %s model detected, ",
-                      model->string.pointer);
+               return AE_OK;
        }
 
        hotk->model = END_MODEL;
index 2022aeaecfbbeb357a23500039c809a7bfe6e4c0..76bc0463f6de456814bbde5bc771a2690c1f9396 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
                                   ACPI_IMODE_LOAD_PASS1, flags, walk_state,
                                   &(node));
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_NSERROR(arg->common.value.string, status);
+                       ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
                        return_ACPI_STATUS(status);
                }
        }
@@ -232,7 +232,8 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
                            + (acpi_integer) arg->common.value.size;
 
                        if (position > ACPI_UINT32_MAX) {
-                               ACPI_REPORT_ERROR(("Bit offset within field too large (> 0xFFFFFFFF)\n"));
+                               ACPI_ERROR((AE_INFO,
+                                           "Bit offset within field too large (> 0xFFFFFFFF)"));
                                return_ACPI_STATUS(AE_SUPPORT);
                        }
 
@@ -268,8 +269,8 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
                                                ACPI_NS_DONT_OPEN_SCOPE,
                                                walk_state, &info->field_node);
                        if (ACPI_FAILURE(status)) {
-                               ACPI_REPORT_NSERROR((char *)&arg->named.name,
-                                                   status);
+                               ACPI_ERROR_NAMESPACE((char *)&arg->named.name,
+                                                    status);
                                if (status != AE_ALREADY_EXISTS) {
                                        return_ACPI_STATUS(status);
                                }
@@ -293,7 +294,11 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
                            + (acpi_integer) arg->common.value.size;
 
                        if (position > ACPI_UINT32_MAX) {
-                               ACPI_REPORT_ERROR(("Field [%4.4s] bit offset too large (> 0xFFFFFFFF)\n", (char *)&info->field_node->name));
+                               ACPI_ERROR((AE_INFO,
+                                           "Field [%4.4s] bit offset too large (> 0xFFFFFFFF)",
+                                           ACPI_CAST_PTR(char,
+                                                         &info->field_node->
+                                                         name)));
                                return_ACPI_STATUS(AE_SUPPORT);
                        }
 
@@ -302,9 +307,9 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
 
                default:
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Invalid opcode in field list: %X\n",
-                                         arg->common.aml_opcode));
+                       ACPI_ERROR((AE_INFO,
+                                   "Invalid opcode in field list: %X",
+                                   arg->common.aml_opcode));
                        return_ACPI_STATUS(AE_AML_BAD_OPCODE);
                }
 
@@ -349,7 +354,7 @@ acpi_ds_create_field(union acpi_parse_object *op,
                                   ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
                                   walk_state, &region_node);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_NSERROR(arg->common.value.name, status);
+                       ACPI_ERROR_NAMESPACE(arg->common.value.name, status);
                        return_ACPI_STATUS(status);
                }
        }
@@ -431,8 +436,8 @@ acpi_ds_init_field_objects(union acpi_parse_object *op,
                                                ACPI_NS_ERROR_IF_FOUND,
                                                walk_state, &node);
                        if (ACPI_FAILURE(status)) {
-                               ACPI_REPORT_NSERROR((char *)&arg->named.name,
-                                                   status);
+                               ACPI_ERROR_NAMESPACE((char *)&arg->named.name,
+                                                    status);
                                if (status != AE_ALREADY_EXISTS) {
                                        return_ACPI_STATUS(status);
                                }
@@ -488,7 +493,7 @@ acpi_ds_create_bank_field(union acpi_parse_object *op,
                                   ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
                                   walk_state, &region_node);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_NSERROR(arg->common.value.name, status);
+                       ACPI_ERROR_NAMESPACE(arg->common.value.name, status);
                        return_ACPI_STATUS(status);
                }
        }
@@ -502,7 +507,7 @@ acpi_ds_create_bank_field(union acpi_parse_object *op,
                           ACPI_NS_SEARCH_PARENT, walk_state,
                           &info.register_node);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_NSERROR(arg->common.value.string, status);
+               ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
                return_ACPI_STATUS(status);
        }
 
@@ -560,7 +565,7 @@ acpi_ds_create_index_field(union acpi_parse_object *op,
                           ACPI_NS_SEARCH_PARENT, walk_state,
                           &info.register_node);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_NSERROR(arg->common.value.string, status);
+               ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
                return_ACPI_STATUS(status);
        }
 
@@ -573,7 +578,7 @@ acpi_ds_create_index_field(union acpi_parse_object *op,
                           ACPI_NS_SEARCH_PARENT, walk_state,
                           &info.data_register_node);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_NSERROR(arg->common.value.string, status);
+               ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
                return_ACPI_STATUS(status);
        }
 
index 8693c704aea611a6e9495fb3b7ee8ce7fe5ca017..e65a07ad2422a3d9fb8a4195109e0ffbb0356192 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -84,7 +84,7 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
        acpi_object_type type;
        acpi_status status;
 
-       ACPI_FUNCTION_NAME("ds_init_one_object");
+       ACPI_FUNCTION_ENTRY();
 
        /*
         * 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,
 
                status = acpi_ds_initialize_region(obj_handle);
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Region %p [%4.4s] - Init failure, %s\n",
-                                         obj_handle,
-                                         acpi_ut_get_node_name(obj_handle),
-                                         acpi_format_exception(status)));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "During Region initialization %p [%4.4s]",
+                                       obj_handle,
+                                       acpi_ut_get_node_name(obj_handle)));
                }
 
                info->op_region_count++;
@@ -117,14 +116,6 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
 
        case ACPI_TYPE_METHOD:
 
-               /*
-                * Print a dot for each method unless we are going to print
-                * the entire pathname
-                */
-               if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
-                       ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "."));
-               }
-
                /*
                 * Set the execution data width (32 or 64) based upon the
                 * revision number of the parent ACPI table.
@@ -134,6 +125,21 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
                if (info->table_desc->pointer->revision == 1) {
                        node->flags |= ANOBJ_DATA_WIDTH_32;
                }
+#ifdef ACPI_INIT_PARSE_METHODS
+               /*
+                * Note 11/2005: Removed this code to parse all methods during table
+                * load because it causes problems if there are any errors during the
+                * parse. Also, it seems like overkill and we probably don't want to
+                * abort a table load because of an issue with a single method.
+                */
+
+               /*
+                * Print a dot for each method unless we are going to print
+                * the entire pathname
+                */
+               if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
+                       ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "."));
+               }
 
                /*
                 * Always parse methods to detect errors, we will delete
@@ -141,15 +147,15 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
                 */
                status = acpi_ds_parse_method(obj_handle);
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "\n+Method %p [%4.4s] - parse failure, %s\n",
-                                         obj_handle,
-                                         acpi_ut_get_node_name(obj_handle),
-                                         acpi_format_exception(status)));
+                       ACPI_ERROR((AE_INFO,
+                                   "Method %p [%4.4s] - parse failure, %s",
+                                   obj_handle,
+                                   acpi_ut_get_node_name(obj_handle),
+                                   acpi_format_exception(status)));
 
                        /* This parse failed, but we will continue parsing more methods */
                }
-
+#endif
                info->method_count++;
                break;
 
@@ -207,8 +213,7 @@ acpi_ds_initialize_objects(struct acpi_table_desc * table_desc,
        status = acpi_walk_namespace(ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX,
                                     acpi_ds_init_one_object, &info, NULL);
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "walk_namespace failed, %s\n",
-                                 acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace"));
        }
 
        ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
index 36c1ca0b9adb71a9b2d19fddd711a4b545a45312..c475546535b652fb313456c5440519c6fc66a0b9 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include <acpi/acdispat.h>
 #include <acpi/acinterp.h>
 #include <acpi/acnamesp.h>
+#include <acpi/acdisasm.h>
 
 #define _COMPONENT          ACPI_DISPATCHER
 ACPI_MODULE_NAME("dsmethod")
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ds_parse_method
+ * FUNCTION:    acpi_ds_method_error
  *
- * PARAMETERS:  Node        - Method node
+ * PARAMETERS:  Status          - Execution status
+ *              walk_state      - Current state
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Parse the AML that is associated with the method.
+ * DESCRIPTION: Called on method error. Invoke the global exception handler if
+ *              present, dump the method data if the disassembler is configured
  *
- * MUTEX:       Assumes parser is locked
+ *              Note: Allows the exception handler to change the status code
  *
  ******************************************************************************/
-acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node)
+acpi_status
+acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
 {
-       acpi_status status;
-       union acpi_operand_object *obj_desc;
-       union acpi_parse_object *op;
-       struct acpi_walk_state *walk_state;
-
-       ACPI_FUNCTION_TRACE_PTR("ds_parse_method", node);
+       ACPI_FUNCTION_ENTRY();
 
-       /* Parameter Validation */
+       /* Ignore AE_OK and control exception codes */
 
-       if (!node) {
-               return_ACPI_STATUS(AE_NULL_ENTRY);
+       if (ACPI_SUCCESS(status) || (status & AE_CODE_CONTROL)) {
+               return (status);
        }
 
-       ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
-                         "**** Parsing [%4.4s] **** named_obj=%p\n",
-                         acpi_ut_get_node_name(node), node));
-
-       /* Extract the method object from the method Node */
+       /* Invoke the global exception handler */
 
-       obj_desc = acpi_ns_get_attached_object(node);
-       if (!obj_desc) {
-               return_ACPI_STATUS(AE_NULL_OBJECT);
-       }
+       if (acpi_gbl_exception_handler) {
+               /* Exit the interpreter, allow handler to execute methods */
 
-       /* Create a mutex for the method if there is a concurrency limit */
+               acpi_ex_exit_interpreter();
 
-       if ((obj_desc->method.concurrency != ACPI_INFINITE_CONCURRENCY) &&
-           (!obj_desc->method.semaphore)) {
-               status = acpi_os_create_semaphore(obj_desc->method.concurrency,
-                                                 obj_desc->method.concurrency,
-                                                 &obj_desc->method.semaphore);
-               if (ACPI_FAILURE(status)) {
-                       return_ACPI_STATUS(status);
-               }
-       }
-
-       /*
-        * Allocate a new parser op to be the root of the parsed
-        * method tree
-        */
-       op = acpi_ps_alloc_op(AML_METHOD_OP);
-       if (!op) {
-               return_ACPI_STATUS(AE_NO_MEMORY);
-       }
-
-       /* Init new op with the method name and pointer back to the Node */
-
-       acpi_ps_set_name(op, node->name.integer);
-       op->common.node = node;
-
-       /*
-        * Get a new owner_id for objects created by this method. Namespace
-        * objects (such as Operation Regions) can be created during the
-        * first pass parse.
-        */
-       status = acpi_ut_allocate_owner_id(&obj_desc->method.owner_id);
-       if (ACPI_FAILURE(status)) {
-               goto cleanup;
-       }
-
-       /* Create and initialize a new walk state */
-
-       walk_state =
-           acpi_ds_create_walk_state(obj_desc->method.owner_id, NULL, NULL,
-                                     NULL);
-       if (!walk_state) {
-               status = AE_NO_MEMORY;
-               goto cleanup2;
+               /*
+                * Handler can map the exception code to anything it wants, including
+                * AE_OK, in which case the executing method will not be aborted.
+                */
+               status = acpi_gbl_exception_handler(status,
+                                                   walk_state->method_node ?
+                                                   walk_state->method_node->
+                                                   name.integer : 0,
+                                                   walk_state->opcode,
+                                                   walk_state->aml_offset,
+                                                   NULL);
+               (void)acpi_ex_enter_interpreter();
        }
-
-       status = acpi_ds_init_aml_walk(walk_state, op, node,
-                                      obj_desc->method.aml_start,
-                                      obj_desc->method.aml_length, NULL, 1);
+#ifdef ACPI_DISASSEMBLER
        if (ACPI_FAILURE(status)) {
-               acpi_ds_delete_walk_state(walk_state);
-               goto cleanup2;
-       }
+               /* Display method locals/args if disassembler is present */
 
-       /*
-        * Parse the method, first pass
-        *
-        * The first pass load is where newly declared named objects are added into
-        * the namespace.  Actual evaluation of the named objects (what would be
-        * called a "second pass") happens during the actual execution of the
-        * method so that operands to the named objects can take on dynamic
-        * run-time values.
-        */
-       status = acpi_ps_parse_aml(walk_state);
-       if (ACPI_FAILURE(status)) {
-               goto cleanup2;
+               acpi_dm_dump_method_info(status, walk_state, walk_state->op);
        }
+#endif
 
-       ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
-                         "**** [%4.4s] Parsed **** named_obj=%p Op=%p\n",
-                         acpi_ut_get_node_name(node), node, op));
-
-       /*
-        * Delete the parse tree. We simply re-parse the method for every
-        * execution since there isn't much overhead (compared to keeping lots
-        * of parse trees around)
-        */
-       acpi_ns_delete_namespace_subtree(node);
-       acpi_ns_delete_namespace_by_owner(obj_desc->method.owner_id);
-
-      cleanup2:
-       acpi_ut_release_owner_id(&obj_desc->method.owner_id);
-
-      cleanup:
-       acpi_ps_delete_parse_tree(op);
-       return_ACPI_STATUS(status);
+       return (status);
 }
 
 /*******************************************************************************
@@ -195,9 +126,9 @@ acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node)
  ******************************************************************************/
 
 acpi_status
-acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
-                              union acpi_operand_object *obj_desc,
-                              struct acpi_namespace_node *calling_method_node)
+acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node,
+                              union acpi_operand_object * obj_desc,
+                              struct acpi_namespace_node * calling_method_node)
 {
        acpi_status status = AE_OK;
 
@@ -210,7 +141,8 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
        /* Prevent wraparound of thread count */
 
        if (obj_desc->method.thread_count == ACPI_UINT8_MAX) {
-               ACPI_REPORT_ERROR(("Method reached maximum reentrancy limit (255)\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Method reached maximum reentrancy limit (255)"));
                return_ACPI_STATUS(AE_AML_METHOD_LIMIT);
        }
 
@@ -539,22 +471,61 @@ void acpi_ds_terminate_control_method(struct acpi_walk_state *walk_state)
                    acpi_os_signal_semaphore(walk_state->method_desc->method.
                                             semaphore, 1);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_ERROR(("Could not signal method semaphore\n"));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not signal method semaphore"));
 
                        /* Ignore error and continue cleanup */
                }
        }
 
+       /*
+        * There are no more threads executing this method.  Perform
+        * additional cleanup.
+        *
+        * The method Node is stored in the walk state
+        */
+       method_node = walk_state->method_node;
+
+       /* Lock namespace for possible update */
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+       if (ACPI_FAILURE(status)) {
+               goto exit;
+       }
+
+       /*
+        * Delete any namespace entries created immediately underneath
+        * the method
+        */
+       if (method_node->child) {
+               acpi_ns_delete_namespace_subtree(method_node);
+       }
+
+       /*
+        * Delete any namespace entries created anywhere else within
+        * the namespace by the execution of this method
+        */
+       acpi_ns_delete_namespace_by_owner(walk_state->method_desc->method.
+                                         owner_id);
+       status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+
+       /* Are there any other threads currently executing this method? */
+
        if (walk_state->method_desc->method.thread_count) {
+               /*
+                * Additional threads. Do not release the owner_id in this case,
+                * we immediately reuse it for the next thread executing this method
+                */
                ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
-                                 "*** Not deleting method namespace, there are still %d threads\n",
+                                 "*** Completed execution of one thread, %d threads remaining\n",
                                  walk_state->method_desc->method.
                                  thread_count));
-       } else {                /* This is the last executing thread */
+       } else {
+               /* This is the only executing thread for this method */
 
                /*
                 * Support to dynamically change a method from not_serialized to
-                * Serialized if it appears that the method is written foolishly and
+                * Serialized if it appears that the method is incorrectly written and
                 * does not support multiple thread execution.  The best example of this
                 * is if such a method creates namespace objects and blocks.  A second
                 * 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)
                                                          semaphore);
                }
 
-               /*
-                * There are no more threads executing this method.  Perform
-                * additional cleanup.
-                *
-                * The method Node is stored in the walk state
-                */
-               method_node = walk_state->method_node;
-
-               /*
-                * Delete any namespace entries created immediately underneath
-                * the method
-                */
-               status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
-               if (ACPI_FAILURE(status)) {
-                       goto exit;
-               }
-
-               if (method_node->child) {
-                       acpi_ns_delete_namespace_subtree(method_node);
-               }
+               /* No more threads, we can free the owner_id */
 
-               /*
-                * Delete any namespace entries created anywhere else within
-                * the namespace
-                */
-               acpi_ns_delete_namespace_by_owner(walk_state->method_desc->
-                                                 method.owner_id);
-               status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
                acpi_ut_release_owner_id(&walk_state->method_desc->method.
                                         owner_id);
        }
@@ -606,3 +551,140 @@ void acpi_ds_terminate_control_method(struct acpi_walk_state *walk_state)
        (void)acpi_ut_release_mutex(ACPI_MTX_PARSER);
        return_VOID;
 }
+
+#ifdef ACPI_INIT_PARSE_METHODS
+       /*
+        * Note 11/2005: Removed this code to parse all methods during table
+        * load because it causes problems if there are any errors during the
+        * parse. Also, it seems like overkill and we probably don't want to
+        * abort a table load because of an issue with a single method.
+        */
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ds_parse_method
+ *
+ * PARAMETERS:  Node        - Method node
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Parse the AML that is associated with the method.
+ *
+ * MUTEX:       Assumes parser is locked
+ *
+ ******************************************************************************/
+
+acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node)
+{
+       acpi_status status;
+       union acpi_operand_object *obj_desc;
+       union acpi_parse_object *op;
+       struct acpi_walk_state *walk_state;
+
+       ACPI_FUNCTION_TRACE_PTR("ds_parse_method", node);
+
+       /* Parameter Validation */
+
+       if (!node) {
+               return_ACPI_STATUS(AE_NULL_ENTRY);
+       }
+
+       ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
+                         "**** Parsing [%4.4s] **** named_obj=%p\n",
+                         acpi_ut_get_node_name(node), node));
+
+       /* Extract the method object from the method Node */
+
+       obj_desc = acpi_ns_get_attached_object(node);
+       if (!obj_desc) {
+               return_ACPI_STATUS(AE_NULL_OBJECT);
+       }
+
+       /* Create a mutex for the method if there is a concurrency limit */
+
+       if ((obj_desc->method.concurrency != ACPI_INFINITE_CONCURRENCY) &&
+           (!obj_desc->method.semaphore)) {
+               status = acpi_os_create_semaphore(obj_desc->method.concurrency,
+                                                 obj_desc->method.concurrency,
+                                                 &obj_desc->method.semaphore);
+               if (ACPI_FAILURE(status)) {
+                       return_ACPI_STATUS(status);
+               }
+       }
+
+       /*
+        * Allocate a new parser op to be the root of the parsed
+        * method tree
+        */
+       op = acpi_ps_alloc_op(AML_METHOD_OP);
+       if (!op) {
+               return_ACPI_STATUS(AE_NO_MEMORY);
+       }
+
+       /* Init new op with the method name and pointer back to the Node */
+
+       acpi_ps_set_name(op, node->name.integer);
+       op->common.node = node;
+
+       /*
+        * Get a new owner_id for objects created by this method. Namespace
+        * objects (such as Operation Regions) can be created during the
+        * first pass parse.
+        */
+       status = acpi_ut_allocate_owner_id(&obj_desc->method.owner_id);
+       if (ACPI_FAILURE(status)) {
+               goto cleanup;
+       }
+
+       /* Create and initialize a new walk state */
+
+       walk_state =
+           acpi_ds_create_walk_state(obj_desc->method.owner_id, NULL, NULL,
+                                     NULL);
+       if (!walk_state) {
+               status = AE_NO_MEMORY;
+               goto cleanup2;
+       }
+
+       status = acpi_ds_init_aml_walk(walk_state, op, node,
+                                      obj_desc->method.aml_start,
+                                      obj_desc->method.aml_length, NULL, 1);
+       if (ACPI_FAILURE(status)) {
+               acpi_ds_delete_walk_state(walk_state);
+               goto cleanup2;
+       }
+
+       /*
+        * Parse the method, first pass
+        *
+        * The first pass load is where newly declared named objects are added into
+        * the namespace.  Actual evaluation of the named objects (what would be
+        * called a "second pass") happens during the actual execution of the
+        * method so that operands to the named objects can take on dynamic
+        * run-time values.
+        */
+       status = acpi_ps_parse_aml(walk_state);
+       if (ACPI_FAILURE(status)) {
+               goto cleanup2;
+       }
+
+       ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
+                         "**** [%4.4s] Parsed **** named_obj=%p Op=%p\n",
+                         acpi_ut_get_node_name(node), node, op));
+
+       /*
+        * Delete the parse tree. We simply re-parse the method for every
+        * execution since there isn't much overhead (compared to keeping lots
+        * of parse trees around)
+        */
+       acpi_ns_delete_namespace_subtree(node);
+       acpi_ns_delete_namespace_by_owner(obj_desc->method.owner_id);
+
+      cleanup2:
+       acpi_ut_release_owner_id(&obj_desc->method.owner_id);
+
+      cleanup:
+       acpi_ps_delete_parse_tree(op);
+       return_ACPI_STATUS(status);
+}
+#endif
index 4095ce70982bf3fcb1d852523ca25e4c99794b6d..c025674f938bd14a75b802d89357464ae7117650 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -260,9 +260,9 @@ acpi_ds_method_data_get_node(u16 opcode,
        case AML_LOCAL_OP:
 
                if (index > ACPI_METHOD_MAX_LOCAL) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Local index %d is invalid (max %d)\n",
-                                         index, ACPI_METHOD_MAX_LOCAL));
+                       ACPI_ERROR((AE_INFO,
+                                   "Local index %d is invalid (max %d)",
+                                   index, ACPI_METHOD_MAX_LOCAL));
                        return_ACPI_STATUS(AE_AML_INVALID_INDEX);
                }
 
@@ -274,9 +274,9 @@ acpi_ds_method_data_get_node(u16 opcode,
        case AML_ARG_OP:
 
                if (index > ACPI_METHOD_MAX_ARG) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Arg index %d is invalid (max %d)\n",
-                                         index, ACPI_METHOD_MAX_ARG));
+                       ACPI_ERROR((AE_INFO,
+                                   "Arg index %d is invalid (max %d)",
+                                   index, ACPI_METHOD_MAX_ARG));
                        return_ACPI_STATUS(AE_AML_INVALID_INDEX);
                }
 
@@ -286,8 +286,7 @@ acpi_ds_method_data_get_node(u16 opcode,
                break;
 
        default:
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Opcode %d is invalid\n",
-                                 opcode));
+               ACPI_ERROR((AE_INFO, "Opcode %d is invalid", opcode));
                return_ACPI_STATUS(AE_AML_BAD_OPCODE);
        }
 
@@ -378,8 +377,7 @@ acpi_ds_method_data_get_value(u16 opcode,
        /* Validate the object descriptor */
 
        if (!dest_desc) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Null object descriptor pointer\n"));
+               ACPI_ERROR((AE_INFO, "Null object descriptor pointer"));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
@@ -424,23 +422,24 @@ acpi_ds_method_data_get_value(u16 opcode,
                        switch (opcode) {
                        case AML_ARG_OP:
 
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Uninitialized Arg[%d] at node %p\n",
-                                                 index, node));
+                               ACPI_ERROR((AE_INFO,
+                                           "Uninitialized Arg[%d] at node %p",
+                                           index, node));
 
                                return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG);
 
                        case AML_LOCAL_OP:
 
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Uninitialized Local[%d] at node %p\n",
-                                                 index, node));
+                               ACPI_ERROR((AE_INFO,
+                                           "Uninitialized Local[%d] at node %p",
+                                           index, node));
 
                                return_ACPI_STATUS(AE_AML_UNINITIALIZED_LOCAL);
 
                        default:
-                               ACPI_REPORT_ERROR(("Not Arg/Local opcode: %X\n",
-                                                  opcode));
+                               ACPI_ERROR((AE_INFO,
+                                           "Not a Arg/Local opcode: %X",
+                                           opcode));
                                return_ACPI_STATUS(AE_AML_INTERNAL);
                        }
        }
index 8ac0cd93adb580b3e70c285bb0c99bf3452dd2d6..8b21f0f9e5177f3d82f9ea72b38ff772c75f972f 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -51,6 +51,7 @@
 #define _COMPONENT          ACPI_DISPATCHER
 ACPI_MODULE_NAME("dsobject")
 
+/* Local prototypes */
 static acpi_status
 acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
                              union acpi_parse_object *op,
@@ -85,7 +86,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
        *obj_desc_ptr = NULL;
        if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
                /*
-                * This is an named object reference.  If this name was
+                * This is a named object reference. If this name was
                 * previously looked up in the namespace, it was stored in this op.
                 * Otherwise, go ahead and look it up now
                 */
@@ -96,18 +97,48 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
                                                ACPI_IMODE_EXECUTE,
                                                ACPI_NS_SEARCH_PARENT |
                                                ACPI_NS_DONT_OPEN_SCOPE, NULL,
-                                               (struct acpi_namespace_node **)
-                                               &(op->common.node));
-
+                                               ACPI_CAST_INDIRECT_PTR(struct
+                                                                      acpi_namespace_node,
+                                                                      &(op->
+                                                                        common.
+                                                                        node)));
                        if (ACPI_FAILURE(status)) {
-                               ACPI_REPORT_NSERROR(op->common.value.string,
-                                                   status);
+                               /* Check if we are resolving a named reference within a package */
+
+                               if ((status == AE_NOT_FOUND)
+                                   && (acpi_gbl_enable_interpreter_slack)
+                                   &&
+                                   ((op->common.parent->common.aml_opcode ==
+                                     AML_PACKAGE_OP)
+                                    || (op->common.parent->common.aml_opcode ==
+                                        AML_VAR_PACKAGE_OP))) {
+                                       /*
+                                        * We didn't find the target and we are populating elements
+                                        * of a package - ignore if slack enabled. Some ASL code
+                                        * contains dangling invalid references in packages and
+                                        * expects that no exception will be issued. Leave the
+                                        * element as a null element. It cannot be used, but it
+                                        * can be overwritten by subsequent ASL code - this is
+                                        * typically the case.
+                                        */
+                                       ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                                         "Ignoring unresolved reference in package [%4.4s]\n",
+                                                         walk_state->
+                                                         scope_info->scope.
+                                                         node->name.ascii));
+
+                                       return_ACPI_STATUS(AE_OK);
+                               } else {
+                                       ACPI_ERROR_NAMESPACE(op->common.value.
+                                                            string, status);
+                               }
+
                                return_ACPI_STATUS(status);
                        }
                }
        }
 
-       /* Create and init the internal ACPI object */
+       /* Create and init a new internal ACPI object */
 
        obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info
                                                   (op->common.aml_opcode))->
@@ -157,13 +188,13 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
 
        ACPI_FUNCTION_TRACE("ds_build_internal_buffer_obj");
 
+       /*
+        * If we are evaluating a Named buffer object "Name (xxxx, Buffer)".
+        * The buffer object already exists (from the NS node), otherwise it must
+        * be created.
+        */
        obj_desc = *obj_desc_ptr;
-       if (obj_desc) {
-               /*
-                * We are evaluating a Named buffer object "Name (xxxx, Buffer)".
-                * The buffer object already exists (from the NS node)
-                */
-       } else {
+       if (!obj_desc) {
                /* Create a new buffer object */
 
                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,
        byte_list = arg->named.next;
        if (byte_list) {
                if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Expecting bytelist, got AML opcode %X in op %p\n",
-                                         byte_list->common.aml_opcode,
-                                         byte_list));
+                       ACPI_ERROR((AE_INFO,
+                                   "Expecting bytelist, got AML opcode %X in op %p",
+                                   byte_list->common.aml_opcode, byte_list));
 
                        acpi_ut_remove_reference(obj_desc);
                        return (AE_TYPE);
@@ -259,7 +289,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
        union acpi_operand_object *obj_desc = NULL;
        u32 package_list_length;
        acpi_status status = AE_OK;
-       u32 i;
+       acpi_native_uint i;
 
        ACPI_FUNCTION_TRACE("ds_build_internal_package_obj");
 
@@ -271,13 +301,12 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
                parent = parent->common.parent;
        }
 
+       /*
+        * If we are evaluating a Named package object "Name (xxxx, Package)",
+        * the package object already exists, otherwise it must be created.
+        */
        obj_desc = *obj_desc_ptr;
-       if (obj_desc) {
-               /*
-                * We are evaluating a Named package object "Name (xxxx, Package)".
-                * Get the existing package object from the NS node
-                */
-       } else {
+       if (!obj_desc) {
                obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
                *obj_desc_ptr = obj_desc;
                if (!obj_desc) {
@@ -291,11 +320,9 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
 
        /* Count the number of items in the package list */
 
-       package_list_length = 0;
        arg = op->common.value.arg;
        arg = arg->common.next;
-       while (arg) {
-               package_list_length++;
+       for (package_list_length = 0; arg; package_list_length++) {
                arg = arg->common.next;
        }
 
@@ -322,12 +349,11 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
        }
 
        /*
-        * Now init the elements of the package
+        * Initialize all elements of the package
         */
-       i = 0;
        arg = op->common.value.arg;
        arg = arg->common.next;
-       while (arg) {
+       for (i = 0; arg; i++) {
                if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
                        /* Object (package or buffer) is already built */
 
@@ -340,8 +366,6 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
                                                               package.
                                                               elements[i]);
                }
-
-               i++;
                arg = arg->common.next;
        }
 
@@ -518,9 +542,9 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
 
                        default:
 
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Unknown constant opcode %X\n",
-                                                 opcode));
+                               ACPI_ERROR((AE_INFO,
+                                           "Unknown constant opcode %X",
+                                           opcode));
                                status = AE_AML_OPERAND_TYPE;
                                break;
                        }
@@ -535,9 +559,8 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
                        break;
 
                default:
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Unknown Integer type %X\n",
-                                         op_info->type));
+                       ACPI_ERROR((AE_INFO, "Unknown Integer type %X",
+                                   op_info->type));
                        status = AE_AML_OPERAND_TYPE;
                        break;
                }
@@ -615,9 +638,8 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
 
        default:
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unimplemented data type: %X\n",
-                                 ACPI_GET_OBJECT_TYPE(obj_desc)));
+               ACPI_ERROR((AE_INFO, "Unimplemented data type: %X",
+                           ACPI_GET_OBJECT_TYPE(obj_desc)));
 
                status = AE_AML_OPERAND_TYPE;
                break;
index 939d167bf87b81eda9041c995950ae5674c11352..6229c10674e186c41bb690d58d8c80feff6da6b6 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        node = obj_desc->buffer.node;
        if (!node) {
-               ACPI_REPORT_ERROR(("No pointer back to NS node in buffer obj %p\n", obj_desc));
+               ACPI_ERROR((AE_INFO,
+                           "No pointer back to NS node in buffer obj %p",
+                           obj_desc));
                return_ACPI_STATUS(AE_AML_INTERNAL);
        }
 
@@ -287,8 +289,9 @@ acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc)
 
        node = obj_desc->package.node;
        if (!node) {
-               ACPI_REPORT_ERROR(("No pointer back to NS node in package %p\n",
-                                  obj_desc));
+               ACPI_ERROR((AE_INFO,
+                           "No pointer back to NS node in package %p",
+                           obj_desc));
                return_ACPI_STATUS(AE_AML_INTERNAL);
        }
 
@@ -413,9 +416,9 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
        /* Host object must be a Buffer */
 
        if (ACPI_GET_OBJECT_TYPE(buffer_desc) != ACPI_TYPE_BUFFER) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Target of Create Field is not a Buffer object - %s\n",
-                                 acpi_ut_get_object_type_name(buffer_desc)));
+               ACPI_ERROR((AE_INFO,
+                           "Target of Create Field is not a Buffer object - %s",
+                           acpi_ut_get_object_type_name(buffer_desc)));
 
                status = AE_AML_OPERAND_TYPE;
                goto cleanup;
@@ -427,10 +430,10 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
         * after resolution in acpi_ex_resolve_operands().
         */
        if (ACPI_GET_DESCRIPTOR_TYPE(result_desc) != ACPI_DESC_TYPE_NAMED) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "(%s) destination not a NS Node [%s]\n",
-                                 acpi_ps_get_opcode_name(aml_opcode),
-                                 acpi_ut_get_descriptor_name(result_desc)));
+               ACPI_ERROR((AE_INFO,
+                           "(%s) destination not a NS Node [%s]",
+                           acpi_ps_get_opcode_name(aml_opcode),
+                           acpi_ut_get_descriptor_name(result_desc)));
 
                status = AE_AML_OPERAND_TYPE;
                goto cleanup;
@@ -453,8 +456,8 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
                /* Must have a valid (>0) bit count */
 
                if (bit_count == 0) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Attempt to create_field of length 0\n"));
+                       ACPI_ERROR((AE_INFO,
+                                   "Attempt to create_field of length zero"));
                        status = AE_AML_OPERAND_VALUE;
                        goto cleanup;
                }
@@ -507,9 +510,8 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
 
        default:
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unknown field creation opcode %02x\n",
-                                 aml_opcode));
+               ACPI_ERROR((AE_INFO,
+                           "Unknown field creation opcode %02x", aml_opcode));
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
@@ -517,13 +519,12 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
        /* Entire field must fit within the current length of the buffer */
 
        if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n",
-                                 acpi_ut_get_node_name(result_desc),
-                                 bit_offset + bit_count,
-                                 acpi_ut_get_node_name(buffer_desc->buffer.
-                                                       node),
-                                 8 * (u32) buffer_desc->buffer.length));
+               ACPI_ERROR((AE_INFO,
+                           "Field [%4.4s] at %d exceeds Buffer [%4.4s] size %d (bits)",
+                           acpi_ut_get_node_name(result_desc),
+                           bit_offset + bit_count,
+                           acpi_ut_get_node_name(buffer_desc->buffer.node),
+                           8 * (u32) buffer_desc->buffer.length));
                status = AE_AML_BUFFER_LIMIT;
                goto cleanup;
        }
@@ -629,9 +630,9 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state,
                           "after acpi_ex_resolve_operands");
 
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "(%s) bad operand(s) (%X)\n",
-                                 acpi_ps_get_opcode_name(op->common.
-                                                         aml_opcode), status));
+               ACPI_ERROR((AE_INFO, "(%s) bad operand(s) (%X)",
+                           acpi_ps_get_opcode_name(op->common.aml_opcode),
+                           status));
 
                return_ACPI_STATUS(status);
        }
@@ -1155,9 +1156,8 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
 
        default:
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unknown control opcode=%X Op=%p\n",
-                                 op->common.aml_opcode, op));
+               ACPI_ERROR((AE_INFO, "Unknown control opcode=%X Op=%p",
+                           op->common.aml_opcode, op));
 
                status = AE_AML_BAD_OPCODE;
                break;
index 83ae1c1aa28668ff8b931ac4e0837233b9a7901e..53356a591ac19da2e7881fc81c0d9431920318b2 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        /* Must have both an Op and a Result Object */
 
        if (!op) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null Op\n"));
-               return_VALUE(TRUE);
+               ACPI_ERROR((AE_INFO, "Null Op"));
+               return_UINT8(TRUE);
        }
 
        /*
@@ -208,7 +208,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
                                  "At Method level, result of [%s] not used\n",
                                  acpi_ps_get_opcode_name(op->common.
                                                          aml_opcode)));
-               return_VALUE(FALSE);
+               return_UINT8(FALSE);
        }
 
        /* 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,
        parent_info =
            acpi_ps_get_opcode_info(op->common.parent->common.aml_opcode);
        if (parent_info->class == AML_CLASS_UNKNOWN) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unknown parent opcode. Op=%p\n", op));
-               return_VALUE(FALSE);
+               ACPI_ERROR((AE_INFO, "Unknown parent opcode Op=%p", op));
+               return_UINT8(FALSE);
        }
 
        /*
@@ -304,7 +303,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
                          acpi_ps_get_opcode_name(op->common.parent->common.
                                                  aml_opcode), op));
 
-       return_VALUE(TRUE);
+       return_UINT8(TRUE);
 
       result_not_used:
        ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
@@ -313,7 +312,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
                          acpi_ps_get_opcode_name(op->common.parent->common.
                                                  aml_opcode), op));
 
-       return_VALUE(FALSE);
+       return_UINT8(FALSE);
 }
 
 /*******************************************************************************
@@ -344,7 +343,7 @@ acpi_ds_delete_result_if_not_used(union acpi_parse_object *op,
        ACPI_FUNCTION_TRACE_PTR("ds_delete_result_if_not_used", result_obj);
 
        if (!op) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null Op\n"));
+               ACPI_ERROR((AE_INFO, "Null Op"));
                return_VOID;
        }
 
@@ -567,7 +566,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                        }
 
                        if (ACPI_FAILURE(status)) {
-                               ACPI_REPORT_NSERROR(name_string, status);
+                               ACPI_ERROR_NAMESPACE(name_string, status);
                        }
                }
 
@@ -616,7 +615,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
 
                if (op_info->flags & AML_HAS_RETVAL) {
                        ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
-                                         "Argument previously created, already stacked \n"));
+                                         "Argument previously created, already stacked\n"));
 
                        ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object
                                           (walk_state->
@@ -635,10 +634,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                                 * Only error is underflow, and this indicates
                                 * a missing or null operand!
                                 */
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Missing or null operand, %s\n",
-                                                 acpi_format_exception
-                                                 (status)));
+                               ACPI_EXCEPTION((AE_INFO, status,
+                                               "Missing or null operand"));
                                return_ACPI_STATUS(status);
                        }
                } else {
@@ -730,7 +727,7 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state,
         */
        (void)acpi_ds_obj_stack_pop_and_delete(arg_count, walk_state);
 
-       ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "While creating Arg %d - %s\n",
-                         (arg_count + 1), acpi_format_exception(status)));
+       ACPI_EXCEPTION((AE_INFO, status, "While creating Arg %d",
+                       (arg_count + 1)));
        return_ACPI_STATUS(status);
 }
index e522763bb692aeacdb568a51a3e1a2fe7b73a213..f1af655ff11350dc82ebdd77eb03fcbc6b2666ab 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        if (result_obj) {
                status = acpi_ds_result_pop(&obj_desc, walk_state);
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Could not get result from predicate evaluation, %s\n",
-                                         acpi_format_exception(status)));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Could not get result from predicate evaluation"));
 
                        return_ACPI_STATUS(status);
                }
@@ -123,9 +122,9 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
        }
 
        if (!obj_desc) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "No predicate obj_desc=%p State=%p\n",
-                                 obj_desc, walk_state));
+               ACPI_ERROR((AE_INFO,
+                           "No predicate obj_desc=%p State=%p",
+                           obj_desc, walk_state));
 
                return_ACPI_STATUS(AE_AML_NO_OPERAND);
        }
@@ -140,10 +139,10 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
        }
 
        if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Bad predicate (not an integer) obj_desc=%p State=%p Type=%X\n",
-                                 obj_desc, walk_state,
-                                 ACPI_GET_OBJECT_TYPE(obj_desc)));
+               ACPI_ERROR((AE_INFO,
+                           "Bad predicate (not an integer) obj_desc=%p State=%p Type=%X",
+                           obj_desc, walk_state,
+                           ACPI_GET_OBJECT_TYPE(obj_desc)));
 
                status = AE_AML_OPERAND_TYPE;
                goto cleanup;
@@ -314,12 +313,13 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
 
        case AML_CLASS_EXECUTE:
        case AML_CLASS_CREATE:
-
                /*
                 * Most operators with arguments.
                 * Start a new result/operand state
                 */
-               status = acpi_ds_result_stack_push(walk_state);
+               if (walk_state->opcode != AML_CREATE_FIELD_OP) {
+                       status = acpi_ds_result_stack_push(walk_state);
+               }
                break;
 
        default:
@@ -361,8 +361,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
        op_class = walk_state->op_info->class;
 
        if (op_class == AML_CLASS_UNKNOWN) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown opcode %X\n",
-                                 op->common.aml_opcode));
+               ACPI_ERROR((AE_INFO, "Unknown opcode %X",
+                           op->common.aml_opcode));
                return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
        }
 
@@ -452,12 +452,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
                                walk_state->operands[1]->reference.offset)) {
                                status = AE_OK;
                        } else {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "[%s]: Could not resolve operands, %s\n",
-                                                 acpi_ps_get_opcode_name
-                                                 (walk_state->opcode),
-                                                 acpi_format_exception
-                                                 (status)));
+                               ACPI_EXCEPTION((AE_INFO, status,
+                                               "While resolving operands for [%s]",
+                                               acpi_ps_get_opcode_name
+                                               (walk_state->opcode)));
                        }
                }
 
@@ -676,8 +674,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
 
                case AML_TYPE_UNDEFINED:
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Undefined opcode type Op=%p\n", op));
+                       ACPI_ERROR((AE_INFO,
+                                   "Undefined opcode type Op=%p", op));
                        return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
 
                case AML_TYPE_BOGUS:
@@ -689,10 +687,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
 
                default:
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p\n",
-                                         op_class, op_type,
-                                         op->common.aml_opcode, op));
+                       ACPI_ERROR((AE_INFO,
+                                   "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p",
+                                   op_class, op_type, op->common.aml_opcode,
+                                   op));
 
                        status = AE_NOT_IMPLEMENTED;
                        break;
@@ -723,20 +721,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
 
       cleanup:
 
-       /* Invoke exception handler on error */
-
-       if (ACPI_FAILURE(status) &&
-           acpi_gbl_exception_handler && !(status & AE_CODE_CONTROL)) {
-               acpi_ex_exit_interpreter();
-               status = acpi_gbl_exception_handler(status,
-                                                   walk_state->method_node->
-                                                   name.integer,
-                                                   walk_state->opcode,
-                                                   walk_state->aml_offset,
-                                                   NULL);
-               (void)acpi_ex_enter_interpreter();
-       }
-
        if (walk_state->result_obj) {
                /* Break to debugger to display result */
 
@@ -758,18 +742,14 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
        }
 #endif
 
-       /* Always clear the object stack */
-
-       walk_state->num_operands = 0;
-
-#ifdef ACPI_DISASSEMBLER
-
-       /* On error, display method locals/args */
+       /* Invoke exception handler on error */
 
        if (ACPI_FAILURE(status)) {
-               acpi_dm_dump_method_info(status, walk_state, op);
+               status = acpi_ds_method_error(status, walk_state);
        }
-#endif
 
+       /* Always clear the object stack */
+
+       walk_state->num_operands = 0;
        return_ACPI_STATUS(status);
 }
index 411731261c2986b2c19e01104bd0e48e89be6131..d3d24da31c814db68766a705c9eb210dfa95a7ba 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        char *path;
        u32 flags;
 
-       ACPI_FUNCTION_NAME("ds_load1_begin_op");
+       ACPI_FUNCTION_TRACE("ds_load1_begin_op");
 
        op = walk_state->op;
        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,
        if (op) {
                if (!(walk_state->op_info->flags & AML_NAMED)) {
                        *out_op = op;
-                       return (AE_OK);
+                       return_ACPI_STATUS(AE_OK);
                }
 
                /* Check if this object has already been installed in the namespace */
 
                if (op->common.node) {
                        *out_op = op;
-                       return (AE_OK);
+                       return_ACPI_STATUS(AE_OK);
                }
        }
 
@@ -187,8 +187,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
                }
 #endif
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_NSERROR(path, status);
-                       return (status);
+                       ACPI_ERROR_NAMESPACE(path, status);
+                       return_ACPI_STATUS(status);
                }
 
                /*
@@ -233,9 +233,11 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
 
                        /* All other types are an error */
 
-                       ACPI_REPORT_ERROR(("Invalid type (%s) for target of Scope operator [%4.4s] (Cannot override)\n", acpi_ut_get_type_name(node->type), path));
+                       ACPI_ERROR((AE_INFO,
+                                   "Invalid type (%s) for target of Scope operator [%4.4s] (Cannot override)",
+                                   acpi_ut_get_type_name(node->type), path));
 
-                       return (AE_AML_OPERAND_TYPE);
+                       return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
                break;
 
@@ -257,6 +259,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
                 *       buffer_field, or Package), the name of the object is already
                 *       in the namespace.
                 */
+
                if (walk_state->deferred_node) {
                        /* This name is already in the namespace, get the node */
 
@@ -265,6 +268,16 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
                        break;
                }
 
+               /*
+                * If we are executing a method, do not create any namespace objects
+                * during the load phase, only during execution.
+                */
+               if (walk_state->method_node) {
+                       node = NULL;
+                       status = AE_OK;
+                       break;
+               }
+
                flags = ACPI_NS_NO_UPSEARCH;
                if ((walk_state->opcode != AML_SCOPE_OP) &&
                    (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) {
@@ -289,8 +302,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
                                   ACPI_IMODE_LOAD_PASS1, flags, walk_state,
                                   &(node));
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_NSERROR(path, status);
-                       return (status);
+                       ACPI_ERROR_NAMESPACE(path, status);
+                       return_ACPI_STATUS(status);
                }
                break;
        }
@@ -302,28 +315,29 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
 
                op = acpi_ps_alloc_op(walk_state->opcode);
                if (!op) {
-                       return (AE_NO_MEMORY);
+                       return_ACPI_STATUS(AE_NO_MEMORY);
                }
        }
 
-       /* Initialize */
-
-       op->named.name = node->name.integer;
+       /* Initialize the op */
 
 #if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))
-       op->named.path = (u8 *) path;
+       op->named.path = ACPI_CAST_PTR(u8, path);
 #endif
 
-       /*
-        * Put the Node in the "op" object that the parser uses, so we
-        * can get it again quickly when this scope is closed
-        */
-       op->common.node = node;
+       if (node) {
+               /*
+                * Put the Node in the "op" object that the parser uses, so we
+                * can get it again quickly when this scope is closed
+                */
+               op->common.node = node;
+               op->named.name = node->name.integer;
+       }
+
        acpi_ps_append_arg(acpi_ps_get_parent_scope(&walk_state->parser_state),
                           op);
-
        *out_op = op;
-       return (status);
+       return_ACPI_STATUS(status);
 }
 
 /*******************************************************************************
@@ -339,13 +353,13 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
  *
  ******************************************************************************/
 
-acpi_status acpi_ds_load1_end_op(struct acpi_walk_state * walk_state)
+acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
 {
        union acpi_parse_object *op;
        acpi_object_type object_type;
        acpi_status status = AE_OK;
 
-       ACPI_FUNCTION_NAME("ds_load1_end_op");
+       ACPI_FUNCTION_TRACE("ds_load1_end_op");
 
        op = walk_state->op;
        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)
        /* We are only interested in opcodes that have an associated name */
 
        if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) {
-               return (AE_OK);
+               return_ACPI_STATUS(AE_OK);
        }
 
        /* 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)
 
 #ifndef ACPI_NO_METHOD_EXECUTION
        if (walk_state->op_info->flags & AML_FIELD) {
-               if (walk_state->opcode == AML_FIELD_OP ||
-                   walk_state->opcode == AML_BANK_FIELD_OP ||
-                   walk_state->opcode == AML_INDEX_FIELD_OP) {
-                       status = acpi_ds_init_field_objects(op, walk_state);
+               /*
+                * If we are executing a method, do not create any namespace objects
+                * during the load phase, only during execution.
+                */
+               if (!walk_state->method_node) {
+                       if (walk_state->opcode == AML_FIELD_OP ||
+                           walk_state->opcode == AML_BANK_FIELD_OP ||
+                           walk_state->opcode == AML_INDEX_FIELD_OP) {
+                               status =
+                                   acpi_ds_init_field_objects(op, walk_state);
+                       }
                }
-               return (status);
+               return_ACPI_STATUS(status);
        }
 
-       if (op->common.aml_opcode == AML_REGION_OP) {
-               status = acpi_ex_create_region(op->named.data, op->named.length,
-                                              (acpi_adr_space_type)
-                                              ((op->common.value.arg)->common.
-                                               value.integer), walk_state);
-               if (ACPI_FAILURE(status)) {
-                       return (status);
+       /*
+        * If we are executing a method, do not create any namespace objects
+        * during the load phase, only during execution.
+        */
+       if (!walk_state->method_node) {
+               if (op->common.aml_opcode == AML_REGION_OP) {
+                       status =
+                           acpi_ex_create_region(op->named.data,
+                                                 op->named.length,
+                                                 (acpi_adr_space_type)
+                                                 ((op->common.value.arg)->
+                                                  common.value.integer),
+                                                 walk_state);
+                       if (ACPI_FAILURE(status)) {
+                               return_ACPI_STATUS(status);
+                       }
                }
        }
 #endif
@@ -391,47 +421,63 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state * walk_state)
                                                               common.
                                                               aml_opcode))->
                            object_type;
-                       op->common.node->type = (u8) object_type;
+
+                       /* Set node type if we have a namespace node */
+
+                       if (op->common.node) {
+                               op->common.node->type = (u8) object_type;
+                       }
                }
        }
 
-       if (op->common.aml_opcode == AML_METHOD_OP) {
-               /*
-                * method_op pkg_length name_string method_flags term_list
-                *
-                * Note: We must create the method node/object pair as soon as we
-                * see the method declaration.  This allows later pass1 parsing
-                * of invocations of the method (need to know the number of
-                * arguments.)
-                */
-               ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
-                                 "LOADING-Method: State=%p Op=%p named_obj=%p\n",
-                                 walk_state, op, op->named.node));
+       /*
+        * If we are executing a method, do not create any namespace objects
+        * during the load phase, only during execution.
+        */
+       if (!walk_state->method_node) {
+               if (op->common.aml_opcode == AML_METHOD_OP) {
+                       /*
+                        * method_op pkg_length name_string method_flags term_list
+                        *
+                        * Note: We must create the method node/object pair as soon as we
+                        * see the method declaration.  This allows later pass1 parsing
+                        * of invocations of the method (need to know the number of
+                        * arguments.)
+                        */
+                       ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
+                                         "LOADING-Method: State=%p Op=%p named_obj=%p\n",
+                                         walk_state, op, op->named.node));
 
-               if (!acpi_ns_get_attached_object(op->named.node)) {
-                       walk_state->operands[0] = (void *)op->named.node;
-                       walk_state->num_operands = 1;
+                       if (!acpi_ns_get_attached_object(op->named.node)) {
+                               walk_state->operands[0] =
+                                   ACPI_CAST_PTR(void, op->named.node);
+                               walk_state->num_operands = 1;
 
-                       status =
-                           acpi_ds_create_operands(walk_state,
-                                                   op->common.value.arg);
-                       if (ACPI_SUCCESS(status)) {
-                               status = acpi_ex_create_method(op->named.data,
-                                                              op->named.length,
-                                                              walk_state);
-                       }
-                       walk_state->operands[0] = NULL;
-                       walk_state->num_operands = 0;
+                               status =
+                                   acpi_ds_create_operands(walk_state,
+                                                           op->common.value.
+                                                           arg);
+                               if (ACPI_SUCCESS(status)) {
+                                       status =
+                                           acpi_ex_create_method(op->named.
+                                                                 data,
+                                                                 op->named.
+                                                                 length,
+                                                                 walk_state);
+                               }
+                               walk_state->operands[0] = NULL;
+                               walk_state->num_operands = 0;
 
-                       if (ACPI_FAILURE(status)) {
-                               return (status);
+                               if (ACPI_FAILURE(status)) {
+                                       return_ACPI_STATUS(status);
+                               }
                        }
                }
        }
 
-       /* Pop the scope stack */
+       /* Pop the scope stack (only if loading a table) */
 
-       if (acpi_ns_opens_scope(object_type)) {
+       if (!walk_state->method_node && acpi_ns_opens_scope(object_type)) {
                ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
                                  "(%s): Popping scope for Op %p\n",
                                  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)
                status = acpi_ds_scope_stack_pop(walk_state);
        }
 
-       return (status);
+       return_ACPI_STATUS(status);
 }
 
 /*******************************************************************************
@@ -456,8 +502,8 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state * walk_state)
  ******************************************************************************/
 
 acpi_status
-acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state,
-                      union acpi_parse_object ** out_op)
+acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
+                      union acpi_parse_object **out_op)
 {
        union acpi_parse_object *op;
        struct acpi_namespace_node *node;
@@ -574,10 +620,10 @@ acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state,
                        if (status == AE_NOT_FOUND) {
                                status = AE_OK;
                        } else {
-                               ACPI_REPORT_NSERROR(buffer_ptr, status);
+                               ACPI_ERROR_NAMESPACE(buffer_ptr, status);
                        }
 #else
-                       ACPI_REPORT_NSERROR(buffer_ptr, status);
+                       ACPI_ERROR_NAMESPACE(buffer_ptr, status);
 #endif
                        return_ACPI_STATUS(status);
                }
@@ -607,7 +653,10 @@ acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state,
                         *  Scope (DEB) { ... }
                         */
 
-                       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)));
+                       ACPI_WARNING((AE_INFO,
+                                     "Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)",
+                                     buffer_ptr,
+                                     acpi_ut_get_type_name(node->type)));
 
                        node->type = ACPI_TYPE_ANY;
                        walk_state->scope_info->common.value = ACPI_TYPE_ANY;
@@ -617,7 +666,10 @@ acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state,
 
                        /* All other types are an error */
 
-                       ACPI_REPORT_ERROR(("Invalid type (%s) for target of Scope operator [%4.4s]\n", acpi_ut_get_type_name(node->type), buffer_ptr));
+                       ACPI_ERROR((AE_INFO,
+                                   "Invalid type (%s) for target of Scope operator [%4.4s]",
+                                   acpi_ut_get_type_name(node->type),
+                                   buffer_ptr));
 
                        return (AE_AML_OPERAND_TYPE);
                }
@@ -670,7 +722,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state * walk_state,
        }
 
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_NSERROR(buffer_ptr, status);
+               ACPI_ERROR_NAMESPACE(buffer_ptr, status);
                return_ACPI_STATUS(status);
        }
 
@@ -840,6 +892,13 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
 
        case AML_TYPE_NAMED_FIELD:
 
+               /*
+                * If we are executing a method, initialize the field
+                */
+               if (walk_state->method_node) {
+                       status = acpi_ds_init_field_objects(op, walk_state);
+               }
+
                switch (op->common.aml_opcode) {
                case AML_INDEX_FIELD_OP:
 
@@ -929,6 +988,24 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
                switch (op->common.aml_opcode) {
 #ifndef ACPI_NO_METHOD_EXECUTION
                case AML_REGION_OP:
+
+                       /*
+                        * If we are executing a method, initialize the region
+                        */
+                       if (walk_state->method_node) {
+                               status =
+                                   acpi_ex_create_region(op->named.data,
+                                                         op->named.length,
+                                                         (acpi_adr_space_type)
+                                                         ((op->common.value.
+                                                           arg)->common.value.
+                                                          integer),
+                                                         walk_state);
+                               if (ACPI_FAILURE(status)) {
+                                       return (status);
+                               }
+                       }
+
                        /*
                         * The op_region is not fully parsed at this time. Only valid
                         * 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)
 
                        status = acpi_ds_create_node(walk_state, node, op);
                        break;
+
+               case AML_METHOD_OP:
+                       /*
+                        * method_op pkg_length name_string method_flags term_list
+                        *
+                        * Note: We must create the method node/object pair as soon as we
+                        * see the method declaration.  This allows later pass1 parsing
+                        * of invocations of the method (need to know the number of
+                        * arguments.)
+                        */
+                       ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
+                                         "LOADING-Method: State=%p Op=%p named_obj=%p\n",
+                                         walk_state, op, op->named.node));
+
+                       if (!acpi_ns_get_attached_object(op->named.node)) {
+                               walk_state->operands[0] =
+                                   ACPI_CAST_PTR(void, op->named.node);
+                               walk_state->num_operands = 1;
+
+                               status =
+                                   acpi_ds_create_operands(walk_state,
+                                                           op->common.value.
+                                                           arg);
+                               if (ACPI_SUCCESS(status)) {
+                                       status =
+                                           acpi_ex_create_method(op->named.
+                                                                 data,
+                                                                 op->named.
+                                                                 length,
+                                                                 walk_state);
+                               }
+                               walk_state->operands[0] = NULL;
+                               walk_state->num_operands = 0;
+
+                               if (ACPI_FAILURE(status)) {
+                                       return_ACPI_STATUS(status);
+                               }
+                       }
+                       break;
+
 #endif                         /* ACPI_NO_METHOD_EXECUTION */
 
                default:
                        /* All NAMED_COMPLEX opcodes must be handled above */
-                       /* Note: Method objects were already created in Pass 1 */
                        break;
                }
                break;
@@ -1004,7 +1120,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
                         */
                        op->common.node = new_node;
                } else {
-                       ACPI_REPORT_NSERROR(arg->common.value.string, status);
+                       ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
                }
                break;
 
index defe956ef7517ebc46a968dfe8d770bf9fa0f6ef..ada21ef4a1744d0c9e39aa0c16bdb7333b9e2e32 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        if (!node) {
                /* Invalid scope   */
 
-               ACPI_REPORT_ERROR(("ds_scope_stack_push: null scope passed\n"));
+               ACPI_ERROR((AE_INFO, "Null scope parameter"));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
        /* Make sure object type is valid */
 
        if (!acpi_ut_valid_object_type(type)) {
-               ACPI_REPORT_WARNING(("ds_scope_stack_push: Invalid object type: 0x%X\n", type));
+               ACPI_WARNING((AE_INFO, "Invalid object type: 0x%X", type));
        }
 
        /* Allocate a new scope object */
index 7d68a5aaf3c43bb6423b1d8a33dfdb54bc625840..fa78cb74ee367eb69ea4a359d681e1448ee146f5 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -92,26 +92,23 @@ acpi_ds_result_remove(union acpi_operand_object **object,
 
        state = walk_state->results;
        if (!state) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "No result object pushed! State=%p\n",
-                                 walk_state));
+               ACPI_ERROR((AE_INFO, "No result object pushed! State=%p",
+                           walk_state));
                return (AE_NOT_EXIST);
        }
 
        if (index >= ACPI_OBJ_MAX_OPERAND) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Index out of range: %X State=%p Num=%X\n",
-                                 index, walk_state,
-                                 state->results.num_results));
+               ACPI_ERROR((AE_INFO,
+                           "Index out of range: %X State=%p Num=%X",
+                           index, walk_state, state->results.num_results));
        }
 
        /* Check for a valid result object */
 
        if (!state->results.obj_desc[index]) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Null operand! State=%p #Ops=%X, Index=%X\n",
-                                 walk_state, state->results.num_results,
-                                 index));
+               ACPI_ERROR((AE_INFO,
+                           "Null operand! State=%p #Ops=%X, Index=%X",
+                           walk_state, state->results.num_results, index));
                return (AE_AML_NO_RETURN_VALUE);
        }
 
@@ -163,9 +160,8 @@ acpi_ds_result_pop(union acpi_operand_object ** object,
        }
 
        if (!state->results.num_results) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Result stack is empty! State=%p\n",
-                                 walk_state));
+               ACPI_ERROR((AE_INFO, "Result stack is empty! State=%p",
+                           walk_state));
                return (AE_AML_NO_RETURN_VALUE);
        }
 
@@ -192,8 +188,7 @@ acpi_ds_result_pop(union acpi_operand_object ** object,
                }
        }
 
-       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                         "No result objects! State=%p\n", walk_state));
+       ACPI_ERROR((AE_INFO, "No result objects! State=%p", walk_state));
        return (AE_AML_NO_RETURN_VALUE);
 }
 
@@ -222,15 +217,14 @@ acpi_ds_result_pop_from_bottom(union acpi_operand_object ** object,
 
        state = walk_state->results;
        if (!state) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Warning: No result object pushed! State=%p\n",
-                                 walk_state));
+               ACPI_ERROR((AE_INFO,
+                           "No result object pushed! State=%p", walk_state));
                return (AE_NOT_EXIST);
        }
 
        if (!state->results.num_results) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "No result objects! State=%p\n", walk_state));
+               ACPI_ERROR((AE_INFO, "No result objects! State=%p",
+                           walk_state));
                return (AE_AML_NO_RETURN_VALUE);
        }
 
@@ -250,10 +244,10 @@ acpi_ds_result_pop_from_bottom(union acpi_operand_object ** object,
        /* Check for a valid result object */
 
        if (!*object) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Null operand! State=%p #Ops=%X Index=%X\n",
-                                 walk_state, state->results.num_results,
-                                 (u32) index));
+               ACPI_ERROR((AE_INFO,
+                           "Null operand! State=%p #Ops=%X Index=%X",
+                           walk_state, state->results.num_results,
+                           (u32) index));
                return (AE_AML_NO_RETURN_VALUE);
        }
 
@@ -288,23 +282,21 @@ acpi_ds_result_push(union acpi_operand_object * object,
 
        state = walk_state->results;
        if (!state) {
-               ACPI_REPORT_ERROR(("No result stack frame during push\n"));
+               ACPI_ERROR((AE_INFO, "No result stack frame during push"));
                return (AE_AML_INTERNAL);
        }
 
        if (state->results.num_results == ACPI_OBJ_NUM_OPERANDS) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Result stack overflow: Obj=%p State=%p Num=%X\n",
-                                 object, walk_state,
-                                 state->results.num_results));
+               ACPI_ERROR((AE_INFO,
+                           "Result stack overflow: Obj=%p State=%p Num=%X",
+                           object, walk_state, state->results.num_results));
                return (AE_STACK_OVERFLOW);
        }
 
        if (!object) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Null Object! Obj=%p State=%p Num=%X\n",
-                                 object, walk_state,
-                                 state->results.num_results));
+               ACPI_ERROR((AE_INFO,
+                           "Null Object! Obj=%p State=%p Num=%X",
+                           object, walk_state, state->results.num_results));
                return (AE_BAD_PARAMETER);
        }
 
@@ -413,10 +405,9 @@ acpi_ds_obj_stack_push(void *object, struct acpi_walk_state * walk_state)
        /* Check for stack overflow */
 
        if (walk_state->num_operands >= ACPI_OBJ_NUM_OPERANDS) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "overflow! Obj=%p State=%p #Ops=%X\n",
-                                 object, walk_state,
-                                 walk_state->num_operands));
+               ACPI_ERROR((AE_INFO,
+                           "Object stack overflow! Obj=%p State=%p #Ops=%X",
+                           object, walk_state, walk_state->num_operands));
                return (AE_STACK_OVERFLOW);
        }
 
@@ -460,10 +451,10 @@ acpi_ds_obj_stack_pop(u32 pop_count, struct acpi_walk_state * walk_state)
                /* Check for stack underflow */
 
                if (walk_state->num_operands == 0) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Underflow! Count=%X State=%p #Ops=%X\n",
-                                         pop_count, walk_state,
-                                         walk_state->num_operands));
+                       ACPI_ERROR((AE_INFO,
+                                   "Object stack underflow! Count=%X State=%p #Ops=%X",
+                                   pop_count, walk_state,
+                                   walk_state->num_operands));
                        return (AE_STACK_UNDERFLOW);
                }
 
@@ -506,10 +497,10 @@ acpi_ds_obj_stack_pop_and_delete(u32 pop_count,
                /* Check for stack underflow */
 
                if (walk_state->num_operands == 0) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Underflow! Count=%X State=%p #Ops=%X\n",
-                                         pop_count, walk_state,
-                                         walk_state->num_operands));
+                       ACPI_ERROR((AE_INFO,
+                                   "Object stack underflow! Count=%X State=%p #Ops=%X",
+                                   pop_count, walk_state,
+                                   walk_state->num_operands));
                        return (AE_STACK_UNDERFLOW);
                }
 
@@ -826,16 +817,14 @@ void acpi_ds_delete_walk_state(struct acpi_walk_state *walk_state)
        }
 
        if (walk_state->data_type != ACPI_DESC_TYPE_WALK) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "%p is not a valid walk state\n",
-                                 walk_state));
+               ACPI_ERROR((AE_INFO, "%p is not a valid walk state",
+                           walk_state));
                return;
        }
 
        if (walk_state->parser_state.scope) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "%p walk still has a scope list\n",
-                                 walk_state));
+               ACPI_ERROR((AE_INFO, "%p walk still has a scope list",
+                           walk_state));
        }
 
        /* Always must free any linked control states */
@@ -894,25 +883,24 @@ acpi_ds_result_insert(void *object,
 
        state = walk_state->results;
        if (!state) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "No result object pushed! State=%p\n",
-                                 walk_state));
+               ACPI_ERROR((AE_INFO, "No result object pushed! State=%p",
+                           walk_state));
                return (AE_NOT_EXIST);
        }
 
        if (index >= ACPI_OBJ_NUM_OPERANDS) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Index out of range: %X Obj=%p State=%p Num=%X\n",
-                                 index, object, walk_state,
-                                 state->results.num_results));
+               ACPI_ERROR((AE_INFO,
+                           "Index out of range: %X Obj=%p State=%p Num=%X",
+                           index, object, walk_state,
+                           state->results.num_results));
                return (AE_BAD_PARAMETER);
        }
 
        if (!object) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Null Object! Index=%X Obj=%p State=%p Num=%X\n",
-                                 index, object, walk_state,
-                                 state->results.num_results));
+               ACPI_ERROR((AE_INFO,
+                           "Null Object! Index=%X Obj=%p State=%p Num=%X",
+                           index, object, walk_state,
+                           state->results.num_results));
                return (AE_BAD_PARAMETER);
        }
 
@@ -986,9 +974,9 @@ acpi_ds_obj_stack_pop_object(union acpi_operand_object **object,
        /* Check for stack underflow */
 
        if (walk_state->num_operands == 0) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Missing operand/stack empty! State=%p #Ops=%X\n",
-                                 walk_state, walk_state->num_operands));
+               ACPI_ERROR((AE_INFO,
+                           "Missing operand/stack empty! State=%p #Ops=%X",
+                           walk_state, walk_state->num_operands));
                *object = NULL;
                return (AE_AML_NO_OPERAND);
        }
@@ -1000,9 +988,9 @@ acpi_ds_obj_stack_pop_object(union acpi_operand_object **object,
        /* Check for a valid operand */
 
        if (!walk_state->operands[walk_state->num_operands]) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Null operand! State=%p #Ops=%X\n",
-                                 walk_state, walk_state->num_operands));
+               ACPI_ERROR((AE_INFO,
+                           "Null operand! State=%p #Ops=%X",
+                           walk_state, walk_state->num_operands));
                *object = NULL;
                return (AE_AML_NO_OPERAND);
        }
index 3758b558d2b5e9ad1b2905049ea090874f63876a..79b09d76c180204e488a924dc4827572a51d92f1 100644 (file)
@@ -60,20 +60,20 @@ ACPI_MODULE_NAME("acpi_ec")
 #define ACPI_EC_BURST_ENABLE   0x82
 #define ACPI_EC_BURST_DISABLE  0x83
 #define ACPI_EC_COMMAND_QUERY  0x84
-#define EC_POLLING             0xFF
-#define EC_BURST               0x00
+#define EC_POLL                        0xFF
+#define EC_INTR                        0x00
 static int acpi_ec_remove(struct acpi_device *device, int type);
 static int acpi_ec_start(struct acpi_device *device);
 static int acpi_ec_stop(struct acpi_device *device, int type);
-static int acpi_ec_burst_add(struct acpi_device *device);
-static int acpi_ec_polling_add(struct acpi_device *device);
+static int acpi_ec_intr_add(struct acpi_device *device);
+static int acpi_ec_poll_add(struct acpi_device *device);
 
 static struct acpi_driver acpi_ec_driver = {
        .name = ACPI_EC_DRIVER_NAME,
        .class = ACPI_EC_CLASS,
        .ids = ACPI_EC_HID,
        .ops = {
-               .add = acpi_ec_polling_add,
+               .add = acpi_ec_intr_add,
                .remove = acpi_ec_remove,
                .start = acpi_ec_start,
                .stop = acpi_ec_stop,
@@ -105,7 +105,7 @@ union acpi_ec {
                atomic_t pending_gpe;
                struct semaphore sem;
                wait_queue_head_t wait;
-       } burst;
+       } intr;
 
        struct {
                u32 mode;
@@ -117,37 +117,37 @@ union acpi_ec {
                struct acpi_generic_address data_addr;
                unsigned long global_lock;
                spinlock_t lock;
-       } polling;
+       } poll;
 };
 
-static int acpi_ec_polling_wait(union acpi_ec *ec, u8 event);
-static int acpi_ec_burst_wait(union acpi_ec *ec, unsigned int event);
-static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data);
-static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data);
-static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data);
-static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data);
-static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data);
-static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data);
-static void acpi_ec_gpe_polling_query(void *ec_cxt);
-static void acpi_ec_gpe_burst_query(void *ec_cxt);
-static u32 acpi_ec_gpe_polling_handler(void *data);
-static u32 acpi_ec_gpe_burst_handler(void *data);
+static int acpi_ec_poll_wait(union acpi_ec *ec, u8 event);
+static int acpi_ec_intr_wait(union acpi_ec *ec, unsigned int event);
+static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data);
+static int acpi_ec_intr_read(union acpi_ec *ec, u8 address, u32 * data);
+static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data);
+static int acpi_ec_intr_write(union acpi_ec *ec, u8 address, u8 data);
+static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data);
+static int acpi_ec_intr_query(union acpi_ec *ec, u32 * data);
+static void acpi_ec_gpe_poll_query(void *ec_cxt);
+static void acpi_ec_gpe_intr_query(void *ec_cxt);
+static u32 acpi_ec_gpe_poll_handler(void *data);
+static u32 acpi_ec_gpe_intr_handler(void *data);
 static acpi_status __init
-acpi_fake_ecdt_polling_callback(acpi_handle handle,
+acpi_fake_ecdt_poll_callback(acpi_handle handle,
                                u32 Level, void *context, void **retval);
 
 static acpi_status __init
-acpi_fake_ecdt_burst_callback(acpi_handle handle,
+acpi_fake_ecdt_intr_callback(acpi_handle handle,
                              u32 Level, void *context, void **retval);
 
-static int __init acpi_ec_polling_get_real_ecdt(void);
-static int __init acpi_ec_burst_get_real_ecdt(void);
+static int __init acpi_ec_poll_get_real_ecdt(void);
+static int __init acpi_ec_intr_get_real_ecdt(void);
 /* If we find an EC via the ECDT, we need to keep a ptr to its context */
 static union acpi_ec *ec_ecdt;
 
 /* External interfaces use first EC only, so remember */
 static struct acpi_device *first_ec;
-static int acpi_ec_polling_mode = EC_POLLING;
+static int acpi_ec_poll_mode = EC_INTR;
 
 /* --------------------------------------------------------------------------
                              Transaction Management
@@ -163,13 +163,13 @@ static u32 acpi_ec_read_status(union acpi_ec *ec)
 
 static int acpi_ec_wait(union acpi_ec *ec, u8 event)
 {
-       if (acpi_ec_polling_mode)
-               return acpi_ec_polling_wait(ec, event);
+       if (acpi_ec_poll_mode)
+               return acpi_ec_poll_wait(ec, event);
        else
-               return acpi_ec_burst_wait(ec, event);
+               return acpi_ec_intr_wait(ec, event);
 }
 
-static int acpi_ec_polling_wait(union acpi_ec *ec, u8 event)
+static int acpi_ec_poll_wait(union acpi_ec *ec, u8 event)
 {
        u32 acpi_ec_status = 0;
        u32 i = ACPI_EC_UDELAY_COUNT;
@@ -203,36 +203,31 @@ static int acpi_ec_polling_wait(union acpi_ec *ec, u8 event)
 
        return -ETIME;
 }
-static int acpi_ec_burst_wait(union acpi_ec *ec, unsigned int event)
+static int acpi_ec_intr_wait(union acpi_ec *ec, unsigned int event)
 {
        int result = 0;
 
        ACPI_FUNCTION_TRACE("acpi_ec_wait");
 
-       ec->burst.expect_event = event;
+       ec->intr.expect_event = event;
        smp_mb();
 
        switch (event) {
-       case ACPI_EC_EVENT_OBF:
-               if (acpi_ec_read_status(ec) & event) {
-                       ec->burst.expect_event = 0;
-                       return_VALUE(0);
-               }
-               break;
-
        case ACPI_EC_EVENT_IBE:
                if (~acpi_ec_read_status(ec) & event) {
-                       ec->burst.expect_event = 0;
+                       ec->intr.expect_event = 0;
                        return_VALUE(0);
                }
                break;
+       default:
+               break;
        }
 
-       result = wait_event_timeout(ec->burst.wait,
-                                   !ec->burst.expect_event,
+       result = wait_event_timeout(ec->intr.wait,
+                                   !ec->intr.expect_event,
                                    msecs_to_jiffies(ACPI_EC_DELAY));
 
-       ec->burst.expect_event = 0;
+       ec->intr.expect_event = 0;
        smp_mb();
 
        /*
@@ -255,7 +250,12 @@ static int acpi_ec_burst_wait(union acpi_ec *ec, unsigned int event)
        return_VALUE(-ETIME);
 }
 
-static int acpi_ec_enter_burst_mode(union acpi_ec *ec)
+#ifdef ACPI_FUTURE_USAGE
+/*
+ * Note: samsung nv5000 doesn't work with ec burst mode.
+ * http://bugzilla.kernel.org/show_bug.cgi?id=4980
+ */
+int acpi_ec_enter_burst_mode(union acpi_ec *ec)
 {
        u32 tmp = 0;
        int status = 0;
@@ -270,45 +270,56 @@ static int acpi_ec_enter_burst_mode(union acpi_ec *ec)
                acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE,
                                        &ec->common.command_addr);
                status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
-               if (status)
-                       return_VALUE(-EINVAL);
                acpi_hw_low_level_read(8, &tmp, &ec->common.data_addr);
                if (tmp != 0x90) {      /* Burst ACK byte */
                        return_VALUE(-EINVAL);
                }
        }
 
-       atomic_set(&ec->burst.leaving_burst, 0);
+       atomic_set(&ec->intr.leaving_burst, 0);
        return_VALUE(0);
       end:
-       printk("Error in acpi_ec_wait\n");
+       printk(KERN_WARNING PREFIX "Error in acpi_ec_wait\n");
        return_VALUE(-1);
 }
 
-static int acpi_ec_leave_burst_mode(union acpi_ec *ec)
+int acpi_ec_leave_burst_mode(union acpi_ec *ec)
 {
+       int status = 0;
 
        ACPI_FUNCTION_TRACE("acpi_ec_leave_burst_mode");
 
-       atomic_set(&ec->burst.leaving_burst, 1);
+       status = acpi_ec_read_status(ec);
+       if (status != -EINVAL && (status & ACPI_EC_FLAG_BURST)){
+               status = acpi_ec_wait(ec, ACPI_EC_FLAG_IBF);
+               if(status)
+                       goto end;
+               acpi_hw_low_level_write(8, ACPI_EC_BURST_DISABLE, &ec->common.command_addr);
+               acpi_ec_wait(ec, ACPI_EC_FLAG_IBF);
+       } 
+       atomic_set(&ec->intr.leaving_burst, 1);
        return_VALUE(0);
+end:
+       printk(KERN_WARNING PREFIX "leave burst_mode:error\n");
+       return_VALUE(-1);
 }
+#endif /* ACPI_FUTURE_USAGE */
 
 static int acpi_ec_read(union acpi_ec *ec, u8 address, u32 * data)
 {
-       if (acpi_ec_polling_mode)
-               return acpi_ec_polling_read(ec, address, data);
+       if (acpi_ec_poll_mode)
+               return acpi_ec_poll_read(ec, address, data);
        else
-               return acpi_ec_burst_read(ec, address, data);
+               return acpi_ec_intr_read(ec, address, data);
 }
 static int acpi_ec_write(union acpi_ec *ec, u8 address, u8 data)
 {
-       if (acpi_ec_polling_mode)
-               return acpi_ec_polling_write(ec, address, data);
+       if (acpi_ec_poll_mode)
+               return acpi_ec_poll_write(ec, address, data);
        else
-               return acpi_ec_burst_write(ec, address, data);
+               return acpi_ec_intr_write(ec, address, data);
 }
-static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
+static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data)
 {
        acpi_status status = AE_OK;
        int result = 0;
@@ -328,7 +339,7 @@ static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
                        return_VALUE(-ENODEV);
        }
 
-       spin_lock_irqsave(&ec->polling.lock, flags);
+       spin_lock_irqsave(&ec->poll.lock, flags);
 
        acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
                                &ec->common.command_addr);
@@ -347,7 +358,7 @@ static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
                          *data, address));
 
       end:
-       spin_unlock_irqrestore(&ec->polling.lock, flags);
+       spin_unlock_irqrestore(&ec->poll.lock, flags);
 
        if (ec->common.global_lock)
                acpi_release_global_lock(glk);
@@ -355,7 +366,7 @@ static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
        return_VALUE(result);
 }
 
-static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
+static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data)
 {
        int result = 0;
        acpi_status status = AE_OK;
@@ -373,7 +384,7 @@ static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
                        return_VALUE(-ENODEV);
        }
 
-       spin_lock_irqsave(&ec->polling.lock, flags);
+       spin_lock_irqsave(&ec->poll.lock, flags);
 
        acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
                                &ec->common.command_addr);
@@ -395,7 +406,7 @@ static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
                          data, address));
 
       end:
-       spin_unlock_irqrestore(&ec->polling.lock, flags);
+       spin_unlock_irqrestore(&ec->poll.lock, flags);
 
        if (ec->common.global_lock)
                acpi_release_global_lock(glk);
@@ -403,7 +414,7 @@ static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
        return_VALUE(result);
 }
 
-static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
+static int acpi_ec_intr_read(union acpi_ec *ec, u8 address, u32 * data)
 {
        int status = 0;
        u32 glk;
@@ -422,25 +433,24 @@ static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
        }
 
        WARN_ON(in_interrupt());
-       down(&ec->burst.sem);
+       down(&ec->intr.sem);
 
-       acpi_ec_enter_burst_mode(ec);
        status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
        if (status) {
-               printk("read EC, IB not empty\n");
+               printk(KERN_DEBUG PREFIX "read EC, IB not empty\n");
                goto end;
        }
        acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
                                &ec->common.command_addr);
        status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
        if (status) {
-               printk("read EC, IB not empty\n");
+               printk(KERN_DEBUG PREFIX "read EC, IB not empty\n");
        }
 
        acpi_hw_low_level_write(8, address, &ec->common.data_addr);
        status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
        if (status) {
-               printk("read EC, OB not full\n");
+               printk(KERN_DEBUG PREFIX "read EC, OB not full\n");
                goto end;
        }
        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)
                          *data, address));
 
       end:
-       acpi_ec_leave_burst_mode(ec);
-       up(&ec->burst.sem);
+       up(&ec->intr.sem);
 
        if (ec->common.global_lock)
                acpi_release_global_lock(glk);
@@ -457,7 +466,7 @@ static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
        return_VALUE(status);
 }
 
-static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data)
+static int acpi_ec_intr_write(union acpi_ec *ec, u8 address, u8 data)
 {
        int status = 0;
        u32 glk;
@@ -474,25 +483,23 @@ static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data)
        }
 
        WARN_ON(in_interrupt());
-       down(&ec->burst.sem);
-
-       acpi_ec_enter_burst_mode(ec);
+       down(&ec->intr.sem);
 
        status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
        if (status) {
-               printk("write EC, IB not empty\n");
+               printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
        }
        acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
                                &ec->common.command_addr);
        status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
        if (status) {
-               printk("write EC, IB not empty\n");
+               printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
        }
 
        acpi_hw_low_level_write(8, address, &ec->common.data_addr);
        status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
        if (status) {
-               printk("write EC, IB not empty\n");
+               printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
        }
 
        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)
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n",
                          data, address));
 
-       acpi_ec_leave_burst_mode(ec);
-       up(&ec->burst.sem);
+       up(&ec->intr.sem);
 
        if (ec->common.global_lock)
                acpi_release_global_lock(glk);
@@ -553,12 +559,12 @@ EXPORT_SYMBOL(ec_write);
 
 static int acpi_ec_query(union acpi_ec *ec, u32 * data)
 {
-       if (acpi_ec_polling_mode)
-               return acpi_ec_polling_query(ec, data);
+       if (acpi_ec_poll_mode)
+               return acpi_ec_poll_query(ec, data);
        else
-               return acpi_ec_burst_query(ec, data);
+               return acpi_ec_intr_query(ec, data);
 }
-static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data)
+static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data)
 {
        int result = 0;
        acpi_status status = AE_OK;
@@ -583,7 +589,7 @@ static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data)
         * Note that successful completion of the query causes the ACPI_EC_SCI
         * bit to be cleared (and thus clearing the interrupt source).
         */
-       spin_lock_irqsave(&ec->polling.lock, flags);
+       spin_lock_irqsave(&ec->poll.lock, flags);
 
        acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY,
                                &ec->common.command_addr);
@@ -596,14 +602,14 @@ static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data)
                result = -ENODATA;
 
       end:
-       spin_unlock_irqrestore(&ec->polling.lock, flags);
+       spin_unlock_irqrestore(&ec->poll.lock, flags);
 
        if (ec->common.global_lock)
                acpi_release_global_lock(glk);
 
        return_VALUE(result);
 }
-static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
+static int acpi_ec_intr_query(union acpi_ec *ec, u32 * data)
 {
        int status = 0;
        u32 glk;
@@ -620,11 +626,11 @@ static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
                        return_VALUE(-ENODEV);
        }
 
-       down(&ec->burst.sem);
+       down(&ec->intr.sem);
 
        status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
        if (status) {
-               printk("query EC, IB not empty\n");
+               printk(KERN_DEBUG PREFIX "query EC, IB not empty\n");
                goto end;
        }
        /*
@@ -636,7 +642,7 @@ static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
                                &ec->common.command_addr);
        status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
        if (status) {
-               printk("query EC, OB not full\n");
+               printk(KERN_DEBUG PREFIX "query EC, OB not full\n");
                goto end;
        }
 
@@ -645,7 +651,7 @@ static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
                status = -ENODATA;
 
       end:
-       up(&ec->burst.sem);
+       up(&ec->intr.sem);
 
        if (ec->common.global_lock)
                acpi_release_global_lock(glk);
@@ -664,13 +670,13 @@ union acpi_ec_query_data {
 
 static void acpi_ec_gpe_query(void *ec_cxt)
 {
-       if (acpi_ec_polling_mode)
-               acpi_ec_gpe_polling_query(ec_cxt);
+       if (acpi_ec_poll_mode)
+               acpi_ec_gpe_poll_query(ec_cxt);
        else
-               acpi_ec_gpe_burst_query(ec_cxt);
+               acpi_ec_gpe_intr_query(ec_cxt);
 }
 
-static void acpi_ec_gpe_polling_query(void *ec_cxt)
+static void acpi_ec_gpe_poll_query(void *ec_cxt)
 {
        union acpi_ec *ec = (union acpi_ec *)ec_cxt;
        u32 value = 0;
@@ -685,9 +691,9 @@ static void acpi_ec_gpe_polling_query(void *ec_cxt)
        if (!ec_cxt)
                goto end;
 
-       spin_lock_irqsave(&ec->polling.lock, flags);
+       spin_lock_irqsave(&ec->poll.lock, flags);
        acpi_hw_low_level_read(8, &value, &ec->common.command_addr);
-       spin_unlock_irqrestore(&ec->polling.lock, flags);
+       spin_unlock_irqrestore(&ec->poll.lock, flags);
 
        /* TBD: Implement asynch events!
         * 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)
       end:
        acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
 }
-static void acpi_ec_gpe_burst_query(void *ec_cxt)
+static void acpi_ec_gpe_intr_query(void *ec_cxt)
 {
        union acpi_ec *ec = (union acpi_ec *)ec_cxt;
        u32 value;
@@ -736,18 +742,18 @@ static void acpi_ec_gpe_burst_query(void *ec_cxt)
 
        acpi_evaluate_object(ec->common.handle, object_name, NULL, NULL);
       end:
-       atomic_dec(&ec->burst.pending_gpe);
+       atomic_dec(&ec->intr.pending_gpe);
        return;
 }
 
 static u32 acpi_ec_gpe_handler(void *data)
 {
-       if (acpi_ec_polling_mode)
-               return acpi_ec_gpe_polling_handler(data);
+       if (acpi_ec_poll_mode)
+               return acpi_ec_gpe_poll_handler(data);
        else
-               return acpi_ec_gpe_burst_handler(data);
+               return acpi_ec_gpe_intr_handler(data);
 }
-static u32 acpi_ec_gpe_polling_handler(void *data)
+static u32 acpi_ec_gpe_poll_handler(void *data)
 {
        acpi_status status = AE_OK;
        union acpi_ec *ec = (union acpi_ec *)data;
@@ -765,7 +771,7 @@ static u32 acpi_ec_gpe_polling_handler(void *data)
        else
                return ACPI_INTERRUPT_NOT_HANDLED;
 }
-static u32 acpi_ec_gpe_burst_handler(void *data)
+static u32 acpi_ec_gpe_intr_handler(void *data)
 {
        acpi_status status = AE_OK;
        u32 value;
@@ -777,22 +783,22 @@ static u32 acpi_ec_gpe_burst_handler(void *data)
        acpi_clear_gpe(NULL, ec->common.gpe_bit, ACPI_ISR);
        value = acpi_ec_read_status(ec);
 
-       switch (ec->burst.expect_event) {
+       switch (ec->intr.expect_event) {
        case ACPI_EC_EVENT_OBF:
                if (!(value & ACPI_EC_FLAG_OBF))
                        break;
        case ACPI_EC_EVENT_IBE:
                if ((value & ACPI_EC_FLAG_IBF))
                        break;
-               ec->burst.expect_event = 0;
-               wake_up(&ec->burst.wait);
+               ec->intr.expect_event = 0;
+               wake_up(&ec->intr.wait);
                return ACPI_INTERRUPT_HANDLED;
        default:
                break;
        }
 
        if (value & ACPI_EC_FLAG_SCI) {
-               atomic_add(1, &ec->burst.pending_gpe);
+               atomic_add(1, &ec->intr.pending_gpe);
                status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE,
                                                     acpi_ec_gpe_query, ec);
                return status == AE_OK ?
@@ -980,7 +986,7 @@ static int acpi_ec_remove_fs(struct acpi_device *device)
                                Driver Interface
    -------------------------------------------------------------------------- */
 
-static int acpi_ec_polling_add(struct acpi_device *device)
+static int acpi_ec_poll_add(struct acpi_device *device)
 {
        int result = 0;
        acpi_status status = AE_OK;
@@ -999,7 +1005,7 @@ static int acpi_ec_polling_add(struct acpi_device *device)
 
        ec->common.handle = device->handle;
        ec->common.uid = -1;
-       spin_lock_init(&ec->polling.lock);
+       spin_lock_init(&ec->poll.lock);
        strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
        strcpy(acpi_device_class(device), ACPI_EC_CLASS);
        acpi_driver_data(device) = ec;
@@ -1038,7 +1044,7 @@ static int acpi_ec_polling_add(struct acpi_device *device)
        if (result)
                goto end;
 
-       printk(KERN_INFO PREFIX "%s [%s] (gpe %d)\n",
+       printk(KERN_INFO PREFIX "%s [%s] (gpe %d) polling mode.\n",
               acpi_device_name(device), acpi_device_bid(device),
               (u32) ec->common.gpe_bit);
 
@@ -1051,7 +1057,7 @@ static int acpi_ec_polling_add(struct acpi_device *device)
 
        return_VALUE(result);
 }
-static int acpi_ec_burst_add(struct acpi_device *device)
+static int acpi_ec_intr_add(struct acpi_device *device)
 {
        int result = 0;
        acpi_status status = AE_OK;
@@ -1070,10 +1076,10 @@ static int acpi_ec_burst_add(struct acpi_device *device)
 
        ec->common.handle = device->handle;
        ec->common.uid = -1;
-       atomic_set(&ec->burst.pending_gpe, 0);
-       atomic_set(&ec->burst.leaving_burst, 1);
-       init_MUTEX(&ec->burst.sem);
-       init_waitqueue_head(&ec->burst.wait);
+       atomic_set(&ec->intr.pending_gpe, 0);
+       atomic_set(&ec->intr.leaving_burst, 1);
+       init_MUTEX(&ec->intr.sem);
+       init_waitqueue_head(&ec->intr.wait);
        strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
        strcpy(acpi_device_class(device), ACPI_EC_CLASS);
        acpi_driver_data(device) = ec;
@@ -1112,8 +1118,7 @@ static int acpi_ec_burst_add(struct acpi_device *device)
        if (result)
                goto end;
 
-       printk("burst-mode-ec-10-Aug\n");
-       printk(KERN_INFO PREFIX "%s [%s] (gpe %d)\n",
+       printk(KERN_INFO PREFIX "%s [%s] (gpe %d) interrupt mode.\n",
               acpi_device_name(device), acpi_device_bid(device),
               (u32) ec->common.gpe_bit);
 
@@ -1151,7 +1156,7 @@ acpi_ec_io_ports(struct acpi_resource *resource, void *context)
        union acpi_ec *ec = (union acpi_ec *)context;
        struct acpi_generic_address *addr;
 
-       if (resource->id != ACPI_RSTYPE_IO) {
+       if (resource->type != ACPI_RESOURCE_TYPE_IO) {
                return AE_OK;
        }
 
@@ -1171,7 +1176,7 @@ acpi_ec_io_ports(struct acpi_resource *resource, void *context)
        addr->address_space_id = ACPI_ADR_SPACE_SYSTEM_IO;
        addr->register_bit_width = 8;
        addr->register_bit_offset = 0;
-       addr->address = resource->data.io.min_base_address;
+       addr->address = resource->data.io.minimum;
 
        return AE_OK;
 }
@@ -1267,16 +1272,16 @@ acpi_fake_ecdt_callback(acpi_handle handle,
                        u32 Level, void *context, void **retval)
 {
 
-       if (acpi_ec_polling_mode)
-               return acpi_fake_ecdt_polling_callback(handle,
+       if (acpi_ec_poll_mode)
+               return acpi_fake_ecdt_poll_callback(handle,
                                                       Level, context, retval);
        else
-               return acpi_fake_ecdt_burst_callback(handle,
+               return acpi_fake_ecdt_intr_callback(handle,
                                                     Level, context, retval);
 }
 
 static acpi_status __init
-acpi_fake_ecdt_polling_callback(acpi_handle handle,
+acpi_fake_ecdt_poll_callback(acpi_handle handle,
                                u32 Level, void *context, void **retval)
 {
        acpi_status status;
@@ -1295,7 +1300,7 @@ acpi_fake_ecdt_polling_callback(acpi_handle handle,
                                  &ec_ecdt->common.gpe_bit);
        if (ACPI_FAILURE(status))
                return status;
-       spin_lock_init(&ec_ecdt->polling.lock);
+       spin_lock_init(&ec_ecdt->poll.lock);
        ec_ecdt->common.global_lock = TRUE;
        ec_ecdt->common.handle = handle;
 
@@ -1308,13 +1313,13 @@ acpi_fake_ecdt_polling_callback(acpi_handle handle,
 }
 
 static acpi_status __init
-acpi_fake_ecdt_burst_callback(acpi_handle handle,
+acpi_fake_ecdt_intr_callback(acpi_handle handle,
                              u32 Level, void *context, void **retval)
 {
        acpi_status status;
 
-       init_MUTEX(&ec_ecdt->burst.sem);
-       init_waitqueue_head(&ec_ecdt->burst.wait);
+       init_MUTEX(&ec_ecdt->intr.sem);
+       init_waitqueue_head(&ec_ecdt->intr.wait);
        status = acpi_walk_resources(handle, METHOD_NAME__CRS,
                                     acpi_ec_io_ports, ec_ecdt);
        if (ACPI_FAILURE(status))
@@ -1380,13 +1385,13 @@ static int __init acpi_ec_fake_ecdt(void)
 
 static int __init acpi_ec_get_real_ecdt(void)
 {
-       if (acpi_ec_polling_mode)
-               return acpi_ec_polling_get_real_ecdt();
+       if (acpi_ec_poll_mode)
+               return acpi_ec_poll_get_real_ecdt();
        else
-               return acpi_ec_burst_get_real_ecdt();
+               return acpi_ec_intr_get_real_ecdt();
 }
 
-static int __init acpi_ec_polling_get_real_ecdt(void)
+static int __init acpi_ec_poll_get_real_ecdt(void)
 {
        acpi_status status;
        struct acpi_table_ecdt *ecdt_ptr;
@@ -1411,7 +1416,7 @@ static int __init acpi_ec_polling_get_real_ecdt(void)
        ec_ecdt->common.status_addr = ecdt_ptr->ec_control;
        ec_ecdt->common.data_addr = ecdt_ptr->ec_data;
        ec_ecdt->common.gpe_bit = ecdt_ptr->gpe_bit;
-       spin_lock_init(&ec_ecdt->polling.lock);
+       spin_lock_init(&ec_ecdt->poll.lock);
        /* use the GL just to be safe */
        ec_ecdt->common.global_lock = TRUE;
        ec_ecdt->common.uid = ecdt_ptr->uid;
@@ -1431,7 +1436,7 @@ static int __init acpi_ec_polling_get_real_ecdt(void)
        return -ENODEV;
 }
 
-static int __init acpi_ec_burst_get_real_ecdt(void)
+static int __init acpi_ec_intr_get_real_ecdt(void)
 {
        acpi_status status;
        struct acpi_table_ecdt *ecdt_ptr;
@@ -1452,8 +1457,8 @@ static int __init acpi_ec_burst_get_real_ecdt(void)
                return -ENOMEM;
        memset(ec_ecdt, 0, sizeof(union acpi_ec));
 
-       init_MUTEX(&ec_ecdt->burst.sem);
-       init_waitqueue_head(&ec_ecdt->burst.wait);
+       init_MUTEX(&ec_ecdt->intr.sem);
+       init_waitqueue_head(&ec_ecdt->intr.wait);
        ec_ecdt->common.command_addr = ecdt_ptr->ec_control;
        ec_ecdt->common.status_addr = ecdt_ptr->ec_control;
        ec_ecdt->common.data_addr = ecdt_ptr->ec_data;
@@ -1571,22 +1576,22 @@ static int __init acpi_fake_ecdt_setup(char *str)
 }
 
 __setup("acpi_fake_ecdt", acpi_fake_ecdt_setup);
-static int __init acpi_ec_set_polling_mode(char *str)
+static int __init acpi_ec_set_intr_mode(char *str)
 {
-       int burst;
+       int intr;
 
-       if (!get_option(&str, &burst))
+       if (!get_option(&str, &intr))
                return 0;
 
-       if (burst) {
-               acpi_ec_polling_mode = EC_BURST;
-               acpi_ec_driver.ops.add = acpi_ec_burst_add;
+       if (intr) {
+               acpi_ec_poll_mode = EC_INTR;
+               acpi_ec_driver.ops.add = acpi_ec_intr_add;
        } else {
-               acpi_ec_polling_mode = EC_POLLING;
-               acpi_ec_driver.ops.add = acpi_ec_polling_add;
+               acpi_ec_poll_mode = EC_POLL;
+               acpi_ec_driver.ops.add = acpi_ec_poll_add;
        }
-       printk(KERN_INFO PREFIX "EC %s mode.\n", burst ? "burst" : "polling");
+       printk(KERN_INFO PREFIX "EC %s mode.\n", intr ? "interrupt" : "polling");
        return 0;
 }
 
-__setup("ec_burst=", acpi_ec_set_polling_mode);
+__setup("ec_intr=", acpi_ec_set_intr_mode);
index 842d1e3fb37b968c66ec45c8a6a5f9485d55df1a..c9ac05c4685fae95ff7a54322dafb293e11631f5 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -73,7 +73,7 @@ acpi_status acpi_ev_initialize_events(void)
        /* Make sure we have ACPI tables */
 
        if (!acpi_gbl_DSDT) {
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN, "No ACPI tables present!\n"));
+               ACPI_WARNING((AE_INFO, "No ACPI tables present!"));
                return_ACPI_STATUS(AE_NO_ACPI_TABLES);
        }
 
@@ -84,20 +84,63 @@ acpi_status acpi_ev_initialize_events(void)
         */
        status = acpi_ev_fixed_event_initialize();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Unable to initialize fixed events, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Unable to initialize fixed events"));
                return_ACPI_STATUS(status);
        }
 
        status = acpi_ev_gpe_initialize();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Unable to initialize general purpose events, %s\n", acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Unable to initialize general purpose events"));
                return_ACPI_STATUS(status);
        }
 
        return_ACPI_STATUS(status);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ev_install_fadt_gpes
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Completes initialization of the FADT-defined GPE blocks
+ *              (0 and 1). This causes the _PRW methods to be run, so the HW
+ *              must be fully initialized at this point, including global lock
+ *              support.
+ *
+ ******************************************************************************/
+
+acpi_status acpi_ev_install_fadt_gpes(void)
+{
+       acpi_status status;
+
+       ACPI_FUNCTION_TRACE("ev_install_fadt_gpes");
+
+       /* Namespace must be locked */
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+       if (ACPI_FAILURE(status)) {
+               return (status);
+       }
+
+       /* FADT GPE Block 0 */
+
+       (void)acpi_ev_initialize_gpe_block(acpi_gbl_fadt_gpe_device,
+                                          acpi_gbl_gpe_fadt_blocks[0]);
+
+       /* FADT GPE Block 1 */
+
+       (void)acpi_ev_initialize_gpe_block(acpi_gbl_fadt_gpe_device,
+                                          acpi_gbl_gpe_fadt_blocks[1]);
+
+       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+       return_ACPI_STATUS(AE_OK);
+}
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ev_install_xrupt_handlers
@@ -120,7 +163,8 @@ acpi_status acpi_ev_install_xrupt_handlers(void)
 
        status = acpi_ev_install_sci_handler();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Unable to install System Control Interrupt Handler, %s\n", acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Unable to install System Control Interrupt handler"));
                return_ACPI_STATUS(status);
        }
 
@@ -128,7 +172,8 @@ acpi_status acpi_ev_install_xrupt_handlers(void)
 
        status = acpi_ev_init_global_lock_handler();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Unable to initialize Global Lock handler, %s\n", acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Unable to initialize Global Lock handler"));
                return_ACPI_STATUS(status);
        }
 
@@ -262,7 +307,9 @@ static u32 acpi_ev_fixed_event_dispatch(u32 event)
                                        enable_register_id, 0,
                                        ACPI_MTX_DO_NOT_LOCK);
 
-               ACPI_REPORT_ERROR(("No installed handler for fixed event [%08X]\n", event));
+               ACPI_ERROR((AE_INFO,
+                           "No installed handler for fixed event [%08X]",
+                           event));
 
                return (ACPI_INTERRUPT_NOT_HANDLED);
        }
index b2f232df13d89e48eeab7df18f64aabdf24111dc..f64f977dd3d5a04b118ebc6f904f47a138f19ed8 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
 
 u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
 {
+       acpi_status status;
+       struct acpi_gpe_block_info *gpe_block;
+       struct acpi_gpe_register_info *gpe_register_info;
        u32 int_status = ACPI_INTERRUPT_NOT_HANDLED;
        u8 enabled_status_byte;
-       struct acpi_gpe_register_info *gpe_register_info;
        u32 status_reg;
        u32 enable_reg;
-       u32 flags;
-       acpi_status status;
-       struct acpi_gpe_block_info *gpe_block;
+       acpi_cpu_flags flags;
        acpi_native_uint i;
        acpi_native_uint j;
 
@@ -546,7 +546,11 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
 
                status = acpi_ns_evaluate_by_handle(&info);
                if (ACPI_FAILURE(status)) {
-                       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));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "While evaluating method [%4.4s] for GPE[%2X]",
+                                       acpi_ut_get_node_name
+                                       (local_gpe_event_info.dispatch.
+                                        method_node), gpe_number));
                }
        }
 
@@ -599,8 +603,10 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
            ACPI_GPE_EDGE_TRIGGERED) {
                status = acpi_hw_clear_gpe(gpe_event_info);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to clear GPE[%2X]\n", acpi_format_exception(status), gpe_number));
-                       return_VALUE(ACPI_INTERRUPT_NOT_HANDLED);
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Unable to clear GPE[%2X]",
+                                       gpe_number));
+                       return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
                }
        }
 
@@ -637,8 +643,10 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
                    ACPI_GPE_LEVEL_TRIGGERED) {
                        status = acpi_hw_clear_gpe(gpe_event_info);
                        if (ACPI_FAILURE(status)) {
-                               ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to clear GPE[%2X]\n", acpi_format_exception(status), gpe_number));
-                               return_VALUE(ACPI_INTERRUPT_NOT_HANDLED);
+                               ACPI_EXCEPTION((AE_INFO, status,
+                                               "Unable to clear GPE[%2X]",
+                                               gpe_number));
+                               return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
                        }
                }
                break;
@@ -651,8 +659,10 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
                 */
                status = acpi_ev_disable_gpe(gpe_event_info);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to disable GPE[%2X]\n", acpi_format_exception(status), gpe_number));
-                       return_VALUE(ACPI_INTERRUPT_NOT_HANDLED);
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Unable to disable GPE[%2X]",
+                                       gpe_number));
+                       return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
                }
 
                /*
@@ -663,7 +673,9 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
                                                     acpi_ev_asynch_execute_gpe_method,
                                                     gpe_event_info);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to queue handler for GPE[%2X] - event disabled\n", acpi_format_exception(status), gpe_number));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Unable to queue handler for GPE[%2X] - event disabled",
+                                       gpe_number));
                }
                break;
 
@@ -671,7 +683,9 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
 
                /* No handler or method to run! */
 
-               ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: No handler or method for GPE[%2X], disabling event\n", gpe_number));
+               ACPI_ERROR((AE_INFO,
+                           "No handler or method for GPE[%2X], disabling event",
+                           gpe_number));
 
                /*
                 * 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)
                 */
                status = acpi_ev_disable_gpe(gpe_event_info);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_ERROR(("acpi_ev_gpe_dispatch: %s, Unable to disable GPE[%2X]\n", acpi_format_exception(status), gpe_number));
-                       return_VALUE(ACPI_INTERRUPT_NOT_HANDLED);
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Unable to disable GPE[%2X]",
+                                       gpe_number));
+                       return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
                }
                break;
        }
 
-       return_VALUE(ACPI_INTERRUPT_HANDLED);
+       return_UINT32(ACPI_INTERRUPT_HANDLED);
 }
 
 #ifdef ACPI_GPE_NOTIFY_CHECK
@@ -722,7 +738,9 @@ acpi_ev_check_for_wake_only_gpe(struct acpi_gpe_event_info *gpe_event_info)
 
                acpi_ev_set_gpe_type(gpe_event_info, ACPI_GPE_TYPE_WAKE);
 
-               ACPI_REPORT_INFO(("GPE %p was updated from wake/run to wake-only\n", gpe_event_info));
+               ACPI_INFO((AE_INFO,
+                          "GPE %p was updated from wake/run to wake-only",
+                          gpe_event_info));
 
                /* This was a wake-only GPE */
 
index b312eb33c43ee6086123f2b50a23da722b124091..0fd00b5ad650c454776908905cc73484f9bc3383 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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);
  *
  * RETURN:      TRUE if the gpe_event is valid
  *
- * DESCRIPTION: Validate a GPE event.  DO NOT CALL FROM INTERRUPT LEVEL.
+ * DESCRIPTION: Validate a GPE event. DO NOT CALL FROM INTERRUPT LEVEL.
  *              Should be called only when the GPE lists are semaphore locked
  *              and not subject to change.
  *
@@ -136,7 +136,7 @@ acpi_status acpi_ev_walk_gpe_list(ACPI_GPE_CALLBACK gpe_walk_callback)
        struct acpi_gpe_block_info *gpe_block;
        struct acpi_gpe_xrupt_info *gpe_xrupt_info;
        acpi_status status = AE_OK;
-       u32 flags;
+       acpi_cpu_flags flags;
 
        ACPI_FUNCTION_TRACE("ev_walk_gpe_list");
 
@@ -264,7 +264,7 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
         * 2) Edge/Level determination is based on the 2nd character
         *    of the method name
         *
-        * NOTE: Default GPE type is RUNTIME.  May be changed later to WAKE
+        * NOTE: Default GPE type is RUNTIME. May be changed later to WAKE
         * if a _PRW object is found that points to this GPE.
         */
        switch (name[1]) {
@@ -279,9 +279,9 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
        default:
                /* Unknown method type, just ignore it! */
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unknown GPE method type: %s (name not of form _Lxx or _Exx)\n",
-                                 name));
+               ACPI_ERROR((AE_INFO,
+                           "Unknown GPE method type: %s (name not of form _Lxx or _Exx)",
+                           name));
                return_ACPI_STATUS(AE_OK);
        }
 
@@ -291,9 +291,9 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
        if (gpe_number == ACPI_UINT32_MAX) {
                /* Conversion failed; invalid method, just ignore it */
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)\n",
-                                 name));
+               ACPI_ERROR((AE_INFO,
+                           "Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)",
+                           name));
                return_ACPI_STATUS(AE_OK);
        }
 
@@ -313,14 +313,14 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
 
        /*
         * Now we can add this information to the gpe_event_info block
-        * for use during dispatch of this GPE.  Default type is RUNTIME, although
+        * for use during dispatch of this GPE. Default type is RUNTIME, although
         * this may change when the _PRW methods are executed later.
         */
        gpe_event_info =
            &gpe_block->event_info[gpe_number - gpe_block->block_base_number];
 
-       gpe_event_info->flags = (u8) (type | ACPI_GPE_DISPATCH_METHOD |
-                                     ACPI_GPE_TYPE_RUNTIME);
+       gpe_event_info->flags = (u8)
+           (type | ACPI_GPE_DISPATCH_METHOD | ACPI_GPE_TYPE_RUNTIME);
 
        gpe_event_info->dispatch.method_node =
            (struct acpi_namespace_node *)obj_handle;
@@ -341,11 +341,11 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
  *
  * PARAMETERS:  Callback from walk_namespace
  *
- * RETURN:      Status.  NOTE: We ignore errors so that the _PRW walk is
+ * RETURN:      Status. NOTE: We ignore errors so that the _PRW walk is
  *              not aborted on a single _PRW failure.
  *
  * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a
- *              Device.  Run the _PRW method.  If present, extract the GPE
+ *              Device. Run the _PRW method. If present, extract the GPE
  *              number and mark the GPE as a WAKE GPE.
  *
  ******************************************************************************/
@@ -443,6 +443,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
 
                gpe_event_info->flags &=
                    ~(ACPI_GPE_WAKE_ENABLED | ACPI_GPE_RUN_ENABLED);
+
                status =
                    acpi_ev_set_gpe_type(gpe_event_info, ACPI_GPE_TYPE_WAKE);
                if (ACPI_FAILURE(status)) {
@@ -466,7 +467,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
  *
  * RETURN:      A GPE interrupt block
  *
- * DESCRIPTION: Get or Create a GPE interrupt block.  There is one interrupt
+ * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt
  *              block per unique interrupt level used for GPEs.
  *              Should be called only when the GPE lists are semaphore locked
  *              and not subject to change.
@@ -479,7 +480,7 @@ static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32
        struct acpi_gpe_xrupt_info *next_gpe_xrupt;
        struct acpi_gpe_xrupt_info *gpe_xrupt;
        acpi_status status;
-       u32 flags;
+       acpi_cpu_flags flags;
 
        ACPI_FUNCTION_TRACE("ev_get_gpe_xrupt_block");
 
@@ -526,9 +527,9 @@ static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32
                                                           acpi_ev_gpe_xrupt_handler,
                                                           gpe_xrupt);
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Could not install GPE interrupt handler at level 0x%X\n",
-                                         interrupt_number));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not install GPE interrupt handler at level 0x%X",
+                                   interrupt_number));
                        return_PTR(NULL);
                }
        }
@@ -553,7 +554,7 @@ static acpi_status
 acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt)
 {
        acpi_status status;
-       u32 flags;
+       acpi_cpu_flags flags;
 
        ACPI_FUNCTION_TRACE("ev_delete_gpe_xrupt");
 
@@ -566,8 +567,9 @@ acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt)
 
        /* Disable this interrupt */
 
-       status = acpi_os_remove_interrupt_handler(gpe_xrupt->interrupt_number,
-                                                 acpi_ev_gpe_xrupt_handler);
+       status =
+           acpi_os_remove_interrupt_handler(gpe_xrupt->interrupt_number,
+                                            acpi_ev_gpe_xrupt_handler);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -610,7 +612,7 @@ acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block,
        struct acpi_gpe_block_info *next_gpe_block;
        struct acpi_gpe_xrupt_info *gpe_xrupt_block;
        acpi_status status;
-       u32 flags;
+       acpi_cpu_flags flags;
 
        ACPI_FUNCTION_TRACE("ev_install_gpe_block");
 
@@ -663,7 +665,7 @@ acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block,
 acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
 {
        acpi_status status;
-       u32 flags;
+       acpi_cpu_flags flags;
 
        ACPI_FUNCTION_TRACE("ev_install_gpe_block");
 
@@ -743,22 +745,22 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
                                               sizeof(struct
                                                      acpi_gpe_register_info));
        if (!gpe_register_info) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Could not allocate the gpe_register_info table\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Could not allocate the gpe_register_info table"));
                return_ACPI_STATUS(AE_NO_MEMORY);
        }
 
        /*
         * Allocate the GPE event_info block. There are eight distinct GPEs
-        * per register.  Initialization to zeros is sufficient.
+        * per register. Initialization to zeros is sufficient.
         */
        gpe_event_info = ACPI_MEM_CALLOCATE(((acpi_size) gpe_block->
                                             register_count *
                                             ACPI_GPE_REGISTER_WIDTH) *
                                            sizeof(struct acpi_gpe_event_info));
        if (!gpe_event_info) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Could not allocate the gpe_event_info table\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Could not allocate the gpe_event_info table"));
                status = AE_NO_MEMORY;
                goto error_exit;
        }
@@ -769,9 +771,9 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
        gpe_block->event_info = gpe_event_info;
 
        /*
-        * Initialize the GPE Register and Event structures.  A goal of these
+        * Initialize the GPE Register and Event structures. A goal of these
         * tables is to hide the fact that there are two separate GPE register sets
-        * in a given gpe hardware block, the status registers occupy the first half,
+        * in a given GPE hardware block, the status registers occupy the first half,
         * and the enable registers occupy the second half.
         */
        this_register = gpe_register_info;
@@ -812,11 +814,8 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
                        this_event++;
                }
 
-               /*
-                * Clear the status/enable registers.  Note that status registers
-                * are cleared by writing a '1', while enable registers are cleared
-                * by writing a '0'.
-                */
+               /* Disable all GPEs within this register */
+
                status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0x00,
                                                 &this_register->
                                                 enable_address);
@@ -824,6 +823,8 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
                        goto error_exit;
                }
 
+               /* Clear any pending GPE events within this register */
+
                status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0xFF,
                                                 &this_register->
                                                 status_address);
@@ -860,7 +861,9 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Create and Install a block of GPE registers
+ * DESCRIPTION: Create and Install a block of GPE registers. All GPEs within
+ *              the block are disabled at exit.
+ *              Note: Assumes namespace is locked.
  *
  ******************************************************************************/
 
@@ -872,14 +875,8 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
                         u32 interrupt_number,
                         struct acpi_gpe_block_info **return_gpe_block)
 {
-       struct acpi_gpe_block_info *gpe_block;
-       struct acpi_gpe_event_info *gpe_event_info;
-       acpi_native_uint i;
-       acpi_native_uint j;
-       u32 wake_gpe_count;
-       u32 gpe_enabled_count;
        acpi_status status;
-       struct acpi_gpe_walk_info gpe_info;
+       struct acpi_gpe_block_info *gpe_block;
 
        ACPI_FUNCTION_TRACE("ev_create_gpe_block");
 
@@ -896,22 +893,24 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
 
        /* Initialize the new GPE block */
 
+       gpe_block->node = gpe_device;
        gpe_block->register_count = register_count;
        gpe_block->block_base_number = gpe_block_base_number;
-       gpe_block->node = gpe_device;
 
        ACPI_MEMCPY(&gpe_block->block_address, gpe_block_address,
                    sizeof(struct acpi_generic_address));
 
-       /* Create the register_info and event_info sub-structures */
-
+       /*
+        * Create the register_info and event_info sub-structures
+        * Note: disables and clears all GPEs in the block
+        */
        status = acpi_ev_create_gpe_info_blocks(gpe_block);
        if (ACPI_FAILURE(status)) {
                ACPI_MEM_FREE(gpe_block);
                return_ACPI_STATUS(status);
        }
 
-       /* Install the new block in the global list(s) */
+       /* Install the new block in the global lists */
 
        status = acpi_ev_install_gpe_block(gpe_block, interrupt_number);
        if (ACPI_FAILURE(status)) {
@@ -926,16 +925,70 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
                                        acpi_ev_save_method_info, gpe_block,
                                        NULL);
 
+       /* Return the new block */
+
+       if (return_gpe_block) {
+               (*return_gpe_block) = gpe_block;
+       }
+
+       ACPI_DEBUG_PRINT((ACPI_DB_INIT,
+                         "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n",
+                         (u32) gpe_block->block_base_number,
+                         (u32) (gpe_block->block_base_number +
+                                ((gpe_block->register_count *
+                                  ACPI_GPE_REGISTER_WIDTH) - 1)),
+                         gpe_device->name.ascii, gpe_block->register_count,
+                         interrupt_number));
+
+       return_ACPI_STATUS(AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ev_initialize_gpe_block
+ *
+ * PARAMETERS:  gpe_device          - Handle to the parent GPE block
+ *              gpe_block           - Gpe Block info
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Initialize and enable a GPE block. First find and run any
+ *              _PRT methods associated with the block, then enable the
+ *              appropriate GPEs.
+ *              Note: Assumes namespace is locked.
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
+                            struct acpi_gpe_block_info *gpe_block)
+{
+       acpi_status status;
+       struct acpi_gpe_event_info *gpe_event_info;
+       struct acpi_gpe_walk_info gpe_info;
+       u32 wake_gpe_count;
+       u32 gpe_enabled_count;
+       acpi_native_uint i;
+       acpi_native_uint j;
+
+       ACPI_FUNCTION_TRACE("ev_initialize_gpe_block");
+
+       /* Ignore a null GPE block (e.g., if no GPE block 1 exists) */
+
+       if (!gpe_block) {
+               return_ACPI_STATUS(AE_OK);
+       }
+
        /*
-        * Runtime option: Should Wake GPEs be enabled at runtime?  The default
-        * is No, they should only be enabled just as the machine goes to sleep.
+        * Runtime option: Should wake GPEs be enabled at runtime?  The default
+        * is no, they should only be enabled just as the machine goes to sleep.
         */
        if (acpi_gbl_leave_wake_gpes_disabled) {
                /*
-                * Differentiate RUNTIME vs WAKE GPEs, via the _PRW control methods.
-                * (Each GPE that has one or more _PRWs that reference it is by
-                * definition a WAKE GPE and will not be enabled while the machine
-                * is running.)
+                * Differentiate runtime vs wake GPEs, via the _PRW control methods.
+                * Each GPE that has one or more _PRWs that reference it is by
+                * definition a wake GPE and will not be enabled while the machine
+                * is running.
                 */
                gpe_info.gpe_block = gpe_block;
                gpe_info.gpe_device = gpe_device;
@@ -948,9 +1001,12 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
        }
 
        /*
-        * Enable all GPEs in this block that are 1) "runtime" or "run/wake" GPEs,
-        * and 2) have a corresponding _Lxx or _Exx method.  All other GPEs must
-        * be enabled via the acpi_enable_gpe() external interface.
+        * Enable all GPEs in this block that have these attributes:
+        * 1) are "runtime" or "run/wake" GPEs, and
+        * 2) have a corresponding _Lxx or _Exx method
+        *
+        * Any other GPEs within this block must be enabled via the acpi_enable_gpe()
+        * external interface.
         */
        wake_gpe_count = 0;
        gpe_enabled_count = 0;
@@ -976,32 +1032,19 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
                }
        }
 
-       /* Dump info about this GPE block */
-
-       ACPI_DEBUG_PRINT((ACPI_DB_INIT,
-                         "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n",
-                         (u32) gpe_block->block_base_number,
-                         (u32) (gpe_block->block_base_number +
-                                ((gpe_block->register_count *
-                                  ACPI_GPE_REGISTER_WIDTH) - 1)),
-                         gpe_device->name.ascii, gpe_block->register_count,
-                         interrupt_number));
-
-       /* Enable all valid GPEs found above */
-
-       status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block);
-
        ACPI_DEBUG_PRINT((ACPI_DB_INIT,
                          "Found %u Wake, Enabled %u Runtime GPEs in this block\n",
                          wake_gpe_count, gpe_enabled_count));
 
-       /* Return the new block */
+       /* Enable all valid runtime GPEs found above */
 
-       if (return_gpe_block) {
-               (*return_gpe_block) = gpe_block;
+       status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block);
+       if (ACPI_FAILURE(status)) {
+               ACPI_ERROR((AE_INFO, "Could not enable GPEs in gpe_block %p",
+                           gpe_block));
        }
 
-       return_ACPI_STATUS(AE_OK);
+       return_ACPI_STATUS(status);
 }
 
 /*******************************************************************************
@@ -1072,8 +1115,8 @@ acpi_status acpi_ev_gpe_initialize(void)
                                                  &acpi_gbl_gpe_fadt_blocks[0]);
 
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_ERROR(("Could not create GPE Block 0, %s\n",
-                                          acpi_format_exception(status)));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Could not create GPE Block 0"));
                }
        }
 
@@ -1086,7 +1129,12 @@ acpi_status acpi_ev_gpe_initialize(void)
 
                if ((register_count0) &&
                    (gpe_number_max >= acpi_gbl_FADT->gpe1_base)) {
-                       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)));
+                       ACPI_ERROR((AE_INFO,
+                                   "GPE0 block (GPE 0 to %d) overlaps the GPE1 block (GPE %d to %d) - Ignoring GPE1",
+                                   gpe_number_max, acpi_gbl_FADT->gpe1_base,
+                                   acpi_gbl_FADT->gpe1_base +
+                                   ((register_count1 *
+                                     ACPI_GPE_REGISTER_WIDTH) - 1)));
 
                        /* Ignore GPE1 block by setting the register count to zero */
 
@@ -1104,7 +1152,8 @@ acpi_status acpi_ev_gpe_initialize(void)
                                                     [1]);
 
                        if (ACPI_FAILURE(status)) {
-                               ACPI_REPORT_ERROR(("Could not create GPE Block 1, %s\n", acpi_format_exception(status)));
+                               ACPI_EXCEPTION((AE_INFO, status,
+                                               "Could not create GPE Block 1"));
                        }
 
                        /*
@@ -1130,7 +1179,9 @@ acpi_status acpi_ev_gpe_initialize(void)
        /* Check for Max GPE number out-of-range */
 
        if (gpe_number_max > ACPI_GPE_MAX) {
-               ACPI_REPORT_ERROR(("Maximum GPE number from FADT is too large: 0x%X\n", gpe_number_max));
+               ACPI_ERROR((AE_INFO,
+                           "Maximum GPE number from FADT is too large: 0x%X",
+                           gpe_number_max));
                status = AE_BAD_VALUE;
                goto cleanup;
        }
index 7e57b8470f55a7aa39af4c97c7d395d411a19499..0909ba69577e6806f4315f11389c97518423c2bf 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
                    acpi_os_signal_semaphore(acpi_gbl_global_lock_semaphore,
                                             acpi_gbl_global_lock_thread_count);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_ERROR(("Could not signal Global Lock semaphore\n"));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not signal Global Lock semaphore"));
                }
        }
 }
@@ -344,7 +345,8 @@ static u32 acpi_ev_global_lock_handler(void *context)
                                                     acpi_ev_global_lock_thread,
                                                     context);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_ERROR(("Could not queue Global Lock thread, %s\n", acpi_format_exception(status)));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Could not queue Global Lock thread"));
 
                        return (ACPI_INTERRUPT_NOT_HANDLED);
                }
@@ -384,7 +386,8 @@ acpi_status acpi_ev_init_global_lock_handler(void)
         * with an error.
         */
        if (status == AE_NO_HARDWARE_RESPONSE) {
-               ACPI_REPORT_ERROR(("No response from Global Lock hardware, disabling lock\n"));
+               ACPI_ERROR((AE_INFO,
+                           "No response from Global Lock hardware, disabling lock"));
 
                acpi_gbl_global_lock_present = FALSE;
                status = AE_OK;
@@ -480,7 +483,8 @@ acpi_status acpi_ev_release_global_lock(void)
        ACPI_FUNCTION_TRACE("ev_release_global_lock");
 
        if (!acpi_gbl_global_lock_thread_count) {
-               ACPI_REPORT_WARNING(("Cannot release HW Global Lock, it has not been acquired\n"));
+               ACPI_WARNING((AE_INFO,
+                             "Cannot release HW Global Lock, it has not been acquired"));
                return_ACPI_STATUS(AE_NOT_ACQUIRED);
        }
 
@@ -542,9 +546,9 @@ void acpi_ev_terminate(void)
                for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
                        status = acpi_disable_event((u32) i, 0);
                        if (ACPI_FAILURE(status)) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Could not disable fixed event %d\n",
-                                                 (u32) i));
+                               ACPI_ERROR((AE_INFO,
+                                           "Could not disable fixed event %d",
+                                           (u32) i));
                        }
                }
 
@@ -556,8 +560,7 @@ void acpi_ev_terminate(void)
 
                status = acpi_ev_remove_sci_handler();
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Could not remove SCI handler\n"));
+                       ACPI_ERROR((AE_INFO, "Could not remove SCI handler"));
                }
        }
 
@@ -570,8 +573,7 @@ void acpi_ev_terminate(void)
        if (acpi_gbl_original_mode == ACPI_SYS_MODE_LEGACY) {
                status = acpi_disable();
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                         "acpi_disable failed\n"));
+                       ACPI_WARNING((AE_INFO, "acpi_disable failed"));
                }
        }
        return_VOID;
index 84fad082d80d22205b2c559313ddb6f02e690e00..6da58e776413a819123d3401f080ac7df702d9c0 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
 
        handler_desc = region_obj->region.handler;
        if (!handler_desc) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "No handler for Region [%4.4s] (%p) [%s]\n",
-                                 acpi_ut_get_node_name(region_obj->region.
-                                                       node), region_obj,
-                                 acpi_ut_get_region_name(region_obj->region.
-                                                         space_id)));
+               ACPI_ERROR((AE_INFO,
+                           "No handler for Region [%4.4s] (%p) [%s]",
+                           acpi_ut_get_node_name(region_obj->region.node),
+                           region_obj,
+                           acpi_ut_get_region_name(region_obj->region.
+                                                   space_id)));
 
                return_ACPI_STATUS(AE_NOT_EXIST);
        }
@@ -317,12 +317,11 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
                if (!region_setup) {
                        /* No initialization routine, exit with error */
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "No init routine for region(%p) [%s]\n",
-                                         region_obj,
-                                         acpi_ut_get_region_name(region_obj->
-                                                                 region.
-                                                                 space_id)));
+                       ACPI_ERROR((AE_INFO,
+                                   "No init routine for region(%p) [%s]",
+                                   region_obj,
+                                   acpi_ut_get_region_name(region_obj->region.
+                                                           space_id)));
                        return_ACPI_STATUS(AE_NOT_EXIST);
                }
 
@@ -347,12 +346,11 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
                /* Check for failure of the Region Setup */
 
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Region Init: %s [%s]\n",
-                                         acpi_format_exception(status),
-                                         acpi_ut_get_region_name(region_obj->
-                                                                 region.
-                                                                 space_id)));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "During region initialization: [%s]",
+                                       acpi_ut_get_region_name(region_obj->
+                                                               region.
+                                                               space_id)));
                        return_ACPI_STATUS(status);
                }
 
@@ -406,10 +404,9 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
                         region_obj2->extra.region_context);
 
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Handler for [%s] returned %s\n",
-                                  acpi_ut_get_region_name(region_obj->region.
-                                                          space_id),
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "Returned by Handler for [%s]",
+                               acpi_ut_get_region_name(region_obj->region.
+                                                       space_id)));
        }
 
        if (!
@@ -501,12 +498,10 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj,
 
                        status = acpi_ev_execute_reg_method(region_obj, 0);
                        if (ACPI_FAILURE(status)) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "%s from region _REG, [%s]\n",
-                                                 acpi_format_exception(status),
-                                                 acpi_ut_get_region_name
-                                                 (region_obj->region.
-                                                  space_id)));
+                               ACPI_EXCEPTION((AE_INFO, status,
+                                               "from region _REG, [%s]",
+                                               acpi_ut_get_region_name
+                                               (region_obj->region.space_id)));
                        }
 
                        if (acpi_ns_is_locked) {
@@ -528,12 +523,10 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj,
                        /* Init routine may fail, Just ignore errors */
 
                        if (ACPI_FAILURE(status)) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "%s from region init, [%s]\n",
-                                                 acpi_format_exception(status),
-                                                 acpi_ut_get_region_name
-                                                 (region_obj->region.
-                                                  space_id)));
+                               ACPI_EXCEPTION((AE_INFO, status,
+                                               "from region init, [%s]",
+                                               acpi_ut_get_region_name
+                                               (region_obj->region.space_id)));
                        }
 
                        region_obj->region.flags &= ~(AOPOBJ_SETUP_COMPLETE);
index a1bd2da27c45e5517d533459b79debae3e262404..baed8c1a1b9fb74542f9ef1345382ab1a660fa09 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -233,7 +233,11 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
                                                         */
                                                        status = AE_OK;
                                                } else {
-                                                       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)));
+                                                       ACPI_EXCEPTION((AE_INFO,
+                                                                       status,
+                                                                       "Could not install pci_config handler for Root Bridge %4.4s",
+                                                                       acpi_ut_get_node_name
+                                                                       (pci_root_node)));
                                                }
                                        }
                                        break;
index 1418359770022a462e1e4f2a53edce4bfacdc6e4..9a622169008a45d261131f925093c39eef153656 100644 (file)
@@ -6,7 +6,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
         */
        interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
 
-       return_VALUE(interrupt_handled);
+       return_UINT32(interrupt_handled);
 }
 
 /*******************************************************************************
@@ -121,7 +121,7 @@ u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context)
         */
        interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
 
-       return_VALUE(interrupt_handled);
+       return_UINT32(interrupt_handled);
 }
 
 /******************************************************************************
index 43b33d19cdf9169b751b275fb9466cc9b6fa2811..b38b39dde54318619a29268bebf4ec6bb61df56c 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -143,8 +143,8 @@ acpi_install_fixed_event_handler(u32 event,
        if (ACPI_SUCCESS(status))
                status = acpi_enable_event(event, 0);
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                 "Could not enable fixed event.\n"));
+               ACPI_WARNING((AE_INFO, "Could not enable fixed event %X",
+                             event));
 
                /* Remove the handler */
 
@@ -204,10 +204,11 @@ acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler)
        acpi_gbl_fixed_event_handlers[event].context = NULL;
 
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                 "Could not write to fixed event enable register.\n"));
+               ACPI_WARNING((AE_INFO,
+                             "Could not write to fixed event enable register %X",
+                             event));
        } else {
-               ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Disabled fixed event %X.\n",
+               ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Disabled fixed event %X\n",
                                  event));
        }
 
@@ -434,7 +435,7 @@ acpi_remove_notify_handler(acpi_handle device,
 
        if (device == ACPI_ROOT_OBJECT) {
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                 "Removing notify handler for ROOT object.\n"));
+                                 "Removing notify handler for namespace root object\n"));
 
                if (((handler_type & ACPI_SYSTEM_NOTIFY) &&
                     !acpi_gbl_system_notify.handler) ||
@@ -562,7 +563,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
        struct acpi_gpe_event_info *gpe_event_info;
        struct acpi_handler_info *handler;
        acpi_status status;
-       u32 flags;
+       acpi_cpu_flags flags;
 
        ACPI_FUNCTION_TRACE("acpi_install_gpe_handler");
 
@@ -653,7 +654,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
        struct acpi_gpe_event_info *gpe_event_info;
        struct acpi_handler_info *handler;
        acpi_status status;
-       u32 flags;
+       acpi_cpu_flags flags;
 
        ACPI_FUNCTION_TRACE("acpi_remove_gpe_handler");
 
index 887ff9f28a0d254277ad31192d17bdcfde3edf17..ec9ce8429f15b823d5b0077f1e9da1c69888d70b 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -70,8 +70,7 @@ acpi_status acpi_enable(void)
        /* Make sure we have the FADT */
 
        if (!acpi_gbl_FADT) {
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                 "No FADT information present!\n"));
+               ACPI_WARNING((AE_INFO, "No FADT information present!"));
                return_ACPI_STATUS(AE_NO_ACPI_TABLES);
        }
 
@@ -83,7 +82,8 @@ acpi_status acpi_enable(void)
 
                status = acpi_hw_set_mode(ACPI_SYS_MODE_ACPI);
                if (ACPI_FAILURE(status)) {
-                       ACPI_REPORT_ERROR(("Could not transition to ACPI mode.\n"));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not transition to ACPI mode"));
                        return_ACPI_STATUS(status);
                }
 
@@ -113,8 +113,7 @@ acpi_status acpi_disable(void)
        ACPI_FUNCTION_TRACE("acpi_disable");
 
        if (!acpi_gbl_FADT) {
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                 "No FADT information present!\n"));
+               ACPI_WARNING((AE_INFO, "No FADT information present!"));
                return_ACPI_STATUS(AE_NO_ACPI_TABLES);
        }
 
@@ -127,8 +126,8 @@ acpi_status acpi_disable(void)
                status = acpi_hw_set_mode(ACPI_SYS_MODE_LEGACY);
 
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Could not exit ACPI mode to legacy mode"));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not exit ACPI mode to legacy mode"));
                        return_ACPI_STATUS(status);
                }
 
@@ -185,9 +184,9 @@ acpi_status acpi_enable_event(u32 event, u32 flags)
        }
 
        if (value != 1) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Could not enable %s event\n",
-                                 acpi_ut_get_event_name(event)));
+               ACPI_ERROR((AE_INFO,
+                           "Could not enable %s event",
+                           acpi_ut_get_event_name(event)));
                return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
        }
 
@@ -384,9 +383,9 @@ acpi_status acpi_disable_event(u32 event, u32 flags)
        }
 
        if (value != 0) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Could not disable %s events\n",
-                                 acpi_ut_get_event_name(event)));
+               ACPI_ERROR((AE_INFO,
+                           "Could not disable %s events",
+                           acpi_ut_get_event_name(event)));
                return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
        }
 
@@ -626,6 +625,13 @@ acpi_install_gpe_block(acpi_handle gpe_device,
                goto unlock_and_exit;
        }
 
+       /* Run the _PRW methods and enable the GPEs */
+
+       status = acpi_ev_initialize_gpe_block(node, gpe_block);
+       if (ACPI_FAILURE(status)) {
+               goto unlock_and_exit;
+       }
+
        /* Get the device_object attached to the node */
 
        obj_desc = acpi_ns_get_attached_object(node);
index 6f28ea2db5ba11eb4b8751127a5d1adea27c4762..abf5caca9ae5a541596e6ee612665cc4566b9a82 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 1ce365d651d8a8bbb2ba1f47f77a6cdef1fe5a40..a29782fe3ecf20e3bd2c9e44469b3cc9af5b75f6 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
            (!ACPI_STRNCMP(table_ptr->signature,
                           acpi_gbl_table_data[ACPI_TABLE_SSDT].signature,
                           acpi_gbl_table_data[ACPI_TABLE_SSDT].sig_length))) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Table has invalid signature [%4.4s], must be SSDT or PSDT\n",
-                                 table_ptr->signature));
+               ACPI_ERROR((AE_INFO,
+                           "Table has invalid signature [%4.4s], must be SSDT or PSDT",
+                           table_ptr->signature));
                status = AE_BAD_SIGNATURE;
                goto cleanup;
        }
index 04e5194989a6ffe51a718f370dedc85ba9e6aadd..e6d52e12d77a6bc18a35c9e54ccae51d84aa0a23 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
                }
 
                /*
-                * Perform the conversion.
+                * Create a new string object and string buffer
                 * (-1 because of extra separator included in string_length from above)
                 */
-               string_length--;
-               if (string_length > ACPI_MAX_STRING_CONVERSION) {       /* ACPI limit */
-                       return_ACPI_STATUS(AE_AML_STRING_LIMIT);
-               }
-
-               /* Create a new string object and string buffer */
-
                return_desc =
-                   acpi_ut_create_string_object((acpi_size) string_length);
+                   acpi_ut_create_string_object((acpi_size)
+                                                (string_length - 1));
                if (!return_desc) {
                        return_ACPI_STATUS(AE_NO_MEMORY);
                }
@@ -647,7 +641,9 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
                        break;
 
                default:
-                       ACPI_REPORT_ERROR(("Bad destination type during conversion: %X\n", destination_type));
+                       ACPI_ERROR((AE_INFO,
+                                   "Bad destination type during conversion: %X",
+                                   destination_type));
                        status = AE_AML_INTERNAL;
                        break;
                }
@@ -660,17 +656,13 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
                break;
 
        default:
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unknown Target type ID 0x%X Op %s dest_type %s\n",
-                                 GET_CURRENT_ARG_TYPE(walk_state->op_info->
-                                                      runtime_args),
-                                 walk_state->op_info->name,
-                                 acpi_ut_get_type_name(destination_type)));
-
-               ACPI_REPORT_ERROR(("Bad Target Type (ARGI): %X\n",
-                                  GET_CURRENT_ARG_TYPE(walk_state->op_info->
-                                                       runtime_args)))
-                   status = AE_AML_INTERNAL;
+               ACPI_ERROR((AE_INFO,
+                           "Unknown Target type ID 0x%X aml_opcode %X dest_type %s",
+                           GET_CURRENT_ARG_TYPE(walk_state->op_info->
+                                                runtime_args),
+                           walk_state->opcode,
+                           acpi_ut_get_type_name(destination_type)));
+               status = AE_AML_INTERNAL;
        }
 
        /*
index 91c49188fb0794f488b64e693c499e1ae5a8328b..680575402835aa735b7bb76ecc1f536e0d94fedb 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -300,8 +300,8 @@ acpi_ex_create_region(u8 * aml_start,
         */
        if ((region_space >= ACPI_NUM_PREDEFINED_REGIONS) &&
            (region_space < ACPI_USER_REGION_BEGIN)) {
-               ACPI_REPORT_ERROR(("Invalid address_space type %X\n",
-                                  region_space));
+               ACPI_ERROR((AE_INFO, "Invalid address_space type %X",
+                           region_space));
                return_ACPI_STATUS(AE_AML_INVALID_SPACE_ID);
        }
 
index bc2fa996047ef6148ce26101e77fa2ef7a8468cd..a7cca8d4f85525f950724527e8df053bb3be5013 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -55,20 +55,386 @@ ACPI_MODULE_NAME("exdump")
  */
 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
 /* Local prototypes */
-#ifdef ACPI_FUTURE_USAGE
 static void acpi_ex_out_string(char *title, char *value);
 
 static void acpi_ex_out_pointer(char *title, void *value);
 
-static void acpi_ex_out_integer(char *title, u32 value);
-
 static void acpi_ex_out_address(char *title, acpi_physical_address value);
 
-static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc);
+static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc);
 
 static void
-acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index);
-#endif                         /* ACPI_FUTURE_USAGE */
+acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
+                        u32 level, u32 index);
+
+/*******************************************************************************
+ *
+ * Object Descriptor info tables
+ *
+ * Note: The first table entry must be an INIT opcode and must contain
+ * the table length (number of table entries)
+ *
+ ******************************************************************************/
+
+static struct acpi_exdump_info acpi_ex_dump_integer[2] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_integer), NULL},
+       {ACPI_EXD_UINT64, ACPI_EXD_OFFSET(integer.value), "Value"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_string[4] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_string), NULL},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(string.length), "Length"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(string.pointer), "Pointer"},
+       {ACPI_EXD_STRING, 0, NULL}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_buffer[4] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer), NULL},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(buffer.length), "Length"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer.pointer), "Pointer"},
+       {ACPI_EXD_BUFFER, 0, NULL}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_package[5] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_package), NULL},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(package.flags), "Flags"},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(package.count), "Elements"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(package.elements), "Element List"},
+       {ACPI_EXD_PACKAGE, 0, NULL}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_device[4] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_device), NULL},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.handler), "Handler"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.system_notify),
+        "System Notify"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(device.device_notify),
+        "Device Notify"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_event[2] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_event), NULL},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(event.semaphore), "Semaphore"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_method[8] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_method), NULL},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.param_count), "param_count"},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.concurrency), "Concurrency"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.semaphore), "Semaphore"},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.owner_id), "Owner Id"},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.thread_count), "Thread Count"},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(method.aml_length), "Aml Length"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.aml_start), "Aml Start"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_mutex[5] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_mutex), NULL},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.sync_level), "Sync Level"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread), "Owner Thread"},
+       {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(mutex.acquisition_depth),
+        "Acquire Depth"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.semaphore), "Semaphore"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_region[7] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region), NULL},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.space_id), "Space Id"},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(region.flags), "Flags"},
+       {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(region.address), "Address"},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(region.length), "Length"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(region.handler), "Handler"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(region.next), "Next"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_power[5] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_power), NULL},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.system_level),
+        "System Level"},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(power_resource.resource_order),
+        "Resource Order"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.system_notify),
+        "System Notify"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(power_resource.device_notify),
+        "Device Notify"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_processor[7] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_processor), NULL},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(processor.proc_id), "Processor ID"},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(processor.length), "Length"},
+       {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET(processor.address), "Address"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.system_notify),
+        "System Notify"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.device_notify),
+        "Device Notify"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(processor.handler), "Handler"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_thermal[4] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_thermal), NULL},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.system_notify),
+        "System Notify"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.device_notify),
+        "Device Notify"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(thermal_zone.handler), "Handler"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_buffer_field[3] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_buffer_field), NULL},
+       {ACPI_EXD_FIELD, 0, NULL},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(buffer_field.buffer_obj),
+        "Buffer Object"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_region_field[3] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_region_field), NULL},
+       {ACPI_EXD_FIELD, 0, NULL},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(field.region_obj), "Region Object"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_bank_field[5] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL},
+       {ACPI_EXD_FIELD, 0, NULL},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(bank_field.value), "Value"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.region_obj),
+        "Region Object"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(bank_field.bank_obj), "Bank Object"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_index_field[5] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_bank_field), NULL},
+       {ACPI_EXD_FIELD, 0, NULL},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(index_field.value), "Value"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.index_obj),
+        "Index Object"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_reference[7] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(reference.offset), "Offset"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.node), "Node"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"},
+       {ACPI_EXD_REFERENCE, 0, NULL}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_address_handler[6] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_address_handler),
+        NULL},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(address_space.space_id), "Space Id"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.next), "Next"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.region_list),
+        "Region List"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.node), "Node"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(address_space.context), "Context"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_notify[3] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_notify), NULL},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.node), "Node"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(notify.context), "Context"}
+};
+
+/* Miscellaneous tables */
+
+static struct acpi_exdump_info acpi_ex_dump_common[4] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_common), NULL},
+       {ACPI_EXD_TYPE, 0, NULL},
+       {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(common.reference_count),
+        "Reference Count"},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common.flags), "Flags"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_field_common[7] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_field_common), NULL},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.field_flags),
+        "Field Flags"},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.access_byte_width),
+        "Access Byte Width"},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.bit_length),
+        "Bit Length"},
+       {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(common_field.start_field_bit_offset),
+        "Field Bit Offset"},
+       {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(common_field.base_byte_offset),
+        "Base Byte Offset"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(common_field.node), "Parent Node"}
+};
+
+static struct acpi_exdump_info acpi_ex_dump_node[6] = {
+       {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_node), NULL},
+       {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET(flags), "Flags"},
+       {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET(owner_id), "Owner Id"},
+       {ACPI_EXD_UINT16, ACPI_EXD_NSOFFSET(reference_count),
+        "Reference Count"},
+       {ACPI_EXD_POINTER, ACPI_EXD_NSOFFSET(child), "Child List"},
+       {ACPI_EXD_POINTER, ACPI_EXD_NSOFFSET(peer), "Next Peer"}
+};
+
+/* Dispatch table, indexed by object type */
+
+static struct acpi_exdump_info *acpi_ex_dump_info[] = {
+       NULL,
+       acpi_ex_dump_integer,
+       acpi_ex_dump_string,
+       acpi_ex_dump_buffer,
+       acpi_ex_dump_package,
+       NULL,
+       acpi_ex_dump_device,
+       acpi_ex_dump_event,
+       acpi_ex_dump_method,
+       acpi_ex_dump_mutex,
+       acpi_ex_dump_region,
+       acpi_ex_dump_power,
+       acpi_ex_dump_processor,
+       acpi_ex_dump_thermal,
+       acpi_ex_dump_buffer_field,
+       NULL,
+       NULL,
+       acpi_ex_dump_region_field,
+       acpi_ex_dump_bank_field,
+       acpi_ex_dump_index_field,
+       acpi_ex_dump_reference,
+       NULL,
+       NULL,
+       acpi_ex_dump_notify,
+       acpi_ex_dump_address_handler,
+       NULL,
+       NULL,
+       NULL
+};
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ex_dump_object
+ *
+ * PARAMETERS:  obj_desc            - Descriptor to dump
+ *              Info                - Info table corresponding to this object
+ *                                    type
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Walk the info table for this object
+ *
+ ******************************************************************************/
+
+static void
+acpi_ex_dump_object(union acpi_operand_object *obj_desc,
+                   struct acpi_exdump_info *info)
+{
+       u8 *target;
+       char *name;
+       u8 count;
+
+       if (!info) {
+               acpi_os_printf
+                   ("ex_dump_object: Display not implemented for object type %s\n",
+                    acpi_ut_get_object_type_name(obj_desc));
+               return;
+       }
+
+       /* First table entry must contain the table length (# of table entries) */
+
+       count = info->offset;
+
+       while (count) {
+               target = ACPI_ADD_PTR(u8, obj_desc, info->offset);
+               name = info->name;
+
+               switch (info->opcode) {
+               case ACPI_EXD_INIT:
+                       break;
+
+               case ACPI_EXD_TYPE:
+                       acpi_ex_out_string("Type",
+                                          acpi_ut_get_object_type_name
+                                          (obj_desc));
+                       break;
+
+               case ACPI_EXD_UINT8:
+
+                       acpi_os_printf("%20s : %2.2X\n", name, *target);
+                       break;
+
+               case ACPI_EXD_UINT16:
+
+                       acpi_os_printf("%20s : %4.4X\n", name,
+                                      ACPI_GET16(target));
+                       break;
+
+               case ACPI_EXD_UINT32:
+
+                       acpi_os_printf("%20s : %8.8X\n", name,
+                                      ACPI_GET32(target));
+                       break;
+
+               case ACPI_EXD_UINT64:
+
+                       acpi_os_printf("%20s : %8.8X%8.8X\n", "Value",
+                                      ACPI_FORMAT_UINT64(ACPI_GET64(target)));
+                       break;
+
+               case ACPI_EXD_POINTER:
+
+                       acpi_ex_out_pointer(name,
+                                           *ACPI_CAST_PTR(void *, target));
+                       break;
+
+               case ACPI_EXD_ADDRESS:
+
+                       acpi_ex_out_address(name,
+                                           *ACPI_CAST_PTR
+                                           (acpi_physical_address, target));
+                       break;
+
+               case ACPI_EXD_STRING:
+
+                       acpi_ut_print_string(obj_desc->string.pointer,
+                                            ACPI_UINT8_MAX);
+                       acpi_os_printf("\n");
+                       break;
+
+               case ACPI_EXD_BUFFER:
+
+                       ACPI_DUMP_BUFFER(obj_desc->buffer.pointer,
+                                        obj_desc->buffer.length);
+                       break;
+
+               case ACPI_EXD_PACKAGE:
+
+                       /* Dump the package contents */
+
+                       acpi_os_printf("\nPackage Contents:\n");
+                       acpi_ex_dump_package_obj(obj_desc, 0, 0);
+                       break;
+
+               case ACPI_EXD_FIELD:
+
+                       acpi_ex_dump_object(obj_desc,
+                                           acpi_ex_dump_field_common);
+                       break;
+
+               case ACPI_EXD_REFERENCE:
+
+                       acpi_ex_out_string("Opcode",
+                                          (acpi_ps_get_opcode_info
+                                           (obj_desc->reference.opcode))->
+                                          name);
+                       acpi_ex_dump_reference_obj(obj_desc);
+                       break;
+
+               default:
+                       acpi_os_printf("**** Invalid table opcode [%X] ****\n",
+                                      info->opcode);
+                       return;
+               }
+
+               info++;
+               count--;
+       }
+}
 
 /*******************************************************************************
  *
@@ -214,7 +580,7 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
 
        case ACPI_TYPE_BUFFER:
 
-               acpi_os_printf("Buffer len %X @ %p \n",
+               acpi_os_printf("Buffer len %X @ %p\n",
                               obj_desc->buffer.length,
                               obj_desc->buffer.pointer);
 
@@ -320,17 +686,17 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
 
        case ACPI_TYPE_BUFFER_FIELD:
 
-               acpi_os_printf("buffer_field: %X bits at byte %X bit %X of \n",
+               acpi_os_printf("buffer_field: %X bits at byte %X bit %X of\n",
                               obj_desc->buffer_field.bit_length,
                               obj_desc->buffer_field.base_byte_offset,
                               obj_desc->buffer_field.start_field_bit_offset);
 
                if (!obj_desc->buffer_field.buffer_obj) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL* \n"));
+                       ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "*NULL*\n"));
                } else
                    if (ACPI_GET_OBJECT_TYPE(obj_desc->buffer_field.buffer_obj)
                        != ACPI_TYPE_BUFFER) {
-                       acpi_os_printf("*not a Buffer* \n");
+                       acpi_os_printf("*not a Buffer*\n");
                } else {
                        acpi_ex_dump_operand(obj_desc->buffer_field.buffer_obj,
                                             depth + 1);
@@ -441,7 +807,6 @@ acpi_ex_dump_operands(union acpi_operand_object **operands,
        return;
 }
 
-#ifdef ACPI_FUTURE_USAGE
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ex_out* functions
@@ -465,11 +830,6 @@ static void acpi_ex_out_pointer(char *title, void *value)
        acpi_os_printf("%20s : %p\n", title, value);
 }
 
-static void acpi_ex_out_integer(char *title, u32 value)
-{
-       acpi_os_printf("%20s : %.2X\n", title, value);
-}
-
 static void acpi_ex_out_address(char *title, acpi_physical_address value)
 {
 
@@ -482,16 +842,16 @@ static void acpi_ex_out_address(char *title, acpi_physical_address value)
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ex_dump_node
+ * FUNCTION:    acpi_ex_dump_namespace_node
  *
- * PARAMETERS:  *Node               - Descriptor to dump
+ * PARAMETERS:  Node                - Descriptor to dump
  *              Flags               - Force display if TRUE
  *
  * DESCRIPTION: Dumps the members of the given.Node
  *
  ******************************************************************************/
 
-void acpi_ex_dump_node(struct acpi_namespace_node *node, u32 flags)
+void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags)
 {
 
        ACPI_FUNCTION_ENTRY();
@@ -506,19 +866,17 @@ void acpi_ex_dump_node(struct acpi_namespace_node *node, u32 flags)
 
        acpi_os_printf("%20s : %4.4s\n", "Name", acpi_ut_get_node_name(node));
        acpi_ex_out_string("Type", acpi_ut_get_type_name(node->type));
-       acpi_ex_out_integer("Flags", node->flags);
-       acpi_ex_out_integer("Owner Id", node->owner_id);
-       acpi_ex_out_integer("Reference Count", node->reference_count);
        acpi_ex_out_pointer("Attached Object",
                            acpi_ns_get_attached_object(node));
-       acpi_ex_out_pointer("child_list", node->child);
-       acpi_ex_out_pointer("next_peer", node->peer);
        acpi_ex_out_pointer("Parent", acpi_ns_get_parent_node(node));
+
+       acpi_ex_dump_object(ACPI_CAST_PTR(union acpi_operand_object, node),
+                           acpi_ex_dump_node);
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ex_dump_reference
+ * FUNCTION:    acpi_ex_dump_reference_obj
  *
  * PARAMETERS:  Object              - Descriptor to dump
  *
@@ -526,14 +884,16 @@ void acpi_ex_dump_node(struct acpi_namespace_node *node, u32 flags)
  *
  ******************************************************************************/
 
-static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc)
+static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
 {
        struct acpi_buffer ret_buf;
        acpi_status status;
 
+       ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER;
+
        if (obj_desc->reference.opcode == AML_INT_NAMEPATH_OP) {
                acpi_os_printf("Named Object %p ", obj_desc->reference.node);
-               ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER;
+
                status =
                    acpi_ns_handle_to_pathname(obj_desc->reference.node,
                                               &ret_buf);
@@ -551,9 +911,9 @@ static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc)
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ex_dump_package
+ * FUNCTION:    acpi_ex_dump_package_obj
  *
- * PARAMETERS:  Object              - Descriptor to dump
+ * PARAMETERS:  obj_desc            - Descriptor to dump
  *              Level               - Indentation Level
  *              Index               - Package index for this object
  *
@@ -562,7 +922,8 @@ static void acpi_ex_dump_reference(union acpi_operand_object *obj_desc)
  ******************************************************************************/
 
 static void
-acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index)
+acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
+                        u32 level, u32 index)
 {
        u32 i;
 
@@ -608,7 +969,8 @@ acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index)
                acpi_os_printf("[Buffer] Length %.2X = ",
                               obj_desc->buffer.length);
                if (obj_desc->buffer.length) {
-                       acpi_ut_dump_buffer((u8 *) obj_desc->buffer.pointer,
+                       acpi_ut_dump_buffer(ACPI_CAST_PTR
+                                           (u8, obj_desc->buffer.pointer),
                                            obj_desc->buffer.length,
                                            DB_DWORD_DISPLAY, _COMPONENT);
                } else {
@@ -618,19 +980,19 @@ acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index)
 
        case ACPI_TYPE_PACKAGE:
 
-               acpi_os_printf("[Package] Contains %d Elements: \n",
+               acpi_os_printf("[Package] Contains %d Elements:\n",
                               obj_desc->package.count);
 
                for (i = 0; i < obj_desc->package.count; i++) {
-                       acpi_ex_dump_package(obj_desc->package.elements[i],
-                                            level + 1, i);
+                       acpi_ex_dump_package_obj(obj_desc->package.elements[i],
+                                                level + 1, i);
                }
                break;
 
        case ACPI_TYPE_LOCAL_REFERENCE:
 
                acpi_os_printf("[Object Reference] ");
-               acpi_ex_dump_reference(obj_desc);
+               acpi_ex_dump_reference_obj(obj_desc);
                break;
 
        default:
@@ -645,7 +1007,7 @@ acpi_ex_dump_package(union acpi_operand_object *obj_desc, u32 level, u32 index)
  *
  * FUNCTION:    acpi_ex_dump_object_descriptor
  *
- * PARAMETERS:  Object              - Descriptor to dump
+ * PARAMETERS:  obj_desc            - Descriptor to dump
  *              Flags               - Force display if TRUE
  *
  * 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)
        }
 
        if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_NAMED) {
-               acpi_ex_dump_node((struct acpi_namespace_node *)obj_desc,
-                                 flags);
+               acpi_ex_dump_namespace_node((struct acpi_namespace_node *)
+                                           obj_desc, flags);
+
                acpi_os_printf("\nAttached Object (%p):\n",
                               ((struct acpi_namespace_node *)obj_desc)->
                               object);
+
                acpi_ex_dump_object_descriptor(((struct acpi_namespace_node *)
                                                obj_desc)->object, flags);
                return_VOID;
@@ -687,233 +1051,18 @@ acpi_ex_dump_object_descriptor(union acpi_operand_object *obj_desc, u32 flags)
                return_VOID;
        }
 
-       /* Common Fields */
-
-       acpi_ex_out_string("Type", acpi_ut_get_object_type_name(obj_desc));
-       acpi_ex_out_integer("Reference Count",
-                           obj_desc->common.reference_count);
-       acpi_ex_out_integer("Flags", obj_desc->common.flags);
-
-       /* Object-specific Fields */
-
-       switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
-       case ACPI_TYPE_INTEGER:
-
-               acpi_os_printf("%20s : %8.8X%8.8X\n", "Value",
-                              ACPI_FORMAT_UINT64(obj_desc->integer.value));
-               break;
-
-       case ACPI_TYPE_STRING:
-
-               acpi_ex_out_integer("Length", obj_desc->string.length);
-
-               acpi_os_printf("%20s : %p ", "Pointer",
-                              obj_desc->string.pointer);
-               acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX);
-               acpi_os_printf("\n");
-               break;
-
-       case ACPI_TYPE_BUFFER:
-
-               acpi_ex_out_integer("Length", obj_desc->buffer.length);
-               acpi_ex_out_pointer("Pointer", obj_desc->buffer.pointer);
-               ACPI_DUMP_BUFFER(obj_desc->buffer.pointer,
-                                obj_desc->buffer.length);
-               break;
-
-       case ACPI_TYPE_PACKAGE:
-
-               acpi_ex_out_integer("Flags", obj_desc->package.flags);
-               acpi_ex_out_integer("Elements", obj_desc->package.count);
-               acpi_ex_out_pointer("Element List", obj_desc->package.elements);
-
-               /* Dump the package contents */
-
-               acpi_os_printf("\nPackage Contents:\n");
-               acpi_ex_dump_package(obj_desc, 0, 0);
-               break;
-
-       case ACPI_TYPE_DEVICE:
-
-               acpi_ex_out_pointer("Handler", obj_desc->device.handler);
-               acpi_ex_out_pointer("system_notify",
-                                   obj_desc->device.system_notify);
-               acpi_ex_out_pointer("device_notify",
-                                   obj_desc->device.device_notify);
-               break;
-
-       case ACPI_TYPE_EVENT:
-
-               acpi_ex_out_pointer("Semaphore", obj_desc->event.semaphore);
-               break;
-
-       case ACPI_TYPE_METHOD:
-
-               acpi_ex_out_integer("param_count",
-                                   obj_desc->method.param_count);
-               acpi_ex_out_integer("Concurrency",
-                                   obj_desc->method.concurrency);
-               acpi_ex_out_pointer("Semaphore", obj_desc->method.semaphore);
-               acpi_ex_out_integer("owner_id", obj_desc->method.owner_id);
-               acpi_ex_out_integer("aml_length", obj_desc->method.aml_length);
-               acpi_ex_out_pointer("aml_start", obj_desc->method.aml_start);
-               break;
-
-       case ACPI_TYPE_MUTEX:
-
-               acpi_ex_out_integer("sync_level", obj_desc->mutex.sync_level);
-               acpi_ex_out_pointer("owner_thread",
-                                   obj_desc->mutex.owner_thread);
-               acpi_ex_out_integer("acquire_depth",
-                                   obj_desc->mutex.acquisition_depth);
-               acpi_ex_out_pointer("Semaphore", obj_desc->mutex.semaphore);
-               break;
-
-       case ACPI_TYPE_REGION:
-
-               acpi_ex_out_integer("space_id", obj_desc->region.space_id);
-               acpi_ex_out_integer("Flags", obj_desc->region.flags);
-               acpi_ex_out_address("Address", obj_desc->region.address);
-               acpi_ex_out_integer("Length", obj_desc->region.length);
-               acpi_ex_out_pointer("Handler", obj_desc->region.handler);
-               acpi_ex_out_pointer("Next", obj_desc->region.next);
-               break;
-
-       case ACPI_TYPE_POWER:
-
-               acpi_ex_out_integer("system_level",
-                                   obj_desc->power_resource.system_level);
-               acpi_ex_out_integer("resource_order",
-                                   obj_desc->power_resource.resource_order);
-               acpi_ex_out_pointer("system_notify",
-                                   obj_desc->power_resource.system_notify);
-               acpi_ex_out_pointer("device_notify",
-                                   obj_desc->power_resource.device_notify);
-               break;
-
-       case ACPI_TYPE_PROCESSOR:
-
-               acpi_ex_out_integer("Processor ID",
-                                   obj_desc->processor.proc_id);
-               acpi_ex_out_integer("Length", obj_desc->processor.length);
-               acpi_ex_out_address("Address",
-                                   (acpi_physical_address) obj_desc->processor.
-                                   address);
-               acpi_ex_out_pointer("system_notify",
-                                   obj_desc->processor.system_notify);
-               acpi_ex_out_pointer("device_notify",
-                                   obj_desc->processor.device_notify);
-               acpi_ex_out_pointer("Handler", obj_desc->processor.handler);
-               break;
-
-       case ACPI_TYPE_THERMAL:
-
-               acpi_ex_out_pointer("system_notify",
-                                   obj_desc->thermal_zone.system_notify);
-               acpi_ex_out_pointer("device_notify",
-                                   obj_desc->thermal_zone.device_notify);
-               acpi_ex_out_pointer("Handler", obj_desc->thermal_zone.handler);
-               break;
-
-       case ACPI_TYPE_BUFFER_FIELD:
-       case ACPI_TYPE_LOCAL_REGION_FIELD:
-       case ACPI_TYPE_LOCAL_BANK_FIELD:
-       case ACPI_TYPE_LOCAL_INDEX_FIELD:
-
-               acpi_ex_out_integer("field_flags",
-                                   obj_desc->common_field.field_flags);
-               acpi_ex_out_integer("access_byte_width",
-                                   obj_desc->common_field.access_byte_width);
-               acpi_ex_out_integer("bit_length",
-                                   obj_desc->common_field.bit_length);
-               acpi_ex_out_integer("fld_bit_offset",
-                                   obj_desc->common_field.
-                                   start_field_bit_offset);
-               acpi_ex_out_integer("base_byte_offset",
-                                   obj_desc->common_field.base_byte_offset);
-               acpi_ex_out_pointer("parent_node", obj_desc->common_field.node);
-
-               switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
-               case ACPI_TYPE_BUFFER_FIELD:
-                       acpi_ex_out_pointer("buffer_obj",
-                                           obj_desc->buffer_field.buffer_obj);
-                       break;
-
-               case ACPI_TYPE_LOCAL_REGION_FIELD:
-                       acpi_ex_out_pointer("region_obj",
-                                           obj_desc->field.region_obj);
-                       break;
-
-               case ACPI_TYPE_LOCAL_BANK_FIELD:
-                       acpi_ex_out_integer("Value",
-                                           obj_desc->bank_field.value);
-                       acpi_ex_out_pointer("region_obj",
-                                           obj_desc->bank_field.region_obj);
-                       acpi_ex_out_pointer("bank_obj",
-                                           obj_desc->bank_field.bank_obj);
-                       break;
-
-               case ACPI_TYPE_LOCAL_INDEX_FIELD:
-                       acpi_ex_out_integer("Value",
-                                           obj_desc->index_field.value);
-                       acpi_ex_out_pointer("Index",
-                                           obj_desc->index_field.index_obj);
-                       acpi_ex_out_pointer("Data",
-                                           obj_desc->index_field.data_obj);
-                       break;
-
-               default:
-                       /* All object types covered above */
-                       break;
-               }
-               break;
-
-       case ACPI_TYPE_LOCAL_REFERENCE:
-
-               acpi_ex_out_integer("target_type",
-                                   obj_desc->reference.target_type);
-               acpi_ex_out_string("Opcode",
-                                  (acpi_ps_get_opcode_info
-                                   (obj_desc->reference.opcode))->name);
-               acpi_ex_out_integer("Offset", obj_desc->reference.offset);
-               acpi_ex_out_pointer("obj_desc", obj_desc->reference.object);
-               acpi_ex_out_pointer("Node", obj_desc->reference.node);
-               acpi_ex_out_pointer("Where", obj_desc->reference.where);
-
-               acpi_ex_dump_reference(obj_desc);
-               break;
-
-       case ACPI_TYPE_LOCAL_ADDRESS_HANDLER:
-
-               acpi_ex_out_integer("space_id",
-                                   obj_desc->address_space.space_id);
-               acpi_ex_out_pointer("Next", obj_desc->address_space.next);
-               acpi_ex_out_pointer("region_list",
-                                   obj_desc->address_space.region_list);
-               acpi_ex_out_pointer("Node", obj_desc->address_space.node);
-               acpi_ex_out_pointer("Context", obj_desc->address_space.context);
-               break;
+       if (obj_desc->common.type > ACPI_TYPE_NS_NODE_MAX) {
+               return_VOID;
+       }
 
-       case ACPI_TYPE_LOCAL_NOTIFY:
+       /* Common Fields */
 
-               acpi_ex_out_pointer("Node", obj_desc->notify.node);
-               acpi_ex_out_pointer("Context", obj_desc->notify.context);
-               break;
+       acpi_ex_dump_object(obj_desc, acpi_ex_dump_common);
 
-       case ACPI_TYPE_LOCAL_ALIAS:
-       case ACPI_TYPE_LOCAL_METHOD_ALIAS:
-       case ACPI_TYPE_LOCAL_EXTRA:
-       case ACPI_TYPE_LOCAL_DATA:
-       default:
-
-               acpi_os_printf
-                   ("ex_dump_object_descriptor: Display not implemented for object type %s\n",
-                    acpi_ut_get_object_type_name(obj_desc));
-               break;
-       }
+       /* Object-specific fields */
 
+       acpi_ex_dump_object(obj_desc, acpi_ex_dump_info[obj_desc->common.type]);
        return_VOID;
 }
 
-#endif                         /*  ACPI_FUTURE_USAGE  */
 #endif
index ab1ba399aa283bfbe18070cdfd61fc98474f2583..e259201ce9a091986ac2b92a4114d8e15eabe6bb 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
                 * Source must be a buffer of sufficient size (ACPI_SMBUS_BUFFER_SIZE).
                 */
                if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_BUFFER) {
-                       ACPI_REPORT_ERROR(("SMBus write requires Buffer, found type %s\n", acpi_ut_get_object_type_name(source_desc)));
+                       ACPI_ERROR((AE_INFO,
+                                   "SMBus write requires Buffer, found type %s",
+                                   acpi_ut_get_object_type_name(source_desc)));
 
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
 
                if (source_desc->buffer.length < ACPI_SMBUS_BUFFER_SIZE) {
-                       ACPI_REPORT_ERROR(("SMBus write requires Buffer of length %X, found length %X\n", ACPI_SMBUS_BUFFER_SIZE, source_desc->buffer.length));
+                       ACPI_ERROR((AE_INFO,
+                                   "SMBus write requires Buffer of length %X, found length %X",
+                                   ACPI_SMBUS_BUFFER_SIZE,
+                                   source_desc->buffer.length));
 
                        return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
                }
index ba6e08843c29894ee749c3f88ee6be3217ee2eab..bd1af35f7fcfc6497e1330d7092d58128f6eb9bc 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        /* We must have a valid region */
 
        if (ACPI_GET_OBJECT_TYPE(rgn_desc) != ACPI_TYPE_REGION) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Needed Region, found type %X (%s)\n",
-                                 ACPI_GET_OBJECT_TYPE(rgn_desc),
-                                 acpi_ut_get_object_type_name(rgn_desc)));
+               ACPI_ERROR((AE_INFO, "Needed Region, found type %X (%s)",
+                           ACPI_GET_OBJECT_TYPE(rgn_desc),
+                           acpi_ut_get_object_type_name(rgn_desc)));
 
                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
        }
@@ -162,31 +161,28 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
                         * than the region itself.  For example, a region of length one
                         * byte, and a field with Dword access specified.
                         */
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Field [%4.4s] access width (%d bytes) too large for region [%4.4s] (length %X)\n",
-                                         acpi_ut_get_node_name(obj_desc->
-                                                               common_field.
-                                                               node),
-                                         obj_desc->common_field.
-                                         access_byte_width,
-                                         acpi_ut_get_node_name(rgn_desc->
-                                                               region.node),
-                                         rgn_desc->region.length));
+                       ACPI_ERROR((AE_INFO,
+                                   "Field [%4.4s] access width (%d bytes) too large for region [%4.4s] (length %X)",
+                                   acpi_ut_get_node_name(obj_desc->
+                                                         common_field.node),
+                                   obj_desc->common_field.access_byte_width,
+                                   acpi_ut_get_node_name(rgn_desc->region.
+                                                         node),
+                                   rgn_desc->region.length));
                }
 
                /*
                 * Offset rounded up to next multiple of field width
                 * exceeds region length, indicate an error
                 */
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Field [%4.4s] Base+Offset+Width %X+%X+%X is beyond end of region [%4.4s] (length %X)\n",
-                                 acpi_ut_get_node_name(obj_desc->common_field.
-                                                       node),
-                                 obj_desc->common_field.base_byte_offset,
-                                 field_datum_byte_offset,
-                                 obj_desc->common_field.access_byte_width,
-                                 acpi_ut_get_node_name(rgn_desc->region.node),
-                                 rgn_desc->region.length));
+               ACPI_ERROR((AE_INFO,
+                           "Field [%4.4s] Base+Offset+Width %X+%X+%X is beyond end of region [%4.4s] (length %X)",
+                           acpi_ut_get_node_name(obj_desc->common_field.node),
+                           obj_desc->common_field.base_byte_offset,
+                           field_datum_byte_offset,
+                           obj_desc->common_field.access_byte_width,
+                           acpi_ut_get_node_name(rgn_desc->region.node),
+                           rgn_desc->region.length));
 
                return_ACPI_STATUS(AE_AML_REGION_LIMIT);
        }
@@ -270,18 +266,17 @@ acpi_ex_access_region(union acpi_operand_object *obj_desc,
 
        if (ACPI_FAILURE(status)) {
                if (status == AE_NOT_IMPLEMENTED) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Region %s(%X) not implemented\n",
-                                         acpi_ut_get_region_name(rgn_desc->
-                                                                 region.
-                                                                 space_id),
-                                         rgn_desc->region.space_id));
+                       ACPI_ERROR((AE_INFO,
+                                   "Region %s(%X) not implemented",
+                                   acpi_ut_get_region_name(rgn_desc->region.
+                                                           space_id),
+                                   rgn_desc->region.space_id));
                } else if (status == AE_NOT_EXIST) {
-                       ACPI_REPORT_ERROR(("Region %s(%X) has no handler\n",
-                                          acpi_ut_get_region_name(rgn_desc->
-                                                                  region.
-                                                                  space_id),
-                                          rgn_desc->region.space_id));
+                       ACPI_ERROR((AE_INFO,
+                                   "Region %s(%X) has no handler",
+                                   acpi_ut_get_region_name(rgn_desc->region.
+                                                           space_id),
+                                   rgn_desc->region.space_id));
                }
        }
 
@@ -514,8 +509,8 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
 
        default:
 
-               ACPI_REPORT_ERROR(("Wrong object type in field I/O %X\n",
-                                  ACPI_GET_OBJECT_TYPE(obj_desc)));
+               ACPI_ERROR((AE_INFO, "Wrong object type in field I/O %X",
+                           ACPI_GET_OBJECT_TYPE(obj_desc)));
                status = AE_AML_INTERNAL;
                break;
        }
@@ -618,11 +613,11 @@ acpi_ex_write_with_update_rule(union acpi_operand_object *obj_desc,
 
                default:
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "write_with_update_rule: Unknown update_rule setting: %X\n",
-                                         (obj_desc->common_field.
-                                          field_flags &
-                                          AML_FIELD_UPDATE_RULE_MASK)));
+                       ACPI_ERROR((AE_INFO,
+                                   "Unknown update_rule value: %X",
+                                   (obj_desc->common_field.
+                                    field_flags &
+                                    AML_FIELD_UPDATE_RULE_MASK)));
                        return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
                }
        }
@@ -677,10 +672,9 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
 
        if (buffer_length <
            ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Field size %X (bits) is too large for buffer (%X)\n",
-                                 obj_desc->common_field.bit_length,
-                                 buffer_length));
+               ACPI_ERROR((AE_INFO,
+                           "Field size %X (bits) is too large for buffer (%X)",
+                           obj_desc->common_field.bit_length, buffer_length));
 
                return_ACPI_STATUS(AE_BUFFER_OVERFLOW);
        }
@@ -792,10 +786,9 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
 
        if (buffer_length <
            ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Field size %X (bits) is too large for buffer (%X)\n",
-                                 obj_desc->common_field.bit_length,
-                                 buffer_length));
+               ACPI_ERROR((AE_INFO,
+                           "Field size %X (bits) is too large for buffer (%X)",
+                           obj_desc->common_field.bit_length, buffer_length));
 
                return_ACPI_STATUS(AE_BUFFER_OVERFLOW);
        }
index a3f4d72bedc979b45c77e3b86516b08d763bc7e2..48c18d29222a4c1891a8b3e55478d4304a92d2bb 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -45,6 +45,7 @@
 #include <acpi/acpi.h>
 #include <acpi/acinterp.h>
 #include <acpi/amlcode.h>
+#include <acpi/amlresrc.h>
 
 #define _COMPONENT          ACPI_EXECUTER
 ACPI_MODULE_NAME("exmisc")
@@ -97,7 +98,8 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
 
                default:
 
-                       ACPI_REPORT_ERROR(("Unknown Reference opcode in get_reference %X\n", obj_desc->reference.opcode));
+                       ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X",
+                                   obj_desc->reference.opcode));
                        return_ACPI_STATUS(AE_AML_INTERNAL);
                }
                break;
@@ -112,7 +114,8 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
 
        default:
 
-               ACPI_REPORT_ERROR(("Invalid descriptor type in get_reference: %X\n", ACPI_GET_DESCRIPTOR_TYPE(obj_desc)));
+               ACPI_ERROR((AE_INFO, "Invalid descriptor type %X",
+                           ACPI_GET_DESCRIPTOR_TYPE(obj_desc)));
                return_ACPI_STATUS(AE_TYPE);
        }
 
@@ -157,48 +160,65 @@ acpi_ex_concat_template(union acpi_operand_object *operand0,
                        union acpi_operand_object **actual_return_desc,
                        struct acpi_walk_state *walk_state)
 {
+       acpi_status status;
        union acpi_operand_object *return_desc;
        u8 *new_buf;
-       u8 *end_tag1;
-       u8 *end_tag2;
+       u8 *end_tag;
+       acpi_size length0;
        acpi_size length1;
-       acpi_size length2;
+       acpi_size new_length;
 
        ACPI_FUNCTION_TRACE("ex_concat_template");
 
-       /* Find the end_tags in each resource template */
+       /*
+        * Find the end_tag descriptor in each resource template.
+        * Note1: returned pointers point TO the end_tag, not past it.
+        * Note2: zero-length buffers are allowed; treated like one end_tag
+        */
+
+       /* Get the length of the first resource template */
 
-       end_tag1 = acpi_ut_get_resource_end_tag(operand0);
-       end_tag2 = acpi_ut_get_resource_end_tag(operand1);
-       if (!end_tag1 || !end_tag2) {
-               return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
+       status = acpi_ut_get_resource_end_tag(operand0, &end_tag);
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
        }
 
-       /* Compute the length of each part */
+       length0 = ACPI_PTR_DIFF(end_tag, operand0->buffer.pointer);
+
+       /* Get the length of the second resource template */
+
+       status = acpi_ut_get_resource_end_tag(operand1, &end_tag);
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
 
-       length1 = ACPI_PTR_DIFF(end_tag1, operand0->buffer.pointer);
-       length2 = ACPI_PTR_DIFF(end_tag2, operand1->buffer.pointer) + 2;        /* Size of END_TAG */
+       length1 = ACPI_PTR_DIFF(end_tag, operand1->buffer.pointer);
 
-       /* Create a new buffer object for the result */
+       /* Combine both lengths, minimum size will be 2 for end_tag */
 
-       return_desc = acpi_ut_create_buffer_object(length1 + length2);
+       new_length = length0 + length1 + sizeof(struct aml_resource_end_tag);
+
+       /* Create a new buffer object for the result (with one end_tag) */
+
+       return_desc = acpi_ut_create_buffer_object(new_length);
        if (!return_desc) {
                return_ACPI_STATUS(AE_NO_MEMORY);
        }
 
-       /* Copy the templates to the new descriptor */
-
+       /*
+        * Copy the templates to the new buffer, 0 first, then 1 follows. One
+        * end_tag descriptor is copied from Operand1.
+        */
        new_buf = return_desc->buffer.pointer;
-       ACPI_MEMCPY(new_buf, operand0->buffer.pointer, length1);
-       ACPI_MEMCPY(new_buf + length1, operand1->buffer.pointer, length2);
+       ACPI_MEMCPY(new_buf, operand0->buffer.pointer, length0);
+       ACPI_MEMCPY(new_buf + length0, operand1->buffer.pointer, length1);
 
-       /* Compute the new checksum */
+       /* Insert end_tag and set the checksum to zero, means "ignore checksum" */
 
-       new_buf[return_desc->buffer.length - 1] =
-           acpi_ut_generate_checksum(return_desc->buffer.pointer,
-                                     (return_desc->buffer.length - 1));
+       new_buf[new_length - 1] = 0;
+       new_buf[new_length - 2] = ACPI_RESOURCE_NAME_END_TAG | 1;
 
-       /* Return the completed template descriptor */
+       /* Return the completed resource template */
 
        *actual_return_desc = return_desc;
        return_ACPI_STATUS(AE_OK);
@@ -229,7 +249,6 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
        union acpi_operand_object *return_desc;
        char *new_buf;
        acpi_status status;
-       acpi_size new_length;
 
        ACPI_FUNCTION_TRACE("ex_do_concatenate");
 
@@ -256,8 +275,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
                break;
 
        default:
-               ACPI_REPORT_ERROR(("Concat - invalid obj type: %X\n",
-                                  ACPI_GET_OBJECT_TYPE(operand0)));
+               ACPI_ERROR((AE_INFO, "Invalid object type: %X",
+                           ACPI_GET_OBJECT_TYPE(operand0)));
                status = AE_AML_INTERNAL;
        }
 
@@ -296,8 +315,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
 
                /* Copy the first integer, LSB first */
 
-               ACPI_MEMCPY(new_buf,
-                           &operand0->integer.value,
+               ACPI_MEMCPY(new_buf, &operand0->integer.value,
                            acpi_gbl_integer_byte_width);
 
                /* Copy the second integer (LSB first) after the first */
@@ -311,14 +329,11 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
 
                /* Result of two Strings is a String */
 
-               new_length = (acpi_size) operand0->string.length +
-                   (acpi_size) local_operand1->string.length;
-               if (new_length > ACPI_MAX_STRING_CONVERSION) {
-                       status = AE_AML_STRING_LIMIT;
-                       goto cleanup;
-               }
-
-               return_desc = acpi_ut_create_string_object(new_length);
+               return_desc = acpi_ut_create_string_object((acpi_size)
+                                                          (operand0->string.
+                                                           length +
+                                                           local_operand1->
+                                                           string.length));
                if (!return_desc) {
                        status = AE_NO_MEMORY;
                        goto cleanup;
@@ -338,11 +353,10 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
                /* Result of two Buffers is a Buffer */
 
                return_desc = acpi_ut_create_buffer_object((acpi_size)
-                                                          operand0->buffer.
-                                                          length +
-                                                          (acpi_size)
-                                                          local_operand1->
-                                                          buffer.length);
+                                                          (operand0->buffer.
+                                                           length +
+                                                           local_operand1->
+                                                           buffer.length));
                if (!return_desc) {
                        status = AE_NO_MEMORY;
                        goto cleanup;
@@ -352,8 +366,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
 
                /* Concatenate the buffers */
 
-               ACPI_MEMCPY(new_buf,
-                           operand0->buffer.pointer, operand0->buffer.length);
+               ACPI_MEMCPY(new_buf, operand0->buffer.pointer,
+                           operand0->buffer.length);
                ACPI_MEMCPY(new_buf + operand0->buffer.length,
                            local_operand1->buffer.pointer,
                            local_operand1->buffer.length);
@@ -363,8 +377,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
 
                /* Invalid object type, should not happen here */
 
-               ACPI_REPORT_ERROR(("Concatenate - Invalid object type: %X\n",
-                                  ACPI_GET_OBJECT_TYPE(operand0)));
+               ACPI_ERROR((AE_INFO, "Invalid object type: %X",
+                           ACPI_GET_OBJECT_TYPE(operand0)));
                status = AE_AML_INTERNAL;
                goto cleanup;
        }
@@ -625,9 +639,8 @@ acpi_ex_do_logical_op(u16 opcode,
 
                /* Lexicographic compare: compare the data bytes */
 
-               compare = ACPI_MEMCMP((const char *)operand0->buffer.pointer,
-                                     (const char *)local_operand1->buffer.
-                                     pointer,
+               compare = ACPI_MEMCMP(operand0->buffer.pointer,
+                                     local_operand1->buffer.pointer,
                                      (length0 > length1) ? length1 : length0);
 
                switch (opcode) {
index ab47f6d8b5c0bd664c471788b11f70823a9f479f..f843b22e20b965101fb676d2ddedc31f54e1f87e 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        /* Sanity check -- we must have a valid thread ID */
 
        if (!walk_state->thread) {
-               ACPI_REPORT_ERROR(("Cannot acquire Mutex [%4.4s], null thread info\n", acpi_ut_get_node_name(obj_desc->mutex.node)));
+               ACPI_ERROR((AE_INFO,
+                           "Cannot acquire Mutex [%4.4s], null thread info",
+                           acpi_ut_get_node_name(obj_desc->mutex.node)));
                return_ACPI_STATUS(AE_AML_INTERNAL);
        }
 
@@ -162,7 +164,9 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
         * mutex.  This mechanism provides some deadlock prevention
         */
        if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) {
-               ACPI_REPORT_ERROR(("Cannot acquire Mutex [%4.4s], incorrect sync_level\n", acpi_ut_get_node_name(obj_desc->mutex.node)));
+               ACPI_ERROR((AE_INFO,
+                           "Cannot acquire Mutex [%4.4s], incorrect sync_level",
+                           acpi_ut_get_node_name(obj_desc->mutex.node)));
                return_ACPI_STATUS(AE_AML_MUTEX_ORDER);
        }
 
@@ -237,14 +241,18 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
        /* The mutex must have been previously acquired in order to release it */
 
        if (!obj_desc->mutex.owner_thread) {
-               ACPI_REPORT_ERROR(("Cannot release Mutex [%4.4s], not acquired\n", acpi_ut_get_node_name(obj_desc->mutex.node)));
+               ACPI_ERROR((AE_INFO,
+                           "Cannot release Mutex [%4.4s], not acquired",
+                           acpi_ut_get_node_name(obj_desc->mutex.node)));
                return_ACPI_STATUS(AE_AML_MUTEX_NOT_ACQUIRED);
        }
 
        /* Sanity check -- we must have a valid thread ID */
 
        if (!walk_state->thread) {
-               ACPI_REPORT_ERROR(("Cannot release Mutex [%4.4s], null thread info\n", acpi_ut_get_node_name(obj_desc->mutex.node)));
+               ACPI_ERROR((AE_INFO,
+                           "Cannot release Mutex [%4.4s], null thread info",
+                           acpi_ut_get_node_name(obj_desc->mutex.node)));
                return_ACPI_STATUS(AE_AML_INTERNAL);
        }
 
@@ -255,7 +263,11 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
        if ((obj_desc->mutex.owner_thread->thread_id !=
             walk_state->thread->thread_id)
            && (obj_desc->mutex.semaphore != acpi_gbl_global_lock_semaphore)) {
-               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));
+               ACPI_ERROR((AE_INFO,
+                           "Thread %X cannot release Mutex [%4.4s] acquired by thread %X",
+                           walk_state->thread->thread_id,
+                           acpi_ut_get_node_name(obj_desc->mutex.node),
+                           obj_desc->mutex.owner_thread->thread_id));
                return_ACPI_STATUS(AE_AML_NOT_OWNER);
        }
 
@@ -264,7 +276,9 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
         * equal to the current sync level
         */
        if (obj_desc->mutex.sync_level > walk_state->thread->current_sync_level) {
-               ACPI_REPORT_ERROR(("Cannot release Mutex [%4.4s], incorrect sync_level\n", acpi_ut_get_node_name(obj_desc->mutex.node)));
+               ACPI_ERROR((AE_INFO,
+                           "Cannot release Mutex [%4.4s], incorrect sync_level",
+                           acpi_ut_get_node_name(obj_desc->mutex.node)));
                return_ACPI_STATUS(AE_AML_MUTEX_ORDER);
        }
 
index 239d8473e9a5c8d7195861d03ccb02d89688ef9f..054fe5e1a3142982d10339b76d7247c16430b1d2 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
         */
        name_string = ACPI_MEM_ALLOCATE(size_needed);
        if (!name_string) {
-               ACPI_REPORT_ERROR(("ex_allocate_name_string: Could not allocate size %d\n", size_needed));
+               ACPI_ERROR((AE_INFO,
+                           "Could not allocate size %d", size_needed));
                return_PTR(NULL);
        }
 
@@ -167,8 +168,7 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
        char_buf[0] = *aml_address;
 
        if ('0' <= char_buf[0] && char_buf[0] <= '9') {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "leading digit: %c\n",
-                                 char_buf[0]));
+               ACPI_ERROR((AE_INFO, "Invalid leading digit: %c", char_buf[0]));
                return_ACPI_STATUS(AE_CTRL_PENDING);
        }
 
@@ -191,10 +191,10 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
                if (name_string) {
                        ACPI_STRCAT(name_string, char_buf);
                        ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
-                                         "Appended to - %s \n", name_string));
+                                         "Appended to - %s\n", name_string));
                } else {
                        ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
-                                         "No Name string - %s \n", char_buf));
+                                         "No Name string - %s\n", char_buf));
                }
        } else if (index == 0) {
                /*
@@ -211,12 +211,12 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
                 * the required 4
                 */
                status = AE_AML_BAD_NAME;
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Bad character %02x in name, at %p\n",
-                                 *aml_address, aml_address));
+               ACPI_ERROR((AE_INFO,
+                           "Bad character %02x in name, at %p",
+                           *aml_address, aml_address));
        }
 
-       *in_aml_address = (u8 *) aml_address;
+       *in_aml_address = ACPI_CAST_PTR(u8, aml_address);
        return_ACPI_STATUS(status);
 }
 
@@ -412,8 +412,7 @@ acpi_ex_get_name_string(acpi_object_type data_type,
        if (AE_CTRL_PENDING == status && has_prefix) {
                /* Ran out of segments after processing a prefix */
 
-               ACPI_REPORT_ERROR(("ex_do_name: Malformed Name at %p\n",
-                                  name_string));
+               ACPI_ERROR((AE_INFO, "Malformed Name at %p", name_string));
                status = AE_AML_BAD_NAME;
        }
 
index 97e34542f5e44746bea68b73f9f01e2e353f9841..23d0823bcd5e69df8a8f88c78d639f57e3bfead5 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        default:                /*  Unknown opcode  */
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_0A_0T_1R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                break;
        }
@@ -188,7 +189,8 @@ acpi_status acpi_ex_opcode_1A_0T_0R(struct acpi_walk_state *walk_state)
 
        default:                /*  Unknown opcode  */
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_1A_0T_0R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                break;
        }
@@ -227,7 +229,8 @@ acpi_status acpi_ex_opcode_1A_1T_0R(struct acpi_walk_state *walk_state)
 
        default:                /* Unknown opcode */
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_1A_1T_0R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
@@ -346,9 +349,9 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
                                /* Check the range of the digit */
 
                                if (temp32 > 9) {
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "BCD digit too large (not decimal): 0x%X\n",
-                                                         temp32));
+                                       ACPI_ERROR((AE_INFO,
+                                                   "BCD digit too large (not decimal): 0x%X",
+                                                   temp32));
 
                                        status = AE_AML_NUMERIC_OVERFLOW;
                                        goto cleanup;
@@ -393,12 +396,10 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
                        /* Overflow if there is any data left in Digit */
 
                        if (digit > 0) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Integer too large to convert to BCD: %8.8X%8.8X\n",
-                                                 ACPI_FORMAT_UINT64(operand
-                                                                    [0]->
-                                                                    integer.
-                                                                    value)));
+                               ACPI_ERROR((AE_INFO,
+                                           "Integer too large to convert to BCD: %8.8X%8.8X",
+                                           ACPI_FORMAT_UINT64(operand[0]->
+                                                              integer.value)));
                                status = AE_AML_NUMERIC_OVERFLOW;
                                goto cleanup;
                        }
@@ -525,15 +526,16 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
 
                /* These are two obsolete opcodes */
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "%s is obsolete and not implemented\n",
-                                 acpi_ps_get_opcode_name(walk_state->opcode)));
+               ACPI_ERROR((AE_INFO,
+                           "%s is obsolete and not implemented",
+                           acpi_ps_get_opcode_name(walk_state->opcode)));
                status = AE_SUPPORT;
                goto cleanup;
 
        default:                /* Unknown opcode */
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_1A_1T_1R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
@@ -639,11 +641,10 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
                    acpi_ex_resolve_operands(AML_LNOT_OP, &temp_desc,
                                             walk_state);
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "%s: bad operand(s) %s\n",
-                                         acpi_ps_get_opcode_name(walk_state->
-                                                                 opcode),
-                                         acpi_format_exception(status)));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "While resolving operands for [%s]",
+                                       acpi_ps_get_opcode_name(walk_state->
+                                                               opcode)));
 
                        goto cleanup;
                }
@@ -742,9 +743,9 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
                        break;
 
                default:
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "size_of - Operand is not Buf/Int/Str/Pkg - found type %s\n",
-                                         acpi_ut_get_type_name(type)));
+                       ACPI_ERROR((AE_INFO,
+                                   "Operand is not Buf/Int/Str/Pkg - found type %s",
+                                   acpi_ut_get_type_name(type)));
                        status = AE_AML_OPERAND_TYPE;
                        goto cleanup;
                }
@@ -941,11 +942,10 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
 
                                default:
 
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "Unknown Index target_type %X in obj %p\n",
-                                                         operand[0]->reference.
-                                                         target_type,
-                                                         operand[0]));
+                                       ACPI_ERROR((AE_INFO,
+                                                   "Unknown Index target_type %X in obj %p",
+                                                   operand[0]->reference.
+                                                   target_type, operand[0]));
                                        status = AE_AML_OPERAND_TYPE;
                                        goto cleanup;
                                }
@@ -971,11 +971,10 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
                                break;
 
                        default:
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Unknown opcode in ref(%p) - %X\n",
-                                                 operand[0],
-                                                 operand[0]->reference.
-                                                 opcode));
+                               ACPI_ERROR((AE_INFO,
+                                           "Unknown opcode in ref(%p) - %X",
+                                           operand[0],
+                                           operand[0]->reference.opcode));
 
                                status = AE_TYPE;
                                goto cleanup;
@@ -985,7 +984,8 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
 
        default:
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_1A_0T_1R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
index 8d70c6beef00c9f6d875320c0ea3c7e6d3b352b7..e263a5ddd405b8fe29418338e51a3cb3212a6f39 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
                /* Are notifies allowed on this object? */
 
                if (!acpi_ev_is_notify_object(node)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Unexpected notify object type [%s]\n",
-                                         acpi_ut_get_type_name(node->type)));
+                       ACPI_ERROR((AE_INFO,
+                                   "Unexpected notify object type [%s]",
+                                   acpi_ut_get_type_name(node->type)));
 
                        status = AE_AML_OPERAND_TYPE;
                        break;
@@ -157,7 +157,8 @@ acpi_status acpi_ex_opcode_2A_0T_0R(struct acpi_walk_state *walk_state)
 
        default:
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_2A_0T_0R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
        }
 
@@ -221,7 +222,8 @@ acpi_status acpi_ex_opcode_2A_2T_1R(struct acpi_walk_state *walk_state)
 
        default:
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_2A_2T_1R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
@@ -344,10 +346,6 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
                       (length < operand[1]->integer.value) &&
                       (operand[0]->buffer.pointer[length])) {
                        length++;
-                       if (length > ACPI_MAX_STRING_CONVERSION) {
-                               status = AE_AML_STRING_LIMIT;
-                               goto cleanup;
-                       }
                }
 
                /* Allocate a new string object */
@@ -358,8 +356,10 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
                        goto cleanup;
                }
 
-               /* Copy the raw buffer data with no transform. NULL terminated already */
-
+               /*
+                * Copy the raw buffer data with no transform.
+                * (NULL terminated already)
+                */
                ACPI_MEMCPY(return_desc->string.pointer,
                            operand[0]->buffer.pointer, length);
                break;
@@ -391,10 +391,10 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
                        /* Object to be indexed is a Package */
 
                        if (index >= operand[0]->package.count) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Index value (%X%8.8X) beyond package end (%X)\n",
-                                                 ACPI_FORMAT_UINT64(index),
-                                                 operand[0]->package.count));
+                               ACPI_ERROR((AE_INFO,
+                                           "Index value (%X%8.8X) beyond package end (%X)",
+                                           ACPI_FORMAT_UINT64(index),
+                                           operand[0]->package.count));
                                status = AE_AML_PACKAGE_LIMIT;
                                goto cleanup;
                        }
@@ -407,10 +407,10 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
                        /* Object to be indexed is a Buffer/String */
 
                        if (index >= operand[0]->buffer.length) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Index value (%X%8.8X) beyond end of buffer (%X)\n",
-                                                 ACPI_FORMAT_UINT64(index),
-                                                 operand[0]->buffer.length));
+                               ACPI_ERROR((AE_INFO,
+                                           "Index value (%X%8.8X) beyond end of buffer (%X)",
+                                           ACPI_FORMAT_UINT64(index),
+                                           operand[0]->buffer.length));
                                status = AE_AML_BUFFER_LIMIT;
                                goto cleanup;
                        }
@@ -442,7 +442,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
 
        default:
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_2A_1T_1R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                break;
        }
@@ -546,7 +547,8 @@ acpi_status acpi_ex_opcode_2A_0T_1R(struct acpi_walk_state *walk_state)
 
        default:
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_2A_0T_1R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
index 483365777670d00a2100ac81de158167e7fe13b4..6a3a883cb8a3b2a24bba6369b608a92cdec659b3 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        default:
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
@@ -223,8 +224,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
                        goto cleanup;
                }
 
-               if (length > 0) {
-                       /* Copy the portion requested */
+               if (buffer) {
+                       /* We have a buffer, copy the portion requested */
 
                        ACPI_MEMCPY(buffer, operand[0]->string.pointer + index,
                                    length);
@@ -242,7 +243,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
 
        default:
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
index 5dee771395769a54349ac3ce1cf34431d15c3a3a..e043d924444f9ad07c17de9016ac8492f16f997b 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
                if ((operand[1]->integer.value > MAX_MATCH_OPERATOR) ||
                    (operand[3]->integer.value > MAX_MATCH_OPERATOR)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Match operator out of range\n"));
+                       ACPI_ERROR((AE_INFO, "Match operator out of range"));
                        status = AE_AML_OPERAND_VALUE;
                        goto cleanup;
                }
@@ -244,10 +243,10 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state)
 
                index = operand[5]->integer.value;
                if (index >= operand[0]->package.count) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Index (%X%8.8X) beyond package end (%X)\n",
-                                         ACPI_FORMAT_UINT64(index),
-                                         operand[0]->package.count));
+                       ACPI_ERROR((AE_INFO,
+                                   "Index (%X%8.8X) beyond package end (%X)",
+                                   ACPI_FORMAT_UINT64(index),
+                                   operand[0]->package.count));
                        status = AE_AML_PACKAGE_LIMIT;
                        goto cleanup;
                }
@@ -316,7 +315,8 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state)
 
        default:
 
-               ACPI_REPORT_ERROR(("acpi_ex_opcode_6A_0T_1R: Unknown opcode %X\n", walk_state->opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X",
+                           walk_state->opcode));
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
index 7476c363e407e30b9f67c899bcfdeaa068ee8aed..7719ae5d4f16a012b97b48244992518fdc7aa3ca 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        default:
                /* Invalid field access type */
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unknown field access type %X\n", access));
-               return_VALUE(0);
+               ACPI_ERROR((AE_INFO, "Unknown field access type %X", access));
+               return_UINT32(0);
        }
 
        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,
        }
 
        *return_byte_alignment = byte_alignment;
-       return_VALUE(bit_length);
+       return_UINT32(bit_length);
 }
 
 /*******************************************************************************
@@ -422,15 +421,15 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
 
        if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) {
                if (!info->region_node) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null region_node\n"));
+                       ACPI_ERROR((AE_INFO, "Null region_node"));
                        return_ACPI_STATUS(AE_AML_NO_OPERAND);
                }
 
                type = acpi_ns_get_type(info->region_node);
                if (type != ACPI_TYPE_REGION) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Needed Region, found type %X (%s)\n",
-                                         type, acpi_ut_get_type_name(type)));
+                       ACPI_ERROR((AE_INFO,
+                                   "Needed Region, found type %X (%s)",
+                                   type, acpi_ut_get_type_name(type)));
 
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
@@ -499,17 +498,17 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
 
        case ACPI_TYPE_LOCAL_INDEX_FIELD:
 
+               /* Get the Index and Data registers */
+
                obj_desc->index_field.index_obj =
                    acpi_ns_get_attached_object(info->register_node);
                obj_desc->index_field.data_obj =
                    acpi_ns_get_attached_object(info->data_register_node);
-               obj_desc->index_field.value = (u32)
-                   (info->field_bit_position /
-                    ACPI_MUL_8(obj_desc->field.access_byte_width));
 
                if (!obj_desc->index_field.data_obj
                    || !obj_desc->index_field.index_obj) {
-                       ACPI_REPORT_ERROR(("Null Index Object during field prep\n"));
+                       ACPI_ERROR((AE_INFO,
+                                   "Null Index Object during field prep"));
                        acpi_ut_delete_object_desc(obj_desc);
                        return_ACPI_STATUS(AE_AML_INTERNAL);
                }
@@ -519,6 +518,15 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
                acpi_ut_add_reference(obj_desc->index_field.data_obj);
                acpi_ut_add_reference(obj_desc->index_field.index_obj);
 
+               /*
+                * The value written to the Index register is the byte offset of the
+                * target field
+                * Note: may change code to: ACPI_DIV_8 (Info->field_bit_position)
+                */
+               obj_desc->index_field.value = (u32)
+                   (info->field_bit_position /
+                    ACPI_MUL_8(obj_desc->field.access_byte_width));
+
                ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
                                  "index_field: bit_off %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n",
                                  obj_desc->index_field.start_field_bit_offset,
index 9a2f5bea3afe9618bbb5de54614683672d28629b..6a4cfdff606d14e97ec93b7bcced12c2f01f6b19 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -77,7 +77,7 @@ acpi_ex_system_memory_space_handler(u32 function,
        struct acpi_mem_space_context *mem_info = region_context;
        u32 length;
        acpi_size window_size;
-#ifndef ACPI_MISALIGNED_TRANSFERS
+#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
        u32 remainder;
 #endif
 
@@ -103,13 +103,12 @@ acpi_ex_system_memory_space_handler(u32 function,
                break;
 
        default:
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Invalid system_memory width %d\n",
-                                 bit_width));
+               ACPI_ERROR((AE_INFO, "Invalid system_memory width %d",
+                           bit_width));
                return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
        }
 
-#ifndef ACPI_MISALIGNED_TRANSFERS
+#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
        /*
         * Hardware does not support non-aligned data transfers, we must verify
         * the request.
@@ -159,10 +158,10 @@ acpi_ex_system_memory_space_handler(u32 function,
                                            (void **)&mem_info->
                                            mapped_logical_address);
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Could not map memory at %8.8X%8.8X, size %X\n",
-                                         ACPI_FORMAT_UINT64(address),
-                                         (u32) window_size));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not map memory at %8.8X%8.8X, size %X",
+                                   ACPI_FORMAT_UINT64(address),
+                                   (u32) window_size));
                        mem_info->mapped_length = 0;
                        return_ACPI_STATUS(status);
                }
@@ -199,20 +198,20 @@ acpi_ex_system_memory_space_handler(u32 function,
                *value = 0;
                switch (bit_width) {
                case 8:
-                       *value = (acpi_integer) * ((u8 *) logical_addr_ptr);
+                       *value = (acpi_integer) ACPI_GET8(logical_addr_ptr);
                        break;
 
                case 16:
-                       *value = (acpi_integer) * ((u16 *) logical_addr_ptr);
+                       *value = (acpi_integer) ACPI_GET16(logical_addr_ptr);
                        break;
 
                case 32:
-                       *value = (acpi_integer) * ((u32 *) logical_addr_ptr);
+                       *value = (acpi_integer) ACPI_GET32(logical_addr_ptr);
                        break;
 
 #if ACPI_MACHINE_WIDTH != 16
                case 64:
-                       *value = (acpi_integer) * ((u64 *) logical_addr_ptr);
+                       *value = (acpi_integer) ACPI_GET64(logical_addr_ptr);
                        break;
 #endif
                default:
@@ -225,20 +224,20 @@ acpi_ex_system_memory_space_handler(u32 function,
 
                switch (bit_width) {
                case 8:
-                       *(u8 *) logical_addr_ptr = (u8) * value;
+                       ACPI_SET8(logical_addr_ptr) = (u8) * value;
                        break;
 
                case 16:
-                       *(u16 *) logical_addr_ptr = (u16) * value;
+                       ACPI_SET16(logical_addr_ptr) = (u16) * value;
                        break;
 
                case 32:
-                       *(u32 *) logical_addr_ptr = (u32) * value;
+                       ACPI_SET32(logical_addr_ptr) = (u32) * value;
                        break;
 
 #if ACPI_MACHINE_WIDTH != 16
                case 64:
-                       *(u64 *) logical_addr_ptr = (u64) * value;
+                       ACPI_SET64(logical_addr_ptr) = (u64) * value;
                        break;
 #endif
 
index ff5d8f97e8eb6dfe9024b5d61ab885ba56bfa59c..01b26c80d22b84e6e1b2bdc124951e8053367234 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        }
 
        if (!source_desc) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "No object attached to node %p\n", node));
+               ACPI_ERROR((AE_INFO, "No object attached to node %p", node));
                return_ACPI_STATUS(AE_AML_NO_OPERAND);
        }
 
@@ -135,10 +134,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
        case ACPI_TYPE_PACKAGE:
 
                if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_PACKAGE) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Object not a Package, type %s\n",
-                                         acpi_ut_get_object_type_name
-                                         (source_desc)));
+                       ACPI_ERROR((AE_INFO, "Object not a Package, type %s",
+                                   acpi_ut_get_object_type_name(source_desc)));
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
 
@@ -154,10 +151,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
        case ACPI_TYPE_BUFFER:
 
                if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_BUFFER) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Object not a Buffer, type %s\n",
-                                         acpi_ut_get_object_type_name
-                                         (source_desc)));
+                       ACPI_ERROR((AE_INFO, "Object not a Buffer, type %s",
+                                   acpi_ut_get_object_type_name(source_desc)));
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
 
@@ -173,10 +168,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
        case ACPI_TYPE_STRING:
 
                if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_STRING) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Object not a String, type %s\n",
-                                         acpi_ut_get_object_type_name
-                                         (source_desc)));
+                       ACPI_ERROR((AE_INFO, "Object not a String, type %s",
+                                   acpi_ut_get_object_type_name(source_desc)));
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
 
@@ -189,10 +182,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
        case ACPI_TYPE_INTEGER:
 
                if (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_INTEGER) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Object not a Integer, type %s\n",
-                                         acpi_ut_get_object_type_name
-                                         (source_desc)));
+                       ACPI_ERROR((AE_INFO, "Object not a Integer, type %s",
+                                   acpi_ut_get_object_type_name(source_desc)));
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
 
@@ -236,9 +227,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
 
        case ACPI_TYPE_ANY:
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Untyped entry %p, no attached object!\n",
-                                 node));
+               ACPI_ERROR((AE_INFO,
+                           "Untyped entry %p, no attached object!", node));
 
                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);        /* Cannot be AE_TYPE */
 
@@ -257,12 +247,11 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
                default:
                        /* No named references are allowed here */
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Unsupported Reference opcode %X (%s)\n",
-                                         source_desc->reference.opcode,
-                                         acpi_ps_get_opcode_name(source_desc->
-                                                                 reference.
-                                                                 opcode)));
+                       ACPI_ERROR((AE_INFO,
+                                   "Unsupported Reference opcode %X (%s)",
+                                   source_desc->reference.opcode,
+                                   acpi_ps_get_opcode_name(source_desc->
+                                                           reference.opcode)));
 
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
@@ -272,9 +261,9 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
 
                /* Default case is for unknown types */
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Node %p - Unknown object type %X\n",
-                                 node, entry_type));
+               ACPI_ERROR((AE_INFO,
+                           "Node %p - Unknown object type %X",
+                           node, entry_type));
 
                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
 
index 97eecbd3242dc9e067b5aa3ac89191ea9e35fbc1..1deed492fe88c865cd3505f4afa0a7279f60f6d7 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        ACPI_FUNCTION_TRACE_PTR("ex_resolve_to_value", stack_ptr);
 
        if (!stack_ptr || !*stack_ptr) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Internal - null pointer\n"));
+               ACPI_ERROR((AE_INFO, "Internal - null pointer"));
                return_ACPI_STATUS(AE_AML_NO_OPERAND);
        }
 
@@ -97,8 +97,7 @@ acpi_ex_resolve_to_value(union acpi_operand_object **stack_ptr,
                }
 
                if (!*stack_ptr) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Internal - null pointer\n"));
+                       ACPI_ERROR((AE_INFO, "Internal - null pointer"));
                        return_ACPI_STATUS(AE_AML_NO_OPERAND);
                }
        }
@@ -228,9 +227,9 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
                                         * A NULL object descriptor means an unitialized element of
                                         * the package, can't dereference it
                                         */
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "Attempt to deref an Index to NULL pkg element Idx=%p\n",
-                                                         stack_desc));
+                                       ACPI_ERROR((AE_INFO,
+                                                   "Attempt to deref an Index to NULL pkg element Idx=%p",
+                                                   stack_desc));
                                        status = AE_AML_UNINITIALIZED_ELEMENT;
                                }
                                break;
@@ -239,7 +238,10 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
 
                                /* Invalid reference object */
 
-                               ACPI_REPORT_ERROR(("During resolve, Unknown target_type %X in Index/Reference obj %p\n", stack_desc->reference.target_type, stack_desc));
+                               ACPI_ERROR((AE_INFO,
+                                           "Unknown target_type %X in Index/Reference obj %p",
+                                           stack_desc->reference.target_type,
+                                           stack_desc));
                                status = AE_AML_INTERNAL;
                                break;
                        }
@@ -264,7 +266,10 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
 
                default:
 
-                       ACPI_REPORT_ERROR(("During resolve, Unknown Reference opcode %X (%s) in %p\n", opcode, acpi_ps_get_opcode_name(opcode), stack_desc));
+                       ACPI_ERROR((AE_INFO,
+                                   "Unknown Reference opcode %X (%s) in %p",
+                                   opcode, acpi_ps_get_opcode_name(opcode),
+                                   stack_desc));
                        status = AE_AML_INTERNAL;
                        break;
                }
@@ -386,7 +391,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
 
                        if (ACPI_GET_DESCRIPTOR_TYPE(node) !=
                            ACPI_DESC_TYPE_NAMED) {
-                               ACPI_REPORT_ERROR(("acpi_ex_resolve_multiple: Not a NS node %p [%s]\n", node, acpi_ut_get_descriptor_name(node)));
+                               ACPI_ERROR((AE_INFO, "Not a NS node %p [%s]",
+                                           node,
+                                           acpi_ut_get_descriptor_name(node)));
                                return_ACPI_STATUS(AE_AML_INTERNAL);
                        }
 
@@ -442,7 +449,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
 
                        if (ACPI_GET_DESCRIPTOR_TYPE(node) !=
                            ACPI_DESC_TYPE_NAMED) {
-                               ACPI_REPORT_ERROR(("acpi_ex_resolve_multiple: Not a NS node %p [%s]\n", node, acpi_ut_get_descriptor_name(node)));
+                               ACPI_ERROR((AE_INFO, "Not a NS node %p [%s]",
+                                           node,
+                                           acpi_ut_get_descriptor_name(node)));
                                return_ACPI_STATUS(AE_AML_INTERNAL);
                        }
 
@@ -511,7 +520,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
 
                default:
 
-                       ACPI_REPORT_ERROR(("acpi_ex_resolve_multiple: Unknown Reference subtype %X\n", obj_desc->reference.opcode));
+                       ACPI_ERROR((AE_INFO,
+                                   "Unknown Reference subtype %X",
+                                   obj_desc->reference.opcode));
                        return_ACPI_STATUS(AE_AML_INTERNAL);
                }
        }
index ff064e79ab90d66995213dc498e473731bb58af9..a1c000f5a4157799744c9723fccb0906c65527e4 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -46,6 +46,7 @@
 #include <acpi/amlcode.h>
 #include <acpi/acparser.h>
 #include <acpi/acinterp.h>
+#include <acpi/acnamesp.h>
 
 #define _COMPONENT          ACPI_EXECUTER
 ACPI_MODULE_NAME("exresop")
@@ -73,7 +74,7 @@ static acpi_status
 acpi_ex_check_object_type(acpi_object_type type_needed,
                          acpi_object_type this_type, void *object)
 {
-       ACPI_FUNCTION_NAME("ex_check_object_type");
+       ACPI_FUNCTION_ENTRY();
 
        if (type_needed == ACPI_TYPE_ANY) {
                /* All types OK, so we don't perform any typechecks */
@@ -95,10 +96,10 @@ acpi_ex_check_object_type(acpi_object_type type_needed,
        }
 
        if (type_needed != this_type) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Needed [%s], found [%s] %p\n",
-                                 acpi_ut_get_type_name(type_needed),
-                                 acpi_ut_get_type_name(this_type), object));
+               ACPI_ERROR((AE_INFO,
+                           "Needed type [%s], found [%s] %p",
+                           acpi_ut_get_type_name(type_needed),
+                           acpi_ut_get_type_name(this_type), object));
 
                return (AE_AML_OPERAND_TYPE);
        }
@@ -151,13 +152,13 @@ acpi_ex_resolve_operands(u16 opcode,
 
        arg_types = op_info->runtime_args;
        if (arg_types == ARGI_INVALID_OPCODE) {
-               ACPI_REPORT_ERROR(("resolve_operands: %X is not a valid AML opcode\n", opcode));
+               ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", opcode));
 
                return_ACPI_STATUS(AE_AML_INTERNAL);
        }
 
        ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
-                         "Opcode %X [%s] required_operand_types=%8.8X \n",
+                         "Opcode %X [%s] required_operand_types=%8.8X\n",
                          opcode, op_info->name, arg_types));
 
        /*
@@ -169,7 +170,8 @@ acpi_ex_resolve_operands(u16 opcode,
         */
        while (GET_CURRENT_ARG_TYPE(arg_types)) {
                if (!stack_ptr || !*stack_ptr) {
-                       ACPI_REPORT_ERROR(("resolve_operands: Null stack entry at %p\n", stack_ptr));
+                       ACPI_ERROR((AE_INFO, "Null stack entry at %p",
+                                   stack_ptr));
 
                        return_ACPI_STATUS(AE_AML_INTERNAL);
                }
@@ -187,6 +189,22 @@ acpi_ex_resolve_operands(u16 opcode,
 
                        object_type =
                            ((struct acpi_namespace_node *)obj_desc)->type;
+
+                       /*
+                        * Resolve an alias object. The construction of these objects
+                        * guarantees that there is only one level of alias indirection;
+                        * thus, the attached object is always the aliased namespace node
+                        */
+                       if (object_type == ACPI_TYPE_LOCAL_ALIAS) {
+                               obj_desc =
+                                   acpi_ns_get_attached_object((struct
+                                                                acpi_namespace_node
+                                                                *)obj_desc);
+                               *stack_ptr = obj_desc;
+                               object_type =
+                                   ((struct acpi_namespace_node *)obj_desc)->
+                                   type;
+                       }
                        break;
 
                case ACPI_DESC_TYPE_OPERAND:
@@ -198,9 +216,9 @@ acpi_ex_resolve_operands(u16 opcode,
                        /* Check for bad acpi_object_type */
 
                        if (!acpi_ut_valid_object_type(object_type)) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Bad operand object type [%X]\n",
-                                                 object_type));
+                               ACPI_ERROR((AE_INFO,
+                                           "Bad operand object type [%X]",
+                                           object_type));
 
                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                        }
@@ -238,13 +256,10 @@ acpi_ex_resolve_operands(u16 opcode,
                                        break;
 
                                default:
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "Operand is a Reference, Unknown Reference Opcode %X [%s]\n",
-                                                         obj_desc->reference.
-                                                         opcode,
-                                                         (acpi_ps_get_opcode_info
-                                                          (obj_desc->reference.
-                                                           opcode))->name));
+                                       ACPI_ERROR((AE_INFO,
+                                                   "Operand is a Reference, Unknown Reference Opcode: %X",
+                                                   obj_desc->reference.
+                                                   opcode));
 
                                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                                }
@@ -255,11 +270,10 @@ acpi_ex_resolve_operands(u16 opcode,
 
                        /* Invalid descriptor */
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Invalid descriptor %p [%s]\n",
-                                         obj_desc,
-                                         acpi_ut_get_descriptor_name
-                                         (obj_desc)));
+                       ACPI_ERROR((AE_INFO,
+                                   "Invalid descriptor %p [%s]",
+                                   obj_desc,
+                                   acpi_ut_get_descriptor_name(obj_desc)));
 
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
@@ -417,11 +431,10 @@ acpi_ex_resolve_operands(u16 opcode,
                            acpi_ex_convert_to_integer(obj_desc, stack_ptr, 16);
                        if (ACPI_FAILURE(status)) {
                                if (status == AE_TYPE) {
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "Needed [Integer/String/Buffer], found [%s] %p\n",
-                                                         acpi_ut_get_object_type_name
-                                                         (obj_desc),
-                                                         obj_desc));
+                                       ACPI_ERROR((AE_INFO,
+                                                   "Needed [Integer/String/Buffer], found [%s] %p",
+                                                   acpi_ut_get_object_type_name
+                                                   (obj_desc), obj_desc));
 
                                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                                }
@@ -444,11 +457,10 @@ acpi_ex_resolve_operands(u16 opcode,
                        status = acpi_ex_convert_to_buffer(obj_desc, stack_ptr);
                        if (ACPI_FAILURE(status)) {
                                if (status == AE_TYPE) {
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "Needed [Integer/String/Buffer], found [%s] %p\n",
-                                                         acpi_ut_get_object_type_name
-                                                         (obj_desc),
-                                                         obj_desc));
+                                       ACPI_ERROR((AE_INFO,
+                                                   "Needed [Integer/String/Buffer], found [%s] %p",
+                                                   acpi_ut_get_object_type_name
+                                                   (obj_desc), obj_desc));
 
                                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                                }
@@ -472,11 +484,10 @@ acpi_ex_resolve_operands(u16 opcode,
                                                           ACPI_IMPLICIT_CONVERT_HEX);
                        if (ACPI_FAILURE(status)) {
                                if (status == AE_TYPE) {
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "Needed [Integer/String/Buffer], found [%s] %p\n",
-                                                         acpi_ut_get_object_type_name
-                                                         (obj_desc),
-                                                         obj_desc));
+                                       ACPI_ERROR((AE_INFO,
+                                                   "Needed [Integer/String/Buffer], found [%s] %p",
+                                                   acpi_ut_get_object_type_name
+                                                   (obj_desc), obj_desc));
 
                                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                                }
@@ -502,10 +513,10 @@ acpi_ex_resolve_operands(u16 opcode,
                                break;
 
                        default:
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Needed [Integer/String/Buffer], found [%s] %p\n",
-                                                 acpi_ut_get_object_type_name
-                                                 (obj_desc), obj_desc));
+                               ACPI_ERROR((AE_INFO,
+                                           "Needed [Integer/String/Buffer], found [%s] %p",
+                                           acpi_ut_get_object_type_name
+                                           (obj_desc), obj_desc));
 
                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                        }
@@ -539,10 +550,10 @@ acpi_ex_resolve_operands(u16 opcode,
                                break;
 
                        default:
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Needed [Integer/String/Buffer], found [%s] %p\n",
-                                                 acpi_ut_get_object_type_name
-                                                 (obj_desc), obj_desc));
+                               ACPI_ERROR((AE_INFO,
+                                           "Needed [Integer/String/Buffer], found [%s] %p",
+                                           acpi_ut_get_object_type_name
+                                           (obj_desc), obj_desc));
 
                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                        }
@@ -566,10 +577,10 @@ acpi_ex_resolve_operands(u16 opcode,
                                break;
 
                        default:
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Needed [Buffer/String/Package/Reference], found [%s] %p\n",
-                                                 acpi_ut_get_object_type_name
-                                                 (obj_desc), obj_desc));
+                               ACPI_ERROR((AE_INFO,
+                                           "Needed [Buffer/String/Package/Reference], found [%s] %p",
+                                           acpi_ut_get_object_type_name
+                                           (obj_desc), obj_desc));
 
                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                        }
@@ -588,10 +599,10 @@ acpi_ex_resolve_operands(u16 opcode,
                                break;
 
                        default:
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Needed [Buffer/String/Package], found [%s] %p\n",
-                                                 acpi_ut_get_object_type_name
-                                                 (obj_desc), obj_desc));
+                               ACPI_ERROR((AE_INFO,
+                                           "Needed [Buffer/String/Package], found [%s] %p",
+                                           acpi_ut_get_object_type_name
+                                           (obj_desc), obj_desc));
 
                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                        }
@@ -611,10 +622,10 @@ acpi_ex_resolve_operands(u16 opcode,
                                break;
 
                        default:
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Needed [Region/region_field], found [%s] %p\n",
-                                                 acpi_ut_get_object_type_name
-                                                 (obj_desc), obj_desc));
+                               ACPI_ERROR((AE_INFO,
+                                           "Needed [Region/region_field], found [%s] %p",
+                                           acpi_ut_get_object_type_name
+                                           (obj_desc), obj_desc));
 
                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                        }
@@ -656,10 +667,10 @@ acpi_ex_resolve_operands(u16 opcode,
                                        break;
                                }
 
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p\n",
-                                                 acpi_ut_get_object_type_name
-                                                 (obj_desc), obj_desc));
+                               ACPI_ERROR((AE_INFO,
+                                           "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p",
+                                           acpi_ut_get_object_type_name
+                                           (obj_desc), obj_desc));
 
                                return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                        }
@@ -669,9 +680,9 @@ acpi_ex_resolve_operands(u16 opcode,
 
                        /* Unknown type */
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Internal - Unknown ARGI (required operand) type %X\n",
-                                         this_arg_type));
+                       ACPI_ERROR((AE_INFO,
+                                   "Internal - Unknown ARGI (required operand) type %X",
+                                   this_arg_type));
 
                        return_ACPI_STATUS(AE_BAD_PARAMETER);
                }
index a7d8eea305c2a80f305055a6851bffcb6d8709ab..3f020c0e2b95b6c7a67cdd321b637aa0ea31d1bc 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -250,7 +250,7 @@ acpi_ex_store(union acpi_operand_object *source_desc,
        /* Validate parameters */
 
        if (!source_desc || !dest_desc) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null parameter\n"));
+               ACPI_ERROR((AE_INFO, "Null parameter"));
                return_ACPI_STATUS(AE_AML_NO_OPERAND);
        }
 
@@ -290,10 +290,10 @@ acpi_ex_store(union acpi_operand_object *source_desc,
 
                /* Destination is not a Reference object */
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Target is not a Reference or Constant object - %s [%p]\n",
-                                 acpi_ut_get_object_type_name(dest_desc),
-                                 dest_desc));
+               ACPI_ERROR((AE_INFO,
+                           "Target is not a Reference or Constant object - %s [%p]",
+                           acpi_ut_get_object_type_name(dest_desc),
+                           dest_desc));
 
                ACPI_DUMP_STACK_ENTRY(source_desc);
                ACPI_DUMP_STACK_ENTRY(dest_desc);
@@ -360,8 +360,8 @@ acpi_ex_store(union acpi_operand_object *source_desc,
 
        default:
 
-               ACPI_REPORT_ERROR(("ex_store: Unknown Reference opcode %X\n",
-                                  ref_desc->reference.opcode));
+               ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X",
+                           ref_desc->reference.opcode));
                ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_ERROR);
 
                status = AE_AML_INTERNAL;
@@ -490,10 +490,9 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
 
                        /* All other types are invalid */
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Source must be Integer/Buffer/String type, not %s\n",
-                                         acpi_ut_get_object_type_name
-                                         (source_desc)));
+                       ACPI_ERROR((AE_INFO,
+                                   "Source must be Integer/Buffer/String type, not %s",
+                                   acpi_ut_get_object_type_name(source_desc)));
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
 
@@ -503,8 +502,8 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
                break;
 
        default:
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Target is not a Package or buffer_field\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Target is not a Package or buffer_field"));
                status = AE_AML_OPERAND_TYPE;
                break;
        }
index 382f63c14ea1cd10954c0e76d26b795b6a82aa50..42967baf760de53ba7a5214739910e2a460dc74b 100644 (file)
@@ -7,7 +7,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
                      && (source_desc->reference.opcode == AML_LOAD_OP))) {
                        /* Conversion successful but still not a valid type */
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Cannot assign type %s to %s (must be type Int/Str/Buf)\n",
-                                         acpi_ut_get_object_type_name
-                                         (source_desc),
-                                         acpi_ut_get_type_name(target_type)));
+                       ACPI_ERROR((AE_INFO,
+                                   "Cannot assign type %s to %s (must be type Int/Str/Buf)",
+                                   acpi_ut_get_object_type_name(source_desc),
+                                   acpi_ut_get_type_name(target_type)));
                        status = AE_AML_OPERAND_TYPE;
                }
                break;
@@ -135,9 +134,11 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
        case ACPI_TYPE_LOCAL_ALIAS:
        case ACPI_TYPE_LOCAL_METHOD_ALIAS:
 
-               /* Aliases are resolved by acpi_ex_prep_operands */
-
-               ACPI_REPORT_ERROR(("Store into Alias - should never happen\n"));
+               /*
+                * All aliases should have been resolved earlier, during the
+                * operand resolution phase.
+                */
+               ACPI_ERROR((AE_INFO, "Store into an unresolved Alias object"));
                status = AE_AML_INTERNAL;
                break;
 
@@ -280,9 +281,8 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc,
                /*
                 * All other types come here.
                 */
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                 "Store into type %s not implemented\n",
-                                 acpi_ut_get_object_type_name(dest_desc)));
+               ACPI_WARNING((AE_INFO, "Store into type %s not implemented",
+                             acpi_ut_get_object_type_name(dest_desc)));
 
                status = AE_NOT_IMPLEMENTED;
                break;
index c4ff654a669717637baf578766d9524fd062fb40..6ab70708775007347a24cf236b0e494629993cea 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
 
        /* We know that source_desc is a buffer by now */
 
-       buffer = (u8 *) source_desc->buffer.pointer;
+       buffer = ACPI_CAST_PTR(u8, source_desc->buffer.pointer);
        length = source_desc->buffer.length;
 
        /*
@@ -160,7 +160,7 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
 
        /* We know that source_desc is a string by now */
 
-       buffer = (u8 *) source_desc->string.pointer;
+       buffer = ACPI_CAST_PTR(u8, source_desc->string.pointer);
        length = source_desc->string.length;
 
        /*
index 8a88b841237d551ec0a440b537a9b2eeac192326..ea9144f42e1f98f2b4a1d37143cfb09fe8ae060c 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
                 * (ACPI specifies 100 usec as max, but this gives some slack in
                 * order to support existing BIOSs)
                 */
-               ACPI_REPORT_ERROR(("Stall: Time parameter is too large (%d)\n",
-                                  how_long));
+               ACPI_ERROR((AE_INFO, "Time parameter is too large (%d)",
+                           how_long));
                status = AE_AML_OPERAND_VALUE;
        } else {
                acpi_os_stall(how_long);
index 1ee79d8c8f8827d2895ac6a221b592eea6c78cd0..f73a61aeb7eca52736f3eb9e71c9ab8e6e1e35ec 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -91,7 +91,7 @@ acpi_status acpi_ex_enter_interpreter(void)
 
        status = acpi_ut_acquire_mutex(ACPI_MTX_EXECUTE);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not acquire interpreter mutex\n"));
+               ACPI_ERROR((AE_INFO, "Could not acquire interpreter mutex"));
        }
 
        return_ACPI_STATUS(status);
@@ -127,7 +127,7 @@ void acpi_ex_exit_interpreter(void)
 
        status = acpi_ut_release_mutex(ACPI_MTX_EXECUTE);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not release interpreter mutex\n"));
+               ACPI_ERROR((AE_INFO, "Could not release interpreter mutex"));
        }
 
        return_VOID;
@@ -200,13 +200,12 @@ u8 acpi_ex_acquire_global_lock(u32 field_flags)
                if (ACPI_SUCCESS(status)) {
                        locked = TRUE;
                } else {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Could not acquire Global Lock, %s\n",
-                                         acpi_format_exception(status)));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Could not acquire Global Lock"));
                }
        }
 
-       return_VALUE(locked);
+       return_UINT8(locked);
 }
 
 /*******************************************************************************
@@ -237,7 +236,8 @@ void acpi_ex_release_global_lock(u8 locked_by_me)
                if (ACPI_FAILURE(status)) {
                        /* Report the error, but there isn't much else we can do */
 
-                       ACPI_REPORT_ERROR(("Could not release ACPI Global Lock, %s\n", acpi_format_exception(status)));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Could not release ACPI Global Lock"));
                }
        }
 
@@ -268,7 +268,7 @@ static u32 acpi_ex_digits_needed(acpi_integer value, u32 base)
        /* acpi_integer is unsigned, so we don't worry about a '-' prefix */
 
        if (value == 0) {
-               return_VALUE(1);
+               return_UINT32(1);
        }
 
        current_value = value;
@@ -282,7 +282,7 @@ static u32 acpi_ex_digits_needed(acpi_integer value, u32 base)
                num_digits++;
        }
 
-       return_VALUE(num_digits);
+       return_UINT32(num_digits);
 }
 
 /*******************************************************************************
index aa993715d6445d40c6ca668616b8f203d35a6b2c..8daef57b994c4b264db47d4a050243812f5a0b8b 100644 (file)
@@ -99,15 +99,15 @@ do_root_bridge_busnr_callback(struct acpi_resource *resource, void *data)
        unsigned long *busnr = (unsigned long *)data;
        struct acpi_resource_address64 address;
 
-       if (resource->id != ACPI_RSTYPE_ADDRESS16 &&
-           resource->id != ACPI_RSTYPE_ADDRESS32 &&
-           resource->id != ACPI_RSTYPE_ADDRESS64)
+       if (resource->type != ACPI_RESOURCE_TYPE_ADDRESS16 &&
+           resource->type != ACPI_RESOURCE_TYPE_ADDRESS32 &&
+           resource->type != ACPI_RESOURCE_TYPE_ADDRESS64)
                return AE_OK;
 
        acpi_resource_to_address64(resource, &address);
        if ((address.address_length > 0) &&
            (address.resource_type == ACPI_BUS_NUMBER_RANGE))
-               *busnr = address.min_address_range;
+               *busnr = address.minimum;
 
        return AE_OK;
 }
index 1bb3463d7040ae6b5913a8863999bff17e920543..ea2f13271ff19c069589858865127c425f1097e4 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -68,8 +68,7 @@ acpi_status acpi_hw_initialize(void)
        /* We must have the ACPI tables by the time we get here */
 
        if (!acpi_gbl_FADT) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No FADT is present\n"));
-
+               ACPI_ERROR((AE_INFO, "No FADT is present"));
                return_ACPI_STATUS(AE_NO_ACPI_TABLES);
        }
 
@@ -108,7 +107,8 @@ acpi_status acpi_hw_set_mode(u32 mode)
         * system does not support mode transition.
         */
        if (!acpi_gbl_FADT->smi_cmd) {
-               ACPI_REPORT_ERROR(("No SMI_CMD in FADT, mode transition failed.\n"));
+               ACPI_ERROR((AE_INFO,
+                           "No SMI_CMD in FADT, mode transition failed"));
                return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
        }
 
@@ -120,7 +120,8 @@ acpi_status acpi_hw_set_mode(u32 mode)
         * transitions are not supported.
         */
        if (!acpi_gbl_FADT->acpi_enable && !acpi_gbl_FADT->acpi_disable) {
-               ACPI_REPORT_ERROR(("No ACPI mode transition supported in this system (enable/disable both zero)\n"));
+               ACPI_ERROR((AE_INFO,
+                           "No ACPI mode transition supported in this system (enable/disable both zero)"));
                return_ACPI_STATUS(AE_OK);
        }
 
@@ -154,8 +155,8 @@ acpi_status acpi_hw_set_mode(u32 mode)
        }
 
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not write mode change, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Could not write ACPI mode change"));
                return_ACPI_STATUS(status);
        }
 
@@ -175,7 +176,7 @@ acpi_status acpi_hw_set_mode(u32 mode)
                retry--;
        }
 
-       ACPI_REPORT_ERROR(("Hardware never changed modes\n"));
+       ACPI_ERROR((AE_INFO, "Hardware did not change modes"));
        return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
 }
 
@@ -204,18 +205,18 @@ u32 acpi_hw_get_mode(void)
         * system does not support mode transition.
         */
        if (!acpi_gbl_FADT->smi_cmd) {
-               return_VALUE(ACPI_SYS_MODE_ACPI);
+               return_UINT32(ACPI_SYS_MODE_ACPI);
        }
 
        status =
            acpi_get_register(ACPI_BITREG_SCI_ENABLE, &value, ACPI_MTX_LOCK);
        if (ACPI_FAILURE(status)) {
-               return_VALUE(ACPI_SYS_MODE_LEGACY);
+               return_UINT32(ACPI_SYS_MODE_LEGACY);
        }
 
        if (value) {
-               return_VALUE(ACPI_SYS_MODE_ACPI);
+               return_UINT32(ACPI_SYS_MODE_ACPI);
        } else {
-               return_VALUE(ACPI_SYS_MODE_LEGACY);
+               return_UINT32(ACPI_SYS_MODE_LEGACY);
        }
 }
index 5c8e5dfd024e5fea65c093a2afe7ca9912265799..d84942d22dd549269b7d87dfdfc5e417e664c375 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 536a7aea80c93a802f206a0268d9c688d48478a3..e1fe75498415c6eaffbc634d3529665d5fad83ca 100644 (file)
@@ -7,7 +7,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        info.parameters = NULL;
        info.return_object = NULL;
-       sleep_state_name = (char *)acpi_gbl_sleep_state_names[sleep_state];
+       sleep_state_name =
+           ACPI_CAST_PTR(char, acpi_gbl_sleep_state_names[sleep_state]);
 
        status = acpi_ns_evaluate_by_name(sleep_state_name, &info);
        if (ACPI_FAILURE(status)) {
@@ -159,15 +160,16 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 * sleep_type_a, u8 * sleep_type_b)
        /* Must have a return object */
 
        if (!info.return_object) {
-               ACPI_REPORT_ERROR(("No Sleep State object returned from [%s]\n",
-                                  sleep_state_name));
+               ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]",
+                           sleep_state_name));
                status = AE_NOT_EXIST;
        }
 
        /* It must be of type Package */
 
        else if (ACPI_GET_OBJECT_TYPE(info.return_object) != ACPI_TYPE_PACKAGE) {
-               ACPI_REPORT_ERROR(("Sleep State return object is not a Package\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Sleep State return object is not a Package"));
                status = AE_AML_OPERAND_TYPE;
        }
 
@@ -179,7 +181,8 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 * sleep_type_a, u8 * sleep_type_b)
         * one per sleep type (A/B).
         */
        else if (info.return_object->package.count < 2) {
-               ACPI_REPORT_ERROR(("Sleep State return package does not have at least two elements\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Sleep State return package does not have at least two elements"));
                status = AE_AML_NO_OPERAND;
        }
 
@@ -189,7 +192,12 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 * sleep_type_a, u8 * sleep_type_b)
                  != ACPI_TYPE_INTEGER) ||
                 (ACPI_GET_OBJECT_TYPE(info.return_object->package.elements[1])
                  != ACPI_TYPE_INTEGER)) {
-               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])));
+               ACPI_ERROR((AE_INFO,
+                           "Sleep State return package elements are not both Integers (%s, %s)",
+                           acpi_ut_get_object_type_name(info.return_object->
+                                                        package.elements[0]),
+                           acpi_ut_get_object_type_name(info.return_object->
+                                                        package.elements[1])));
                status = AE_AML_OPERAND_TYPE;
        } else {
                /* 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)
        }
 
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "%s While evaluating sleep_state [%s], bad Sleep object %p type %s\n",
-                                 acpi_format_exception(status),
-                                 sleep_state_name, info.return_object,
-                                 acpi_ut_get_object_type_name(info.
-                                                              return_object)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "While evaluating sleep_state [%s], bad Sleep object %p type %s",
+                               sleep_state_name, info.return_object,
+                               acpi_ut_get_object_type_name(info.
+                                                            return_object)));
        }
 
        acpi_ut_remove_reference(info.return_object);
@@ -229,12 +236,11 @@ EXPORT_SYMBOL(acpi_get_sleep_type_data);
 
 struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id)
 {
-       ACPI_FUNCTION_NAME("hw_get_bit_register_info");
+       ACPI_FUNCTION_ENTRY();
 
        if (register_id > ACPI_BITREG_MAX) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Invalid bit_register ID: %X\n",
-                                 register_id));
+               ACPI_ERROR((AE_INFO, "Invalid bit_register ID: %X",
+                           register_id));
                return (NULL);
        }
 
@@ -334,8 +340,8 @@ acpi_status acpi_set_register(u32 register_id, u32 value, u32 flags)
 
        bit_reg_info = acpi_hw_get_bit_register_info(register_id);
        if (!bit_reg_info) {
-               ACPI_REPORT_ERROR(("Bad ACPI HW register_id: %X\n",
-                                  register_id));
+               ACPI_ERROR((AE_INFO, "Bad ACPI HW register_id: %X",
+                           register_id));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
@@ -569,8 +575,7 @@ acpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value)
                break;
 
        default:
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown Register ID: %X\n",
-                                 register_id));
+               ACPI_ERROR((AE_INFO, "Unknown Register ID: %X", register_id));
                status = AE_BAD_PARAMETER;
                break;
        }
@@ -765,9 +770,9 @@ acpi_hw_low_level_read(u32 width, u32 * value, struct acpi_generic_address *reg)
                break;
 
        default:
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unsupported address space: %X\n",
-                                 reg->address_space_id));
+               ACPI_ERROR((AE_INFO,
+                           "Unsupported address space: %X",
+                           reg->address_space_id));
                return (AE_BAD_PARAMETER);
        }
 
@@ -836,9 +841,9 @@ acpi_hw_low_level_write(u32 width, u32 value, struct acpi_generic_address * reg)
                break;
 
        default:
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unsupported address space: %X\n",
-                                 reg->address_space_id));
+               ACPI_ERROR((AE_INFO,
+                           "Unsupported address space: %X",
+                           reg->address_space_id));
                return (AE_BAD_PARAMETER);
        }
 
index 34519069050c2da488fa445759398220f3ecf897..89269272fd621d7e4d4f6054448617b8173422d8 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _SST failed, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "While executing method _SST"));
        }
 
        return_ACPI_STATUS(AE_OK);
@@ -232,9 +232,8 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)
 
        if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) ||
            (acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) {
-               ACPI_REPORT_ERROR(("Sleep values out of range: A=%X B=%X\n",
-                                  acpi_gbl_sleep_type_a,
-                                  acpi_gbl_sleep_type_b));
+               ACPI_ERROR((AE_INFO, "Sleep values out of range: A=%X B=%X",
+                           acpi_gbl_sleep_type_a, acpi_gbl_sleep_type_b));
                return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
        }
 
@@ -533,21 +532,18 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
        arg.integer.value = ACPI_SST_WAKING;
        status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _SST failed, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During Method _SST"));
        }
 
        arg.integer.value = sleep_state;
        status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL);
        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _BFS failed, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During Method _BFS"));
        }
 
        status = acpi_evaluate_object(NULL, METHOD_NAME__WAK, &arg_list, NULL);
        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _WAK failed, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During Method _WAK"));
        }
        /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */
 
@@ -582,8 +578,7 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
        arg.integer.value = ACPI_SST_WORKING;
        status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL);
        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
-               ACPI_REPORT_ERROR(("Method _SST failed, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During Method _SST"));
        }
 
        return_ACPI_STATUS(status);
index aff6dc1417845490516365fc7dff3c968531c7a9..fc10b7cb456f1327935b9054bc821873f181367a 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index e928e8c2c6ec90629aab15eeef143319c8c2462e..468244147ec1f7f422ee6d5bfe7fb7d510c602eb 100644 (file)
@@ -54,36 +54,36 @@ static acpi_status acpi_reserve_io_ranges(struct acpi_resource *res, void *data)
 
        ACPI_FUNCTION_TRACE("acpi_reserve_io_ranges");
 
-       if (res->id == ACPI_RSTYPE_IO) {
+       if (res->type == ACPI_RESOURCE_TYPE_IO) {
                struct acpi_resource_io *io_res = &res->data.io;
 
-               if (io_res->min_base_address != io_res->max_base_address)
+               if (io_res->minimum != io_res->maximum)
                        return_VALUE(AE_OK);
                if (IS_RESERVED_ADDR
-                   (io_res->min_base_address, io_res->range_length)) {
+                   (io_res->minimum, io_res->address_length)) {
                        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                          "Motherboard resources 0x%08x - 0x%08x\n",
-                                         io_res->min_base_address,
-                                         io_res->min_base_address +
-                                         io_res->range_length));
+                                         io_res->minimum,
+                                         io_res->minimum +
+                                         io_res->address_length));
                        requested_res =
-                           request_region(io_res->min_base_address,
-                                          io_res->range_length, "motherboard");
+                           request_region(io_res->minimum,
+                                          io_res->address_length, "motherboard");
                }
-       } else if (res->id == ACPI_RSTYPE_FIXED_IO) {
+       } else if (res->type == ACPI_RESOURCE_TYPE_FIXED_IO) {
                struct acpi_resource_fixed_io *fixed_io_res =
                    &res->data.fixed_io;
 
                if (IS_RESERVED_ADDR
-                   (fixed_io_res->base_address, fixed_io_res->range_length)) {
+                   (fixed_io_res->address, fixed_io_res->address_length)) {
                        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                          "Motherboard resources 0x%08x - 0x%08x\n",
-                                         fixed_io_res->base_address,
-                                         fixed_io_res->base_address +
-                                         fixed_io_res->range_length));
+                                         fixed_io_res->address,
+                                         fixed_io_res->address +
+                                         fixed_io_res->address_length));
                        requested_res =
-                           request_region(fixed_io_res->base_address,
-                                          fixed_io_res->range_length,
+                           request_region(fixed_io_res->address,
+                                          fixed_io_res->address_length,
                                           "motherboard");
                }
        } else {
index edfbe34600f5178b66b9ec39f18c768eee2b1dfd..1149bc18fb359759ed84a70585a886adb0ad416c 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -110,10 +110,9 @@ acpi_status acpi_ns_root_initialize(void)
                                        ACPI_NS_NO_UPSEARCH, NULL, &new_node);
 
                if (ACPI_FAILURE(status) || (!new_node)) {      /* Must be on same line for code converter */
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Could not create predefined name %s, %s\n",
-                                         init_val->name,
-                                         acpi_format_exception(status)));
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Could not create predefined name %s",
+                                       init_val->name));
                }
 
                /*
@@ -124,9 +123,9 @@ acpi_status acpi_ns_root_initialize(void)
                if (init_val->val) {
                        status = acpi_os_predefined_override(init_val, &val);
                        if (ACPI_FAILURE(status)) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Could not override predefined %s\n",
-                                                 init_val->name));
+                               ACPI_ERROR((AE_INFO,
+                                           "Could not override predefined %s",
+                                           init_val->name));
                        }
 
                        if (!val) {
@@ -233,7 +232,9 @@ acpi_status acpi_ns_root_initialize(void)
 
                        default:
 
-                               ACPI_REPORT_ERROR(("Unsupported initial type value %X\n", init_val->type));
+                               ACPI_ERROR((AE_INFO,
+                                           "Unsupported initial type value %X",
+                                           init_val->type));
                                acpi_ut_remove_reference(obj_desc);
                                obj_desc = NULL;
                                continue;
@@ -339,7 +340,9 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
                prefix_node = scope_info->scope.node;
                if (ACPI_GET_DESCRIPTOR_TYPE(prefix_node) !=
                    ACPI_DESC_TYPE_NAMED) {
-                       ACPI_REPORT_ERROR(("ns_lookup: %p is not a namespace node [%s]\n", prefix_node, acpi_ut_get_descriptor_name(prefix_node)));
+                       ACPI_ERROR((AE_INFO, "%p is not a namespace node [%s]",
+                                   prefix_node,
+                                   acpi_ut_get_descriptor_name(prefix_node)));
                        return_ACPI_STATUS(AE_AML_INTERNAL);
                }
 
@@ -429,7 +432,8 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
                                if (!this_node) {
                                        /* Current scope has no parent scope */
 
-                                       ACPI_REPORT_ERROR(("ACPI path has too many parent prefixes (^) - reached beyond root node\n"));
+                                       ACPI_ERROR((AE_INFO,
+                                                   "ACPI path has too many parent prefixes (^) - reached beyond root node"));
                                        return_ACPI_STATUS(AE_NOT_FOUND);
                                }
                        }
@@ -498,7 +502,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
                        path++;
 
                        ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
-                                         "Multi Pathname (%d Segments, Flags=%X) \n",
+                                         "Multi Pathname (%d Segments, Flags=%X)\n",
                                          num_segments, flags));
                        break;
 
@@ -600,7 +604,12 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
                    (this_node->type != type_to_check_for)) {
                        /* Complain about a type mismatch */
 
-                       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)));
+                       ACPI_WARNING((AE_INFO,
+                                     "ns_lookup: Type mismatch on %4.4s (%s), searching for (%s)",
+                                     ACPI_CAST_PTR(char, &simple_name),
+                                     acpi_ut_get_type_name(this_node->type),
+                                     acpi_ut_get_type_name
+                                     (type_to_check_for)));
                }
 
                /*
index cc7a85f8cfe686004d29abd3c7e735367e021472..9b871f38b61b81ff2480c951aae6095d6a13e1fd 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
                /* Grandchildren should have all been deleted already */
 
                if (child_node->child) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Found a grandchild! P=%p C=%p\n",
-                                         parent_node, child_node));
+                       ACPI_ERROR((AE_INFO, "Found a grandchild! P=%p C=%p",
+                                   parent_node, child_node));
                }
 
                /* Now we can free this child object */
@@ -302,7 +301,9 @@ void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
                /* There should be only one reference remaining on this node */
 
                if (child_node->reference_count != 1) {
-                       ACPI_REPORT_WARNING(("Existing references (%d) on node being deleted (%p)\n", child_node->reference_count, child_node));
+                       ACPI_WARNING((AE_INFO,
+                                     "Existing references (%d) on node being deleted (%p)",
+                                     child_node->reference_count, child_node));
                }
 
                /* Now we can delete the node */
index 9faf1d5c86ed8179ecdd7210df20f81d22b11d2a..a2807317a84b0295a514f9bbfbd12d071fa73ae6 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -198,12 +198,13 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
                /* Check the node type and name */
 
                if (type > ACPI_TYPE_LOCAL_MAX) {
-                       ACPI_REPORT_WARNING(("Invalid ACPI Type %08X\n", type));
+                       ACPI_WARNING((AE_INFO, "Invalid ACPI Object Type %08X",
+                                     type));
                }
 
                if (!acpi_ut_valid_acpi_name(this_node->name.integer)) {
-                       ACPI_REPORT_WARNING(("Invalid ACPI Name %08X\n",
-                                            this_node->name.integer));
+                       ACPI_WARNING((AE_INFO, "Invalid ACPI Name %08X",
+                                     this_node->name.integer));
                }
 
                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,
        /*
         * Now we can print out the pertinent information
         */
-       acpi_os_printf(" %-12s %p ", acpi_ut_get_type_name(type), this_node);
+       acpi_os_printf(" %-12s %p %2.2X ",
+                      acpi_ut_get_type_name(type), this_node,
+                      this_node->owner_id);
 
        dbg_level = acpi_dbg_level;
        acpi_dbg_level = 0;
index 55de883943d67d976c3b14334a4ae0cb3733d279..aff899a935e3a9529ff33f4044c8d12223d7f199 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 0191c7d92824234a91444505e517045909dd5b5b..19d7b94d40c3844573599ea342de5c25ce40cdb2 100644 (file)
@@ -6,7 +6,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        info->obj_desc = acpi_ns_get_attached_object(info->node);
        if (!info->obj_desc) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "No attached method object\n"));
+               ACPI_ERROR((AE_INFO, "No attached method object"));
 
                (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
                return_ACPI_STATUS(AE_NULL_OBJECT);
index 0a08d2f04a06bd5394d18698338c0c6cdb9db985..9f929e479fd835b66183d7ab5478f768893acfce 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -93,8 +93,7 @@ acpi_status acpi_ns_initialize_objects(void)
                                     ACPI_UINT32_MAX, acpi_ns_init_one_object,
                                     &info, NULL);
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "walk_namespace failed! %s\n",
-                                 acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace"));
        }
 
        ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
@@ -159,12 +158,11 @@ acpi_status acpi_ns_initialize_devices(void)
        (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
 
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "walk_namespace failed! %s\n",
-                                 acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace"));
        }
 
        ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
-                             "\n%hd Devices found containing: %hd _STA, %hd _INI methods\n",
+                             "\n%hd Devices found - executed %hd _STA, %hd _INI methods\n",
                              info.device_count, info.num_STA, info.num_INI));
 
        return_ACPI_STATUS(status);
@@ -289,12 +287,10 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
        }
 
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT_RAW((ACPI_DB_ERROR, "\n"));
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Could not execute arguments for [%4.4s] (%s), %s\n",
-                                 acpi_ut_get_node_name(node),
-                                 acpi_ut_get_type_name(type),
-                                 acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Could not execute arguments for [%4.4s] (%s)",
+                               acpi_ut_get_node_name(node),
+                               acpi_ut_get_type_name(type)));
        }
 
        /*
@@ -336,23 +332,22 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
        struct acpi_parameter_info pinfo;
        u32 flags;
        acpi_status status;
+       struct acpi_namespace_node *ini_node;
+       struct acpi_namespace_node *device_node;
 
        ACPI_FUNCTION_TRACE("ns_init_one_device");
 
-       pinfo.parameters = NULL;
-       pinfo.parameter_type = ACPI_PARAM_ARGS;
-
-       pinfo.node = acpi_ns_map_handle_to_node(obj_handle);
-       if (!pinfo.node) {
+       device_node = acpi_ns_map_handle_to_node(obj_handle);
+       if (!device_node) {
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
        /*
         * We will run _STA/_INI on Devices, Processors and thermal_zones only
         */
-       if ((pinfo.node->type != ACPI_TYPE_DEVICE) &&
-           (pinfo.node->type != ACPI_TYPE_PROCESSOR) &&
-           (pinfo.node->type != ACPI_TYPE_THERMAL)) {
+       if ((device_node->type != ACPI_TYPE_DEVICE) &&
+           (device_node->type != ACPI_TYPE_PROCESSOR) &&
+           (device_node->type != ACPI_TYPE_THERMAL)) {
                return_ACPI_STATUS(AE_OK);
        }
 
@@ -364,57 +359,69 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
        info->device_count++;
 
        /*
-        * Run _STA to determine if we can run _INI on the device.
+        * Check if the _INI method exists for this device -
+        * if _INI does not exist, there is no need to run _STA
+        * No _INI means device requires no initialization
+        */
+       status = acpi_ns_search_node(*ACPI_CAST_PTR(u32, METHOD_NAME__INI),
+                                    device_node, ACPI_TYPE_METHOD, &ini_node);
+       if (ACPI_FAILURE(status)) {
+               /* No _INI method found - move on to next device */
+
+               return_ACPI_STATUS(AE_OK);
+       }
+
+       /*
+        * Run _STA to determine if we can run _INI on the device -
+        * the device must be present before _INI can be run.
+        * However, _STA is not required - assume device present if no _STA
         */
        ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD,
-                                                     pinfo.node,
+                                                     device_node,
                                                      METHOD_NAME__STA));
-       status = acpi_ut_execute_STA(pinfo.node, &flags);
 
+       pinfo.node = device_node;
+       pinfo.parameters = NULL;
+       pinfo.parameter_type = ACPI_PARAM_ARGS;
+
+       status = acpi_ut_execute_STA(pinfo.node, &flags);
        if (ACPI_FAILURE(status)) {
-               if (pinfo.node->type == ACPI_TYPE_DEVICE) {
-                       /* Ignore error and move on to next device */
+               /* Ignore error and move on to next device */
 
-                       return_ACPI_STATUS(AE_OK);
-               }
+               return_ACPI_STATUS(AE_OK);
+       }
 
-               /* _STA is not required for Processor or thermal_zone objects */
-       } else {
+       if (flags != ACPI_UINT32_MAX) {
                info->num_STA++;
+       }
 
-               if (!(flags & 0x01)) {
-                       /* Don't look at children of a not present device */
+       if (!(flags & ACPI_STA_DEVICE_PRESENT)) {
+               /* Don't look at children of a not present device */
 
-                       return_ACPI_STATUS(AE_CTRL_DEPTH);
-               }
+               return_ACPI_STATUS(AE_CTRL_DEPTH);
        }
 
        /*
-        * The device is present. Run _INI.
+        * The device is present and _INI exists. Run the _INI method.
+        * (We already have the _INI node from above)
         */
        ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD,
                                                      pinfo.node,
                                                      METHOD_NAME__INI));
-       status = acpi_ns_evaluate_relative(METHOD_NAME__INI, &pinfo);
-       if (ACPI_FAILURE(status)) {
-               /* No _INI (AE_NOT_FOUND) means device requires no initialization */
 
-               if (status != AE_NOT_FOUND) {
-                       /* Ignore error and move on to next device */
+       pinfo.node = ini_node;
+       status = acpi_ns_evaluate_by_handle(&pinfo);
+       if (ACPI_FAILURE(status)) {
+               /* Ignore error and move on to next device */
 
 #ifdef ACPI_DEBUG_OUTPUT
-                       char *scope_name =
-                           acpi_ns_get_external_pathname(pinfo.node);
+               char *scope_name = acpi_ns_get_external_pathname(ini_node);
 
-                       ACPI_DEBUG_PRINT((ACPI_DB_WARN, "%s._INI failed: %s\n",
-                                         scope_name,
-                                         acpi_format_exception(status)));
+               ACPI_WARNING((AE_INFO, "%s._INI failed: %s",
+                             scope_name, acpi_format_exception(status)));
 
-                       ACPI_MEM_FREE(scope_name);
+               ACPI_MEM_FREE(scope_name);
 #endif
-               }
-
-               status = AE_OK;
        } else {
                /* Delete any return object (especially if implicit_return is enabled) */
 
@@ -434,5 +441,5 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
                    acpi_gbl_init_handler(pinfo.node, ACPI_INIT_DEVICE_INI);
        }
 
-       return_ACPI_STATUS(status);
+       return_ACPI_STATUS(AE_OK);
 }
index c28849de465a61fbb442a63b1a49c7d6f68e3f71..4e0b0524c18831590c0513c16066ca6486671a64 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        /* Check validity of the AML start and length */
 
        if (!table_desc->aml_start) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null AML pointer\n"));
+               ACPI_ERROR((AE_INFO, "Null AML pointer"));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
@@ -102,8 +102,8 @@ acpi_ns_load_table(struct acpi_table_desc *table_desc,
        /* Ignore table if there is no AML contained within */
 
        if (!table_desc->aml_length) {
-               ACPI_REPORT_WARNING(("Zero-length AML block in table [%4.4s]\n",
-                                    table_desc->pointer->signature));
+               ACPI_WARNING((AE_INFO, "Zero-length AML block in table [%4.4s]",
+                             table_desc->pointer->signature));
                return_ACPI_STATUS(AE_OK);
        }
 
@@ -263,7 +263,7 @@ acpi_status acpi_ns_load_namespace(void)
        /* There must be at least a DSDT installed */
 
        if (acpi_gbl_DSDT == NULL) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "DSDT is not in memory\n"));
+               ACPI_ERROR((AE_INFO, "DSDT is not in memory"));
                return_ACPI_STATUS(AE_NO_ACPI_TABLES);
        }
 
index d5e8dea61c278f1e3f2fe76d3713e9fd380b851b..639f653b4b6baadb5e34f3731a001de20fa6334c 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
        acpi_size index;
        struct acpi_namespace_node *parent_node;
 
-       ACPI_FUNCTION_NAME("ns_build_external_path");
+       ACPI_FUNCTION_ENTRY();
 
        /* Special case for root */
 
@@ -110,9 +110,9 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
        name_buffer[index] = AML_ROOT_PREFIX;
 
        if (index != 0) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Could not construct pathname; index=%X, size=%X, Path=%s\n",
-                                 (u32) index, (u32) size, &name_buffer[size]));
+               ACPI_ERROR((AE_INFO,
+                           "Could not construct pathname; index=%X, size=%X, Path=%s",
+                           (u32) index, (u32) size, &name_buffer[size]));
        }
 
        return;
@@ -148,7 +148,7 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
 
        name_buffer = ACPI_MEM_CALLOCATE(size);
        if (!name_buffer) {
-               ACPI_REPORT_ERROR(("ns_get_table_pathname: allocation failure\n"));
+               ACPI_ERROR((AE_INFO, "Allocation failure"));
                return_PTR(NULL);
        }
 
@@ -241,7 +241,7 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
 
        acpi_ns_build_external_path(node, required_size, buffer->pointer);
 
-       ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X] \n",
+       ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n",
                          (char *)buffer->pointer, (u32) required_size));
        return_ACPI_STATUS(AE_OK);
 }
index fc9be946ebed7c24c3fef227ceed40f2bc7b8499..10ae6292bca4d521d14a8319dc86991636f1c2bb 100644 (file)
@@ -6,7 +6,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -84,22 +84,23 @@ acpi_ns_attach_object(struct acpi_namespace_node *node,
        if (!node) {
                /* Invalid handle */
 
-               ACPI_REPORT_ERROR(("ns_attach_object: Null named_obj handle\n"));
+               ACPI_ERROR((AE_INFO, "Null named_obj handle"));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
        if (!object && (ACPI_TYPE_ANY != type)) {
                /* Null object */
 
-               ACPI_REPORT_ERROR(("ns_attach_object: Null object, but type not ACPI_TYPE_ANY\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Null object, but type not ACPI_TYPE_ANY"));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
        if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
                /* Not a name handle */
 
-               ACPI_REPORT_ERROR(("ns_attach_object: Invalid handle %p [%s]\n",
-                                  node, acpi_ut_get_descriptor_name(node)));
+               ACPI_ERROR((AE_INFO, "Invalid handle %p [%s]",
+                           node, acpi_ut_get_descriptor_name(node)));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
@@ -254,7 +255,7 @@ union acpi_operand_object *acpi_ns_get_attached_object(struct
        ACPI_FUNCTION_TRACE_PTR("ns_get_attached_object", node);
 
        if (!node) {
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Null Node ptr\n"));
+               ACPI_WARNING((AE_INFO, "Null Node ptr"));
                return_PTR(NULL);
        }
 
index 433442a9ec7441c019f0360e147519f38df315b7..232be4303653282761958b66d6f24db05a91043d 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 50a3ca5470ed6f1c41cd0332d7e03bec14ad4768..d64b78952f24c5b585010fc11efc0c34c4e37b2e 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -99,8 +99,8 @@ acpi_ns_search_node(u32 target_name,
                if (scope_name) {
                        ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
                                          "Searching %s (%p) For [%4.4s] (%s)\n",
-                                         scope_name, node,
-                                         (char *)&target_name,
+                                         scope_name, node, ACPI_CAST_PTR(char,
+                                                                         &target_name),
                                          acpi_ut_get_type_name(type)));
 
                        ACPI_MEM_FREE(scope_name);
@@ -131,7 +131,7 @@ acpi_ns_search_node(u32 target_name,
                         */
                        ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
                                          "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
-                                         (char *)&target_name,
+                                         ACPI_CAST_PTR(char, &target_name),
                                          acpi_ut_get_type_name(next_node->
                                                                type),
                                          next_node,
@@ -160,7 +160,8 @@ acpi_ns_search_node(u32 target_name,
 
        ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
                          "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n",
-                         (char *)&target_name, acpi_ut_get_type_name(type),
+                         ACPI_CAST_PTR(char, &target_name),
+                         acpi_ut_get_type_name(type),
                          acpi_ut_get_node_name(node), node, node->child));
 
        return_ACPI_STATUS(AE_NOT_FOUND);
@@ -210,14 +211,14 @@ acpi_ns_search_parent_tree(u32 target_name,
         */
        if (!parent_node) {
                ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "[%4.4s] has no parent\n",
-                                 (char *)&target_name));
+                                 ACPI_CAST_PTR(char, &target_name)));
                return_ACPI_STATUS(AE_NOT_FOUND);
        }
 
        if (acpi_ns_local(type)) {
                ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
                                  "[%4.4s] type [%s] must be local to this scope (no parent search)\n",
-                                 (char *)&target_name,
+                                 ACPI_CAST_PTR(char, &target_name),
                                  acpi_ut_get_type_name(type)));
                return_ACPI_STATUS(AE_NOT_FOUND);
        }
@@ -227,7 +228,7 @@ acpi_ns_search_parent_tree(u32 target_name,
        ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
                          "Searching parent [%4.4s] for [%4.4s]\n",
                          acpi_ut_get_node_name(parent_node),
-                         (char *)&target_name));
+                         ACPI_CAST_PTR(char, &target_name)));
 
        /*
         * 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,
        /* Parameter validation */
 
        if (!node || !target_name || !return_node) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Null param: Node %p Name %X return_node %p\n",
-                                 node, target_name, return_node));
-
-               ACPI_REPORT_ERROR(("ns_search_and_enter: Null parameter\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Null param: Node %p Name %X return_node %p",
+                           node, target_name, return_node));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
        /* Name must consist of printable characters */
 
        if (!acpi_ut_valid_acpi_name(target_name)) {
-               ACPI_REPORT_ERROR(("ns_search_and_enter: Bad character in ACPI Name: %X\n", target_name));
+               ACPI_ERROR((AE_INFO, "Bad character in ACPI Name: %X",
+                           target_name));
                return_ACPI_STATUS(AE_BAD_CHARACTER);
        }
 
@@ -360,7 +360,7 @@ acpi_ns_search_and_enter(u32 target_name,
        if (interpreter_mode == ACPI_IMODE_EXECUTE) {
                ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
                                  "%4.4s Not found in %p [Not adding]\n",
-                                 (char *)&target_name, node));
+                                 ACPI_CAST_PTR(char, &target_name), node));
 
                return_ACPI_STATUS(AE_NOT_FOUND);
        }
index ebec036423c9af25db4d25d029d946a5fce08a35..3e7cad549a38739cf5ad752513e3f45e0735ce7a 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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);
  *
  * PARAMETERS:  module_name         - Caller's module name (for error output)
  *              line_number         - Caller's line number (for error output)
- *              component_id        - Caller's component ID (for error output)
  *              internal_name       - Name or path of the namespace node
  *              lookup_status       - Exception code from NS lookup
  *
@@ -76,19 +75,17 @@ acpi_name acpi_ns_find_parent_name(struct acpi_namespace_node *node_to_search);
 void
 acpi_ns_report_error(char *module_name,
                     u32 line_number,
-                    u32 component_id,
                     char *internal_name, acpi_status lookup_status)
 {
        acpi_status status;
        char *name = NULL;
 
-       acpi_os_printf("%8s-%04d: *** Error: Looking up ",
-                      module_name, line_number);
+       acpi_ut_report_error(module_name, line_number);
 
        if (lookup_status == AE_BAD_CHARACTER) {
                /* There is a non-ascii character in the name */
 
-               acpi_os_printf("[0x%4.4X] (NON-ASCII)\n",
+               acpi_os_printf("[0x%4.4X] (NON-ASCII)",
                               *(ACPI_CAST_PTR(u32, internal_name)));
        } else {
                /* Convert path to external format */
@@ -109,7 +106,7 @@ acpi_ns_report_error(char *module_name,
                }
        }
 
-       acpi_os_printf(" in namespace, %s\n",
+       acpi_os_printf(" Namespace lookup failure, %s\n",
                       acpi_format_exception(lookup_status));
 }
 
@@ -119,10 +116,9 @@ acpi_ns_report_error(char *module_name,
  *
  * PARAMETERS:  module_name         - Caller's module name (for error output)
  *              line_number         - Caller's line number (for error output)
- *              component_id        - Caller's component ID (for error output)
  *              Message             - Error message to use on failure
  *              prefix_node         - Prefix relative to the path
- *              Path                - Path to the node
+ *              Path                - Path to the node (optional)
  *              method_status       - Execution status
  *
  * RETURN:      None
@@ -134,7 +130,6 @@ acpi_ns_report_error(char *module_name,
 void
 acpi_ns_report_method_error(char *module_name,
                            u32 line_number,
-                           u32 component_id,
                            char *message,
                            struct acpi_namespace_node *prefix_node,
                            char *path, acpi_status method_status)
@@ -142,17 +137,16 @@ acpi_ns_report_method_error(char *module_name,
        acpi_status status;
        struct acpi_namespace_node *node = prefix_node;
 
+       acpi_ut_report_error(module_name, line_number);
+
        if (path) {
                status = acpi_ns_get_node_by_path(path, prefix_node,
                                                  ACPI_NS_NO_UPSEARCH, &node);
                if (ACPI_FAILURE(status)) {
-                       acpi_os_printf
-                           ("report_method_error: Could not get node\n");
-                       return;
+                       acpi_os_printf("[Could not get node by pathname]");
                }
        }
 
-       acpi_os_printf("%8s-%04d: *** Error: ", module_name, line_number);
        acpi_ns_print_node_pathname(node, message);
        acpi_os_printf(", %s\n", acpi_format_exception(method_status));
 }
@@ -248,11 +242,11 @@ acpi_object_type acpi_ns_get_type(struct acpi_namespace_node * node)
        ACPI_FUNCTION_TRACE("ns_get_type");
 
        if (!node) {
-               ACPI_REPORT_WARNING(("ns_get_type: Null Node input pointer\n"));
-               return_VALUE(ACPI_TYPE_ANY);
+               ACPI_WARNING((AE_INFO, "Null Node parameter"));
+               return_UINT32(ACPI_TYPE_ANY);
        }
 
-       return_VALUE((acpi_object_type) node->type);
+       return_UINT32((acpi_object_type) node->type);
 }
 
 /*******************************************************************************
@@ -275,11 +269,11 @@ u32 acpi_ns_local(acpi_object_type type)
        if (!acpi_ut_valid_object_type(type)) {
                /* Type code out of range  */
 
-               ACPI_REPORT_WARNING(("ns_local: Invalid Object Type\n"));
-               return_VALUE(ACPI_NS_NORMAL);
+               ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type));
+               return_UINT32(ACPI_NS_NORMAL);
        }
 
-       return_VALUE((u32) acpi_gbl_ns_properties[type] & ACPI_NS_LOCAL);
+       return_UINT32((u32) acpi_gbl_ns_properties[type] & ACPI_NS_LOCAL);
 }
 
 /*******************************************************************************
@@ -627,7 +621,7 @@ acpi_ns_externalize_name(u32 internal_name_length,
         * with internal_name (invalid format).
         */
        if (required_length > internal_name_length) {
-               ACPI_REPORT_ERROR(("ns_externalize_name: Invalid internal name\n"));
+               ACPI_ERROR((AE_INFO, "Invalid internal name"));
                return_ACPI_STATUS(AE_BAD_PATHNAME);
        }
 
@@ -803,12 +797,11 @@ u32 acpi_ns_opens_scope(acpi_object_type type)
        if (!acpi_ut_valid_object_type(type)) {
                /* type code out of range  */
 
-               ACPI_REPORT_WARNING(("ns_opens_scope: Invalid Object Type %X\n",
-                                    type));
-               return_VALUE(ACPI_NS_NORMAL);
+               ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type));
+               return_UINT32(ACPI_NS_NORMAL);
        }
 
-       return_VALUE(((u32) acpi_gbl_ns_properties[type]) & ACPI_NS_NEWSCOPE);
+       return_UINT32(((u32) acpi_gbl_ns_properties[type]) & ACPI_NS_NEWSCOPE);
 }
 
 /*******************************************************************************
index 5f164c0df33b15e34a7dd4eb9638c5d2449cc319..fcab1e784b8173072ae496e55203a92db9969b43 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index c07b046659ff6c9dd298bf9ca6afd7dbdefce089..a95f636dc35d454e16865732cff8e4c57ab3731f 100644 (file)
@@ -6,7 +6,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -112,8 +112,7 @@ acpi_evaluate_object_typed(acpi_handle handle,
        if (return_buffer->length == 0) {
                /* Error because caller specifically asked for a return value */
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No return value\n"));
-
+               ACPI_ERROR((AE_INFO, "No return value"));
                return_ACPI_STATUS(AE_NULL_OBJECT);
        }
 
@@ -125,11 +124,11 @@ acpi_evaluate_object_typed(acpi_handle handle,
 
        /* Return object type does not match requested type */
 
-       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                         "Incorrect return type [%s] requested [%s]\n",
-                         acpi_ut_get_type_name(((union acpi_object *)
-                                                return_buffer->pointer)->type),
-                         acpi_ut_get_type_name(return_type)));
+       ACPI_ERROR((AE_INFO,
+                   "Incorrect return type [%s] requested [%s]",
+                   acpi_ut_get_type_name(((union acpi_object *)return_buffer->
+                                          pointer)->type),
+                   acpi_ut_get_type_name(return_type)));
 
        if (must_free) {
                /* Caller used ACPI_ALLOCATE_BUFFER, free the return buffer */
@@ -236,11 +235,11 @@ acpi_evaluate_object(acpi_handle handle,
                 * qualified names above, this is an error
                 */
                if (!pathname) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Both Handle and Pathname are NULL\n"));
+                       ACPI_ERROR((AE_INFO,
+                                   "Both Handle and Pathname are NULL"));
                } else {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Handle is NULL and Pathname is relative\n"));
+                       ACPI_ERROR((AE_INFO,
+                                   "Handle is NULL and Pathname is relative"));
                }
 
                status = AE_BAD_PARAMETER;
@@ -399,7 +398,7 @@ acpi_walk_namespace(acpi_object_type type,
 
        /* Parameter validation */
 
-       if ((type > ACPI_TYPE_EXTERNAL_MAX) || (!max_depth) || (!user_function)) {
+       if ((type > ACPI_TYPE_LOCAL_MAX) || (!max_depth) || (!user_function)) {
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
@@ -473,8 +472,8 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
                return (AE_CTRL_DEPTH);
        }
 
-       if (!(flags & 0x01)) {
-               /* Don't return at the device or children of the device if not there */
+       if (!(flags & ACPI_STA_DEVICE_PRESENT)) {
+               /* Don't examine children of the device if not present */
 
                return (AE_CTRL_DEPTH);
        }
index 6b5f8d4481d131f8140da6fd2b9b5890d995d9e8..8cd8675a47c0403c765c640f7b021b43fa89327a 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
                status = acpi_ut_execute_CID(node, &cid_list);
                if (ACPI_SUCCESS(status)) {
-                       size += ((acpi_size) cid_list->count - 1) *
-                           sizeof(struct acpi_compatible_id);
+                       size += cid_list->size;
                        info->valid |= ACPI_VALID_CID;
                }
 
index 0856d42e690982c66790ddb564a080a79c8421d9..a0332595677a9dbb51093443de445781ce43f1f8 100644 (file)
@@ -6,7 +6,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 20c9a37643c73110f0e18fd5efef989906d2bf14..ac5bbaedac1ba7f15972881b1662081903ed2292 100644 (file)
@@ -838,7 +838,7 @@ acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout)
                        static const int quantum_ms = 1000 / HZ;
 
                        ret = down_trylock(sem);
-                       for (i = timeout; (i > 0 && ret < 0); i -= quantum_ms) {
+                       for (i = timeout; (i > 0 && ret != 0); i -= quantum_ms) {
                                schedule_timeout_interruptible(1);
                                ret = down_trylock(sem);
                        }
@@ -1060,13 +1060,11 @@ EXPORT_SYMBOL(max_cstate);
  * Acquire a spinlock.
  *
  * handle is a pointer to the spinlock_t.
- * flags is *not* the result of save_flags - it is an ACPI-specific flag variable
- *   that indicates whether we are at interrupt level.
  */
 
-unsigned long acpi_os_acquire_lock(acpi_handle handle)
+acpi_cpu_flags acpi_os_acquire_lock(acpi_handle handle)
 {
-       unsigned long flags;
+       acpi_cpu_flags flags;
        spin_lock_irqsave((spinlock_t *) handle, flags);
        return flags;
 }
@@ -1075,7 +1073,7 @@ unsigned long acpi_os_acquire_lock(acpi_handle handle)
  * Release a spinlock. See above.
  */
 
-void acpi_os_release_lock(acpi_handle handle, unsigned long flags)
+void acpi_os_release_lock(acpi_handle handle, acpi_cpu_flags flags)
 {
        spin_unlock_irqrestore((spinlock_t *) handle, flags);
 }
index 5858188f94a69912220474c7af6142e7ba494b53..de573be52718f611459ff1212f539547a3b295a0 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -45,6 +45,7 @@
 #include <acpi/acparser.h>
 #include <acpi/amlcode.h>
 #include <acpi/acnamesp.h>
+#include <acpi/acdispat.h>
 
 #define _COMPONENT          ACPI_PARSER
 ACPI_MODULE_NAME("psargs")
@@ -62,61 +63,51 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
  *
  * PARAMETERS:  parser_state        - Current parser state object
  *
- * RETURN:      Decoded package length.  On completion, the AML pointer points
+ * RETURN:      Decoded package length. On completion, the AML pointer points
  *              past the length byte or bytes.
  *
- * DESCRIPTION: Decode and return a package length field
+ * DESCRIPTION: Decode and return a package length field.
+ *              Note: Largest package length is 28 bits, from ACPI specification
  *
  ******************************************************************************/
 
 static u32
 acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state)
 {
-       u32 encoded_length;
-       u32 length = 0;
+       u8 *aml = parser_state->aml;
+       u32 package_length = 0;
+       acpi_native_uint byte_count;
+       u8 byte_zero_mask = 0x3F;       /* Default [0:5] */
 
        ACPI_FUNCTION_TRACE("ps_get_next_package_length");
 
-       encoded_length = (u32) ACPI_GET8(parser_state->aml);
-       parser_state->aml++;
-
-       switch (encoded_length >> 6) {  /* bits 6-7 contain encoding scheme */
-       case 0:         /* 1-byte encoding (bits 0-5) */
-
-               length = (encoded_length & 0x3F);
-               break;
-
-       case 1:         /* 2-byte encoding (next byte + bits 0-3) */
-
-               length = ((ACPI_GET8(parser_state->aml) << 04) |
-                         (encoded_length & 0x0F));
-               parser_state->aml++;
-               break;
-
-       case 2:         /* 3-byte encoding (next 2 bytes + bits 0-3) */
-
-               length = ((ACPI_GET8(parser_state->aml + 1) << 12) |
-                         (ACPI_GET8(parser_state->aml) << 04) |
-                         (encoded_length & 0x0F));
-               parser_state->aml += 2;
-               break;
+       /*
+        * Byte 0 bits [6:7] contain the number of additional bytes
+        * used to encode the package length, either 0,1,2, or 3
+        */
+       byte_count = (aml[0] >> 6);
+       parser_state->aml += (byte_count + 1);
 
-       case 3:         /* 4-byte encoding (next 3 bytes + bits 0-3) */
+       /* Get bytes 3, 2, 1 as needed */
 
-               length = ((ACPI_GET8(parser_state->aml + 2) << 20) |
-                         (ACPI_GET8(parser_state->aml + 1) << 12) |
-                         (ACPI_GET8(parser_state->aml) << 04) |
-                         (encoded_length & 0x0F));
-               parser_state->aml += 3;
-               break;
-
-       default:
+       while (byte_count) {
+               /*
+                * Final bit positions for the package length bytes:
+                *      Byte3->[20:27]
+                *      Byte2->[12:19]
+                *      Byte1->[04:11]
+                *      Byte0->[00:03]
+                */
+               package_length |= (aml[byte_count] << ((byte_count << 3) - 4));
 
-               /* Can't get here, only 2 bits / 4 cases */
-               break;
+               byte_zero_mask = 0x0F;  /* Use bits [0:3] of byte 0 */
+               byte_count--;
        }
 
-       return_VALUE(length);
+       /* Byte 0 is a special case, either bits [0:3] or [0:5] are used */
+
+       package_length |= (aml[0] & byte_zero_mask);
+       return_UINT32(package_length);
 }
 
 /*******************************************************************************
@@ -135,16 +126,15 @@ acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state)
 u8 *acpi_ps_get_next_package_end(struct acpi_parse_state *parser_state)
 {
        u8 *start = parser_state->aml;
-       acpi_native_uint length;
+       u32 package_length;
 
        ACPI_FUNCTION_TRACE("ps_get_next_package_end");
 
-       /* Function below changes parser_state->Aml */
+       /* Function below updates parser_state->Aml */
 
-       length =
-           (acpi_native_uint) acpi_ps_get_next_package_length(parser_state);
+       package_length = acpi_ps_get_next_package_length(parser_state);
 
-       return_PTR(start + length);     /* end of package */
+       return_PTR(start + package_length);     /* end of package */
 }
 
 /*******************************************************************************
@@ -169,17 +159,15 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
 
        ACPI_FUNCTION_TRACE("ps_get_next_namestring");
 
-       /* Handle multiple prefix characters */
-
-       while (acpi_ps_is_prefix_char(ACPI_GET8(end))) {
-               /* Include prefix '\\' or '^' */
+       /* Point past any namestring prefix characters (backslash or carat) */
 
+       while (acpi_ps_is_prefix_char(*end)) {
                end++;
        }
 
-       /* Decode the path */
+       /* Decode the path prefix character */
 
-       switch (ACPI_GET8(end)) {
+       switch (*end) {
        case 0:
 
                /* null_name */
@@ -199,9 +187,9 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
 
        case AML_MULTI_NAME_PREFIX_OP:
 
-               /* Multiple name segments, 4 chars each */
+               /* Multiple name segments, 4 chars each, count in next byte */
 
-               end += 2 + ((acpi_size) ACPI_GET8(end + 1) * ACPI_NAME_SIZE);
+               end += 2 + (*(end + 1) * ACPI_NAME_SIZE);
                break;
 
        default:
@@ -212,7 +200,7 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
                break;
        }
 
-       parser_state->aml = (u8 *) end;
+       parser_state->aml = end;
        return_PTR((char *)start);
 }
 
@@ -224,7 +212,7 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
  *              Arg                 - Where the namepath will be stored
  *              arg_count           - If the namepath points to a control method
  *                                    the method's argument is returned here.
- *              method_call         - Whether the namepath can possibly be the
+ *              possible_method_call - Whether the namepath can possibly be the
  *                                    start of a method call
  *
  * RETURN:      Status
@@ -240,11 +228,11 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
 acpi_status
 acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
                          struct acpi_parse_state *parser_state,
-                         union acpi_parse_object *arg, u8 method_call)
+                         union acpi_parse_object *arg, u8 possible_method_call)
 {
        char *path;
        union acpi_parse_object *name_op;
-       acpi_status status = AE_OK;
+       acpi_status status;
        union acpi_operand_object *method_desc;
        struct acpi_namespace_node *node;
        union acpi_generic_state scope_info;
@@ -252,115 +240,129 @@ acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
        ACPI_FUNCTION_TRACE("ps_get_next_namepath");
 
        path = acpi_ps_get_next_namestring(parser_state);
+       acpi_ps_init_op(arg, AML_INT_NAMEPATH_OP);
 
-       /* Null path case is allowed */
+       /* Null path case is allowed, just exit */
 
-       if (path) {
-               /*
-                * Lookup the name in the internal namespace
-                */
-               scope_info.scope.node = NULL;
-               node = parser_state->start_node;
-               if (node) {
-                       scope_info.scope.node = node;
-               }
+       if (!path) {
+               arg->common.value.name = path;
+               return_ACPI_STATUS(AE_OK);
+       }
 
-               /*
-                * Lookup object.  We don't want to add anything new to the namespace
-                * here, however.  So we use MODE_EXECUTE.  Allow searching of the
-                * parent tree, but don't open a new scope -- we just want to lookup the
-                * object  (MUST BE mode EXECUTE to perform upsearch)
-                */
-               status = acpi_ns_lookup(&scope_info, path, ACPI_TYPE_ANY,
-                                       ACPI_IMODE_EXECUTE,
-                                       ACPI_NS_SEARCH_PARENT |
-                                       ACPI_NS_DONT_OPEN_SCOPE, NULL, &node);
-               if (ACPI_SUCCESS(status) && method_call) {
-                       if (node->type == ACPI_TYPE_METHOD) {
-                               /* This name is actually a control method invocation */
-
-                               method_desc = acpi_ns_get_attached_object(node);
-                               ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
-                                                 "Control Method - %p Desc %p Path=%p\n",
-                                                 node, method_desc, path));
-
-                               name_op = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP);
-                               if (!name_op) {
-                                       return_ACPI_STATUS(AE_NO_MEMORY);
-                               }
+       /* Setup search scope info */
 
-                               /* Change arg into a METHOD CALL and attach name to it */
+       scope_info.scope.node = NULL;
+       node = parser_state->start_node;
+       if (node) {
+               scope_info.scope.node = node;
+       }
 
-                               acpi_ps_init_op(arg, AML_INT_METHODCALL_OP);
-                               name_op->common.value.name = path;
+       /*
+        * Lookup the name in the internal namespace. We don't want to add
+        * anything new to the namespace here, however, so we use MODE_EXECUTE.
+        * Allow searching of the parent tree, but don't open a new scope -
+        * we just want to lookup the object (must be mode EXECUTE to perform
+        * the upsearch)
+        */
+       status =
+           acpi_ns_lookup(&scope_info, path, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+                          ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
+                          NULL, &node);
 
-                               /* Point METHODCALL/NAME to the METHOD Node */
+       /*
+        * If this name is a control method invocation, we must
+        * setup the method call
+        */
+       if (ACPI_SUCCESS(status) &&
+           possible_method_call && (node->type == ACPI_TYPE_METHOD)) {
+               /* This name is actually a control method invocation */
 
-                               name_op->common.node = node;
-                               acpi_ps_append_arg(arg, name_op);
+               method_desc = acpi_ns_get_attached_object(node);
+               ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
+                                 "Control Method - %p Desc %p Path=%p\n", node,
+                                 method_desc, path));
 
-                               if (!method_desc) {
-                                       ACPI_REPORT_ERROR(("ps_get_next_namepath: Control Method %p has no attached object\n", node));
-                                       return_ACPI_STATUS(AE_AML_INTERNAL);
-                               }
+               name_op = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP);
+               if (!name_op) {
+                       return_ACPI_STATUS(AE_NO_MEMORY);
+               }
 
-                               ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
-                                                 "Control Method - %p Args %X\n",
-                                                 node,
-                                                 method_desc->method.
-                                                 param_count));
+               /* Change Arg into a METHOD CALL and attach name to it */
 
-                               /* Get the number of arguments to expect */
+               acpi_ps_init_op(arg, AML_INT_METHODCALL_OP);
+               name_op->common.value.name = path;
 
-                               walk_state->arg_count =
-                                   method_desc->method.param_count;
-                               return_ACPI_STATUS(AE_OK);
-                       }
+               /* Point METHODCALL/NAME to the METHOD Node */
 
-                       /*
-                        * Else this is normal named object reference.
-                        * Just init the NAMEPATH object with the pathname.
-                        * (See code below)
-                        */
-               }
+               name_op->common.node = node;
+               acpi_ps_append_arg(arg, name_op);
 
-               if (ACPI_FAILURE(status)) {
-                       /*
-                        * 1) Any error other than NOT_FOUND is always severe
-                        * 2) NOT_FOUND is only important if we are executing a method.
-                        * 3) If executing a cond_ref_of opcode, NOT_FOUND is ok.
-                        */
-                       if ((((walk_state->
-                              parse_flags & ACPI_PARSE_MODE_MASK) ==
-                             ACPI_PARSE_EXECUTE) && (status == AE_NOT_FOUND)
-                            && (walk_state->op->common.aml_opcode !=
-                                AML_COND_REF_OF_OP))
-                           || (status != AE_NOT_FOUND)) {
-                               ACPI_REPORT_NSERROR(path, status);
-
-                               acpi_os_printf
-                                   ("search_node %p start_node %p return_node %p\n",
-                                    scope_info.scope.node,
-                                    parser_state->start_node, node);
-
-                       } else {
-                               /*
-                                * We got a NOT_FOUND during table load or we encountered
-                                * a cond_ref_of(x) where the target does not exist.
-                                * Either case is ok
-                                */
-                               status = AE_OK;
-                       }
+               if (!method_desc) {
+                       ACPI_ERROR((AE_INFO,
+                                   "Control Method %p has no attached object",
+                                   node));
+                       return_ACPI_STATUS(AE_AML_INTERNAL);
                }
+
+               ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
+                                 "Control Method - %p Args %X\n",
+                                 node, method_desc->method.param_count));
+
+               /* Get the number of arguments to expect */
+
+               walk_state->arg_count = method_desc->method.param_count;
+               return_ACPI_STATUS(AE_OK);
        }
 
        /*
-        * Regardless of success/failure above,
-        * Just initialize the Op with the pathname.
+        * Special handling if the name was not found during the lookup -
+        * some not_found cases are allowed
         */
-       acpi_ps_init_op(arg, AML_INT_NAMEPATH_OP);
-       arg->common.value.name = path;
+       if (status == AE_NOT_FOUND) {
+               /* 1) not_found is ok during load pass 1/2 (allow forward references) */
+
+               if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) !=
+                   ACPI_PARSE_EXECUTE) {
+                       status = AE_OK;
+               }
+
+               /* 2) not_found during a cond_ref_of(x) is ok by definition */
+
+               else if (walk_state->op->common.aml_opcode ==
+                        AML_COND_REF_OF_OP) {
+                       status = AE_OK;
+               }
+
+               /*
+                * 3) not_found while building a Package is ok at this point, we
+                * may flag as an error later if slack mode is not enabled.
+                * (Some ASL code depends on allowing this behavior)
+                */
+               else if ((arg->common.parent) &&
+                        ((arg->common.parent->common.aml_opcode ==
+                          AML_PACKAGE_OP)
+                         || (arg->common.parent->common.aml_opcode ==
+                             AML_VAR_PACKAGE_OP))) {
+                       status = AE_OK;
+               }
+       }
+
+       /* Final exception check (may have been changed from code above) */
 
+       if (ACPI_FAILURE(status)) {
+               ACPI_ERROR_NAMESPACE(path, status);
+
+               if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) ==
+                   ACPI_PARSE_EXECUTE) {
+                       /* Report a control method execution error */
+
+                       status = acpi_ds_method_error(status, walk_state);
+               }
+       }
+
+       /* Save the namepath */
+
+       arg->common.value.name = path;
        return_ACPI_STATUS(status);
 }
 
@@ -382,59 +384,63 @@ void
 acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state,
                            u32 arg_type, union acpi_parse_object *arg)
 {
+       u32 length;
+       u16 opcode;
+       u8 *aml = parser_state->aml;
 
        ACPI_FUNCTION_TRACE_U32("ps_get_next_simple_arg", arg_type);
 
        switch (arg_type) {
        case ARGP_BYTEDATA:
 
-               acpi_ps_init_op(arg, AML_BYTE_OP);
-               arg->common.value.integer = (u32) ACPI_GET8(parser_state->aml);
-               parser_state->aml++;
+               /* Get 1 byte from the AML stream */
+
+               opcode = AML_BYTE_OP;
+               arg->common.value.integer = (acpi_integer) * aml;
+               length = 1;
                break;
 
        case ARGP_WORDDATA:
 
-               acpi_ps_init_op(arg, AML_WORD_OP);
-
                /* Get 2 bytes from the AML stream */
 
-               ACPI_MOVE_16_TO_32(&arg->common.value.integer,
-                                  parser_state->aml);
-               parser_state->aml += 2;
+               opcode = AML_WORD_OP;
+               ACPI_MOVE_16_TO_64(&arg->common.value.integer, aml);
+               length = 2;
                break;
 
        case ARGP_DWORDDATA:
 
-               acpi_ps_init_op(arg, AML_DWORD_OP);
-
                /* Get 4 bytes from the AML stream */
 
-               ACPI_MOVE_32_TO_32(&arg->common.value.integer,
-                                  parser_state->aml);
-               parser_state->aml += 4;
+               opcode = AML_DWORD_OP;
+               ACPI_MOVE_32_TO_64(&arg->common.value.integer, aml);
+               length = 4;
                break;
 
        case ARGP_QWORDDATA:
 
-               acpi_ps_init_op(arg, AML_QWORD_OP);
-
                /* Get 8 bytes from the AML stream */
 
-               ACPI_MOVE_64_TO_64(&arg->common.value.integer,
-                                  parser_state->aml);
-               parser_state->aml += 8;
+               opcode = AML_QWORD_OP;
+               ACPI_MOVE_64_TO_64(&arg->common.value.integer, aml);
+               length = 8;
                break;
 
        case ARGP_CHARLIST:
 
-               acpi_ps_init_op(arg, AML_STRING_OP);
-               arg->common.value.string = (char *)parser_state->aml;
+               /* Get a pointer to the string, point past the string */
+
+               opcode = AML_STRING_OP;
+               arg->common.value.string = ACPI_CAST_PTR(char, aml);
 
-               while (ACPI_GET8(parser_state->aml) != '\0') {
-                       parser_state->aml++;
+               /* Find the null terminator */
+
+               length = 0;
+               while (aml[length]) {
+                       length++;
                }
-               parser_state->aml++;
+               length++;
                break;
 
        case ARGP_NAME:
@@ -443,14 +449,16 @@ acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state,
                acpi_ps_init_op(arg, AML_INT_NAMEPATH_OP);
                arg->common.value.name =
                    acpi_ps_get_next_namestring(parser_state);
-               break;
+               return_VOID;
 
        default:
 
-               ACPI_REPORT_ERROR(("Invalid arg_type %X\n", arg_type));
-               break;
+               ACPI_ERROR((AE_INFO, "Invalid arg_type %X", arg_type));
+               return_VOID;
        }
 
+       acpi_ps_init_op(arg, opcode);
+       parser_state->aml += length;
        return_VOID;
 }
 
@@ -540,7 +548,7 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
                 * access_type is first operand, access_attribute is second
                 */
                field->common.value.integer =
-                   (ACPI_GET8(parser_state->aml) << 8);
+                   (((u32) ACPI_GET8(parser_state->aml) << 8));
                parser_state->aml++;
                field->common.value.integer |= ACPI_GET8(parser_state->aml);
                parser_state->aml++;
@@ -703,7 +711,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
 
        default:
 
-               ACPI_REPORT_ERROR(("Invalid arg_type: %X\n", arg_type));
+               ACPI_ERROR((AE_INFO, "Invalid arg_type: %X", arg_type));
                status = AE_AML_OPERAND_TYPE;
                break;
        }
index 088d33999d9076b17575502b0bb5fc99906e51a0..00b072e15d1921ef9f5e6bb86e7b13d0aaadcae9 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
                                    && ((status & AE_CODE_MASK) !=
                                        AE_CODE_CONTROL)) {
                                        if (status == AE_AML_NO_RETURN_VALUE) {
-                                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                                 "Invoked method did not return a value, %s\n",
-                                                                 acpi_format_exception
-                                                                 (status)));
+                                               ACPI_EXCEPTION((AE_INFO, status,
+                                                               "Invoked method did not return a value"));
 
                                        }
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "get_predicate Failed, %s\n",
-                                                         acpi_format_exception
-                                                         (status)));
+                                       ACPI_EXCEPTION((AE_INFO, status,
+                                                       "get_predicate Failed"));
                                        return_ACPI_STATUS(status);
                                }
 
@@ -190,11 +186,11 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
 
                                /* The opcode is unrecognized.  Just skip unknown opcodes */
 
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Found unknown opcode %X at AML address %p offset %X, ignoring\n",
-                                                 walk_state->opcode,
-                                                 parser_state->aml,
-                                                 walk_state->aml_offset));
+                               ACPI_ERROR((AE_INFO,
+                                           "Found unknown opcode %X at AML address %p offset %X, ignoring",
+                                           walk_state->opcode,
+                                           parser_state->aml,
+                                           walk_state->aml_offset));
 
                                ACPI_DUMP_BUFFER(parser_state->aml, 128);
 
@@ -281,10 +277,8 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
                                    walk_state->descending_callback(walk_state,
                                                                    &op);
                                if (ACPI_FAILURE(status)) {
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "During name lookup/catalog, %s\n",
-                                                         acpi_format_exception
-                                                         (status)));
+                                       ACPI_EXCEPTION((AE_INFO, status,
+                                                       "During name lookup/catalog"));
                                        goto close_this_op;
                                }
 
@@ -704,6 +698,15 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
                                acpi_ps_pop_scope(parser_state, &op,
                                                  &walk_state->arg_types,
                                                  &walk_state->arg_count);
+
+                               if (op->common.aml_opcode != AML_WHILE_OP) {
+                                       status2 =
+                                           acpi_ds_result_stack_pop
+                                           (walk_state);
+                                       if (ACPI_FAILURE(status2)) {
+                                               return_ACPI_STATUS(status2);
+                                       }
+                               }
                        }
 
                        /* Close this iteration of the While loop */
index 229ae86afe8beb8cd7150f8b1518ec54d8e663c4..11d6351ab8b288ed2d428e8677e2d017465adda2 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        /* Unknown AML opcode */
 
-       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+       ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
                          "Unknown AML opcode [%4.4X]\n", opcode));
 
        return (&acpi_gbl_aml_op_info[_UNK]);
index 76d4d640d83cdebaa7362742258b2daac841e2d9..a9f3229f4106f2750a21e5e7c59255405eabc35f 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
 
        switch (callback_status) {
        case AE_CTRL_TERMINATE:
-
                /*
                 * A control method was terminated via a RETURN statement.
                 * The walk of this method is complete.
@@ -346,13 +345,19 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
 
                parser_state->aml = walk_state->aml_last_while;
                walk_state->control_state->common.value = FALSE;
-               status = AE_CTRL_BREAK;
+               status = acpi_ds_result_stack_pop(walk_state);
+               if (ACPI_SUCCESS(status)) {
+                       status = AE_CTRL_BREAK;
+               }
                break;
 
        case AE_CTRL_CONTINUE:
 
                parser_state->aml = walk_state->aml_last_while;
-               status = AE_CTRL_CONTINUE;
+               status = acpi_ds_result_stack_pop(walk_state);
+               if (ACPI_SUCCESS(status)) {
+                       status = AE_CTRL_CONTINUE;
+               }
                break;
 
        case AE_CTRL_PENDING:
@@ -369,16 +374,18 @@ acpi_ps_next_parse_state(struct acpi_walk_state *walk_state,
 #endif
 
        case AE_CTRL_TRUE:
-
                /*
                 * Predicate of an IF was true, and we are at the matching ELSE.
                 * Just close out this package
                 */
                parser_state->aml = acpi_ps_get_next_package_end(parser_state);
+               status = acpi_ds_result_stack_pop(walk_state);
+               if (ACPI_SUCCESS(status)) {
+                       status = AE_CTRL_PENDING;
+               }
                break;
 
        case AE_CTRL_FALSE:
-
                /*
                 * Either an IF/WHILE Predicate was false or we encountered a BREAK
                 * 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)
                } else if (status == AE_CTRL_TERMINATE) {
                        status = AE_OK;
                } else if ((status != AE_OK) && (walk_state->method_desc)) {
-                       ACPI_REPORT_METHOD_ERROR("Method execution failed",
-                                                walk_state->method_node, NULL,
-                                                status);
-
-                       /* Ensure proper cleanup */
+                       /* Either the method parse or actual execution failed */
 
-                       walk_state->parse_flags |= ACPI_PARSE_EXECUTE;
+                       ACPI_ERROR_METHOD("Method parse/execution failed",
+                                         walk_state->method_node, NULL,
+                                         status);
 
                        /* Check for possible multi-thread reentrancy problem */
 
                        if ((status == AE_ALREADY_EXISTS) &&
                            (!walk_state->method_desc->method.semaphore)) {
                                /*
-                                * This method is marked not_serialized, but it tried to create
+                                * Method tried to create an object twice. The probable cause is
+                                * that the method cannot handle reentrancy.
+                                *
+                                * The method is marked not_serialized, but it tried to create
                                 * a named object, causing the second thread entrance to fail.
-                                * We will workaround this by marking the method permanently
+                                * Workaround this problem by marking the method permanently
                                 * as Serialized.
                                 */
                                walk_state->method_desc->method.method_flags |=
@@ -536,15 +544,23 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
                acpi_ds_scope_stack_clear(walk_state);
 
                /*
-                * If we just returned from the execution of a control method,
-                * there's lots of cleanup to do
+                * If we just returned from the execution of a control method or if we
+                * encountered an error during the method parse phase, there's lots of
+                * cleanup to do
                 */
-               if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) ==
-                   ACPI_PARSE_EXECUTE) {
+               if (((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) ==
+                    ACPI_PARSE_EXECUTE) || (ACPI_FAILURE(status))) {
                        if (walk_state->method_desc) {
                                /* Decrement the thread count on the method parse tree */
 
-                               walk_state->method_desc->method.thread_count--;
+                               if (walk_state->method_desc->method.
+                                   thread_count) {
+                                       walk_state->method_desc->method.
+                                           thread_count--;
+                               } else {
+                                       ACPI_ERROR((AE_INFO,
+                                                   "Invalid zero thread count in method"));
+                               }
                        }
 
                        acpi_ds_terminate_control_method(walk_state);
@@ -553,7 +569,6 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
                /* Delete this walk state and all linked control states */
 
                acpi_ps_cleanup_scope(&walk_state->parser_state);
-
                previous_walk_state = walk_state;
 
                ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
index 1c953b6f1af16958fb7a7163e5fa0ac847650972..bc6047caccd9befcbb105ed748804f05607f5fd5 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index f0e755884eea849fbe6dbd1c7690c41ddf13223c..dd6f16726fc437abab328359d315cc365ee146e1 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
        if (op_info->class == AML_CLASS_UNKNOWN) {
                /* Invalid opcode */
 
-               ACPI_REPORT_ERROR(("ps_append_arg: Invalid AML Opcode: 0x%2.2X\n", op->common.aml_opcode));
+               ACPI_ERROR((AE_INFO, "Invalid AML Opcode: 0x%2.2X",
+                           op->common.aml_opcode));
                return;
        }
 
index 2075efbb4324c79259083a852a023f38d03f7cfa..3e07cb9cb7487f6940324c1b218ebbf6d9bfa761 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 08f2321b6ded21e923c35b8ed8f8d32d283361f8..06f05bfd761262c6f1776b25b3329b65b958c1b5 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 4dcbd443160e64a90e62c8ca59412c59cf00e5b2..2dd48cbb7c0299c66e0606d8a8da9687eb35aa5c 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 ACPI_MODULE_NAME("psxface")
 
 /* Local Prototypes */
+static void acpi_ps_start_trace(struct acpi_parameter_info *info);
+
+static void acpi_ps_stop_trace(struct acpi_parameter_info *info);
+
 static acpi_status acpi_ps_execute_pass(struct acpi_parameter_info *info);
 
 static void
 acpi_ps_update_parameter_list(struct acpi_parameter_info *info, u16 action);
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_debug_trace
+ *
+ * PARAMETERS:  method_name     - Valid ACPI name string
+ *              debug_level     - Optional level mask. 0 to use default
+ *              debug_layer     - Optional layer mask. 0 to use default
+ *              Flags           - bit 1: one shot(1) or persistent(0)
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: External interface to enable debug tracing during control
+ *              method execution
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags)
+{
+       acpi_status status;
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+       if (ACPI_FAILURE(status)) {
+               return (status);
+       }
+
+       /* TBDs: Validate name, allow full path or just nameseg */
+
+       acpi_gbl_trace_method_name = *ACPI_CAST_PTR(u32, name);
+       acpi_gbl_trace_flags = flags;
+
+       if (debug_level) {
+               acpi_gbl_trace_dbg_level = debug_level;
+       }
+       if (debug_layer) {
+               acpi_gbl_trace_dbg_layer = debug_layer;
+       }
+
+       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+       return (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ps_start_trace
+ *
+ * PARAMETERS:  Info        - Method info struct
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Start control method execution trace
+ *
+ ******************************************************************************/
+
+static void acpi_ps_start_trace(struct acpi_parameter_info *info)
+{
+       acpi_status status;
+
+       ACPI_FUNCTION_ENTRY();
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+       if (ACPI_FAILURE(status)) {
+               return;
+       }
+
+       if ((!acpi_gbl_trace_method_name) ||
+           (acpi_gbl_trace_method_name != info->node->name.integer)) {
+               goto exit;
+       }
+
+       acpi_gbl_original_dbg_level = acpi_dbg_level;
+       acpi_gbl_original_dbg_layer = acpi_dbg_layer;
+
+       acpi_dbg_level = 0x00FFFFFF;
+       acpi_dbg_layer = ACPI_UINT32_MAX;
+
+       if (acpi_gbl_trace_dbg_level) {
+               acpi_dbg_level = acpi_gbl_trace_dbg_level;
+       }
+       if (acpi_gbl_trace_dbg_layer) {
+               acpi_dbg_layer = acpi_gbl_trace_dbg_layer;
+       }
+
+      exit:
+       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ps_stop_trace
+ *
+ * PARAMETERS:  Info        - Method info struct
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Stop control method execution trace
+ *
+ ******************************************************************************/
+
+static void acpi_ps_stop_trace(struct acpi_parameter_info *info)
+{
+       acpi_status status;
+
+       ACPI_FUNCTION_ENTRY();
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+       if (ACPI_FAILURE(status)) {
+               return;
+       }
+
+       if ((!acpi_gbl_trace_method_name) ||
+           (acpi_gbl_trace_method_name != info->node->name.integer)) {
+               goto exit;
+       }
+
+       /* Disable further tracing if type is one-shot */
+
+       if (acpi_gbl_trace_flags & 1) {
+               acpi_gbl_trace_method_name = 0;
+               acpi_gbl_trace_dbg_level = 0;
+               acpi_gbl_trace_dbg_layer = 0;
+       }
+
+       acpi_dbg_level = acpi_gbl_original_dbg_level;
+       acpi_dbg_layer = acpi_gbl_original_dbg_layer;
+
+      exit:
+       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+}
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ps_execute_method
@@ -104,6 +238,10 @@ acpi_status acpi_ps_execute_method(struct acpi_parameter_info *info)
         */
        acpi_ps_update_parameter_list(info, REF_INCREMENT);
 
+       /* Begin tracing if requested */
+
+       acpi_ps_start_trace(info);
+
        /*
         * 1) Perform the first pass parse of the method to enter any
         *    named objects that it creates into the namespace
@@ -129,6 +267,10 @@ acpi_status acpi_ps_execute_method(struct acpi_parameter_info *info)
        status = acpi_ps_execute_pass(info);
 
       cleanup:
+       /* End optional tracing */
+
+       acpi_ps_stop_trace(info);
+
        /* Take away the extra reference that we gave the parameters above */
 
        acpi_ps_update_parameter_list(info, REF_DECREMENT);
index e567c03b238ee608a5ab7cc35268139e39788818..65aee79b3971fc02f25b8faa53528ece37b0fd64 100644 (file)
@@ -258,7 +258,7 @@ typedef int (*irq_lookup_func) (struct acpi_prt_entry *, int *, int *, char **);
 
 static int
 acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
-                     int *edge_level, int *active_high_low, char **link)
+                     int *triggering, int *polarity, char **link)
 {
        int irq;
 
@@ -266,8 +266,8 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
 
        if (entry->link.handle) {
                irq = acpi_pci_link_allocate_irq(entry->link.handle,
-                                                entry->link.index, edge_level,
-                                                active_high_low, link);
+                                                entry->link.index, triggering,
+                                                polarity, link);
                if (irq < 0) {
                        ACPI_DEBUG_PRINT((ACPI_DB_WARN,
                                          "Invalid IRQ link routing entry\n"));
@@ -275,8 +275,8 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
                }
        } else {
                irq = entry->link.index;
-               *edge_level = ACPI_LEVEL_SENSITIVE;
-               *active_high_low = ACPI_ACTIVE_LOW;
+               *triggering = ACPI_LEVEL_SENSITIVE;
+               *polarity = ACPI_ACTIVE_LOW;
        }
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found IRQ %d\n", irq));
@@ -285,7 +285,7 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
 
 static int
 acpi_pci_free_irq(struct acpi_prt_entry *entry,
-                 int *edge_level, int *active_high_low, char **link)
+                 int *triggering, int *polarity, char **link)
 {
        int irq;
 
@@ -307,8 +307,8 @@ static int
 acpi_pci_irq_lookup(struct pci_bus *bus,
                    int device,
                    int pin,
-                   int *edge_level,
-                   int *active_high_low, char **link, irq_lookup_func func)
+                   int *triggering,
+                   int *polarity, char **link, irq_lookup_func func)
 {
        struct acpi_prt_entry *entry = NULL;
        int segment = pci_domain_nr(bus);
@@ -327,7 +327,7 @@ acpi_pci_irq_lookup(struct pci_bus *bus,
                return_VALUE(-1);
        }
 
-       ret = func(entry, edge_level, active_high_low, link);
+       ret = func(entry, triggering, polarity, link);
        return_VALUE(ret);
 }
 
@@ -339,8 +339,8 @@ acpi_pci_irq_lookup(struct pci_bus *bus,
 static int
 acpi_pci_irq_derive(struct pci_dev *dev,
                    int pin,
-                   int *edge_level,
-                   int *active_high_low, char **link, irq_lookup_func func)
+                   int *triggering,
+                   int *polarity, char **link, irq_lookup_func func)
 {
        struct pci_dev *bridge = dev;
        int irq = -1;
@@ -374,7 +374,7 @@ acpi_pci_irq_derive(struct pci_dev *dev,
                }
 
                irq = acpi_pci_irq_lookup(bridge->bus, PCI_SLOT(bridge->devfn),
-                                         pin, edge_level, active_high_low,
+                                         pin, triggering, polarity,
                                          link, func);
        }
 
@@ -401,8 +401,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
 {
        int irq = 0;
        u8 pin = 0;
-       int edge_level = ACPI_LEVEL_SENSITIVE;
-       int active_high_low = ACPI_ACTIVE_LOW;
+       int triggering = ACPI_LEVEL_SENSITIVE;
+       int polarity = ACPI_ACTIVE_LOW;
        char *link = NULL;
        int rc;
 
@@ -431,7 +431,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
         * values override any BIOS-assigned IRQs set during boot.
         */
        irq = acpi_pci_irq_lookup(dev->bus, PCI_SLOT(dev->devfn), pin,
-                                 &edge_level, &active_high_low, &link,
+                                 &triggering, &polarity, &link,
                                  acpi_pci_allocate_irq);
 
        /*
@@ -439,8 +439,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
         * device's parent bridge.
         */
        if (irq < 0)
-               irq = acpi_pci_irq_derive(dev, pin, &edge_level,
-                                         &active_high_low, &link,
+               irq = acpi_pci_irq_derive(dev, pin, &triggering,
+                                         &polarity, &link,
                                          acpi_pci_allocate_irq);
 
        /*
@@ -462,7 +462,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
                }
        }
 
-       rc = acpi_register_gsi(irq, edge_level, active_high_low);
+       rc = acpi_register_gsi(irq, triggering, polarity);
        if (rc < 0) {
                printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: failed "
                       "to register GSI\n", pci_name(dev), ('A' + pin));
@@ -477,8 +477,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
                printk("Link [%s] -> ", link);
 
        printk("GSI %u (%s, %s) -> IRQ %d\n", irq,
-              (edge_level == ACPI_LEVEL_SENSITIVE) ? "level" : "edge",
-              (active_high_low == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq);
+              (triggering == ACPI_LEVEL_SENSITIVE) ? "level" : "edge",
+              (polarity == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq);
 
        return_VALUE(0);
 }
@@ -494,8 +494,8 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
 {
        int gsi = 0;
        u8 pin = 0;
-       int edge_level = ACPI_LEVEL_SENSITIVE;
-       int active_high_low = ACPI_ACTIVE_LOW;
+       int triggering = ACPI_LEVEL_SENSITIVE;
+       int polarity = ACPI_ACTIVE_LOW;
 
        ACPI_FUNCTION_TRACE("acpi_pci_irq_disable");
 
@@ -511,7 +511,7 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
         * First we check the PCI IRQ routing table (PRT) for an IRQ.
         */
        gsi = acpi_pci_irq_lookup(dev->bus, PCI_SLOT(dev->devfn), pin,
-                                 &edge_level, &active_high_low, NULL,
+                                 &triggering, &polarity, NULL,
                                  acpi_pci_free_irq);
        /*
         * 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)
         */
        if (gsi < 0)
                gsi = acpi_pci_irq_derive(dev, pin,
-                                         &edge_level, &active_high_low, NULL,
+                                         &triggering, &polarity, NULL,
                                          acpi_pci_free_irq);
        if (gsi < 0)
                return_VOID;
index 78927c0f155102a01f3acf97b87887819bfc546f..07bc6dfe662b34aeb4c83d7476d6cee31c10c70a 100644 (file)
@@ -70,8 +70,8 @@ static struct acpi_driver acpi_pci_link_driver = {
  */
 struct acpi_pci_link_irq {
        u8 active;              /* Current IRQ */
-       u8 edge_level;          /* All IRQs */
-       u8 active_high_low;     /* All IRQs */
+       u8 triggering;          /* All IRQs */
+       u8 polarity;    /* All IRQs */
        u8 resource_type;
        u8 possible_count;
        u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
@@ -108,19 +108,19 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
 
        ACPI_FUNCTION_TRACE("acpi_pci_link_check_possible");
 
-       switch (resource->id) {
-       case ACPI_RSTYPE_START_DPF:
+       switch (resource->type) {
+       case ACPI_RESOURCE_TYPE_START_DEPENDENT:
                return_ACPI_STATUS(AE_OK);
-       case ACPI_RSTYPE_IRQ:
+       case ACPI_RESOURCE_TYPE_IRQ:
                {
                        struct acpi_resource_irq *p = &resource->data.irq;
-                       if (!p || !p->number_of_interrupts) {
+                       if (!p || !p->interrupt_count) {
                                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
                                                  "Blank IRQ resource\n"));
                                return_ACPI_STATUS(AE_OK);
                        }
                        for (i = 0;
-                            (i < p->number_of_interrupts
+                            (i < p->interrupt_count
                              && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
                                if (!p->interrupts[i]) {
                                        ACPI_DEBUG_PRINT((ACPI_DB_WARN,
@@ -131,22 +131,22 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
                                link->irq.possible[i] = p->interrupts[i];
                                link->irq.possible_count++;
                        }
-                       link->irq.edge_level = p->edge_level;
-                       link->irq.active_high_low = p->active_high_low;
-                       link->irq.resource_type = ACPI_RSTYPE_IRQ;
+                       link->irq.triggering = p->triggering;
+                       link->irq.polarity = p->polarity;
+                       link->irq.resource_type = ACPI_RESOURCE_TYPE_IRQ;
                        break;
                }
-       case ACPI_RSTYPE_EXT_IRQ:
+       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
                {
-                       struct acpi_resource_ext_irq *p =
+                       struct acpi_resource_extended_irq *p =
                            &resource->data.extended_irq;
-                       if (!p || !p->number_of_interrupts) {
+                       if (!p || !p->interrupt_count) {
                                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
                                                  "Blank EXT IRQ resource\n"));
                                return_ACPI_STATUS(AE_OK);
                        }
                        for (i = 0;
-                            (i < p->number_of_interrupts
+                            (i < p->interrupt_count
                              && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
                                if (!p->interrupts[i]) {
                                        ACPI_DEBUG_PRINT((ACPI_DB_WARN,
@@ -157,9 +157,9 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
                                link->irq.possible[i] = p->interrupts[i];
                                link->irq.possible_count++;
                        }
-                       link->irq.edge_level = p->edge_level;
-                       link->irq.active_high_low = p->active_high_low;
-                       link->irq.resource_type = ACPI_RSTYPE_EXT_IRQ;
+                       link->irq.triggering = p->triggering;
+                       link->irq.polarity = p->polarity;
+                       link->irq.resource_type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
                        break;
                }
        default:
@@ -201,11 +201,11 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
 
        ACPI_FUNCTION_TRACE("acpi_pci_link_check_current");
 
-       switch (resource->id) {
-       case ACPI_RSTYPE_IRQ:
+       switch (resource->type) {
+       case ACPI_RESOURCE_TYPE_IRQ:
                {
                        struct acpi_resource_irq *p = &resource->data.irq;
-                       if (!p || !p->number_of_interrupts) {
+                       if (!p || !p->interrupt_count) {
                                /*
                                 * IRQ descriptors may have no IRQ# bits set,
                                 * particularly those those w/ _STA disabled
@@ -217,11 +217,11 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
                        *irq = p->interrupts[0];
                        break;
                }
-       case ACPI_RSTYPE_EXT_IRQ:
+       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
                {
-                       struct acpi_resource_ext_irq *p =
+                       struct acpi_resource_extended_irq *p =
                            &resource->data.extended_irq;
-                       if (!p || !p->number_of_interrupts) {
+                       if (!p || !p->interrupt_count) {
                                /*
                                 * extended IRQ descriptors must
                                 * return at least 1 IRQ
@@ -233,8 +233,10 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
                        *irq = p->interrupts[0];
                        break;
                }
+               break;
        default:
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Resource isn't an IRQ\n"));
+               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Resource %d isn't an IRQ\n", resource->type));
+       case ACPI_RESOURCE_TYPE_END_TAG:
                return_ACPI_STATUS(AE_OK);
        }
        return_ACPI_STATUS(AE_CTRL_TERMINATE);
@@ -325,36 +327,36 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
        buffer.pointer = resource;
 
        switch (link->irq.resource_type) {
-       case ACPI_RSTYPE_IRQ:
-               resource->res.id = ACPI_RSTYPE_IRQ;
+       case ACPI_RESOURCE_TYPE_IRQ:
+               resource->res.type = ACPI_RESOURCE_TYPE_IRQ;
                resource->res.length = sizeof(struct acpi_resource);
-               resource->res.data.irq.edge_level = link->irq.edge_level;
-               resource->res.data.irq.active_high_low =
-                   link->irq.active_high_low;
-               if (link->irq.edge_level == ACPI_EDGE_SENSITIVE)
-                       resource->res.data.irq.shared_exclusive =
+               resource->res.data.irq.triggering = link->irq.triggering;
+               resource->res.data.irq.polarity =
+                   link->irq.polarity;
+               if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
+                       resource->res.data.irq.sharable =
                            ACPI_EXCLUSIVE;
                else
-                       resource->res.data.irq.shared_exclusive = ACPI_SHARED;
-               resource->res.data.irq.number_of_interrupts = 1;
+                       resource->res.data.irq.sharable = ACPI_SHARED;
+               resource->res.data.irq.interrupt_count = 1;
                resource->res.data.irq.interrupts[0] = irq;
                break;
 
-       case ACPI_RSTYPE_EXT_IRQ:
-               resource->res.id = ACPI_RSTYPE_EXT_IRQ;
+       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+               resource->res.type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
                resource->res.length = sizeof(struct acpi_resource);
                resource->res.data.extended_irq.producer_consumer =
                    ACPI_CONSUMER;
-               resource->res.data.extended_irq.edge_level =
-                   link->irq.edge_level;
-               resource->res.data.extended_irq.active_high_low =
-                   link->irq.active_high_low;
-               if (link->irq.edge_level == ACPI_EDGE_SENSITIVE)
-                       resource->res.data.irq.shared_exclusive =
+               resource->res.data.extended_irq.triggering =
+                   link->irq.triggering;
+               resource->res.data.extended_irq.polarity =
+                   link->irq.polarity;
+               if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
+                       resource->res.data.irq.sharable =
                            ACPI_EXCLUSIVE;
                else
-                       resource->res.data.irq.shared_exclusive = ACPI_SHARED;
-               resource->res.data.extended_irq.number_of_interrupts = 1;
+                       resource->res.data.irq.sharable = ACPI_SHARED;
+               resource->res.data.extended_irq.interrupt_count = 1;
                resource->res.data.extended_irq.interrupts[0] = irq;
                /* ignore resource_source, it's optional */
                break;
@@ -364,7 +366,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
                goto end;
 
        }
-       resource->end.id = ACPI_RSTYPE_END_TAG;
+       resource->end.type = ACPI_RESOURCE_TYPE_END_TAG;
 
        /* Attempt to set the resource */
        status = acpi_set_current_resources(link->handle, &buffer);
@@ -613,7 +615,7 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
 int
 acpi_pci_link_allocate_irq(acpi_handle handle,
                           int index,
-                          int *edge_level, int *active_high_low, char **name)
+                          int *triggering, int *polarity, char **name)
 {
        int result = 0;
        struct acpi_device *device = NULL;
@@ -653,10 +655,10 @@ acpi_pci_link_allocate_irq(acpi_handle handle,
        link->refcnt++;
        up(&acpi_link_lock);
 
-       if (edge_level)
-               *edge_level = link->irq.edge_level;
-       if (active_high_low)
-               *active_high_low = link->irq.active_high_low;
+       if (triggering)
+               *triggering = link->irq.triggering;
+       if (polarity)
+               *polarity = link->irq.polarity;
        if (name)
                *name = acpi_device_bid(link->device);
        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
index 0fd9988c283d199f3a3d5d9a6f14369198d73474..4c313eab6313d94ff6e345555fa1eb53e24bedd0 100644 (file)
@@ -122,15 +122,15 @@ get_root_bridge_busnr_callback(struct acpi_resource *resource, void *data)
        int *busnr = (int *)data;
        struct acpi_resource_address64 address;
 
-       if (resource->id != ACPI_RSTYPE_ADDRESS16 &&
-           resource->id != ACPI_RSTYPE_ADDRESS32 &&
-           resource->id != ACPI_RSTYPE_ADDRESS64)
+       if (resource->type != ACPI_RESOURCE_TYPE_ADDRESS16 &&
+           resource->type != ACPI_RESOURCE_TYPE_ADDRESS32 &&
+           resource->type != ACPI_RESOURCE_TYPE_ADDRESS64)
                return AE_OK;
 
        acpi_resource_to_address64(resource, &address);
        if ((address.address_length > 0) &&
            (address.resource_type == ACPI_BUS_NUMBER_RANGE))
-               *busnr = address.min_address_range;
+               *busnr = address.minimum;
 
        return AE_OK;
 }
index 1278aca96fe3e05141773eec181742b5b53f1c5c..99a3a28594daf333eb8c9355f2a886ed43f5f626 100644 (file)
@@ -253,31 +253,21 @@ static int acpi_processor_errata(struct acpi_processor *pr)
  * _PDC is required for a BIOS-OS handshake for most of the newer
  * ACPI processor features.
  */
-
-int acpi_processor_set_pdc(struct acpi_processor *pr,
-                          struct acpi_object_list *pdc_in)
+static int acpi_processor_set_pdc(struct acpi_processor *pr)
 {
+       struct acpi_object_list *pdc_in = pr->pdc;
        acpi_status status = AE_OK;
-       u32 arg0_buf[3];
-       union acpi_object arg0 = { ACPI_TYPE_BUFFER };
-       struct acpi_object_list no_object = { 1, &arg0 };
-       struct acpi_object_list *pdc;
 
        ACPI_FUNCTION_TRACE("acpi_processor_set_pdc");
 
-       arg0.buffer.length = 12;
-       arg0.buffer.pointer = (u8 *) arg0_buf;
-       arg0_buf[0] = ACPI_PDC_REVISION_ID;
-       arg0_buf[1] = 0;
-       arg0_buf[2] = 0;
-
-       pdc = (pdc_in) ? pdc_in : &no_object;
+       if (!pdc_in)
+               return_VALUE(status);
 
-       status = acpi_evaluate_object(pr->handle, "_PDC", pdc, NULL);
+       status = acpi_evaluate_object(pr->handle, "_PDC", pdc_in, NULL);
 
-       if ((ACPI_FAILURE(status)) && (pdc_in))
+       if (ACPI_FAILURE(status))
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                 "Error evaluating _PDC, using legacy perf. control...\n"));
+                   "Could not evaluate _PDC, using legacy perf. control...\n"));
 
        return_VALUE(status);
 }
@@ -357,7 +347,6 @@ static int acpi_processor_add_fs(struct acpi_device *device)
                                  ACPI_PROCESSOR_FILE_THROTTLING));
        else {
                entry->proc_fops = &acpi_processor_throttling_fops;
-               entry->proc_fops->write = acpi_processor_write_throttling;
                entry->data = acpi_driver_data(device);
                entry->owner = THIS_MODULE;
        }
@@ -372,7 +361,6 @@ static int acpi_processor_add_fs(struct acpi_device *device)
                                  ACPI_PROCESSOR_FILE_LIMIT));
        else {
                entry->proc_fops = &acpi_processor_limit_fops;
-               entry->proc_fops->write = acpi_processor_write_limit;
                entry->data = acpi_driver_data(device);
                entry->owner = THIS_MODULE;
        }
@@ -589,6 +577,10 @@ static int acpi_processor_start(struct acpi_device *device)
                                  "Error installing device notify handler\n"));
        }
 
+       /* _PDC call should be done before doing anything else (if reqd.). */
+       arch_acpi_processor_init_pdc(pr);
+       acpi_processor_set_pdc(pr);
+
        acpi_processor_power_init(pr, device);
 
        if (pr->flags.throttling) {
index cc049338e418b5b968888faafd22a85492752bab..be2dae52f6fa47a6b74dbca63c47a553236cfd27 100644 (file)
@@ -95,22 +95,57 @@ static int set_max_cstate(struct dmi_system_id *id)
 }
 
 static struct dmi_system_id __initdata processor_power_dmi_table[] = {
-       {set_max_cstate, "IBM ThinkPad R40e", {
-                                              DMI_MATCH(DMI_BIOS_VENDOR,
-                                                        "IBM"),
-                                              DMI_MATCH(DMI_BIOS_VERSION,
-                                                        "1SET60WW")},
-        (void *)1},
-       {set_max_cstate, "Medion 41700", {
-                                         DMI_MATCH(DMI_BIOS_VENDOR,
-                                                   "Phoenix Technologies LTD"),
-                                         DMI_MATCH(DMI_BIOS_VERSION,
-                                                   "R01-A1J")}, (void *)1},
-       {set_max_cstate, "Clevo 5600D", {
-                                        DMI_MATCH(DMI_BIOS_VENDOR,
-                                                  "Phoenix Technologies LTD"),
-                                        DMI_MATCH(DMI_BIOS_VERSION,
-                                                  "SHE845M0.86C.0013.D.0302131307")},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET60WW")}, (void *)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET43WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET45WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET47WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET50WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET52WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET55WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET56WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET59WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET60WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET61WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET62WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET64WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET65WW") }, (void*)1},
+       { set_max_cstate, "IBM ThinkPad R40e", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"IBM"),
+         DMI_MATCH(DMI_BIOS_VERSION,"1SET68WW") }, (void*)1},
+       { set_max_cstate, "Medion 41700", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),
+         DMI_MATCH(DMI_BIOS_VERSION,"R01-A1J")}, (void *)1},
+       { set_max_cstate, "Clevo 5600D", {
+         DMI_MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),
+         DMI_MATCH(DMI_BIOS_VERSION,"SHE845M0.86C.0013.D.0302131307")},
         (void *)2},
        {},
 };
@@ -550,18 +585,10 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
        if (!pr->pblk)
                return_VALUE(-ENODEV);
 
-       memset(pr->power.states, 0, sizeof(pr->power.states));
-
        /* if info is obtained from pblk/fadt, type equals state */
-       pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
        pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2;
        pr->power.states[ACPI_STATE_C3].type = ACPI_STATE_C3;
 
-       /* the C0 state only exists as a filler in our array,
-        * and all processors need to support C1 */
-       pr->power.states[ACPI_STATE_C0].valid = 1;
-       pr->power.states[ACPI_STATE_C1].valid = 1;
-
 #ifndef CONFIG_HOTPLUG_CPU
        /*
         * 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)
 {
        ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_default_c1");
 
+       /* Zero initialize all the C-states info. */
        memset(pr->power.states, 0, sizeof(pr->power.states));
 
-       /* if info is obtained from pblk/fadt, type equals state */
+       /* set the first C-State to C1 */
        pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
-       pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2;
-       pr->power.states[ACPI_STATE_C3].type = ACPI_STATE_C3;
 
        /* the C0 state only exists as a filler in our array,
         * and all processors need to support C1 */
@@ -610,6 +636,7 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
 {
        acpi_status status = 0;
        acpi_integer count;
+       int current_count;
        int i;
        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
        union acpi_object *cst;
@@ -619,10 +646,12 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
        if (nocst)
                return_VALUE(-ENODEV);
 
-       pr->power.count = 0;
-       for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++)
-               memset(&(pr->power.states[i]), 0,
-                      sizeof(struct acpi_processor_cx));
+       current_count = 1;
+
+       /* Zero initialize C2 onwards and prepare for fresh CST lookup */
+       for (i = 2; i < ACPI_PROCESSOR_MAX_POWER; i++)
+               memset(&(pr->power.states[i]), 0, 
+                               sizeof(struct acpi_processor_cx));
 
        status = acpi_evaluate_object(pr->handle, "_CST", NULL, &buffer);
        if (ACPI_FAILURE(status)) {
@@ -650,16 +679,6 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
                goto end;
        }
 
-       /* We support up to ACPI_PROCESSOR_MAX_POWER. */
-       if (count > ACPI_PROCESSOR_MAX_POWER) {
-               printk(KERN_WARNING
-                      "Limiting number of power states to max (%d)\n",
-                      ACPI_PROCESSOR_MAX_POWER);
-               printk(KERN_WARNING
-                      "Please increase ACPI_PROCESSOR_MAX_POWER if needed.\n");
-               count = ACPI_PROCESSOR_MAX_POWER;
-       }
-
        /* Tell driver that at least _CST is supported. */
        pr->flags.has_cst = 1;
 
@@ -703,7 +722,7 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
                    (reg->space_id != ACPI_ADR_SPACE_SYSTEM_IO))
                        continue;
 
-               if ((cx.type < ACPI_STATE_C1) || (cx.type > ACPI_STATE_C3))
+               if ((cx.type < ACPI_STATE_C2) || (cx.type > ACPI_STATE_C3))
                        continue;
 
                obj = (union acpi_object *)&(element->package.elements[2]);
@@ -718,15 +737,28 @@ static int acpi_processor_get_power_info_cst(struct acpi_processor *pr)
 
                cx.power = obj->integer.value;
 
-               (pr->power.count)++;
-               memcpy(&(pr->power.states[pr->power.count]), &cx, sizeof(cx));
+               current_count++;
+               memcpy(&(pr->power.states[current_count]), &cx, sizeof(cx));
+
+               /*
+                * We support total ACPI_PROCESSOR_MAX_POWER - 1
+                * (From 1 through ACPI_PROCESSOR_MAX_POWER - 1)
+                */
+               if (current_count >= (ACPI_PROCESSOR_MAX_POWER - 1)) {
+                       printk(KERN_WARNING
+                              "Limiting number of power states to max (%d)\n",
+                              ACPI_PROCESSOR_MAX_POWER);
+                       printk(KERN_WARNING
+                              "Please increase ACPI_PROCESSOR_MAX_POWER if needed.\n");
+                       break;
+               }
        }
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found %d power states\n",
-                         pr->power.count));
+                         current_count));
 
        /* Validate number of power states discovered */
-       if (pr->power.count < 2)
+       if (current_count < 2)
                status = -EFAULT;
 
       end:
@@ -892,12 +924,13 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr)
        /* NOTE: the idle thread may not be running while calling
         * this function */
 
+       /* Adding C1 state */
+       acpi_processor_get_power_info_default_c1(pr);
        result = acpi_processor_get_power_info_cst(pr);
        if (result == -ENODEV)
-               result = acpi_processor_get_power_info_fadt(pr);
+               acpi_processor_get_power_info_fadt(pr);
 
-       if ((result) || (acpi_processor_power_verify(pr) < 2))
-               result = acpi_processor_get_power_info_default_c1(pr);
+       pr->power.count = acpi_processor_power_verify(pr);
 
        /*
         * Set Default Policy
@@ -1066,8 +1099,6 @@ int acpi_processor_power_init(struct acpi_processor *pr,
                }
        }
 
-       acpi_processor_power_init_pdc(&(pr->power), pr->id);
-       acpi_processor_set_pdc(pr, pr->power.pdc);
        acpi_processor_get_power_info(pr);
 
        /*
index 22c7bb66c2005c4956a241c7a31a566d9ae6b073..abbdb37a7f5f37e062f58800318d66b67a37c5d1 100644 (file)
@@ -315,8 +315,6 @@ static int acpi_processor_get_performance_info(struct acpi_processor *pr)
        if (!pr || !pr->performance || !pr->handle)
                return_VALUE(-EINVAL);
 
-       acpi_processor_set_pdc(pr, pr->performance->pdc);
-
        status = acpi_get_handle(pr->handle, "_PCT", &handle);
        if (ACPI_FAILURE(status)) {
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
@@ -520,8 +518,8 @@ static void acpi_cpufreq_add_file(struct acpi_processor *pr)
                                  "Unable to create '%s' fs entry\n",
                                  ACPI_PROCESSOR_FILE_PERFORMANCE));
        else {
+               acpi_processor_perf_fops.write = acpi_processor_write_performance;
                entry->proc_fops = &acpi_processor_perf_fops;
-               entry->proc_fops->write = acpi_processor_write_performance;
                entry->data = acpi_driver_data(device);
                entry->owner = THIS_MODULE;
        }
index dc9817cfb882a87f6b640640aeb243988e059c3d..f99ad05cd6a2b9575f51d5bf2f9fdbe81f3cc675 100644 (file)
@@ -348,9 +348,9 @@ static int acpi_processor_limit_open_fs(struct inode *inode, struct file *file)
                           PDE(inode)->data);
 }
 
-ssize_t acpi_processor_write_limit(struct file * file,
-                                  const char __user * buffer,
-                                  size_t count, loff_t * data)
+static ssize_t acpi_processor_write_limit(struct file * file,
+                                         const char __user * buffer,
+                                         size_t count, loff_t * data)
 {
        int result = 0;
        struct seq_file *m = (struct seq_file *)file->private_data;
@@ -394,6 +394,7 @@ ssize_t acpi_processor_write_limit(struct file * file,
 struct file_operations acpi_processor_limit_fops = {
        .open = acpi_processor_limit_open_fs,
        .read = seq_read,
+       .write = acpi_processor_write_limit,
        .llseek = seq_lseek,
        .release = single_release,
 };
index 74a52d4e79ae936d8ee30aa19ae6e23279e45c4b..b966549ec000487eecce9f3e1edc53a72cd51964 100644 (file)
@@ -306,9 +306,9 @@ static int acpi_processor_throttling_open_fs(struct inode *inode,
                           PDE(inode)->data);
 }
 
-ssize_t acpi_processor_write_throttling(struct file * file,
-                                       const char __user * buffer,
-                                       size_t count, loff_t * data)
+static ssize_t acpi_processor_write_throttling(struct file * file,
+                                              const char __user * buffer,
+                                              size_t count, loff_t * data)
 {
        int result = 0;
        struct seq_file *m = (struct seq_file *)file->private_data;
@@ -337,6 +337,7 @@ ssize_t acpi_processor_write_throttling(struct file * file,
 struct file_operations acpi_processor_throttling_fops = {
        .open = acpi_processor_throttling_open_fs,
        .read = seq_read,
+       .write = acpi_processor_write_throttling,
        .llseek = seq_lseek,
        .release = single_release,
 };
index 2130b74170c3ee7048b00e8800d27045f8f14e55..8de4f69dfa095f8120e6f72f19596129dda17fd3 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for all Linux ACPI interpreter subdirectories
 #
 
-obj-y := rsaddr.o  rscreate.o  rsio.o   rslist.o    rsmisc.o   rsxface.o \
+obj-y := rsaddr.o rscreate.o rsinfo.o rsio.o rslist.o rsmisc.o rsxface.o \
         rscalc.o  rsirq.o  rsmemory.o  rsutils.o
 
 obj-$(ACPI_FUTURE_USAGE) += rsdump.o
index 23b54baa0cb2ebd6e451fff26967ba79b2b00eba..8fa3213ce000709af7c33a74c44efb397bfdc5c8 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #define _COMPONENT          ACPI_RESOURCES
 ACPI_MODULE_NAME("rsaddr")
 
-/* Local prototypes */
-static void
-acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags);
-
-static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource);
-
-static void
-acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags);
-
-static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource);
-
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_decode_general_flags
- *
- * PARAMETERS:  Resource            - Address resource data struct
- *              Flags               - Actual flag byte
- *
- * RETURN:      Decoded flag bits in resource struct
- *
- * DESCRIPTION: Decode a general flag byte to an address resource struct
+ * acpi_rs_convert_address16 - All WORD (16-bit) address resources
  *
  ******************************************************************************/
+struct acpi_rsconvert_info acpi_rs_convert_address16[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS16,
+        ACPI_RS_SIZE(struct acpi_resource_address16),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address16)},
 
-static void
-acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags)
-{
-       ACPI_FUNCTION_ENTRY();
-
-       /* Producer / Consumer - flag bit[0] */
-
-       resource->address.producer_consumer = (u32) (flags & 0x01);
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS16,
+        sizeof(struct aml_resource_address16),
+        0},
 
-       /* Decode (_DEC) - flag bit[1] */
+       /* Resource Type, General Flags, and Type-Specific Flags */
 
-       resource->address.decode = (u32) ((flags >> 1) & 0x01);
+       {ACPI_RSC_ADDRESS, 0, 0, 0},
 
-       /* Min Address Fixed (_MIF) - flag bit[2] */
+       /*
+        * These fields are contiguous in both the source and destination:
+        * Address Granularity
+        * Address Range Minimum
+        * Address Range Maximum
+        * Address Translation Offset
+        * Address Length
+        */
+       {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.address16.granularity),
+        AML_OFFSET(address16.granularity),
+        5},
 
-       resource->address.min_address_fixed = (u32) ((flags >> 2) & 0x01);
+       /* Optional resource_source (Index and String) */
 
-       /* Max Address Fixed (_MAF) - flag bit[3] */
-
-       resource->address.max_address_fixed = (u32) ((flags >> 3) & 0x01);
-}
+       {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address16.resource_source),
+        0,
+        sizeof(struct aml_resource_address16)}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_encode_general_flags
- *
- * PARAMETERS:  Resource            - Address resource data struct
- *
- * RETURN:      Encoded general flag byte
- *
- * DESCRIPTION: Construct a general flag byte from an address resource struct
+ * acpi_rs_convert_address32 - All DWORD (32-bit) address resources
  *
  ******************************************************************************/
 
-static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource)
-{
-       u8 flags;
-
-       ACPI_FUNCTION_ENTRY();
-
-       /* Producer / Consumer - flag bit[0] */
-
-       flags = (u8) (resource->address.producer_consumer & 0x01);
-
-       /* Decode (_DEC) - flag bit[1] */
-
-       flags |= (u8) ((resource->address.decode & 0x01) << 1);
-
-       /* Min Address Fixed (_MIF) - flag bit[2] */
-
-       flags |= (u8) ((resource->address.min_address_fixed & 0x01) << 2);
+struct acpi_rsconvert_info acpi_rs_convert_address32[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS32,
+        ACPI_RS_SIZE(struct acpi_resource_address32),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address32)},
 
-       /* Max Address Fixed (_MAF) - flag bit[3] */
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS32,
+        sizeof(struct aml_resource_address32),
+        0},
 
-       flags |= (u8) ((resource->address.max_address_fixed & 0x01) << 3);
+       /* Resource Type, General Flags, and Type-Specific Flags */
 
-       return (flags);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_decode_specific_flags
- *
- * PARAMETERS:  Resource            - Address resource data struct
- *              Flags               - Actual flag byte
- *
- * RETURN:      Decoded flag bits in attribute struct
- *
- * DESCRIPTION: Decode a type-specific flag byte to an attribute struct.
- *              Type-specific flags are only defined for the Memory and IO
- *              resource types.
- *
- ******************************************************************************/
+       {ACPI_RSC_ADDRESS, 0, 0, 0},
 
-static void
-acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags)
-{
-       ACPI_FUNCTION_ENTRY();
-
-       if (resource->address.resource_type == ACPI_MEMORY_RANGE) {
-               /* Write Status (_RW) - flag bit[0] */
-
-               resource->address.attribute.memory.read_write_attribute =
-                   (u16) (flags & 0x01);
-
-               /* Memory Attributes (_MEM) - flag bits[2:1] */
-
-               resource->address.attribute.memory.cache_attribute =
-                   (u16) ((flags >> 1) & 0x03);
-       } else if (resource->address.resource_type == ACPI_IO_RANGE) {
-               /* Ranges (_RNG) - flag bits[1:0] */
-
-               resource->address.attribute.io.range_attribute =
-                   (u16) (flags & 0x03);
+       /*
+        * These fields are contiguous in both the source and destination:
+        * Address Granularity
+        * Address Range Minimum
+        * Address Range Maximum
+        * Address Translation Offset
+        * Address Length
+        */
+       {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.address32.granularity),
+        AML_OFFSET(address32.granularity),
+        5},
 
-               /* Translations (_TTP and _TRS) - flag bits[5:4] */
+       /* Optional resource_source (Index and String) */
 
-               resource->address.attribute.io.translation_attribute =
-                   (u16) ((flags >> 4) & 0x03);
-       }
-}
+       {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address32.resource_source),
+        0,
+        sizeof(struct aml_resource_address32)}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_encode_specific_flags
- *
- * PARAMETERS:  Resource            - Address resource data struct
- *
- * RETURN:      Encoded type-specific flag byte
- *
- * DESCRIPTION: Construct a type-specific flag byte from an attribute struct.
- *              Type-specific flags are only defined for the Memory and IO
- *              resource types.
+ * acpi_rs_convert_address64 - All QWORD (64-bit) address resources
  *
  ******************************************************************************/
 
-static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource)
-{
-       u8 flags = 0;
-
-       ACPI_FUNCTION_ENTRY();
-
-       if (resource->address.resource_type == ACPI_MEMORY_RANGE) {
-               /* Write Status (_RW) - flag bit[0] */
+struct acpi_rsconvert_info acpi_rs_convert_address64[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS64,
+        ACPI_RS_SIZE(struct acpi_resource_address64),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address64)},
 
-               flags = (u8)
-                   (resource->address.attribute.memory.
-                    read_write_attribute & 0x01);
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS64,
+        sizeof(struct aml_resource_address64),
+        0},
 
-               /* Memory Attributes (_MEM) - flag bits[2:1] */
+       /* Resource Type, General Flags, and Type-Specific Flags */
 
-               flags |= (u8)
-                   ((resource->address.attribute.memory.
-                     cache_attribute & 0x03) << 1);
-       } else if (resource->address.resource_type == ACPI_IO_RANGE) {
-               /* Ranges (_RNG) - flag bits[1:0] */
+       {ACPI_RSC_ADDRESS, 0, 0, 0},
 
-               flags = (u8)
-                   (resource->address.attribute.io.range_attribute & 0x03);
+       /*
+        * These fields are contiguous in both the source and destination:
+        * Address Granularity
+        * Address Range Minimum
+        * Address Range Maximum
+        * Address Translation Offset
+        * Address Length
+        */
+       {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.address64.granularity),
+        AML_OFFSET(address64.granularity),
+        5},
 
-               /* Translations (_TTP and _TRS) - flag bits[5:4] */
+       /* Optional resource_source (Index and String) */
 
-               flags |= (u8)
-                   ((resource->address.attribute.io.
-                     translation_attribute & 0x03) << 4);
-       }
-
-       return (flags);
-}
+       {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address64.resource_source),
+        0,
+        sizeof(struct aml_resource_address64)}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_address16_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_convert_ext_address64 - All Extended (64-bit) address resources
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_address16_resource(u8 * byte_stream_buffer,
-                          acpi_size * bytes_consumed,
-                          u8 ** output_buffer, acpi_size * structure_size)
-{
-       u32 index;
-       u16 temp16;
-       u8 temp8;
-       u8 *temp_ptr;
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_address16);
-
-       ACPI_FUNCTION_TRACE("rs_address16_resource");
-
-       /* Get the Descriptor Length field */
-
-       buffer += 1;
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-       /* Validate minimum descriptor length */
-
-       if (temp16 < 13) {
-               return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
-       }
-
-       *bytes_consumed = temp16 + 3;
-       output_struct->id = ACPI_RSTYPE_ADDRESS16;
-
-       /* Get the Resource Type (Byte3) */
+struct acpi_rsconvert_info acpi_rs_convert_ext_address64[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
+        ACPI_RS_SIZE(struct acpi_resource_extended_address64),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_address64)},
 
-       buffer += 2;
-       temp8 = *buffer;
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64,
+        sizeof(struct aml_resource_extended_address64),
+        0},
 
-       /* Values 0-2 and 0xC0-0xFF are valid */
+       /* Resource Type, General Flags, and Type-Specific Flags */
 
-       if ((temp8 > 2) && (temp8 < 0xC0)) {
-               return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
-       }
-
-       output_struct->data.address16.resource_type = temp8;
-
-       /* Get the General Flags (Byte4) */
-
-       buffer += 1;
-       acpi_rs_decode_general_flags(&output_struct->data, *buffer);
-
-       /* Get the Type Specific Flags (Byte5) */
-
-       buffer += 1;
-       acpi_rs_decode_specific_flags(&output_struct->data, *buffer);
-
-       /* Get Granularity (Bytes 6-7) */
-
-       buffer += 1;
-       ACPI_MOVE_16_TO_32(&output_struct->data.address16.granularity, buffer);
-
-       /* Get min_address_range (Bytes 8-9) */
+       {ACPI_RSC_ADDRESS, 0, 0, 0},
 
-       buffer += 2;
-       ACPI_MOVE_16_TO_32(&output_struct->data.address16.min_address_range,
-                          buffer);
-
-       /* Get max_address_range (Bytes 10-11) */
-
-       buffer += 2;
-       ACPI_MOVE_16_TO_32(&output_struct->data.address16.max_address_range,
-                          buffer);
-
-       /* Get address_translation_offset (Bytes 12-13) */
-
-       buffer += 2;
-       ACPI_MOVE_16_TO_32(&output_struct->data.address16.
-                          address_translation_offset, buffer);
-
-       /* Get address_length (Bytes 14-15) */
-
-       buffer += 2;
-       ACPI_MOVE_16_TO_32(&output_struct->data.address16.address_length,
-                          buffer);
-
-       /* Resource Source Index (if present) */
-
-       buffer += 2;
+       /* Revision ID */
 
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.ext_address64.revision_iD),
+        AML_OFFSET(ext_address64.revision_iD),
+        1},
        /*
-        * This will leave us pointing to the Resource Source Index
-        * If it is present, then save it off and calculate the
-        * pointer to where the null terminated string goes:
-        * Each Interrupt takes 32-bits + the 5 bytes of the
-        * stream that are default.
-        *
-        * Note: Some resource descriptors will have an additional null, so
-        * we add 1 to the length.
+        * These fields are contiguous in both the source and destination:
+        * Address Granularity
+        * Address Range Minimum
+        * Address Range Maximum
+        * Address Translation Offset
+        * Address Length
+        * Type-Specific Attribute
         */
-       if (*bytes_consumed > (16 + 1)) {
-               /* Dereference the Index */
-
-               output_struct->data.address16.resource_source.index =
-                   (u32) * buffer;
-
-               /* Point to the String */
-
-               buffer += 1;
-
-               /* Point the String pointer to the end of this structure */
-
-               output_struct->data.address16.resource_source.string_ptr =
-                   (char *)((u8 *) output_struct + struct_size);
-
-               temp_ptr = (u8 *)
-                   output_struct->data.address16.resource_source.string_ptr;
-
-               /* Copy the resource_source string into the buffer */
-
-               index = 0;
-               while (*buffer) {
-                       *temp_ptr = *buffer;
-
-                       temp_ptr++;
-                       buffer++;
-                       index++;
-               }
-
-               /* Add the terminating null and set the string length */
-
-               *temp_ptr = 0;
-               output_struct->data.address16.resource_source.string_length =
-                   index + 1;
-
-               /*
-                * In order for the struct_size to fall on a 32-bit boundary,
-                * calculate the length of the string and expand the
-                * struct_size to the next 32-bit boundary.
-                */
-               temp8 = (u8) (index + 1);
-               struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
-       } else {
-               output_struct->data.address16.resource_source.index = 0;
-               output_struct->data.address16.resource_source.string_length = 0;
-               output_struct->data.address16.resource_source.string_ptr = NULL;
-       }
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.ext_address64.granularity),
+        AML_OFFSET(ext_address64.granularity),
+        6}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_address16_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_convert_general_flags - Flags common to all address descriptors
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_address16_stream(struct acpi_resource *linked_list,
-                        u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u8 *length_field;
-       acpi_size actual_bytes;
-
-       ACPI_FUNCTION_TRACE("rs_address16_stream");
-
-       /* Set the Descriptor Type field */
-
-       *buffer = ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE;
-       buffer += 1;
-
-       /* Save a pointer to the Length field - to be filled in later */
-
-       length_field = buffer;
-       buffer += 2;
-
-       /* Set the Resource Type (Memory, Io, bus_number) */
-
-       *buffer = (u8) (linked_list->data.address16.resource_type & 0x03);
-       buffer += 1;
-
-       /* Set the general flags */
-
-       *buffer = acpi_rs_encode_general_flags(&linked_list->data);
-       buffer += 1;
-
-       /* Set the type specific flags */
-
-       *buffer = acpi_rs_encode_specific_flags(&linked_list->data);
-       buffer += 1;
-
-       /* Set the address space granularity */
-
-       ACPI_MOVE_32_TO_16(buffer, &linked_list->data.address16.granularity);
-       buffer += 2;
-
-       /* Set the address range minimum */
+static struct acpi_rsconvert_info acpi_rs_convert_general_flags[6] = {
+       {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.flags),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_general_flags)},
 
-       ACPI_MOVE_32_TO_16(buffer,
-                          &linked_list->data.address16.min_address_range);
-       buffer += 2;
+       /* Resource Type (Memory, Io, bus_number, etc.) */
 
-       /* Set the address range maximum */
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.address.resource_type),
+        AML_OFFSET(address.resource_type),
+        1},
 
-       ACPI_MOVE_32_TO_16(buffer,
-                          &linked_list->data.address16.max_address_range);
-       buffer += 2;
+       /* General Flags - Consume, Decode, min_fixed, max_fixed */
 
-       /* Set the address translation offset */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.producer_consumer),
+        AML_OFFSET(address.flags),
+        0},
 
-       ACPI_MOVE_32_TO_16(buffer,
-                          &linked_list->data.address16.
-                          address_translation_offset);
-       buffer += 2;
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.decode),
+        AML_OFFSET(address.flags),
+        1},
 
-       /* Set the address length */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.min_address_fixed),
+        AML_OFFSET(address.flags),
+        2},
 
-       ACPI_MOVE_32_TO_16(buffer, &linked_list->data.address16.address_length);
-       buffer += 2;
-
-       /* Resource Source Index and Resource Source are optional */
-
-       if (linked_list->data.address16.resource_source.string_length) {
-               *buffer =
-                   (u8) linked_list->data.address16.resource_source.index;
-               buffer += 1;
-
-               /* Copy the resource_source string */
-
-               ACPI_STRCPY((char *)buffer,
-                           linked_list->data.address16.resource_source.
-                           string_ptr);
-
-               /*
-                * Buffer needs to be set to the length of the string + one for the
-                * terminating null
-                */
-               buffer +=
-                   (acpi_size) (ACPI_STRLEN
-                                (linked_list->data.address16.resource_source.
-                                 string_ptr) + 1);
-       }
-
-       /* Return the number of bytes consumed in this operation */
-
-       actual_bytes = ACPI_PTR_DIFF(buffer, *output_buffer);
-       *bytes_consumed = actual_bytes;
-
-       /*
-        * Set the length field to the number of bytes consumed
-        * minus the header size (3 bytes)
-        */
-       actual_bytes -= 3;
-       ACPI_MOVE_SIZE_TO_16(length_field, &actual_bytes);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.max_address_fixed),
+        AML_OFFSET(address.flags),
+        3}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_address32_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_convert_mem_flags - Flags common to Memory address descriptors
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_address32_resource(u8 * byte_stream_buffer,
-                          acpi_size * bytes_consumed,
-                          u8 ** output_buffer, acpi_size * structure_size)
-{
-       u16 temp16;
-       u8 temp8;
-       u8 *temp_ptr;
-       u32 index;
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32);
+static struct acpi_rsconvert_info acpi_rs_convert_mem_flags[5] = {
+       {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_mem_flags)},
 
-       ACPI_FUNCTION_TRACE("rs_address32_resource");
+       /* Memory-specific flags */
 
-       /* Get the Descriptor Length field */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.write_protect),
+        AML_OFFSET(address.specific_flags),
+        0},
 
-       buffer += 1;
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
+       {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.caching),
+        AML_OFFSET(address.specific_flags),
+        1},
 
-       /* Validate minimum descriptor length */
+       {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.range_type),
+        AML_OFFSET(address.specific_flags),
+        3},
 
-       if (temp16 < 23) {
-               return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
-       }
-
-       *bytes_consumed = temp16 + 3;
-       output_struct->id = ACPI_RSTYPE_ADDRESS32;
-
-       /* Get the Resource Type (Byte3) */
-
-       buffer += 2;
-       temp8 = *buffer;
-
-       /* Values 0-2 and 0xC0-0xFF are valid */
-
-       if ((temp8 > 2) && (temp8 < 0xC0)) {
-               return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
-       }
-
-       output_struct->data.address32.resource_type = temp8;
-
-       /* Get the General Flags (Byte4) */
-
-       buffer += 1;
-       acpi_rs_decode_general_flags(&output_struct->data, *buffer);
-
-       /* Get the Type Specific Flags (Byte5) */
-
-       buffer += 1;
-       acpi_rs_decode_specific_flags(&output_struct->data, *buffer);
-
-       /* Get Granularity (Bytes 6-9) */
-
-       buffer += 1;
-       ACPI_MOVE_32_TO_32(&output_struct->data.address32.granularity, buffer);
-
-       /* Get min_address_range (Bytes 10-13) */
-
-       buffer += 4;
-       ACPI_MOVE_32_TO_32(&output_struct->data.address32.min_address_range,
-                          buffer);
-
-       /* Get max_address_range (Bytes 14-17) */
-
-       buffer += 4;
-       ACPI_MOVE_32_TO_32(&output_struct->data.address32.max_address_range,
-                          buffer);
-
-       /* Get address_translation_offset (Bytes 18-21) */
-
-       buffer += 4;
-       ACPI_MOVE_32_TO_32(&output_struct->data.address32.
-                          address_translation_offset, buffer);
-
-       /* Get address_length (Bytes 22-25) */
-
-       buffer += 4;
-       ACPI_MOVE_32_TO_32(&output_struct->data.address32.address_length,
-                          buffer);
-
-       /* Resource Source Index (if present) */
-
-       buffer += 4;
-
-       /*
-        * This will leave us pointing to the Resource Source Index
-        * If it is present, then save it off and calculate the
-        * pointer to where the null terminated string goes:
-        *
-        * Note: Some resource descriptors will have an additional null, so
-        * we add 1 to the length.
-        */
-       if (*bytes_consumed > (26 + 1)) {
-               /* Dereference the Index */
-
-               output_struct->data.address32.resource_source.index =
-                   (u32) * buffer;
-
-               /* Point to the String */
-
-               buffer += 1;
-
-               /* Point the String pointer to the end of this structure */
-
-               output_struct->data.address32.resource_source.string_ptr =
-                   (char *)((u8 *) output_struct + struct_size);
-
-               temp_ptr = (u8 *)
-                   output_struct->data.address32.resource_source.string_ptr;
-
-               /* Copy the resource_source string into the buffer */
-
-               index = 0;
-               while (*buffer) {
-                       *temp_ptr = *buffer;
-
-                       temp_ptr++;
-                       buffer++;
-                       index++;
-               }
-
-               /* Add the terminating null and set the string length */
-
-               *temp_ptr = 0;
-               output_struct->data.address32.resource_source.string_length =
-                   index + 1;
-
-               /*
-                * In order for the struct_size to fall on a 32-bit boundary,
-                * calculate the length of the string and expand the
-                * struct_size to the next 32-bit boundary.
-                */
-               temp8 = (u8) (index + 1);
-               struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
-       } else {
-               output_struct->data.address32.resource_source.index = 0;
-               output_struct->data.address32.resource_source.string_length = 0;
-               output_struct->data.address32.resource_source.string_ptr = NULL;
-       }
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.translation),
+        AML_OFFSET(address.specific_flags),
+        5}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_address32_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_convert_io_flags - Flags common to I/O address descriptors
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_address32_stream(struct acpi_resource *linked_list,
-                        u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer;
-       u16 *length_field;
-
-       ACPI_FUNCTION_TRACE("rs_address32_stream");
-
-       buffer = *output_buffer;
-
-       /* Set the Descriptor Type field */
-
-       *buffer = ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE;
-       buffer += 1;
-
-       /* Save a pointer to the Length field - to be filled in later */
-
-       length_field = ACPI_CAST_PTR(u16, buffer);
-       buffer += 2;
-
-       /* Set the Resource Type (Memory, Io, bus_number) */
-
-       *buffer = (u8) (linked_list->data.address32.resource_type & 0x03);
-       buffer += 1;
-
-       /* Set the general flags */
-
-       *buffer = acpi_rs_encode_general_flags(&linked_list->data);
-       buffer += 1;
-
-       /* Set the type specific flags */
-
-       *buffer = acpi_rs_encode_specific_flags(&linked_list->data);
-       buffer += 1;
-
-       /* Set the address space granularity */
-
-       ACPI_MOVE_32_TO_32(buffer, &linked_list->data.address32.granularity);
-       buffer += 4;
-
-       /* Set the address range minimum */
-
-       ACPI_MOVE_32_TO_32(buffer,
-                          &linked_list->data.address32.min_address_range);
-       buffer += 4;
-
-       /* Set the address range maximum */
-
-       ACPI_MOVE_32_TO_32(buffer,
-                          &linked_list->data.address32.max_address_range);
-       buffer += 4;
-
-       /* Set the address translation offset */
-
-       ACPI_MOVE_32_TO_32(buffer,
-                          &linked_list->data.address32.
-                          address_translation_offset);
-       buffer += 4;
-
-       /* Set the address length */
-
-       ACPI_MOVE_32_TO_32(buffer, &linked_list->data.address32.address_length);
-       buffer += 4;
+static struct acpi_rsconvert_info acpi_rs_convert_io_flags[4] = {
+       {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io_flags)},
 
-       /* Resource Source Index and Resource Source are optional */
+       /* I/O-specific flags */
 
-       if (linked_list->data.address32.resource_source.string_length) {
-               *buffer =
-                   (u8) linked_list->data.address32.resource_source.index;
-               buffer += 1;
+       {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.io.range_type),
+        AML_OFFSET(address.specific_flags),
+        0},
 
-               /* Copy the resource_source string */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.io.translation),
+        AML_OFFSET(address.specific_flags),
+        4},
 
-               ACPI_STRCPY((char *)buffer,
-                           linked_list->data.address32.resource_source.
-                           string_ptr);
-
-               /*
-                * Buffer needs to be set to the length of the string + one for the
-                *  terminating null
-                */
-               buffer +=
-                   (acpi_size) (ACPI_STRLEN
-                                (linked_list->data.address32.resource_source.
-                                 string_ptr) + 1);
-       }
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-
-       /*
-        * Set the length field to the number of bytes consumed
-        * minus the header size (3 bytes)
-        */
-       *length_field = (u16) (*bytes_consumed - 3);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_1BITFLAG,
+        ACPI_RS_OFFSET(data.address.info.io.translation_type),
+        AML_OFFSET(address.specific_flags),
+        5}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_address64_resource
+ * FUNCTION:    acpi_rs_get_address_common
  *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
+ * PARAMETERS:  Resource            - Pointer to the internal resource struct
+ *              Aml                 - Pointer to the AML resource descriptor
  *
- * RETURN:      Status
+ * RETURN:      TRUE if the resource_type field is OK, FALSE otherwise
  *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor
+ *              to an internal resource descriptor
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_address64_resource(u8 * byte_stream_buffer,
-                          acpi_size * bytes_consumed,
-                          u8 ** output_buffer, acpi_size * structure_size)
+u8
+acpi_rs_get_address_common(struct acpi_resource *resource,
+                          union aml_resource *aml)
 {
-       u16 temp16;
-       u8 temp8;
-       u8 resource_type;
-       u8 *temp_ptr;
-       u32 index;
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64);
-
-       ACPI_FUNCTION_TRACE("rs_address64_resource");
-
-       /* Get the Descriptor Type */
-
-       resource_type = *buffer;
-
-       /* Get the Descriptor Length field */
-
-       buffer += 1;
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-       /* Validate minimum descriptor length */
-
-       if (temp16 < 43) {
-               return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
-       }
-
-       *bytes_consumed = temp16 + 3;
-       output_struct->id = ACPI_RSTYPE_ADDRESS64;
-
-       /* Get the Resource Type (Byte3) */
-
-       buffer += 2;
-       temp8 = *buffer;
-
-       /* Values 0-2 and 0xC0-0xFF are valid */
-
-       if ((temp8 > 2) && (temp8 < 0xC0)) {
-               return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
-       }
-
-       output_struct->data.address64.resource_type = temp8;
-
-       /* Get the General Flags (Byte4) */
-
-       buffer += 1;
-       acpi_rs_decode_general_flags(&output_struct->data, *buffer);
-
-       /* Get the Type Specific Flags (Byte5) */
-
-       buffer += 1;
-       acpi_rs_decode_specific_flags(&output_struct->data, *buffer);
+       ACPI_FUNCTION_ENTRY();
 
-       if (resource_type == ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE) {
-               /* Move past revision_id and Reserved byte */
+       /* Validate the Resource Type */
 
-               buffer += 2;
+       if ((aml->address.resource_type > 2)
+           && (aml->address.resource_type < 0xC0)) {
+               return (FALSE);
        }
 
-       /* Get Granularity (Bytes 6-13) or (Bytes 8-15) */
-
-       buffer += 1;
-       ACPI_MOVE_64_TO_64(&output_struct->data.address64.granularity, buffer);
-
-       /* Get min_address_range (Bytes 14-21) or (Bytes 16-23) */
-
-       buffer += 8;
-       ACPI_MOVE_64_TO_64(&output_struct->data.address64.min_address_range,
-                          buffer);
-
-       /* Get max_address_range (Bytes 22-29) or (Bytes 24-31) */
-
-       buffer += 8;
-       ACPI_MOVE_64_TO_64(&output_struct->data.address64.max_address_range,
-                          buffer);
-
-       /* Get address_translation_offset (Bytes 30-37) or (Bytes 32-39) */
-
-       buffer += 8;
-       ACPI_MOVE_64_TO_64(&output_struct->data.address64.
-                          address_translation_offset, buffer);
+       /* Get the Resource Type and General Flags */
 
-       /* Get address_length (Bytes 38-45) or (Bytes 40-47) */
+       (void)acpi_rs_convert_aml_to_resource(resource, aml,
+                                             acpi_rs_convert_general_flags);
 
-       buffer += 8;
-       ACPI_MOVE_64_TO_64(&output_struct->data.address64.address_length,
-                          buffer);
+       /* Get the Type-Specific Flags (Memory and I/O descriptors only) */
 
-       output_struct->data.address64.resource_source.index = 0;
-       output_struct->data.address64.resource_source.string_length = 0;
-       output_struct->data.address64.resource_source.string_ptr = NULL;
-
-       if (resource_type == ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE) {
-               /* Get type_specific_attribute (Bytes 48-55) */
-
-               buffer += 8;
-               ACPI_MOVE_64_TO_64(&output_struct->data.address64.
-                                  type_specific_attributes, buffer);
+       if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
+               (void)acpi_rs_convert_aml_to_resource(resource, aml,
+                                                     acpi_rs_convert_mem_flags);
+       } else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
+               (void)acpi_rs_convert_aml_to_resource(resource, aml,
+                                                     acpi_rs_convert_io_flags);
        } else {
-               output_struct->data.address64.type_specific_attributes = 0;
-
-               /* Resource Source Index (if present) */
-
-               buffer += 8;
-
-               /*
-                * This will leave us pointing to the Resource Source Index
-                * If it is present, then save it off and calculate the
-                * pointer to where the null terminated string goes:
-                * Each Interrupt takes 32-bits + the 5 bytes of the
-                * stream that are default.
-                *
-                * Note: Some resource descriptors will have an additional null, so
-                * we add 1 to the length.
-                */
-               if (*bytes_consumed > (46 + 1)) {
-                       /* Dereference the Index */
-
-                       output_struct->data.address64.resource_source.index =
-                           (u32) * buffer;
-
-                       /* Point to the String */
-
-                       buffer += 1;
-
-                       /* Point the String pointer to the end of this structure */
-
-                       output_struct->data.address64.resource_source.
-                           string_ptr =
-                           (char *)((u8 *) output_struct + struct_size);
-
-                       temp_ptr = (u8 *)
-                           output_struct->data.address64.resource_source.
-                           string_ptr;
-
-                       /* Copy the resource_source string into the buffer */
-
-                       index = 0;
-                       while (*buffer) {
-                               *temp_ptr = *buffer;
-
-                               temp_ptr++;
-                               buffer++;
-                               index++;
-                       }
-
-                       /*
-                        * Add the terminating null and set the string length
-                        */
-                       *temp_ptr = 0;
-                       output_struct->data.address64.resource_source.
-                           string_length = index + 1;
-
-                       /*
-                        * In order for the struct_size to fall on a 32-bit boundary,
-                        * calculate the length of the string and expand the
-                        * struct_size to the next 32-bit boundary.
-                        */
-                       temp8 = (u8) (index + 1);
-                       struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
-               }
-       }
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
+               /* Generic resource type, just grab the type_specific byte */
 
-       /* Return the final size of the structure */
+               resource->data.address.info.type_specific =
+                   aml->address.specific_flags;
+       }
 
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
+       return (TRUE);
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_address64_stream
+ * FUNCTION:    acpi_rs_set_address_common
  *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
+ * PARAMETERS:  Aml                 - Pointer to the AML resource descriptor
+ *              Resource            - Pointer to the internal resource struct
  *
- * RETURN:      Status
+ * RETURN:      None
  *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * DESCRIPTION: Convert common flag fields from a resource descriptor to an
+ *              AML descriptor
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_address64_stream(struct acpi_resource *linked_list,
-                        u8 ** output_buffer, acpi_size * bytes_consumed)
+void
+acpi_rs_set_address_common(union aml_resource *aml,
+                          struct acpi_resource *resource)
 {
-       u8 *buffer;
-       u16 *length_field;
-
-       ACPI_FUNCTION_TRACE("rs_address64_stream");
-
-       buffer = *output_buffer;
-
-       /* Set the Descriptor Type field */
-
-       *buffer = ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE;
-       buffer += 1;
-
-       /* Save a pointer to the Length field - to be filled in later */
-
-       length_field = ACPI_CAST_PTR(u16, buffer);
-       buffer += 2;
-
-       /* Set the Resource Type (Memory, Io, bus_number) */
-
-       *buffer = (u8) (linked_list->data.address64.resource_type & 0x03);
-       buffer += 1;
-
-       /* Set the general flags */
-
-       *buffer = acpi_rs_encode_general_flags(&linked_list->data);
-       buffer += 1;
-
-       /* Set the type specific flags */
-
-       *buffer = acpi_rs_encode_specific_flags(&linked_list->data);
-       buffer += 1;
-
-       /* Set the address space granularity */
-
-       ACPI_MOVE_64_TO_64(buffer, &linked_list->data.address64.granularity);
-       buffer += 8;
-
-       /* Set the address range minimum */
-
-       ACPI_MOVE_64_TO_64(buffer,
-                          &linked_list->data.address64.min_address_range);
-       buffer += 8;
-
-       /* Set the address range maximum */
-
-       ACPI_MOVE_64_TO_64(buffer,
-                          &linked_list->data.address64.max_address_range);
-       buffer += 8;
-
-       /* Set the address translation offset */
-
-       ACPI_MOVE_64_TO_64(buffer,
-                          &linked_list->data.address64.
-                          address_translation_offset);
-       buffer += 8;
-
-       /* Set the address length */
-
-       ACPI_MOVE_64_TO_64(buffer, &linked_list->data.address64.address_length);
-       buffer += 8;
+       ACPI_FUNCTION_ENTRY();
 
-       /* Resource Source Index and Resource Source are optional */
+       /* Set the Resource Type and General Flags */
 
-       if (linked_list->data.address64.resource_source.string_length) {
-               *buffer =
-                   (u8) linked_list->data.address64.resource_source.index;
-               buffer += 1;
+       (void)acpi_rs_convert_resource_to_aml(resource, aml,
+                                             acpi_rs_convert_general_flags);
 
-               /* Copy the resource_source string */
+       /* Set the Type-Specific Flags (Memory and I/O descriptors only) */
 
-               ACPI_STRCPY((char *)buffer,
-                           linked_list->data.address64.resource_source.
-                           string_ptr);
+       if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
+               (void)acpi_rs_convert_resource_to_aml(resource, aml,
+                                                     acpi_rs_convert_mem_flags);
+       } else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
+               (void)acpi_rs_convert_resource_to_aml(resource, aml,
+                                                     acpi_rs_convert_io_flags);
+       } else {
+               /* Generic resource type, just copy the type_specific byte */
 
-               /*
-                * Buffer needs to be set to the length of the string + one for the
-                * terminating null
-                */
-               buffer +=
-                   (acpi_size) (ACPI_STRLEN
-                                (linked_list->data.address64.resource_source.
-                                 string_ptr) + 1);
+               aml->address.specific_flags =
+                   resource->data.address.info.type_specific;
        }
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-
-       /*
-        * Set the length field to the number of bytes consumed
-        * minus the header size (3 bytes)
-        */
-       *length_field = (u16) (*bytes_consumed - 3);
-       return_ACPI_STATUS(AE_OK);
 }
index 378f58390fc14935fff3f9fa4e519e6d2293e143..7d6481d9fbecded65bbeb2137bf718cd6ea18c64 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #define _COMPONENT          ACPI_RESOURCES
 ACPI_MODULE_NAME("rscalc")
 
+/* Local prototypes */
+static u8 acpi_rs_count_set_bits(u16 bit_field);
+
+static acpi_rs_length
+acpi_rs_struct_option_length(struct acpi_resource_source *resource_source);
+
+static u32
+acpi_rs_stream_option_length(u32 resource_length, u32 minimum_total_length);
+
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_get_byte_stream_length
+ * FUNCTION:    acpi_rs_count_set_bits
  *
- * PARAMETERS:  linked_list         - Pointer to the resource linked list
- *              size_needed         - u32 pointer of the size buffer needed
- *                                    to properly return the parsed data
+ * PARAMETERS:  bit_field       - Field in which to count bits
  *
- * RETURN:      Status
+ * RETURN:      Number of bits set within the field
  *
- * DESCRIPTION: Takes the resource byte stream and parses it once, calculating
- *              the size buffer needed to hold the linked list that conveys
- *              the resource data.
+ * DESCRIPTION: Count the number of bits set in a resource field. Used for
+ *              (Short descriptor) interrupt and DMA lists.
  *
  ******************************************************************************/
-acpi_status
-acpi_rs_get_byte_stream_length(struct acpi_resource *linked_list,
-                              acpi_size * size_needed)
-{
-       acpi_size byte_stream_size_needed = 0;
-       acpi_size segment_size;
-       u8 done = FALSE;
-
-       ACPI_FUNCTION_TRACE("rs_get_byte_stream_length");
-
-       while (!done) {
-               /* Init the variable that will hold the size to add to the total. */
-
-               segment_size = 0;
-
-               switch (linked_list->id) {
-               case ACPI_RSTYPE_IRQ:
-                       /*
-                        * IRQ Resource
-                        * For an IRQ Resource, Byte 3, although optional, will always be
-                        * created - it holds IRQ information.
-                        */
-                       segment_size = 4;
-                       break;
-
-               case ACPI_RSTYPE_DMA:
-                       /*
-                        * DMA Resource
-                        * For this resource the size is static
-                        */
-                       segment_size = 3;
-                       break;
-
-               case ACPI_RSTYPE_START_DPF:
-                       /*
-                        * Start Dependent Functions Resource
-                        * For a start_dependent_functions Resource, Byte 1, although
-                        * optional, will always be created.
-                        */
-                       segment_size = 2;
-                       break;
-
-               case ACPI_RSTYPE_END_DPF:
-                       /*
-                        * End Dependent Functions Resource
-                        * For this resource the size is static
-                        */
-                       segment_size = 1;
-                       break;
-
-               case ACPI_RSTYPE_IO:
-                       /*
-                        * IO Port Resource
-                        * For this resource the size is static
-                        */
-                       segment_size = 8;
-                       break;
 
-               case ACPI_RSTYPE_FIXED_IO:
-                       /*
-                        * Fixed IO Port Resource
-                        * For this resource the size is static
-                        */
-                       segment_size = 4;
-                       break;
-
-               case ACPI_RSTYPE_VENDOR:
-                       /*
-                        * Vendor Defined Resource
-                        * For a Vendor Specific resource, if the Length is between 1 and 7
-                        * it will be created as a Small Resource data type, otherwise it
-                        * is a Large Resource data type.
-                        */
-                       if (linked_list->data.vendor_specific.length > 7) {
-                               segment_size = 3;
-                       } else {
-                               segment_size = 1;
-                       }
-                       segment_size +=
-                           linked_list->data.vendor_specific.length;
-                       break;
-
-               case ACPI_RSTYPE_END_TAG:
-                       /*
-                        * End Tag
-                        * For this resource the size is static
-                        */
-                       segment_size = 2;
-                       done = TRUE;
-                       break;
-
-               case ACPI_RSTYPE_MEM24:
-                       /*
-                        * 24-Bit Memory Resource
-                        * For this resource the size is static
-                        */
-                       segment_size = 12;
-                       break;
+static u8 acpi_rs_count_set_bits(u16 bit_field)
+{
+       u8 bits_set;
 
-               case ACPI_RSTYPE_MEM32:
-                       /*
-                        * 32-Bit Memory Range Resource
-                        * For this resource the size is static
-                        */
-                       segment_size = 20;
-                       break;
+       ACPI_FUNCTION_ENTRY();
 
-               case ACPI_RSTYPE_FIXED_MEM32:
-                       /*
-                        * 32-Bit Fixed Memory Resource
-                        * For this resource the size is static
-                        */
-                       segment_size = 12;
-                       break;
+       for (bits_set = 0; bit_field; bits_set++) {
+               /* Zero the least significant bit that is set */
 
-               case ACPI_RSTYPE_ADDRESS16:
-                       /*
-                        * 16-Bit Address Resource
-                        * The base size of this byte stream is 16. If a Resource Source
-                        * string is not NULL, add 1 for the Index + the length of the null
-                        * terminated string Resource Source + 1 for the null.
-                        */
-                       segment_size = 16;
-
-                       if (linked_list->data.address16.resource_source.
-                           string_ptr) {
-                               segment_size +=
-                                   linked_list->data.address16.resource_source.
-                                   string_length;
-                               segment_size++;
-                       }
-                       break;
+               bit_field &= (bit_field - 1);
+       }
 
-               case ACPI_RSTYPE_ADDRESS32:
-                       /*
-                        * 32-Bit Address Resource
-                        * The base size of this byte stream is 26. If a Resource
-                        * Source string is not NULL, add 1 for the Index + the
-                        * length of the null terminated string Resource Source +
-                        * 1 for the null.
-                        */
-                       segment_size = 26;
-
-                       if (linked_list->data.address32.resource_source.
-                           string_ptr) {
-                               segment_size +=
-                                   linked_list->data.address32.resource_source.
-                                   string_length;
-                               segment_size++;
-                       }
-                       break;
+       return (bits_set);
+}
 
-               case ACPI_RSTYPE_ADDRESS64:
-                       /*
-                        * 64-Bit Address Resource
-                        * The base size of this byte stream is 46. If a resource_source
-                        * string is not NULL, add 1 for the Index + the length of the null
-                        * terminated string Resource Source + 1 for the null.
-                        */
-                       segment_size = 46;
-
-                       if (linked_list->data.address64.resource_source.
-                           string_ptr) {
-                               segment_size +=
-                                   linked_list->data.address64.resource_source.
-                                   string_length;
-                               segment_size++;
-                       }
-                       break;
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_struct_option_length
+ *
+ * PARAMETERS:  resource_source     - Pointer to optional descriptor field
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Common code to handle optional resource_source_index and
+ *              resource_source fields in some Large descriptors. Used during
+ *              list-to-stream conversion
+ *
+ ******************************************************************************/
 
-               case ACPI_RSTYPE_EXT_IRQ:
-                       /*
-                        * Extended IRQ Resource
-                        * The base size of this byte stream is 9. This is for an Interrupt
-                        * table length of 1.  For each additional interrupt, add 4.
-                        * If a Resource Source string is not NULL, add 1 for the
-                        * Index + the length of the null terminated string
-                        * Resource Source + 1 for the null.
-                        */
-                       segment_size = 9 + (((acpi_size)
-                                            linked_list->data.extended_irq.
-                                            number_of_interrupts - 1) * 4);
-
-                       if (linked_list->data.extended_irq.resource_source.
-                           string_ptr) {
-                               segment_size +=
-                                   linked_list->data.extended_irq.
-                                   resource_source.string_length;
-                               segment_size++;
-                       }
-                       break;
+static acpi_rs_length
+acpi_rs_struct_option_length(struct acpi_resource_source *resource_source)
+{
+       ACPI_FUNCTION_ENTRY();
 
-               default:
+       /*
+        * If the resource_source string is valid, return the size of the string
+        * (string_length includes the NULL terminator) plus the size of the
+        * resource_source_index (1).
+        */
+       if (resource_source->string_ptr) {
+               return ((acpi_rs_length) (resource_source->string_length + 1));
+       }
 
-                       /* If we get here, everything is out of sync, exit with error */
+       return (0);
+}
 
-                       return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_stream_option_length
+ *
+ * PARAMETERS:  resource_length     - Length from the resource header
+ *              minimum_total_length - Minimum length of this resource, before
+ *                                    any optional fields. Includes header size
+ *
+ * RETURN:      Length of optional string (0 if no string present)
+ *
+ * DESCRIPTION: Common code to handle optional resource_source_index and
+ *              resource_source fields in some Large descriptors. Used during
+ *              stream-to-list conversion
+ *
+ ******************************************************************************/
 
-               }               /* switch (linked_list->Id) */
+static u32
+acpi_rs_stream_option_length(u32 resource_length,
+                            u32 minimum_aml_resource_length)
+{
+       u32 string_length = 0;
 
-               /* Update the total */
+       ACPI_FUNCTION_ENTRY();
 
-               byte_stream_size_needed += segment_size;
+       /*
+        * The resource_source_index and resource_source are optional elements of some
+        * Large-type resource descriptors.
+        */
 
-               /* Point to the next object */
+       /*
+        * If the length of the actual resource descriptor is greater than the ACPI
+        * spec-defined minimum length, it means that a resource_source_index exists
+        * and is followed by a (required) null terminated string. The string length
+        * (including the null terminator) is the resource length minus the minimum
+        * length, minus one byte for the resource_source_index itself.
+        */
+       if (resource_length > minimum_aml_resource_length) {
+               /* Compute the length of the optional string */
 
-               linked_list = ACPI_PTR_ADD(struct acpi_resource,
-                                          linked_list, linked_list->length);
+               string_length =
+                   resource_length - minimum_aml_resource_length - 1;
        }
 
-       /* This is the data the caller needs */
+       /* Round up length to 32 bits for internal structure alignment */
 
-       *size_needed = byte_stream_size_needed;
-       return_ACPI_STATUS(AE_OK);
+       return (ACPI_ROUND_UP_to_32_bITS(string_length));
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_get_list_length
+ * FUNCTION:    acpi_rs_get_aml_length
  *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource byte stream
- *              byte_stream_buffer_length - Size of byte_stream_buffer
- *              size_needed             - u32 pointer of the size buffer
- *                                        needed to properly return the
- *                                        parsed data
+ * PARAMETERS:  Resource            - Pointer to the resource linked list
+ *              size_needed         - Where the required size is returned
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Takes the resource byte stream and parses it once, calculating
- *              the size buffer needed to hold the linked list that conveys
- *              the resource data.
+ * DESCRIPTION: Takes a linked list of internal resource descriptors and
+ *              calculates the size buffer needed to hold the corresponding
+ *              external resource byte stream.
  *
  ******************************************************************************/
 
 acpi_status
-acpi_rs_get_list_length(u8 * byte_stream_buffer,
-                       u32 byte_stream_buffer_length, acpi_size * size_needed)
+acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed)
 {
-       u32 buffer_size = 0;
-       u32 bytes_parsed = 0;
-       u8 number_of_interrupts = 0;
-       u8 number_of_channels = 0;
-       u8 resource_type;
-       u32 structure_size;
-       u32 bytes_consumed;
-       u8 *buffer;
-       u8 temp8;
-       u16 temp16;
-       u8 index;
-       u8 additional_bytes;
-
-       ACPI_FUNCTION_TRACE("rs_get_list_length");
+       acpi_size aml_size_needed = 0;
+       acpi_rs_length total_size;
 
-       while (bytes_parsed < byte_stream_buffer_length) {
-               /* The next byte in the stream is the resource type */
+       ACPI_FUNCTION_TRACE("rs_get_aml_length");
 
-               resource_type = acpi_rs_get_resource_type(*byte_stream_buffer);
+       /* Traverse entire list of internal resource descriptors */
 
-               switch (resource_type) {
-               case ACPI_RDESC_TYPE_MEMORY_24:
-                       /*
-                        * 24-Bit Memory Resource
-                        */
-                       bytes_consumed = 12;
-
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_mem24);
-                       break;
+       while (resource) {
+               /* Validate the descriptor type */
 
-               case ACPI_RDESC_TYPE_LARGE_VENDOR:
-                       /*
-                        * Vendor Defined Resource
-                        */
-                       buffer = byte_stream_buffer;
-                       ++buffer;
-
-                       ACPI_MOVE_16_TO_16(&temp16, buffer);
-                       bytes_consumed = temp16 + 3;
-
-                       /* Ensure a 32-bit boundary for the structure */
+               if (resource->type > ACPI_RESOURCE_TYPE_MAX) {
+                       return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
+               }
 
-                       temp16 = (u16) ACPI_ROUND_UP_to_32_bITS(temp16);
+               /* Get the base size of the (external stream) resource descriptor */
 
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor) +
-                           (temp16 * sizeof(u8));
-                       break;
+               total_size = acpi_gbl_aml_resource_sizes[resource->type];
 
-               case ACPI_RDESC_TYPE_MEMORY_32:
+               /*
+                * Augment the base size for descriptors with optional and/or
+                * variable-length fields
+                */
+               switch (resource->type) {
+               case ACPI_RESOURCE_TYPE_VENDOR:
                        /*
-                        * 32-Bit Memory Range Resource
+                        * Vendor Defined Resource:
+                        * For a Vendor Specific resource, if the Length is between 1 and 7
+                        * it will be created as a Small Resource data type, otherwise it
+                        * is a Large Resource data type.
                         */
-                       bytes_consumed = 20;
+                       if (resource->data.vendor.byte_length > 7) {
+                               /* Base size of a Large resource descriptor */
 
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_mem32);
-                       break;
+                               total_size =
+                                   sizeof(struct aml_resource_large_header);
+                       }
 
-               case ACPI_RDESC_TYPE_FIXED_MEMORY_32:
-                       /*
-                        * 32-Bit Fixed Memory Resource
-                        */
-                       bytes_consumed = 12;
+                       /* Add the size of the vendor-specific data */
 
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct
-                                                acpi_resource_fixed_mem32);
+                       total_size = (acpi_rs_length)
+                           (total_size + resource->data.vendor.byte_length);
                        break;
 
-               case ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE:
+               case ACPI_RESOURCE_TYPE_END_TAG:
                        /*
-                        * 64-Bit Address Resource
+                        * End Tag:
+                        * We are done -- return the accumulated total size.
                         */
-                       buffer = byte_stream_buffer;
+                       *size_needed = aml_size_needed + total_size;
 
-                       ++buffer;
-                       ACPI_MOVE_16_TO_16(&temp16, buffer);
+                       /* Normal exit */
 
-                       bytes_consumed = temp16 + 3;
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct
-                                                acpi_resource_address64);
-                       break;
+                       return_ACPI_STATUS(AE_OK);
 
-               case ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE:
+               case ACPI_RESOURCE_TYPE_ADDRESS16:
                        /*
-                        * 64-Bit Address Resource
+                        * 16-Bit Address Resource:
+                        * Add the size of the optional resource_source info
                         */
-                       buffer = byte_stream_buffer;
-
-                       ++buffer;
-                       ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-                       bytes_consumed = temp16 + 3;
+                       total_size = (acpi_rs_length)
+                           (total_size +
+                            acpi_rs_struct_option_length(&resource->data.
+                                                         address16.
+                                                         resource_source));
+                       break;
 
+               case ACPI_RESOURCE_TYPE_ADDRESS32:
                        /*
-                        * Resource Source Index and Resource Source are optional elements.
-                        * Check the length of the Bytestream.  If it is greater than 43,
-                        * that means that an Index exists and is followed by a null
-                        * terminated string.  Therefore, set the temp variable to the
-                        * length minus the minimum byte stream length plus the byte for
-                        * the Index to determine the size of the NULL terminated string.
+                        * 32-Bit Address Resource:
+                        * Add the size of the optional resource_source info
                         */
-                       if (43 < temp16) {
-                               temp8 = (u8) (temp16 - 44);
-                       } else {
-                               temp8 = 0;
-                       }
-
-                       /* Ensure a 64-bit boundary for the structure */
-
-                       temp8 = (u8) ACPI_ROUND_UP_to_64_bITS(temp8);
-
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64)
-                           + (temp8 * sizeof(u8));
+                       total_size = (acpi_rs_length)
+                           (total_size +
+                            acpi_rs_struct_option_length(&resource->data.
+                                                         address32.
+                                                         resource_source));
                        break;
 
-               case ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE:
+               case ACPI_RESOURCE_TYPE_ADDRESS64:
                        /*
-                        * 32-Bit Address Resource
+                        * 64-Bit Address Resource:
+                        * Add the size of the optional resource_source info
                         */
-                       buffer = byte_stream_buffer;
-
-                       ++buffer;
-                       ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-                       bytes_consumed = temp16 + 3;
+                       total_size = (acpi_rs_length)
+                           (total_size +
+                            acpi_rs_struct_option_length(&resource->data.
+                                                         address64.
+                                                         resource_source));
+                       break;
 
+               case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
                        /*
-                        * Resource Source Index and Resource Source are optional elements.
-                        * Check the length of the Bytestream.  If it is greater than 23,
-                        * that means that an Index exists and is followed by a null
-                        * terminated string.  Therefore, set the temp variable to the
-                        * length minus the minimum byte stream length plus the byte for
-                        * the Index to determine the size of the NULL terminated string.
+                        * Extended IRQ Resource:
+                        * Add the size of each additional optional interrupt beyond the
+                        * required 1 (4 bytes for each u32 interrupt number)
                         */
-                       if (23 < temp16) {
-                               temp8 = (u8) (temp16 - 24);
-                       } else {
-                               temp8 = 0;
-                       }
-
-                       /* Ensure a 32-bit boundary for the structure */
-
-                       temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8);
+                       total_size = (acpi_rs_length)
+                           (total_size +
+                            ((resource->data.extended_irq.interrupt_count -
+                              1) * 4) +
+                            /* Add the size of the optional resource_source info */
+                            acpi_rs_struct_option_length(&resource->data.
+                                                         extended_irq.
+                                                         resource_source));
+                       break;
 
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32)
-                           + (temp8 * sizeof(u8));
+               default:
                        break;
+               }
 
-               case ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE:
-                       /*
-                        * 16-Bit Address Resource
-                        */
-                       buffer = byte_stream_buffer;
+               /* Update the total */
 
-                       ++buffer;
-                       ACPI_MOVE_16_TO_16(&temp16, buffer);
+               aml_size_needed += total_size;
 
-                       bytes_consumed = temp16 + 3;
+               /* Point to the next object */
 
-                       /*
-                        * Resource Source Index and Resource Source are optional elements.
-                        * Check the length of the Bytestream.  If it is greater than 13,
-                        * that means that an Index exists and is followed by a null
-                        * terminated string.  Therefore, set the temp variable to the
-                        * length minus the minimum byte stream length plus the byte for
-                        * the Index to determine the size of the NULL terminated string.
-                        */
-                       if (13 < temp16) {
-                               temp8 = (u8) (temp16 - 14);
-                       } else {
-                               temp8 = 0;
-                       }
+               resource =
+                   ACPI_ADD_PTR(struct acpi_resource, resource,
+                                resource->length);
+       }
 
-                       /* Ensure a 32-bit boundary for the structure */
+       /* Did not find an end_tag resource descriptor */
 
-                       temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8);
+       return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
+}
 
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_address16)
-                           + (temp8 * sizeof(u8));
-                       break;
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_get_list_length
+ *
+ * PARAMETERS:  aml_buffer          - Pointer to the resource byte stream
+ *              aml_buffer_length   - Size of aml_buffer
+ *              size_needed         - Where the size needed is returned
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Takes an external resource byte stream and calculates the size
+ *              buffer needed to hold the corresponding internal resource
+ *              descriptor linked list.
+ *
+ ******************************************************************************/
 
-               case ACPI_RDESC_TYPE_EXTENDED_XRUPT:
-                       /*
-                        * Extended IRQ
-                        */
-                       buffer = byte_stream_buffer;
+acpi_status
+acpi_rs_get_list_length(u8 * aml_buffer,
+                       u32 aml_buffer_length, acpi_size * size_needed)
+{
+       acpi_status status;
+       u8 *end_aml;
+       u8 *buffer;
+       u32 buffer_size = 0;
+       u16 temp16;
+       u16 resource_length;
+       u32 extra_struct_bytes;
+       u8 resource_index;
+       u8 minimum_aml_resource_length;
 
-                       ++buffer;
-                       ACPI_MOVE_16_TO_16(&temp16, buffer);
+       ACPI_FUNCTION_TRACE("rs_get_list_length");
 
-                       bytes_consumed = temp16 + 3;
+       end_aml = aml_buffer + aml_buffer_length;
 
-                       /*
-                        * Point past the length field and the Interrupt vector flags to
-                        * save off the Interrupt table length to the Temp8 variable.
-                        */
-                       buffer += 3;
-                       temp8 = *buffer;
+       /* Walk the list of AML resource descriptors */
 
-                       /*
-                        * To compensate for multiple interrupt numbers, add 4 bytes for
-                        * each additional interrupts greater than 1
-                        */
-                       additional_bytes = (u8) ((temp8 - 1) * 4);
+       while (aml_buffer < end_aml) {
+               /* Validate the Resource Type and Resource Length */
 
-                       /*
-                        * Resource Source Index and Resource Source are optional elements.
-                        * Check the length of the Bytestream.  If it is greater than 9,
-                        * that means that an Index exists and is followed by a null
-                        * terminated string.  Therefore, set the temp variable to the
-                        * length minus the minimum byte stream length plus the byte for
-                        * the Index to determine the size of the NULL terminated string.
-                        */
-                       if (9 + additional_bytes < temp16) {
-                               temp8 = (u8) (temp16 - (9 + additional_bytes));
-                       } else {
-                               temp8 = 0;
-                       }
+               status = acpi_ut_validate_resource(aml_buffer, &resource_index);
+               if (ACPI_FAILURE(status)) {
+                       return_ACPI_STATUS(status);
+               }
 
-                       /* Ensure a 32-bit boundary for the structure */
+               /* Get the resource length and base (minimum) AML size */
 
-                       temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8);
+               resource_length = acpi_ut_get_resource_length(aml_buffer);
+               minimum_aml_resource_length =
+                   acpi_gbl_resource_aml_sizes[resource_index];
 
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_ext_irq) +
-                           (additional_bytes * sizeof(u8)) +
-                           (temp8 * sizeof(u8));
-                       break;
+               /*
+                * Augment the size for descriptors with optional
+                * and/or variable length fields
+                */
+               extra_struct_bytes = 0;
+               buffer =
+                   aml_buffer + acpi_ut_get_resource_header_length(aml_buffer);
 
-               case ACPI_RDESC_TYPE_IRQ_FORMAT:
+               switch (acpi_ut_get_resource_type(aml_buffer)) {
+               case ACPI_RESOURCE_NAME_IRQ:
                        /*
-                        * IRQ Resource.
-                        * Determine if it there are two or three trailing bytes
+                        * IRQ Resource:
+                        * Get the number of bits set in the 16-bit IRQ mask
                         */
-                       buffer = byte_stream_buffer;
-                       temp8 = *buffer;
-
-                       if (temp8 & 0x01) {
-                               bytes_consumed = 4;
-                       } else {
-                               bytes_consumed = 3;
-                       }
-
-                       /* Point past the descriptor */
-
-                       ++buffer;
-
-                       /* Look at the number of bits set */
-
                        ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-                       for (index = 0; index < 16; index++) {
-                               if (temp16 & 0x1) {
-                                       ++number_of_interrupts;
-                               }
-
-                               temp16 >>= 1;
-                       }
-
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_io) +
-                           (number_of_interrupts * sizeof(u32));
+                       extra_struct_bytes = acpi_rs_count_set_bits(temp16);
                        break;
 
-               case ACPI_RDESC_TYPE_DMA_FORMAT:
+               case ACPI_RESOURCE_NAME_DMA:
                        /*
-                        * DMA Resource
+                        * DMA Resource:
+                        * Get the number of bits set in the 8-bit DMA mask
                         */
-                       buffer = byte_stream_buffer;
-                       bytes_consumed = 3;
-
-                       /* Point past the descriptor */
-
-                       ++buffer;
-
-                       /* Look at the number of bits set */
-
-                       temp8 = *buffer;
-
-                       for (index = 0; index < 8; index++) {
-                               if (temp8 & 0x1) {
-                                       ++number_of_channels;
-                               }
-
-                               temp8 >>= 1;
-                       }
-
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_dma) +
-                           (number_of_channels * sizeof(u32));
+                       extra_struct_bytes = acpi_rs_count_set_bits(*buffer);
                        break;
 
-               case ACPI_RDESC_TYPE_START_DEPENDENT:
+               case ACPI_RESOURCE_NAME_VENDOR_SMALL:
                        /*
-                        * Start Dependent Functions Resource
-                        * Determine if it there are two or three trailing bytes
+                        * Vendor Resource:
+                        * Ensure a 32-bit boundary for the structure
                         */
-                       buffer = byte_stream_buffer;
-                       temp8 = *buffer;
-
-                       if (temp8 & 0x01) {
-                               bytes_consumed = 2;
-                       } else {
-                               bytes_consumed = 1;
-                       }
-
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct
-                                                acpi_resource_start_dpf);
+                       extra_struct_bytes =
+                           ACPI_ROUND_UP_to_32_bITS(resource_length) -
+                           resource_length;
                        break;
 
-               case ACPI_RDESC_TYPE_END_DEPENDENT:
+               case ACPI_RESOURCE_NAME_END_TAG:
                        /*
-                        * End Dependent Functions Resource
+                        * End Tag: This is the normal exit, add size of end_tag
                         */
-                       bytes_consumed = 1;
-                       structure_size = ACPI_RESOURCE_LENGTH;
-                       break;
+                       *size_needed = buffer_size + ACPI_RS_SIZE_MIN;
+                       return_ACPI_STATUS(AE_OK);
 
-               case ACPI_RDESC_TYPE_IO_PORT:
+               case ACPI_RESOURCE_NAME_VENDOR_LARGE:
                        /*
-                        * IO Port Resource
+                        * Vendor Resource:
+                        * Add vendor data and ensure a 32-bit boundary for the structure
                         */
-                       bytes_consumed = 8;
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_io);
+                       extra_struct_bytes =
+                           ACPI_ROUND_UP_to_32_bITS(resource_length) -
+                           resource_length;
                        break;
 
-               case ACPI_RDESC_TYPE_FIXED_IO_PORT:
+               case ACPI_RESOURCE_NAME_ADDRESS32:
+               case ACPI_RESOURCE_NAME_ADDRESS16:
                        /*
-                        * Fixed IO Port Resource
+                        * 32-Bit or 16-bit Address Resource:
+                        * Add the size of any optional data (resource_source)
                         */
-                       bytes_consumed = 4;
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_io);
+                       extra_struct_bytes =
+                           acpi_rs_stream_option_length(resource_length,
+                                                        minimum_aml_resource_length);
                        break;
 
-               case ACPI_RDESC_TYPE_SMALL_VENDOR:
+               case ACPI_RESOURCE_NAME_EXTENDED_IRQ:
                        /*
-                        * Vendor Specific Resource
+                        * Extended IRQ:
+                        * Point past the interrupt_vector_flags to get the
+                        * interrupt_table_length.
                         */
-                       buffer = byte_stream_buffer;
+                       buffer++;
 
-                       temp8 = *buffer;
-                       temp8 = (u8) (temp8 & 0x7);
-                       bytes_consumed = temp8 + 1;
-
-                       /* Ensure a 32-bit boundary for the structure */
-
-                       temp8 = (u8) ACPI_ROUND_UP_to_32_bITS(temp8);
-                       structure_size =
-                           ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor) +
-                           (temp8 * sizeof(u8));
+                       extra_struct_bytes =
+                           /*
+                            * Add 4 bytes for each additional interrupt. Note: at
+                            * least one interrupt is required and is included in
+                            * the minimum descriptor size
+                            */
+                           ((*buffer - 1) * sizeof(u32)) +
+                           /* Add the size of any optional data (resource_source) */
+                           acpi_rs_stream_option_length(resource_length -
+                                                        extra_struct_bytes,
+                                                        minimum_aml_resource_length);
                        break;
 
-               case ACPI_RDESC_TYPE_END_TAG:
+               case ACPI_RESOURCE_NAME_ADDRESS64:
                        /*
-                        * End Tag
+                        * 64-Bit Address Resource:
+                        * Add the size of any optional data (resource_source)
+                        * Ensure a 64-bit boundary for the structure
                         */
-                       bytes_consumed = 2;
-                       structure_size = ACPI_RESOURCE_LENGTH;
-                       byte_stream_buffer_length = bytes_parsed;
+                       extra_struct_bytes =
+                           ACPI_ROUND_UP_to_64_bITS
+                           (acpi_rs_stream_option_length
+                            (resource_length, minimum_aml_resource_length));
                        break;
 
                default:
-                       /*
-                        * If we get here, everything is out of sync,
-                        * exit with an error
-                        */
-                       return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
+                       break;
                }
 
-               /* Update the return value and counter */
-
-               buffer_size += (u32) ACPI_ALIGN_RESOURCE_SIZE(structure_size);
-               bytes_parsed += bytes_consumed;
+               /* Update the required buffer size for the internal descriptor structs */
 
-               /* Set the byte stream to point to the next resource */
+               temp16 = (u16) (acpi_gbl_resource_struct_sizes[resource_index] +
+                               extra_struct_bytes);
+               buffer_size += (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(temp16);
 
-               byte_stream_buffer += bytes_consumed;
+               /*
+                * Point to the next resource within the stream
+                * using the size of the header plus the length contained in the header
+                */
+               aml_buffer += acpi_ut_get_descriptor_length(aml_buffer);
        }
 
-       /* This is the data the caller needs */
+       /* Did not find an end_tag resource descriptor */
 
-       *size_needed = buffer_size;
-       return_ACPI_STATUS(AE_OK);
+       return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
 }
 
 /*******************************************************************************
@@ -760,13 +541,13 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
 
                for (table_index = 0; table_index < 4 && !name_found;
                     table_index++) {
-                       if ((ACPI_TYPE_STRING ==
-                            ACPI_GET_OBJECT_TYPE(*sub_object_list))
-                           ||
-                           ((ACPI_TYPE_LOCAL_REFERENCE ==
-                             ACPI_GET_OBJECT_TYPE(*sub_object_list))
-                            && ((*sub_object_list)->reference.opcode ==
-                                AML_INT_NAMEPATH_OP))) {
+                       if (*sub_object_list && /* Null object allowed */
+                           ((ACPI_TYPE_STRING ==
+                             ACPI_GET_OBJECT_TYPE(*sub_object_list)) ||
+                            ((ACPI_TYPE_LOCAL_REFERENCE ==
+                              ACPI_GET_OBJECT_TYPE(*sub_object_list)) &&
+                             ((*sub_object_list)->reference.opcode ==
+                              AML_INT_NAMEPATH_OP)))) {
                                name_found = TRUE;
                        } else {
                                /* Look at the next element */
index 0911526b7ad883d1dda18fc1b545c0c3f847c166..8c128dea325294e2591e1a96a934a9208022b60e 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -53,10 +53,10 @@ ACPI_MODULE_NAME("rscreate")
  *
  * FUNCTION:    acpi_rs_create_resource_list
  *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource byte stream
- *              output_buffer           - Pointer to the user's buffer
+ * PARAMETERS:  aml_buffer          - Pointer to the resource byte stream
+ *              output_buffer       - Pointer to the user's buffer
  *
- * RETURN:      Status  - AE_OK if okay, else a valid acpi_status code
+ * RETURN:      Status: AE_OK if okay, else a valid acpi_status code
  *              If output_buffer is not large enough, output_buffer_length
  *              indicates how large output_buffer should be, else it
  *              indicates how may u8 elements of output_buffer are valid.
@@ -67,33 +67,30 @@ ACPI_MODULE_NAME("rscreate")
  *
  ******************************************************************************/
 acpi_status
-acpi_rs_create_resource_list(union acpi_operand_object *byte_stream_buffer,
+acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,
                             struct acpi_buffer *output_buffer)
 {
 
        acpi_status status;
-       u8 *byte_stream_start;
+       u8 *aml_start;
        acpi_size list_size_needed = 0;
-       u32 byte_stream_buffer_length;
+       u32 aml_buffer_length;
 
        ACPI_FUNCTION_TRACE("rs_create_resource_list");
 
-       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "byte_stream_buffer = %p\n",
-                         byte_stream_buffer));
+       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "aml_buffer = %p\n", aml_buffer));
 
        /* Params already validated, so we don't re-validate here */
 
-       byte_stream_buffer_length = byte_stream_buffer->buffer.length;
-       byte_stream_start = byte_stream_buffer->buffer.pointer;
+       aml_buffer_length = aml_buffer->buffer.length;
+       aml_start = aml_buffer->buffer.pointer;
 
        /*
-        * Pass the byte_stream_buffer into a module that can calculate
+        * Pass the aml_buffer into a module that can calculate
         * the buffer size needed for the linked list
         */
-       status =
-           acpi_rs_get_list_length(byte_stream_start,
-                                   byte_stream_buffer_length,
-                                   &list_size_needed);
+       status = acpi_rs_get_list_length(aml_start, aml_buffer_length,
+                                        &list_size_needed);
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Status=%X list_size_needed=%X\n",
                          status, (u32) list_size_needed));
@@ -110,10 +107,8 @@ acpi_rs_create_resource_list(union acpi_operand_object *byte_stream_buffer,
 
        /* Do the conversion */
 
-       status =
-           acpi_rs_byte_stream_to_list(byte_stream_start,
-                                       byte_stream_buffer_length,
-                                       output_buffer->pointer);
+       status = acpi_rs_convert_aml_to_resources(aml_start, aml_buffer_length,
+                                                 output_buffer->pointer);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -212,21 +207,20 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
                /* Each element of the top-level package must also be a package */
 
                if (ACPI_GET_OBJECT_TYPE(*top_object_list) != ACPI_TYPE_PACKAGE) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "(PRT[%X]) Need sub-package, found %s\n",
-                                         index,
-                                         acpi_ut_get_object_type_name
-                                         (*top_object_list)));
+                       ACPI_ERROR((AE_INFO,
+                                   "(PRT[%X]) Need sub-package, found %s",
+                                   index,
+                                   acpi_ut_get_object_type_name
+                                   (*top_object_list)));
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
 
                /* Each sub-package must be of length 4 */
 
                if ((*top_object_list)->package.count != 4) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "(PRT[%X]) Need package of length 4, found length %d\n",
-                                         index,
-                                         (*top_object_list)->package.count));
+                       ACPI_ERROR((AE_INFO,
+                                   "(PRT[%X]) Need package of length 4, found length %d",
+                                   index, (*top_object_list)->package.count));
                        return_ACPI_STATUS(AE_AML_PACKAGE_LIMIT);
                }
 
@@ -243,11 +237,10 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
                if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
                        user_prt->address = obj_desc->integer.value;
                } else {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "(PRT[%X].Address) Need Integer, found %s\n",
-                                         index,
-                                         acpi_ut_get_object_type_name
-                                         (obj_desc)));
+                       ACPI_ERROR((AE_INFO,
+                                   "(PRT[%X].Address) Need Integer, found %s",
+                                   index,
+                                   acpi_ut_get_object_type_name(obj_desc)));
                        return_ACPI_STATUS(AE_BAD_DATA);
                }
 
@@ -257,76 +250,83 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
                if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
                        user_prt->pin = (u32) obj_desc->integer.value;
                } else {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "(PRT[%X].Pin) Need Integer, found %s\n",
-                                         index,
-                                         acpi_ut_get_object_type_name
-                                         (obj_desc)));
+                       ACPI_ERROR((AE_INFO,
+                                   "(PRT[%X].Pin) Need Integer, found %s",
+                                   index,
+                                   acpi_ut_get_object_type_name(obj_desc)));
                        return_ACPI_STATUS(AE_BAD_DATA);
                }
 
-               /* 3) Third subobject: Dereference the PRT.source_name */
-
+               /*
+                * 3) Third subobject: Dereference the PRT.source_name
+                * The name may be unresolved (slack mode), so allow a null object
+                */
                obj_desc = sub_object_list[2];
-               switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
-               case ACPI_TYPE_LOCAL_REFERENCE:
-
-                       if (obj_desc->reference.opcode != AML_INT_NAMEPATH_OP) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "(PRT[%X].Source) Need name, found reference op %X\n",
-                                                 index,
-                                                 obj_desc->reference.opcode));
+               if (obj_desc) {
+                       switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
+                       case ACPI_TYPE_LOCAL_REFERENCE:
+
+                               if (obj_desc->reference.opcode !=
+                                   AML_INT_NAMEPATH_OP) {
+                                       ACPI_ERROR((AE_INFO,
+                                                   "(PRT[%X].Source) Need name, found reference op %X",
+                                                   index,
+                                                   obj_desc->reference.
+                                                   opcode));
+                                       return_ACPI_STATUS(AE_BAD_DATA);
+                               }
+
+                               node = obj_desc->reference.node;
+
+                               /* Use *remaining* length of the buffer as max for pathname */
+
+                               path_buffer.length = output_buffer->length -
+                                   (u32) ((u8 *) user_prt->source -
+                                          (u8 *) output_buffer->pointer);
+                               path_buffer.pointer = user_prt->source;
+
+                               status =
+                                   acpi_ns_handle_to_pathname((acpi_handle)
+                                                              node,
+                                                              &path_buffer);
+
+                               /* +1 to include null terminator */
+
+                               user_prt->length +=
+                                   (u32) ACPI_STRLEN(user_prt->source) + 1;
+                               break;
+
+                       case ACPI_TYPE_STRING:
+
+                               ACPI_STRCPY(user_prt->source,
+                                           obj_desc->string.pointer);
+
+                               /*
+                                * Add to the Length field the length of the string
+                                * (add 1 for terminator)
+                                */
+                               user_prt->length += obj_desc->string.length + 1;
+                               break;
+
+                       case ACPI_TYPE_INTEGER:
+                               /*
+                                * If this is a number, then the Source Name is NULL, since the
+                                * entire buffer was zeroed out, we can leave this alone.
+                                *
+                                * Add to the Length field the length of the u32 NULL
+                                */
+                               user_prt->length += sizeof(u32);
+                               break;
+
+                       default:
+
+                               ACPI_ERROR((AE_INFO,
+                                           "(PRT[%X].Source) Need Ref/String/Integer, found %s",
+                                           index,
+                                           acpi_ut_get_object_type_name
+                                           (obj_desc)));
                                return_ACPI_STATUS(AE_BAD_DATA);
                        }
-
-                       node = obj_desc->reference.node;
-
-                       /* Use *remaining* length of the buffer as max for pathname */
-
-                       path_buffer.length = output_buffer->length -
-                           (u32) ((u8 *) user_prt->source -
-                                  (u8 *) output_buffer->pointer);
-                       path_buffer.pointer = user_prt->source;
-
-                       status =
-                           acpi_ns_handle_to_pathname((acpi_handle) node,
-                                                      &path_buffer);
-
-                       /* +1 to include null terminator */
-
-                       user_prt->length +=
-                           (u32) ACPI_STRLEN(user_prt->source) + 1;
-                       break;
-
-               case ACPI_TYPE_STRING:
-
-                       ACPI_STRCPY(user_prt->source, obj_desc->string.pointer);
-
-                       /*
-                        * Add to the Length field the length of the string
-                        * (add 1 for terminator)
-                        */
-                       user_prt->length += obj_desc->string.length + 1;
-                       break;
-
-               case ACPI_TYPE_INTEGER:
-                       /*
-                        * If this is a number, then the Source Name is NULL, since the
-                        * entire buffer was zeroed out, we can leave this alone.
-                        *
-                        * Add to the Length field the length of the u32 NULL
-                        */
-                       user_prt->length += sizeof(u32);
-                       break;
-
-               default:
-
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "(PRT[%X].Source) Need Ref/String/Integer, found %s\n",
-                                         index,
-                                         acpi_ut_get_object_type_name
-                                         (obj_desc)));
-                       return_ACPI_STATUS(AE_BAD_DATA);
                }
 
                /* Now align the current length */
@@ -340,11 +340,10 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
                if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
                        user_prt->source_index = (u32) obj_desc->integer.value;
                } else {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "(PRT[%X].source_index) Need Integer, found %s\n",
-                                         index,
-                                         acpi_ut_get_object_type_name
-                                         (obj_desc)));
+                       ACPI_ERROR((AE_INFO,
+                                   "(PRT[%X].source_index) Need Integer, found %s",
+                                   index,
+                                   acpi_ut_get_object_type_name(obj_desc)));
                        return_ACPI_STATUS(AE_BAD_DATA);
                }
 
@@ -360,7 +359,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_create_byte_stream
+ * FUNCTION:    acpi_rs_create_aml_resources
  *
  * PARAMETERS:  linked_list_buffer      - Pointer to the resource linked list
  *              output_buffer           - Pointer to the user's buffer
@@ -377,13 +376,13 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
  ******************************************************************************/
 
 acpi_status
-acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer,
-                          struct acpi_buffer *output_buffer)
+acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer,
+                            struct acpi_buffer *output_buffer)
 {
        acpi_status status;
-       acpi_size byte_stream_size_needed = 0;
+       acpi_size aml_size_needed = 0;
 
-       ACPI_FUNCTION_TRACE("rs_create_byte_stream");
+       ACPI_FUNCTION_TRACE("rs_create_aml_resources");
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "linked_list_buffer = %p\n",
                          linked_list_buffer));
@@ -394,11 +393,10 @@ acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer,
         * Pass the linked_list_buffer into a module that calculates
         * the buffer size needed for the byte stream.
         */
-       status = acpi_rs_get_byte_stream_length(linked_list_buffer,
-                                               &byte_stream_size_needed);
+       status = acpi_rs_get_aml_length(linked_list_buffer, &aml_size_needed);
 
-       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "byte_stream_size_needed=%X, %s\n",
-                         (u32) byte_stream_size_needed,
+       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "aml_size_needed=%X, %s\n",
+                         (u32) aml_size_needed,
                          acpi_format_exception(status)));
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
@@ -406,8 +404,7 @@ acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer,
 
        /* Validate/Allocate/Clear caller buffer */
 
-       status =
-           acpi_ut_initialize_buffer(output_buffer, byte_stream_size_needed);
+       status = acpi_ut_initialize_buffer(output_buffer, aml_size_needed);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -415,9 +412,9 @@ acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer,
        /* Do the conversion */
 
        status =
-           acpi_rs_list_to_byte_stream(linked_list_buffer,
-                                       byte_stream_size_needed,
-                                       output_buffer->pointer);
+           acpi_rs_convert_resources_to_aml(linked_list_buffer,
+                                            aml_size_needed,
+                                            output_buffer->pointer);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
index 75bd34d1783f6495660d6d595c2ca2f24d6ead51..e7de061cf883b36b080665cefb15883466248c37 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,1063 +49,720 @@ ACPI_MODULE_NAME("rsdump")
 
 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
 /* Local prototypes */
-static void acpi_rs_dump_irq(union acpi_resource_data *data);
+static void acpi_rs_out_string(char *title, char *value);
 
-static void acpi_rs_dump_address16(union acpi_resource_data *data);
+static void acpi_rs_out_integer8(char *title, u8 value);
 
-static void acpi_rs_dump_address32(union acpi_resource_data *data);
+static void acpi_rs_out_integer16(char *title, u16 value);
 
-static void acpi_rs_dump_address64(union acpi_resource_data *data);
+static void acpi_rs_out_integer32(char *title, u32 value);
 
-static void acpi_rs_dump_dma(union acpi_resource_data *data);
+static void acpi_rs_out_integer64(char *title, u64 value);
 
-static void acpi_rs_dump_io(union acpi_resource_data *data);
+static void acpi_rs_out_title(char *title);
 
-static void acpi_rs_dump_extended_irq(union acpi_resource_data *data);
+static void acpi_rs_dump_byte_list(u16 length, u8 * data);
 
-static void acpi_rs_dump_fixed_io(union acpi_resource_data *data);
+static void acpi_rs_dump_dword_list(u8 length, u32 * data);
 
-static void acpi_rs_dump_fixed_memory32(union acpi_resource_data *data);
+static void acpi_rs_dump_short_byte_list(u8 length, u8 * data);
 
-static void acpi_rs_dump_memory24(union acpi_resource_data *data);
+static void
+acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source);
 
-static void acpi_rs_dump_memory32(union acpi_resource_data *data);
+static void acpi_rs_dump_address_common(union acpi_resource_data *resource);
 
-static void acpi_rs_dump_start_depend_fns(union acpi_resource_data *data);
+static void
+acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table);
 
-static void acpi_rs_dump_vendor_specific(union acpi_resource_data *data);
+#define ACPI_RSD_OFFSET(f)          (u8) ACPI_OFFSET (union acpi_resource_data,f)
+#define ACPI_PRT_OFFSET(f)          (u8) ACPI_OFFSET (struct acpi_pci_routing_table,f)
+#define ACPI_RSD_TABLE_SIZE(name)   (sizeof(name) / sizeof (struct acpi_rsdump_info))
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dump_irq
+ * Resource Descriptor info tables
  *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
+ * Note: The first table entry must be a Title or Literal and must contain
+ * the table length (number of table entries)
  *
  ******************************************************************************/
 
-static void acpi_rs_dump_irq(union acpi_resource_data *data)
-{
-       struct acpi_resource_irq *irq_data = (struct acpi_resource_irq *)data;
-       u8 index = 0;
-
-       ACPI_FUNCTION_ENTRY();
-
-       acpi_os_printf("IRQ Resource\n");
+struct acpi_rsdump_info acpi_rs_dump_irq[6] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_irq), "IRQ", NULL},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.triggering), "Triggering",
+        acpi_gbl_HEdecode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.polarity), "Polarity",
+        acpi_gbl_LLdecode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.sharable), "Sharing",
+        acpi_gbl_SHRdecode},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.interrupt_count),
+        "Interrupt Count", NULL},
+       {ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(irq.interrupts[0]),
+        "Interrupt List", NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_dma[6] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_dma), "DMA", NULL},
+       {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.type), "Speed",
+        acpi_gbl_TYPdecode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(dma.bus_master), "Mastering",
+        acpi_gbl_BMdecode},
+       {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.transfer), "Transfer Type",
+        acpi_gbl_SIZdecode},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(dma.channel_count), "Channel Count",
+        NULL},
+       {ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(dma.channels[0]), "Channel List",
+        NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_start_dpf[3] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_start_dpf),
+        "Start-Dependent-Functions", NULL},
+       {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.compatibility_priority),
+        "Compatibility Priority", acpi_gbl_config_decode},
+       {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.performance_robustness),
+        "Performance/Robustness", acpi_gbl_config_decode}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_end_dpf[1] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_dpf),
+        "End-Dependent-Functions", NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_io[6] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io), "I/O", NULL},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(io.io_decode), "Address Decoding",
+        acpi_gbl_io_decode},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.minimum), "Address Minimum", NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.maximum), "Address Maximum", NULL},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.alignment), "Alignment", NULL},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.address_length), "Address Length",
+        NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_fixed_io[3] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_io),
+        "Fixed I/O", NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_io.address), "Address", NULL},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_io.address_length),
+        "Address Length", NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_vendor[3] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_vendor),
+        "Vendor Specific", NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(vendor.byte_length), "Length", NULL},
+       {ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET(vendor.byte_data[0]), "Vendor Data",
+        NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_end_tag[1] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_tag), "end_tag",
+        NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_memory24[6] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory24),
+        "24-Bit Memory Range", NULL},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory24.write_protect),
+        "Write Protect", acpi_gbl_RWdecode},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.minimum), "Address Minimum",
+        NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.maximum), "Address Maximum",
+        NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.alignment), "Alignment",
+        NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.address_length),
+        "Address Length", NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_memory32[6] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory32),
+        "32-Bit Memory Range", NULL},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory32.write_protect),
+        "Write Protect", acpi_gbl_RWdecode},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.minimum), "Address Minimum",
+        NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.maximum), "Address Maximum",
+        NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.alignment), "Alignment",
+        NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.address_length),
+        "Address Length", NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[4] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_memory32),
+        "32-Bit Fixed Memory Range", NULL},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(fixed_memory32.write_protect),
+        "Write Protect", acpi_gbl_RWdecode},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address), "Address",
+        NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address_length),
+        "Address Length", NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_address16[8] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address16),
+        "16-Bit WORD Address Space", NULL},
+       {ACPI_RSD_ADDRESS, 0, NULL, NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.granularity), "Granularity",
+        NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.minimum), "Address Minimum",
+        NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.maximum), "Address Maximum",
+        NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.translation_offset),
+        "Translation Offset", NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.address_length),
+        "Address Length", NULL},
+       {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address16.resource_source), NULL, NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_address32[8] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address32),
+        "32-Bit DWORD Address Space", NULL},
+       {ACPI_RSD_ADDRESS, 0, NULL, NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.granularity), "Granularity",
+        NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.minimum), "Address Minimum",
+        NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.maximum), "Address Maximum",
+        NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.translation_offset),
+        "Translation Offset", NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.address_length),
+        "Address Length", NULL},
+       {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address32.resource_source), NULL, NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_address64[8] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address64),
+        "64-Bit QWORD Address Space", NULL},
+       {ACPI_RSD_ADDRESS, 0, NULL, NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.granularity), "Granularity",
+        NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.minimum), "Address Minimum",
+        NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.maximum), "Address Maximum",
+        NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.translation_offset),
+        "Translation Offset", NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.address_length),
+        "Address Length", NULL},
+       {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address64.resource_source), NULL, NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_ext_address64[8] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_address64),
+        "64-Bit Extended Address Space", NULL},
+       {ACPI_RSD_ADDRESS, 0, NULL, NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.granularity),
+        "Granularity", NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.minimum),
+        "Address Minimum", NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.maximum),
+        "Address Maximum", NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.translation_offset),
+        "Translation Offset", NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.address_length),
+        "Address Length", NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.type_specific),
+        "Type-Specific Attribute", NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_ext_irq[8] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_irq),
+        "Extended IRQ", NULL},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.producer_consumer),
+        "Type", acpi_gbl_consume_decode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.triggering),
+        "Triggering", acpi_gbl_HEdecode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.polarity), "Polarity",
+        acpi_gbl_LLdecode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.sharable), "Sharing",
+        acpi_gbl_SHRdecode},
+       {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(extended_irq.resource_source), NULL,
+        NULL},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(extended_irq.interrupt_count),
+        "Interrupt Count", NULL},
+       {ACPI_RSD_DWORDLIST, ACPI_RSD_OFFSET(extended_irq.interrupts[0]),
+        "Interrupt List", NULL}
+};
+
+struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_generic_reg),
+        "Generic Register", NULL},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.space_id), "Space ID",
+        NULL},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_width), "Bit Width",
+        NULL},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_offset), "Bit Offset",
+        NULL},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.access_size),
+        "Access Size", NULL},
+       {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL}
+};
 
-       acpi_os_printf("  %s Triggered\n",
-                      ACPI_LEVEL_SENSITIVE ==
-                      irq_data->edge_level ? "Level" : "Edge");
-
-       acpi_os_printf("  Active %s\n",
-                      ACPI_ACTIVE_LOW ==
-                      irq_data->active_high_low ? "Low" : "High");
-
-       acpi_os_printf("  %s\n",
-                      ACPI_SHARED ==
-                      irq_data->shared_exclusive ? "Shared" : "Exclusive");
-
-       acpi_os_printf("  %X Interrupts ( ", irq_data->number_of_interrupts);
-
-       for (index = 0; index < irq_data->number_of_interrupts; index++) {
-               acpi_os_printf("%X ", irq_data->interrupts[index]);
-       }
+/*
+ * Tables used for common address descriptor flag fields
+ */
+static struct acpi_rsdump_info acpi_rs_dump_general_flags[5] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_general_flags), NULL,
+        NULL},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.producer_consumer),
+        "Consumer/Producer", acpi_gbl_consume_decode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.decode), "Address Decode",
+        acpi_gbl_DECdecode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.min_address_fixed),
+        "Min Relocatability", acpi_gbl_min_decode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.max_address_fixed),
+        "Max Relocatability", acpi_gbl_max_decode}
+};
+
+static struct acpi_rsdump_info acpi_rs_dump_memory_flags[5] = {
+       {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory_flags),
+        "Resource Type", (void *)"Memory Range"},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.write_protect),
+        "Write Protect", acpi_gbl_RWdecode},
+       {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.caching),
+        "Caching", acpi_gbl_MEMdecode},
+       {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.range_type),
+        "Range Type", acpi_gbl_MTPdecode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.translation),
+        "Translation", acpi_gbl_TTPdecode}
+};
+
+static struct acpi_rsdump_info acpi_rs_dump_io_flags[4] = {
+       {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io_flags),
+        "Resource Type", (void *)"I/O Range"},
+       {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.io.range_type),
+        "Range Type", acpi_gbl_RNGdecode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation),
+        "Translation", acpi_gbl_TTPdecode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation_type),
+        "Translation Type", acpi_gbl_TRSdecode}
+};
 
-       acpi_os_printf(")\n");
-       return;
-}
+/*
+ * Table used to dump _PRT contents
+ */
+static struct acpi_rsdump_info acpi_rs_dump_prt[5] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_prt), NULL, NULL},
+       {ACPI_RSD_UINT64, ACPI_PRT_OFFSET(address), "Address", NULL},
+       {ACPI_RSD_UINT32, ACPI_PRT_OFFSET(pin), "Pin", NULL},
+       {ACPI_RSD_STRING, ACPI_PRT_OFFSET(source[0]), "Source", NULL},
+       {ACPI_RSD_UINT32, ACPI_PRT_OFFSET(source_index), "Source Index", NULL}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dump_dma
+ * FUNCTION:    acpi_rs_dump_descriptor
  *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
+ * PARAMETERS:  Resource
  *
  * RETURN:      None
  *
- * DESCRIPTION: Prints out the various members of the Data structure type.
+ * DESCRIPTION:
  *
  ******************************************************************************/
 
-static void acpi_rs_dump_dma(union acpi_resource_data *data)
+static void
+acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
 {
-       struct acpi_resource_dma *dma_data = (struct acpi_resource_dma *)data;
-       u8 index = 0;
-
-       ACPI_FUNCTION_ENTRY();
-
-       acpi_os_printf("DMA Resource\n");
-
-       switch (dma_data->type) {
-       case ACPI_COMPATIBILITY:
-               acpi_os_printf("  Compatibility mode\n");
-               break;
-
-       case ACPI_TYPE_A:
-               acpi_os_printf("  Type A\n");
-               break;
-
-       case ACPI_TYPE_B:
-               acpi_os_printf("  Type B\n");
-               break;
-
-       case ACPI_TYPE_F:
-               acpi_os_printf("  Type F\n");
-               break;
-
-       default:
-               acpi_os_printf("  Invalid DMA type\n");
-               break;
-       }
-
-       acpi_os_printf("  %sBus Master\n",
-                      ACPI_BUS_MASTER == dma_data->bus_master ? "" : "Not a ");
-
-       switch (dma_data->transfer) {
-       case ACPI_TRANSFER_8:
-               acpi_os_printf("  8-bit only transfer\n");
-               break;
+       u8 *target = NULL;
+       u8 *previous_target;
+       char *name;
+       u8 count;
+
+       /* First table entry must contain the table length (# of table entries) */
+
+       count = table->offset;
+
+       while (count) {
+               previous_target = target;
+               target = ACPI_ADD_PTR(u8, resource, table->offset);
+               name = table->name;
+
+               switch (table->opcode) {
+               case ACPI_RSD_TITLE:
+                       /*
+                        * Optional resource title
+                        */
+                       if (table->name) {
+                               acpi_os_printf("%s Resource\n", name);
+                       }
+                       break;
 
-       case ACPI_TRANSFER_8_16:
-               acpi_os_printf("  8 and 16-bit transfer\n");
-               break;
+                       /* Strings */
 
-       case ACPI_TRANSFER_16:
-               acpi_os_printf("  16 bit only transfer\n");
-               break;
+               case ACPI_RSD_LITERAL:
+                       acpi_rs_out_string(name,
+                                          ACPI_CAST_PTR(char, table->pointer));
+                       break;
 
-       default:
-               acpi_os_printf("  Invalid transfer preference\n");
-               break;
-       }
+               case ACPI_RSD_STRING:
+                       acpi_rs_out_string(name, ACPI_CAST_PTR(char, target));
+                       break;
 
-       acpi_os_printf("  Number of Channels: %X ( ",
-                      dma_data->number_of_channels);
+                       /* Data items, 8/16/32/64 bit */
 
-       for (index = 0; index < dma_data->number_of_channels; index++) {
-               acpi_os_printf("%X ", dma_data->channels[index]);
-       }
+               case ACPI_RSD_UINT8:
+                       acpi_rs_out_integer8(name, ACPI_GET8(target));
+                       break;
 
-       acpi_os_printf(")\n");
-       return;
-}
+               case ACPI_RSD_UINT16:
+                       acpi_rs_out_integer16(name, ACPI_GET16(target));
+                       break;
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_dump_start_depend_fns
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
+               case ACPI_RSD_UINT32:
+                       acpi_rs_out_integer32(name, ACPI_GET32(target));
+                       break;
 
-static void acpi_rs_dump_start_depend_fns(union acpi_resource_data *data)
-{
-       struct acpi_resource_start_dpf *sdf_data =
-           (struct acpi_resource_start_dpf *)data;
+               case ACPI_RSD_UINT64:
+                       acpi_rs_out_integer64(name, ACPI_GET64(target));
+                       break;
 
-       ACPI_FUNCTION_ENTRY();
+                       /* Flags: 1-bit and 2-bit flags supported */
 
-       acpi_os_printf("Start Dependent Functions Resource\n");
+               case ACPI_RSD_1BITFLAG:
+                       acpi_rs_out_string(name, ACPI_CAST_PTR(char,
+                                                              table->
+                                                              pointer[*target &
+                                                                      0x01]));
+                       break;
 
-       switch (sdf_data->compatibility_priority) {
-       case ACPI_GOOD_CONFIGURATION:
-               acpi_os_printf("  Good configuration\n");
-               break;
+               case ACPI_RSD_2BITFLAG:
+                       acpi_rs_out_string(name, ACPI_CAST_PTR(char,
+                                                              table->
+                                                              pointer[*target &
+                                                                      0x03]));
+                       break;
 
-       case ACPI_ACCEPTABLE_CONFIGURATION:
-               acpi_os_printf("  Acceptable configuration\n");
-               break;
+               case ACPI_RSD_SHORTLIST:
+                       /*
+                        * Short byte list (single line output) for DMA and IRQ resources
+                        * Note: The list length is obtained from the previous table entry
+                        */
+                       if (previous_target) {
+                               acpi_rs_out_title(name);
+                               acpi_rs_dump_short_byte_list(*previous_target,
+                                                            target);
+                       }
+                       break;
 
-       case ACPI_SUB_OPTIMAL_CONFIGURATION:
-               acpi_os_printf("  Sub-optimal configuration\n");
-               break;
+               case ACPI_RSD_LONGLIST:
+                       /*
+                        * Long byte list for Vendor resource data
+                        * Note: The list length is obtained from the previous table entry
+                        */
+                       if (previous_target) {
+                               acpi_rs_dump_byte_list(ACPI_GET16
+                                                      (previous_target),
+                                                      target);
+                       }
+                       break;
 
-       default:
-               acpi_os_printf("  Invalid compatibility priority\n");
-               break;
-       }
+               case ACPI_RSD_DWORDLIST:
+                       /*
+                        * Dword list for Extended Interrupt resources
+                        * Note: The list length is obtained from the previous table entry
+                        */
+                       if (previous_target) {
+                               acpi_rs_dump_dword_list(*previous_target,
+                                                       ACPI_CAST_PTR(u32,
+                                                                     target));
+                       }
+                       break;
 
-       switch (sdf_data->performance_robustness) {
-       case ACPI_GOOD_CONFIGURATION:
-               acpi_os_printf("  Good configuration\n");
-               break;
+               case ACPI_RSD_ADDRESS:
+                       /*
+                        * Common flags for all Address resources
+                        */
+                       acpi_rs_dump_address_common(ACPI_CAST_PTR
+                                                   (union acpi_resource_data,
+                                                    target));
+                       break;
 
-       case ACPI_ACCEPTABLE_CONFIGURATION:
-               acpi_os_printf("  Acceptable configuration\n");
-               break;
+               case ACPI_RSD_SOURCE:
+                       /*
+                        * Optional resource_source for Address resources
+                        */
+                       acpi_rs_dump_resource_source(ACPI_CAST_PTR
+                                                    (struct
+                                                     acpi_resource_source,
+                                                     target));
+                       break;
 
-       case ACPI_SUB_OPTIMAL_CONFIGURATION:
-               acpi_os_printf("  Sub-optimal configuration\n");
-               break;
+               default:
+                       acpi_os_printf("**** Invalid table opcode [%X] ****\n",
+                                      table->opcode);
+                       return;
+               }
 
-       default:
-               acpi_os_printf("  Invalid performance robustness preference\n");
-               break;
+               table++;
+               count--;
        }
-
-       return;
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_dump_io
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-static void acpi_rs_dump_io(union acpi_resource_data *data)
-{
-       struct acpi_resource_io *io_data = (struct acpi_resource_io *)data;
-
-       ACPI_FUNCTION_ENTRY();
-
-       acpi_os_printf("Io Resource\n");
-
-       acpi_os_printf("  %d bit decode\n",
-                      ACPI_DECODE_16 == io_data->io_decode ? 16 : 10);
-
-       acpi_os_printf("  Range minimum base: %08X\n",
-                      io_data->min_base_address);
-
-       acpi_os_printf("  Range maximum base: %08X\n",
-                      io_data->max_base_address);
-
-       acpi_os_printf("  Alignment: %08X\n", io_data->alignment);
-
-       acpi_os_printf("  Range Length: %08X\n", io_data->range_length);
-
-       return;
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_dump_fixed_io
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-static void acpi_rs_dump_fixed_io(union acpi_resource_data *data)
-{
-       struct acpi_resource_fixed_io *fixed_io_data =
-           (struct acpi_resource_fixed_io *)data;
-
-       ACPI_FUNCTION_ENTRY();
-
-       acpi_os_printf("Fixed Io Resource\n");
-       acpi_os_printf("  Range base address: %08X",
-                      fixed_io_data->base_address);
-
-       acpi_os_printf("  Range length: %08X", fixed_io_data->range_length);
-
-       return;
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dump_vendor_specific
+ * FUNCTION:    acpi_rs_dump_resource_source
  *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
+ * PARAMETERS:  resource_source     - Pointer to a Resource Source struct
  *
  * RETURN:      None
  *
- * DESCRIPTION: Prints out the various members of the Data structure type.
+ * DESCRIPTION: Common routine for dumping the optional resource_source and the
+ *              corresponding resource_source_index.
  *
  ******************************************************************************/
 
-static void acpi_rs_dump_vendor_specific(union acpi_resource_data *data)
+static void
+acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source)
 {
-       struct acpi_resource_vendor *vendor_data =
-           (struct acpi_resource_vendor *)data;
-       u16 index = 0;
-
        ACPI_FUNCTION_ENTRY();
 
-       acpi_os_printf("Vendor Specific Resource\n");
-
-       acpi_os_printf("  Length: %08X\n", vendor_data->length);
-
-       for (index = 0; index < vendor_data->length; index++) {
-               acpi_os_printf("  Byte %X: %08X\n",
-                              index, vendor_data->reserved[index]);
+       if (resource_source->index == 0xFF) {
+               return;
        }
 
-       return;
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_dump_memory24
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-static void acpi_rs_dump_memory24(union acpi_resource_data *data)
-{
-       struct acpi_resource_mem24 *memory24_data =
-           (struct acpi_resource_mem24 *)data;
-
-       ACPI_FUNCTION_ENTRY();
-
-       acpi_os_printf("24-Bit Memory Range Resource\n");
-
-       acpi_os_printf("  Read%s\n",
-                      ACPI_READ_WRITE_MEMORY ==
-                      memory24_data->read_write_attribute ?
-                      "/Write" : " only");
-
-       acpi_os_printf("  Range minimum base: %08X\n",
-                      memory24_data->min_base_address);
-
-       acpi_os_printf("  Range maximum base: %08X\n",
-                      memory24_data->max_base_address);
-
-       acpi_os_printf("  Alignment: %08X\n", memory24_data->alignment);
-
-       acpi_os_printf("  Range length: %08X\n", memory24_data->range_length);
-
-       return;
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_dump_memory32
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-static void acpi_rs_dump_memory32(union acpi_resource_data *data)
-{
-       struct acpi_resource_mem32 *memory32_data =
-           (struct acpi_resource_mem32 *)data;
-
-       ACPI_FUNCTION_ENTRY();
-
-       acpi_os_printf("32-Bit Memory Range Resource\n");
-
-       acpi_os_printf("  Read%s\n",
-                      ACPI_READ_WRITE_MEMORY ==
-                      memory32_data->read_write_attribute ?
-                      "/Write" : " only");
-
-       acpi_os_printf("  Range minimum base: %08X\n",
-                      memory32_data->min_base_address);
-
-       acpi_os_printf("  Range maximum base: %08X\n",
-                      memory32_data->max_base_address);
-
-       acpi_os_printf("  Alignment: %08X\n", memory32_data->alignment);
-
-       acpi_os_printf("  Range length: %08X\n", memory32_data->range_length);
+       acpi_rs_out_integer8("Resource Source Index", resource_source->index);
 
-       return;
+       acpi_rs_out_string("Resource Source",
+                          resource_source->string_ptr ?
+                          resource_source->string_ptr : "[Not Specified]");
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dump_fixed_memory32
+ * FUNCTION:    acpi_rs_dump_address_common
  *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
- *
- * RETURN:
- *
- * DESCRIPTION: Prints out the various members of the Data structure type.
- *
- ******************************************************************************/
-
-static void acpi_rs_dump_fixed_memory32(union acpi_resource_data *data)
-{
-       struct acpi_resource_fixed_mem32 *fixed_memory32_data =
-           (struct acpi_resource_fixed_mem32 *)data;
-
-       ACPI_FUNCTION_ENTRY();
-
-       acpi_os_printf("32-Bit Fixed Location Memory Range Resource\n");
-
-       acpi_os_printf("  Read%s\n",
-                      ACPI_READ_WRITE_MEMORY ==
-                      fixed_memory32_data->
-                      read_write_attribute ? "/Write" : " Only");
-
-       acpi_os_printf("  Range base address: %08X\n",
-                      fixed_memory32_data->range_base_address);
-
-       acpi_os_printf("  Range length: %08X\n",
-                      fixed_memory32_data->range_length);
-
-       return;
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_dump_address16
- *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
+ * PARAMETERS:  Resource        - Pointer to an internal resource descriptor
  *
  * RETURN:      None
  *
- * DESCRIPTION: Prints out the various members of the Data structure type.
+ * DESCRIPTION: Dump the fields that are common to all Address resource
+ *              descriptors
  *
  ******************************************************************************/
 
-static void acpi_rs_dump_address16(union acpi_resource_data *data)
+static void acpi_rs_dump_address_common(union acpi_resource_data *resource)
 {
-       struct acpi_resource_address16 *address16_data =
-           (struct acpi_resource_address16 *)data;
-
        ACPI_FUNCTION_ENTRY();
 
-       acpi_os_printf("16-Bit Address Space Resource\n");
-       acpi_os_printf("  Resource Type: ");
+       /* Decode the type-specific flags */
 
-       switch (address16_data->resource_type) {
+       switch (resource->address.resource_type) {
        case ACPI_MEMORY_RANGE:
 
-               acpi_os_printf("Memory Range\n");
-
-               switch (address16_data->attribute.memory.cache_attribute) {
-               case ACPI_NON_CACHEABLE_MEMORY:
-                       acpi_os_printf
-                           ("  Type Specific: Noncacheable memory\n");
-                       break;
-
-               case ACPI_CACHABLE_MEMORY:
-                       acpi_os_printf("  Type Specific: Cacheable memory\n");
-                       break;
-
-               case ACPI_WRITE_COMBINING_MEMORY:
-                       acpi_os_printf
-                           ("  Type Specific: Write-combining memory\n");
-                       break;
-
-               case ACPI_PREFETCHABLE_MEMORY:
-                       acpi_os_printf
-                           ("  Type Specific: Prefetchable memory\n");
-                       break;
-
-               default:
-                       acpi_os_printf
-                           ("  Type Specific: Invalid cache attribute\n");
-                       break;
-               }
-
-               acpi_os_printf("  Type Specific: Read%s\n",
-                              ACPI_READ_WRITE_MEMORY ==
-                              address16_data->attribute.memory.
-                              read_write_attribute ? "/Write" : " Only");
+               acpi_rs_dump_descriptor(resource, acpi_rs_dump_memory_flags);
                break;
 
        case ACPI_IO_RANGE:
 
-               acpi_os_printf("I/O Range\n");
-
-               switch (address16_data->attribute.io.range_attribute) {
-               case ACPI_NON_ISA_ONLY_RANGES:
-                       acpi_os_printf
-                           ("  Type Specific: Non-ISA Io Addresses\n");
-                       break;
-
-               case ACPI_ISA_ONLY_RANGES:
-                       acpi_os_printf("  Type Specific: ISA Io Addresses\n");
-                       break;
-
-               case ACPI_ENTIRE_RANGE:
-                       acpi_os_printf
-                           ("  Type Specific: ISA and non-ISA Io Addresses\n");
-                       break;
-
-               default:
-                       acpi_os_printf
-                           ("  Type Specific: Invalid range attribute\n");
-                       break;
-               }
-
-               acpi_os_printf("  Type Specific: %s Translation\n",
-                              ACPI_SPARSE_TRANSLATION ==
-                              address16_data->attribute.io.
-                              translation_attribute ? "Sparse" : "Dense");
+               acpi_rs_dump_descriptor(resource, acpi_rs_dump_io_flags);
                break;
 
        case ACPI_BUS_NUMBER_RANGE:
 
-               acpi_os_printf("Bus Number Range\n");
+               acpi_rs_out_string("Resource Type", "Bus Number Range");
                break;
 
        default:
 
-               acpi_os_printf("0x%2.2X\n", address16_data->resource_type);
+               acpi_rs_out_integer8("Resource Type",
+                                    (u8) resource->address.resource_type);
                break;
        }
 
-       acpi_os_printf("  Resource %s\n",
-                      ACPI_CONSUMER == address16_data->producer_consumer ?
-                      "Consumer" : "Producer");
-
-       acpi_os_printf("  %s decode\n",
-                      ACPI_SUB_DECODE == address16_data->decode ?
-                      "Subtractive" : "Positive");
+       /* Decode the general flags */
 
-       acpi_os_printf("  Min address is %s fixed\n",
-                      ACPI_ADDRESS_FIXED == address16_data->min_address_fixed ?
-                      "" : "not");
-
-       acpi_os_printf("  Max address is %s fixed\n",
-                      ACPI_ADDRESS_FIXED == address16_data->max_address_fixed ?
-                      "" : "not");
-
-       acpi_os_printf("  Granularity: %08X\n", address16_data->granularity);
-
-       acpi_os_printf("  Address range min: %08X\n",
-                      address16_data->min_address_range);
-
-       acpi_os_printf("  Address range max: %08X\n",
-                      address16_data->max_address_range);
-
-       acpi_os_printf("  Address translation offset: %08X\n",
-                      address16_data->address_translation_offset);
-
-       acpi_os_printf("  Address Length: %08X\n",
-                      address16_data->address_length);
-
-       if (0xFF != address16_data->resource_source.index) {
-               acpi_os_printf("  Resource Source Index: %X\n",
-                              address16_data->resource_source.index);
-
-               acpi_os_printf("  Resource Source: %s\n",
-                              address16_data->resource_source.string_ptr);
-       }
-
-       return;
+       acpi_rs_dump_descriptor(resource, acpi_rs_dump_general_flags);
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dump_address32
+ * FUNCTION:    acpi_rs_dump_resource_list
  *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
+ * PARAMETERS:  resource_list       - Pointer to a resource descriptor list
  *
  * RETURN:      None
  *
- * DESCRIPTION: Prints out the various members of the Data structure type.
+ * DESCRIPTION: Dispatches the structure to the correct dump routine.
  *
  ******************************************************************************/
 
-static void acpi_rs_dump_address32(union acpi_resource_data *data)
+void acpi_rs_dump_resource_list(struct acpi_resource *resource_list)
 {
-       struct acpi_resource_address32 *address32_data =
-           (struct acpi_resource_address32 *)data;
+       u32 count = 0;
+       u32 type;
 
        ACPI_FUNCTION_ENTRY();
 
-       acpi_os_printf("32-Bit Address Space Resource\n");
-
-       switch (address32_data->resource_type) {
-       case ACPI_MEMORY_RANGE:
-
-               acpi_os_printf("  Resource Type: Memory Range\n");
-
-               switch (address32_data->attribute.memory.cache_attribute) {
-               case ACPI_NON_CACHEABLE_MEMORY:
-                       acpi_os_printf
-                           ("  Type Specific: Noncacheable memory\n");
-                       break;
-
-               case ACPI_CACHABLE_MEMORY:
-                       acpi_os_printf("  Type Specific: Cacheable memory\n");
-                       break;
-
-               case ACPI_WRITE_COMBINING_MEMORY:
-                       acpi_os_printf
-                           ("  Type Specific: Write-combining memory\n");
-                       break;
-
-               case ACPI_PREFETCHABLE_MEMORY:
-                       acpi_os_printf
-                           ("  Type Specific: Prefetchable memory\n");
-                       break;
-
-               default:
-                       acpi_os_printf
-                           ("  Type Specific: Invalid cache attribute\n");
-                       break;
-               }
-
-               acpi_os_printf("  Type Specific: Read%s\n",
-                              ACPI_READ_WRITE_MEMORY ==
-                              address32_data->attribute.memory.
-                              read_write_attribute ? "/Write" : " Only");
-               break;
-
-       case ACPI_IO_RANGE:
-
-               acpi_os_printf("  Resource Type: Io Range\n");
+       if (!(acpi_dbg_level & ACPI_LV_RESOURCES)
+           || !(_COMPONENT & acpi_dbg_layer)) {
+               return;
+       }
 
-               switch (address32_data->attribute.io.range_attribute) {
-               case ACPI_NON_ISA_ONLY_RANGES:
-                       acpi_os_printf
-                           ("  Type Specific: Non-ISA Io Addresses\n");
-                       break;
+       /* Walk list and dump all resource descriptors (END_TAG terminates) */
 
-               case ACPI_ISA_ONLY_RANGES:
-                       acpi_os_printf("  Type Specific: ISA Io Addresses\n");
-                       break;
+       do {
+               acpi_os_printf("\n[%02X] ", count);
+               count++;
 
-               case ACPI_ENTIRE_RANGE:
-                       acpi_os_printf
-                           ("  Type Specific: ISA and non-ISA Io Addresses\n");
-                       break;
+               /* Validate Type before dispatch */
 
-               default:
+               type = resource_list->type;
+               if (type > ACPI_RESOURCE_TYPE_MAX) {
                        acpi_os_printf
-                           ("  Type Specific: Invalid Range attribute");
-                       break;
+                           ("Invalid descriptor type (%X) in resource list\n",
+                            resource_list->type);
+                       return;
                }
 
-               acpi_os_printf("  Type Specific: %s Translation\n",
-                              ACPI_SPARSE_TRANSLATION ==
-                              address32_data->attribute.io.
-                              translation_attribute ? "Sparse" : "Dense");
-               break;
-
-       case ACPI_BUS_NUMBER_RANGE:
-
-               acpi_os_printf("  Resource Type: Bus Number Range\n");
-               break;
-
-       default:
-
-               acpi_os_printf("  Resource Type: 0x%2.2X\n",
-                              address32_data->resource_type);
-               break;
-       }
-
-       acpi_os_printf("  Resource %s\n",
-                      ACPI_CONSUMER == address32_data->producer_consumer ?
-                      "Consumer" : "Producer");
-
-       acpi_os_printf("  %s decode\n",
-                      ACPI_SUB_DECODE == address32_data->decode ?
-                      "Subtractive" : "Positive");
-
-       acpi_os_printf("  Min address is %s fixed\n",
-                      ACPI_ADDRESS_FIXED == address32_data->min_address_fixed ?
-                      "" : "not ");
-
-       acpi_os_printf("  Max address is %s fixed\n",
-                      ACPI_ADDRESS_FIXED == address32_data->max_address_fixed ?
-                      "" : "not ");
+               /* Dump the resource descriptor */
 
-       acpi_os_printf("  Granularity: %08X\n", address32_data->granularity);
+               acpi_rs_dump_descriptor(&resource_list->data,
+                                       acpi_gbl_dump_resource_dispatch[type]);
 
-       acpi_os_printf("  Address range min: %08X\n",
-                      address32_data->min_address_range);
+               /* Point to the next resource structure */
 
-       acpi_os_printf("  Address range max: %08X\n",
-                      address32_data->max_address_range);
+               resource_list =
+                   ACPI_ADD_PTR(struct acpi_resource, resource_list,
+                                resource_list->length);
 
-       acpi_os_printf("  Address translation offset: %08X\n",
-                      address32_data->address_translation_offset);
+               /* Exit when END_TAG descriptor is reached */
 
-       acpi_os_printf("  Address Length: %08X\n",
-                      address32_data->address_length);
-
-       if (0xFF != address32_data->resource_source.index) {
-               acpi_os_printf("  Resource Source Index: %X\n",
-                              address32_data->resource_source.index);
-
-               acpi_os_printf("  Resource Source: %s\n",
-                              address32_data->resource_source.string_ptr);
-       }
-
-       return;
+       } while (type != ACPI_RESOURCE_TYPE_END_TAG);
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dump_address64
+ * FUNCTION:    acpi_rs_dump_irq_list
  *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
+ * PARAMETERS:  route_table     - Pointer to the routing table to dump.
  *
  * RETURN:      None
  *
- * DESCRIPTION: Prints out the various members of the Data structure type.
+ * DESCRIPTION: Print IRQ routing table
  *
  ******************************************************************************/
 
-static void acpi_rs_dump_address64(union acpi_resource_data *data)
+void acpi_rs_dump_irq_list(u8 * route_table)
 {
-       struct acpi_resource_address64 *address64_data =
-           (struct acpi_resource_address64 *)data;
+       struct acpi_pci_routing_table *prt_element;
+       u8 count;
 
        ACPI_FUNCTION_ENTRY();
 
-       acpi_os_printf("64-Bit Address Space Resource\n");
-
-       switch (address64_data->resource_type) {
-       case ACPI_MEMORY_RANGE:
-
-               acpi_os_printf("  Resource Type: Memory Range\n");
-
-               switch (address64_data->attribute.memory.cache_attribute) {
-               case ACPI_NON_CACHEABLE_MEMORY:
-                       acpi_os_printf
-                           ("  Type Specific: Noncacheable memory\n");
-                       break;
-
-               case ACPI_CACHABLE_MEMORY:
-                       acpi_os_printf("  Type Specific: Cacheable memory\n");
-                       break;
-
-               case ACPI_WRITE_COMBINING_MEMORY:
-                       acpi_os_printf
-                           ("  Type Specific: Write-combining memory\n");
-                       break;
-
-               case ACPI_PREFETCHABLE_MEMORY:
-                       acpi_os_printf
-                           ("  Type Specific: Prefetchable memory\n");
-                       break;
-
-               default:
-                       acpi_os_printf
-                           ("  Type Specific: Invalid cache attribute\n");
-                       break;
-               }
-
-               acpi_os_printf("  Type Specific: Read%s\n",
-                              ACPI_READ_WRITE_MEMORY ==
-                              address64_data->attribute.memory.
-                              read_write_attribute ? "/Write" : " Only");
-               break;
-
-       case ACPI_IO_RANGE:
-
-               acpi_os_printf("  Resource Type: Io Range\n");
-
-               switch (address64_data->attribute.io.range_attribute) {
-               case ACPI_NON_ISA_ONLY_RANGES:
-                       acpi_os_printf
-                           ("  Type Specific: Non-ISA Io Addresses\n");
-                       break;
-
-               case ACPI_ISA_ONLY_RANGES:
-                       acpi_os_printf("  Type Specific: ISA Io Addresses\n");
-                       break;
-
-               case ACPI_ENTIRE_RANGE:
-                       acpi_os_printf
-                           ("  Type Specific: ISA and non-ISA Io Addresses\n");
-                       break;
-
-               default:
-                       acpi_os_printf
-                           ("  Type Specific: Invalid Range attribute");
-                       break;
-               }
-
-               acpi_os_printf("  Type Specific: %s Translation\n",
-                              ACPI_SPARSE_TRANSLATION ==
-                              address64_data->attribute.io.
-                              translation_attribute ? "Sparse" : "Dense");
-               break;
-
-       case ACPI_BUS_NUMBER_RANGE:
-
-               acpi_os_printf("  Resource Type: Bus Number Range\n");
-               break;
-
-       default:
-
-               acpi_os_printf("  Resource Type: 0x%2.2X\n",
-                              address64_data->resource_type);
-               break;
+       if (!(acpi_dbg_level & ACPI_LV_RESOURCES)
+           || !(_COMPONENT & acpi_dbg_layer)) {
+               return;
        }
 
-       acpi_os_printf("  Resource %s\n",
-                      ACPI_CONSUMER == address64_data->producer_consumer ?
-                      "Consumer" : "Producer");
-
-       acpi_os_printf("  %s decode\n",
-                      ACPI_SUB_DECODE == address64_data->decode ?
-                      "Subtractive" : "Positive");
-
-       acpi_os_printf("  Min address is %s fixed\n",
-                      ACPI_ADDRESS_FIXED == address64_data->min_address_fixed ?
-                      "" : "not ");
-
-       acpi_os_printf("  Max address is %s fixed\n",
-                      ACPI_ADDRESS_FIXED == address64_data->max_address_fixed ?
-                      "" : "not ");
+       prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, route_table);
 
-       acpi_os_printf("  Granularity: %8.8X%8.8X\n",
-                      ACPI_FORMAT_UINT64(address64_data->granularity));
+       /* Dump all table elements, Exit on zero length element */
 
-       acpi_os_printf("  Address range min: %8.8X%8.8X\n",
-                      ACPI_FORMAT_UINT64(address64_data->min_address_range));
+       for (count = 0; prt_element->length; count++) {
+               acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n",
+                              count);
+               acpi_rs_dump_descriptor(prt_element, acpi_rs_dump_prt);
 
-       acpi_os_printf("  Address range max: %8.8X%8.8X\n",
-                      ACPI_FORMAT_UINT64(address64_data->max_address_range));
-
-       acpi_os_printf("  Address translation offset: %8.8X%8.8X\n",
-                      ACPI_FORMAT_UINT64(address64_data->
-                                         address_translation_offset));
-
-       acpi_os_printf("  Address Length: %8.8X%8.8X\n",
-                      ACPI_FORMAT_UINT64(address64_data->address_length));
-
-       acpi_os_printf("  Type Specific Attributes: %8.8X%8.8X\n",
-                      ACPI_FORMAT_UINT64(address64_data->
-                                         type_specific_attributes));
-
-       if (0xFF != address64_data->resource_source.index) {
-               acpi_os_printf("  Resource Source Index: %X\n",
-                              address64_data->resource_source.index);
-
-               acpi_os_printf("  Resource Source: %s\n",
-                              address64_data->resource_source.string_ptr);
+               prt_element = ACPI_ADD_PTR(struct acpi_pci_routing_table,
+                                          prt_element, prt_element->length);
        }
-
-       return;
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dump_extended_irq
+ * FUNCTION:    acpi_rs_out*
  *
- * PARAMETERS:  Data            - pointer to the resource structure to dump.
+ * PARAMETERS:  Title       - Name of the resource field
+ *              Value       - Value of the resource field
  *
  * RETURN:      None
  *
- * DESCRIPTION: Prints out the various members of the Data structure type.
+ * DESCRIPTION: Miscellaneous helper functions to consistently format the
+ *              output of the resource dump routines
  *
  ******************************************************************************/
 
-static void acpi_rs_dump_extended_irq(union acpi_resource_data *data)
+static void acpi_rs_out_string(char *title, char *value)
 {
-       struct acpi_resource_ext_irq *ext_irq_data =
-           (struct acpi_resource_ext_irq *)data;
-       u8 index = 0;
-
-       ACPI_FUNCTION_ENTRY();
-
-       acpi_os_printf("Extended IRQ Resource\n");
-
-       acpi_os_printf("  Resource %s\n",
-                      ACPI_CONSUMER == ext_irq_data->producer_consumer ?
-                      "Consumer" : "Producer");
-
-       acpi_os_printf("  %s\n",
-                      ACPI_LEVEL_SENSITIVE == ext_irq_data->edge_level ?
-                      "Level" : "Edge");
-
-       acpi_os_printf("  Active %s\n",
-                      ACPI_ACTIVE_LOW == ext_irq_data->active_high_low ?
-                      "low" : "high");
-
-       acpi_os_printf("  %s\n",
-                      ACPI_SHARED == ext_irq_data->shared_exclusive ?
-                      "Shared" : "Exclusive");
-
-       acpi_os_printf("  Interrupts : %X ( ",
-                      ext_irq_data->number_of_interrupts);
-
-       for (index = 0; index < ext_irq_data->number_of_interrupts; index++) {
-               acpi_os_printf("%X ", ext_irq_data->interrupts[index]);
-       }
-
-       acpi_os_printf(")\n");
-
-       if (0xFF != ext_irq_data->resource_source.index) {
-               acpi_os_printf("  Resource Source Index: %X",
-                              ext_irq_data->resource_source.index);
-
-               acpi_os_printf("  Resource Source: %s",
-                              ext_irq_data->resource_source.string_ptr);
+       acpi_os_printf("%27s : %s", title, value);
+       if (!*value) {
+               acpi_os_printf("[NULL NAMESTRING]");
        }
-
-       return;
+       acpi_os_printf("\n");
 }
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_dump_resource_list
- *
- * PARAMETERS:  Resource        - pointer to the resource structure to dump.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Dispatches the structure to the correct dump routine.
- *
- ******************************************************************************/
-
-void acpi_rs_dump_resource_list(struct acpi_resource *resource)
+static void acpi_rs_out_integer8(char *title, u8 value)
 {
-       u8 count = 0;
-       u8 done = FALSE;
-
-       ACPI_FUNCTION_ENTRY();
-
-       if (acpi_dbg_level & ACPI_LV_RESOURCES && _COMPONENT & acpi_dbg_layer) {
-               while (!done) {
-                       acpi_os_printf("Resource structure %X.\n", count++);
-
-                       switch (resource->id) {
-                       case ACPI_RSTYPE_IRQ:
-                               acpi_rs_dump_irq(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_DMA:
-                               acpi_rs_dump_dma(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_START_DPF:
-                               acpi_rs_dump_start_depend_fns(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_END_DPF:
-                               acpi_os_printf
-                                   ("end_dependent_functions Resource\n");
-                               /* acpi_rs_dump_end_dependent_functions (Resource->Data); */
-                               break;
-
-                       case ACPI_RSTYPE_IO:
-                               acpi_rs_dump_io(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_FIXED_IO:
-                               acpi_rs_dump_fixed_io(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_VENDOR:
-                               acpi_rs_dump_vendor_specific(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_END_TAG:
-                               /*rs_dump_end_tag (Resource->Data); */
-                               acpi_os_printf("end_tag Resource\n");
-                               done = TRUE;
-                               break;
-
-                       case ACPI_RSTYPE_MEM24:
-                               acpi_rs_dump_memory24(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_MEM32:
-                               acpi_rs_dump_memory32(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_FIXED_MEM32:
-                               acpi_rs_dump_fixed_memory32(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_ADDRESS16:
-                               acpi_rs_dump_address16(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_ADDRESS32:
-                               acpi_rs_dump_address32(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_ADDRESS64:
-                               acpi_rs_dump_address64(&resource->data);
-                               break;
-
-                       case ACPI_RSTYPE_EXT_IRQ:
-                               acpi_rs_dump_extended_irq(&resource->data);
-                               break;
+       acpi_os_printf("%27s : %2.2X\n", title, value);
+}
 
-                       default:
-                               acpi_os_printf("Invalid resource type\n");
-                               break;
+static void acpi_rs_out_integer16(char *title, u16 value)
+{
+       acpi_os_printf("%27s : %4.4X\n", title, value);
+}
 
-                       }
+static void acpi_rs_out_integer32(char *title, u32 value)
+{
+       acpi_os_printf("%27s : %8.8X\n", title, value);
+}
 
-                       resource =
-                           ACPI_PTR_ADD(struct acpi_resource, resource,
-                                        resource->length);
-               }
-       }
+static void acpi_rs_out_integer64(char *title, u64 value)
+{
+       acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value));
+}
 
-       return;
+static void acpi_rs_out_title(char *title)
+{
+       acpi_os_printf("%27s : ", title);
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dump_irq_list
+ * FUNCTION:    acpi_rs_dump*List
  *
- * PARAMETERS:  route_table     - pointer to the routing table to dump.
+ * PARAMETERS:  Length      - Number of elements in the list
+ *              Data        - Start of the list
  *
  * RETURN:      None
  *
- * DESCRIPTION: Dispatches the structures to the correct dump routine.
+ * DESCRIPTION: Miscellaneous functions to dump lists of raw data
  *
  ******************************************************************************/
 
-void acpi_rs_dump_irq_list(u8 * route_table)
+static void acpi_rs_dump_byte_list(u16 length, u8 * data)
 {
-       u8 *buffer = route_table;
-       u8 count = 0;
-       u8 done = FALSE;
-       struct acpi_pci_routing_table *prt_element;
+       u8 i;
 
-       ACPI_FUNCTION_ENTRY();
-
-       if (acpi_dbg_level & ACPI_LV_RESOURCES && _COMPONENT & acpi_dbg_layer) {
-               prt_element =
-                   ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer);
-
-               while (!done) {
-                       acpi_os_printf("PCI IRQ Routing Table structure %X.\n",
-                                      count++);
-
-                       acpi_os_printf("  Address: %8.8X%8.8X\n",
-                                      ACPI_FORMAT_UINT64(prt_element->
-                                                         address));
+       for (i = 0; i < length; i++) {
+               acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]);
+       }
+}
 
-                       acpi_os_printf("  Pin: %X\n", prt_element->pin);
+static void acpi_rs_dump_short_byte_list(u8 length, u8 * data)
+{
+       u8 i;
 
-                       acpi_os_printf("  Source: %s\n", prt_element->source);
+       for (i = 0; i < length; i++) {
+               acpi_os_printf("%X ", data[i]);
+       }
+       acpi_os_printf("\n");
+}
 
-                       acpi_os_printf("  source_index: %X\n",
-                                      prt_element->source_index);
+static void acpi_rs_dump_dword_list(u8 length, u32 * data)
+{
+       u8 i;
 
-                       buffer += prt_element->length;
-                       prt_element =
-                           ACPI_CAST_PTR(struct acpi_pci_routing_table,
-                                         buffer);
-                       if (0 == prt_element->length) {
-                               done = TRUE;
-                       }
-               }
+       for (i = 0; i < length; i++) {
+               acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]);
        }
-
-       return;
 }
 
 #endif
diff --git a/drivers/acpi/resources/rsinfo.c b/drivers/acpi/resources/rsinfo.c
new file mode 100644 (file)
index 0000000..d9ae64b
--- /dev/null
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ *
+ * Module Name: rsinfo - Dispatch and Info tables
+ *
+ ******************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2006, R. Byron Moore
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ */
+
+#include <acpi/acpi.h>
+#include <acpi/acresrc.h>
+
+#define _COMPONENT          ACPI_RESOURCES
+ACPI_MODULE_NAME("rsinfo")
+
+/*
+ * Resource dispatch and information tables. Any new resource types (either
+ * Large or Small) must be reflected in each of these tables, so they are here
+ * in one place.
+ *
+ * The tables for Large descriptors are indexed by bits 6:0 of the AML
+ * descriptor type byte. The tables for Small descriptors are indexed by
+ * bits 6:3 of the descriptor byte. The tables for internal resource
+ * descriptors are indexed by the acpi_resource_type field.
+ */
+/* Dispatch table for resource-to-AML (Set Resource) conversion functions */
+struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[] = {
+       acpi_rs_set_irq,        /* 0x00, ACPI_RESOURCE_TYPE_IRQ */
+       acpi_rs_convert_dma,    /* 0x01, ACPI_RESOURCE_TYPE_DMA */
+       acpi_rs_set_start_dpf,  /* 0x02, ACPI_RESOURCE_TYPE_START_DEPENDENT */
+       acpi_rs_convert_end_dpf,        /* 0x03, ACPI_RESOURCE_TYPE_END_DEPENDENT */
+       acpi_rs_convert_io,     /* 0x04, ACPI_RESOURCE_TYPE_IO */
+       acpi_rs_convert_fixed_io,       /* 0x05, ACPI_RESOURCE_TYPE_FIXED_IO */
+       acpi_rs_set_vendor,     /* 0x06, ACPI_RESOURCE_TYPE_VENDOR */
+       acpi_rs_convert_end_tag,        /* 0x07, ACPI_RESOURCE_TYPE_END_TAG */
+       acpi_rs_convert_memory24,       /* 0x08, ACPI_RESOURCE_TYPE_MEMORY24 */
+       acpi_rs_convert_memory32,       /* 0x09, ACPI_RESOURCE_TYPE_MEMORY32 */
+       acpi_rs_convert_fixed_memory32, /* 0x0A, ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */
+       acpi_rs_convert_address16,      /* 0x0B, ACPI_RESOURCE_TYPE_ADDRESS16 */
+       acpi_rs_convert_address32,      /* 0x0C, ACPI_RESOURCE_TYPE_ADDRESS32 */
+       acpi_rs_convert_address64,      /* 0x0D, ACPI_RESOURCE_TYPE_ADDRESS64 */
+       acpi_rs_convert_ext_address64,  /* 0x0E, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
+       acpi_rs_convert_ext_irq,        /* 0x0F, ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
+       acpi_rs_convert_generic_reg     /* 0x10, ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
+};
+
+/* Dispatch tables for AML-to-resource (Get Resource) conversion functions */
+
+struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[] = {
+       /* Small descriptors */
+
+       NULL,                   /* 0x00, Reserved */
+       NULL,                   /* 0x01, Reserved */
+       NULL,                   /* 0x02, Reserved */
+       NULL,                   /* 0x03, Reserved */
+       acpi_rs_get_irq,        /* 0x04, ACPI_RESOURCE_NAME_IRQ */
+       acpi_rs_convert_dma,    /* 0x05, ACPI_RESOURCE_NAME_DMA */
+       acpi_rs_get_start_dpf,  /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
+       acpi_rs_convert_end_dpf,        /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
+       acpi_rs_convert_io,     /* 0x08, ACPI_RESOURCE_NAME_IO */
+       acpi_rs_convert_fixed_io,       /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO */
+       NULL,                   /* 0x0A, Reserved */
+       NULL,                   /* 0x0B, Reserved */
+       NULL,                   /* 0x0C, Reserved */
+       NULL,                   /* 0x0D, Reserved */
+       acpi_rs_get_vendor_small,       /* 0x0E, ACPI_RESOURCE_NAME_VENDOR_SMALL */
+       acpi_rs_convert_end_tag,        /* 0x0F, ACPI_RESOURCE_NAME_END_TAG */
+
+       /* Large descriptors */
+
+       NULL,                   /* 0x00, Reserved */
+       acpi_rs_convert_memory24,       /* 0x01, ACPI_RESOURCE_NAME_MEMORY24 */
+       acpi_rs_convert_generic_reg,    /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
+       NULL,                   /* 0x03, Reserved */
+       acpi_rs_get_vendor_large,       /* 0x04, ACPI_RESOURCE_NAME_VENDOR_LARGE */
+       acpi_rs_convert_memory32,       /* 0x05, ACPI_RESOURCE_NAME_MEMORY32 */
+       acpi_rs_convert_fixed_memory32, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY32 */
+       acpi_rs_convert_address32,      /* 0x07, ACPI_RESOURCE_NAME_ADDRESS32 */
+       acpi_rs_convert_address16,      /* 0x08, ACPI_RESOURCE_NAME_ADDRESS16 */
+       acpi_rs_convert_ext_irq,        /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_IRQ */
+       acpi_rs_convert_address64,      /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */
+       acpi_rs_convert_ext_address64   /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */
+};
+
+#ifdef ACPI_FUTURE_USAGE
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+
+/* Dispatch table for resource dump functions */
+
+struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[] = {
+       acpi_rs_dump_irq,       /* ACPI_RESOURCE_TYPE_IRQ */
+       acpi_rs_dump_dma,       /* ACPI_RESOURCE_TYPE_DMA */
+       acpi_rs_dump_start_dpf, /* ACPI_RESOURCE_TYPE_START_DEPENDENT */
+       acpi_rs_dump_end_dpf,   /* ACPI_RESOURCE_TYPE_END_DEPENDENT */
+       acpi_rs_dump_io,        /* ACPI_RESOURCE_TYPE_IO */
+       acpi_rs_dump_fixed_io,  /* ACPI_RESOURCE_TYPE_FIXED_IO */
+       acpi_rs_dump_vendor,    /* ACPI_RESOURCE_TYPE_VENDOR */
+       acpi_rs_dump_end_tag,   /* ACPI_RESOURCE_TYPE_END_TAG */
+       acpi_rs_dump_memory24,  /* ACPI_RESOURCE_TYPE_MEMORY24 */
+       acpi_rs_dump_memory32,  /* ACPI_RESOURCE_TYPE_MEMORY32 */
+       acpi_rs_dump_fixed_memory32,    /* ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */
+       acpi_rs_dump_address16, /* ACPI_RESOURCE_TYPE_ADDRESS16 */
+       acpi_rs_dump_address32, /* ACPI_RESOURCE_TYPE_ADDRESS32 */
+       acpi_rs_dump_address64, /* ACPI_RESOURCE_TYPE_ADDRESS64 */
+       acpi_rs_dump_ext_address64,     /* ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
+       acpi_rs_dump_ext_irq,   /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
+       acpi_rs_dump_generic_reg,       /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
+};
+#endif
+#endif /* ACPI_FUTURE_USAGE */
+/*
+ * Base sizes for external AML resource descriptors, indexed by internal type.
+ * Includes size of the descriptor header (1 byte for small descriptors,
+ * 3 bytes for large descriptors)
+ */
+const u8 acpi_gbl_aml_resource_sizes[] = {
+       sizeof(struct aml_resource_irq),        /* ACPI_RESOURCE_TYPE_IRQ (optional Byte 3 always created) */
+       sizeof(struct aml_resource_dma),        /* ACPI_RESOURCE_TYPE_DMA */
+       sizeof(struct aml_resource_start_dependent),    /* ACPI_RESOURCE_TYPE_START_DEPENDENT (optional Byte 1 always created) */
+       sizeof(struct aml_resource_end_dependent),      /* ACPI_RESOURCE_TYPE_END_DEPENDENT */
+       sizeof(struct aml_resource_io), /* ACPI_RESOURCE_TYPE_IO */
+       sizeof(struct aml_resource_fixed_io),   /* ACPI_RESOURCE_TYPE_FIXED_IO */
+       sizeof(struct aml_resource_vendor_small),       /* ACPI_RESOURCE_TYPE_VENDOR */
+       sizeof(struct aml_resource_end_tag),    /* ACPI_RESOURCE_TYPE_END_TAG */
+       sizeof(struct aml_resource_memory24),   /* ACPI_RESOURCE_TYPE_MEMORY24 */
+       sizeof(struct aml_resource_memory32),   /* ACPI_RESOURCE_TYPE_MEMORY32 */
+       sizeof(struct aml_resource_fixed_memory32),     /* ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */
+       sizeof(struct aml_resource_address16),  /* ACPI_RESOURCE_TYPE_ADDRESS16 */
+       sizeof(struct aml_resource_address32),  /* ACPI_RESOURCE_TYPE_ADDRESS32 */
+       sizeof(struct aml_resource_address64),  /* ACPI_RESOURCE_TYPE_ADDRESS64 */
+       sizeof(struct aml_resource_extended_address64), /*ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
+       sizeof(struct aml_resource_extended_irq),       /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
+       sizeof(struct aml_resource_generic_register)    /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
+};
+
+const u8 acpi_gbl_resource_struct_sizes[] = {
+       /* Small descriptors */
+
+       0,
+       0,
+       0,
+       0,
+       ACPI_RS_SIZE(struct acpi_resource_irq),
+       ACPI_RS_SIZE(struct acpi_resource_dma),
+       ACPI_RS_SIZE(struct acpi_resource_start_dependent),
+       ACPI_RS_SIZE_MIN,
+       ACPI_RS_SIZE(struct acpi_resource_io),
+       ACPI_RS_SIZE(struct acpi_resource_fixed_io),
+       0,
+       0,
+       0,
+       0,
+       ACPI_RS_SIZE(struct acpi_resource_vendor),
+       ACPI_RS_SIZE_MIN,
+
+       /* Large descriptors */
+
+       0,
+       ACPI_RS_SIZE(struct acpi_resource_memory24),
+       ACPI_RS_SIZE(struct acpi_resource_generic_register),
+       0,
+       ACPI_RS_SIZE(struct acpi_resource_vendor),
+       ACPI_RS_SIZE(struct acpi_resource_memory32),
+       ACPI_RS_SIZE(struct acpi_resource_fixed_memory32),
+       ACPI_RS_SIZE(struct acpi_resource_address32),
+       ACPI_RS_SIZE(struct acpi_resource_address16),
+       ACPI_RS_SIZE(struct acpi_resource_extended_irq),
+       ACPI_RS_SIZE(struct acpi_resource_address64),
+       ACPI_RS_SIZE(struct acpi_resource_extended_address64)
+};
index d53bbe89e8514dfd17ad6fe3fe8084366698e02c..ea567167c4f23f03cf7037056c6bc9d15315b0a2 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,428 +49,206 @@ ACPI_MODULE_NAME("rsio")
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_io_resource
+ * acpi_rs_convert_io
  *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
+ ******************************************************************************/
+struct acpi_rsconvert_info acpi_rs_convert_io[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO,
+        ACPI_RS_SIZE(struct acpi_resource_io),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)},
+
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO,
+        sizeof(struct aml_resource_io),
+        0},
+
+       /* Decode flag */
+
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.io.io_decode),
+        AML_OFFSET(io.flags),
+        0},
+       /*
+        * These fields are contiguous in both the source and destination:
+        * Address Alignment
+        * Length
+        * Minimum Base Address
+        * Maximum Base Address
+        */
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.io.alignment),
+        AML_OFFSET(io.alignment),
+        2},
+
+       {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.io.minimum),
+        AML_OFFSET(io.minimum),
+        2}
+};
+
+/*******************************************************************************
  *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_convert_fixed_io
  *
  ******************************************************************************/
-acpi_status
-acpi_rs_io_resource(u8 * byte_stream_buffer,
-                   acpi_size * bytes_consumed,
-                   u8 ** output_buffer, acpi_size * structure_size)
-{
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       acpi_size struct_size = ACPI_SIZEOF_RESOURCE(struct acpi_resource_io);
-
-       ACPI_FUNCTION_TRACE("rs_io_resource");
-
-       /* The number of bytes consumed are Constant */
-
-       *bytes_consumed = 8;
-
-       output_struct->id = ACPI_RSTYPE_IO;
-
-       /* Check Decode */
-
-       buffer += 1;
-       temp8 = *buffer;
-
-       output_struct->data.io.io_decode = temp8 & 0x01;
-
-       /* Check min_base Address */
-
-       buffer += 1;
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-       output_struct->data.io.min_base_address = temp16;
-
-       /* Check max_base Address */
 
-       buffer += 2;
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-       output_struct->data.io.max_base_address = temp16;
-
-       /* Check Base alignment */
-
-       buffer += 2;
-       temp8 = *buffer;
-
-       output_struct->data.io.alignment = temp8;
-
-       /* Check range_length */
-
-       buffer += 1;
-       temp8 = *buffer;
-
-       output_struct->data.io.range_length = temp8;
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+struct acpi_rsconvert_info acpi_rs_convert_fixed_io[4] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO,
+        ACPI_RS_SIZE(struct acpi_resource_fixed_io),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)},
+
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO,
+        sizeof(struct aml_resource_fixed_io),
+        0},
+       /*
+        * These fields are contiguous in both the source and destination:
+        * Base Address
+        * Length
+        */
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_io.address_length),
+        AML_OFFSET(fixed_io.address_length),
+        1},
+
+       {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_io.address),
+        AML_OFFSET(fixed_io.address),
+        1}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_fixed_io_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_convert_generic_reg
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_fixed_io_resource(u8 * byte_stream_buffer,
-                         acpi_size * bytes_consumed,
-                         u8 ** output_buffer, acpi_size * structure_size)
-{
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_io);
-
-       ACPI_FUNCTION_TRACE("rs_fixed_io_resource");
-
-       /* The number of bytes consumed are Constant */
-
-       *bytes_consumed = 4;
-
-       output_struct->id = ACPI_RSTYPE_FIXED_IO;
-
-       /* Check Range Base Address */
-
-       buffer += 1;
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-       output_struct->data.fixed_io.base_address = temp16;
-
-       /* Check range_length */
-
-       buffer += 2;
-       temp8 = *buffer;
-
-       output_struct->data.fixed_io.range_length = temp8;
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+struct acpi_rsconvert_info acpi_rs_convert_generic_reg[4] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
+        ACPI_RS_SIZE(struct acpi_resource_generic_register),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)},
+
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER,
+        sizeof(struct aml_resource_generic_register),
+        0},
+       /*
+        * These fields are contiguous in both the source and destination:
+        * Address Space ID
+        * Register Bit Width
+        * Register Bit Offset
+        * Access Size
+        */
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.generic_reg.space_id),
+        AML_OFFSET(generic_reg.address_space_id),
+        4},
+
+       /* Get the Register Address */
+
+       {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.generic_reg.address),
+        AML_OFFSET(generic_reg.address),
+        1}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_io_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_convert_end_dpf
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_io_stream(struct acpi_resource *linked_list,
-                 u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-
-       ACPI_FUNCTION_TRACE("rs_io_stream");
-
-       /* The descriptor field is static */
-
-       *buffer = 0x47;
-       buffer += 1;
-
-       /* Io Information Byte */
-
-       temp8 = (u8) (linked_list->data.io.io_decode & 0x01);
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Set the Range minimum base address */
-
-       temp16 = (u16) linked_list->data.io.min_base_address;
-
-       ACPI_MOVE_16_TO_16(buffer, &temp16);
-       buffer += 2;
-
-       /* Set the Range maximum base address */
-
-       temp16 = (u16) linked_list->data.io.max_base_address;
+struct acpi_rsconvert_info acpi_rs_convert_end_dpf[2] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT,
+        ACPI_RS_SIZE_MIN,
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)},
 
-       ACPI_MOVE_16_TO_16(buffer, &temp16);
-       buffer += 2;
-
-       /* Set the base alignment */
-
-       temp8 = (u8) linked_list->data.io.alignment;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Set the range length */
-
-       temp8 = (u8) linked_list->data.io.range_length;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT,
+        sizeof(struct aml_resource_end_dependent),
+        0}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_fixed_io_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_convert_end_tag
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_fixed_io_stream(struct acpi_resource *linked_list,
-                       u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-
-       ACPI_FUNCTION_TRACE("rs_fixed_io_stream");
-
-       /* The descriptor field is static */
-
-       *buffer = 0x4B;
-
-       buffer += 1;
-
-       /* Set the Range base address */
-
-       temp16 = (u16) linked_list->data.fixed_io.base_address;
-
-       ACPI_MOVE_16_TO_16(buffer, &temp16);
-       buffer += 2;
-
-       /* Set the range length */
-
-       temp8 = (u8) linked_list->data.fixed_io.range_length;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
-}
+struct acpi_rsconvert_info acpi_rs_convert_end_tag[2] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG,
+        ACPI_RS_SIZE_MIN,
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_tag)},
+
+       /*
+        * Note: The checksum field is set to zero, meaning that the resource
+        * data is treated as if the checksum operation succeeded.
+        * (ACPI Spec 1.0b Section 6.4.2.8)
+        */
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG,
+        sizeof(struct aml_resource_end_tag),
+        0}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dma_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_get_start_dpf
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_dma_resource(u8 * byte_stream_buffer,
-                    acpi_size * bytes_consumed,
-                    u8 ** output_buffer, acpi_size * structure_size)
-{
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       u8 temp8 = 0;
-       u8 index;
-       u8 i;
-       acpi_size struct_size = ACPI_SIZEOF_RESOURCE(struct acpi_resource_dma);
-
-       ACPI_FUNCTION_TRACE("rs_dma_resource");
-
-       /* The number of bytes consumed are Constant */
+struct acpi_rsconvert_info acpi_rs_get_start_dpf[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT,
+        ACPI_RS_SIZE(struct acpi_resource_start_dependent),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_get_start_dpf)},
 
-       *bytes_consumed = 3;
-       output_struct->id = ACPI_RSTYPE_DMA;
+       /* Defaults for Compatibility and Performance priorities */
 
-       /* Point to the 8-bits of Byte 1 */
+       {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
+        ACPI_ACCEPTABLE_CONFIGURATION,
+        2},
 
-       buffer += 1;
-       temp8 = *buffer;
+       /* All done if there is no flag byte present in the descriptor */
 
-       /* Decode the DMA channel bits */
+       {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
 
-       for (i = 0, index = 0; index < 8; index++) {
-               if ((temp8 >> index) & 0x01) {
-                       output_struct->data.dma.channels[i] = index;
-                       i++;
-               }
-       }
+       /* Flag byte is present, get the flags */
 
-       /* Zero DMA channels is valid */
+       {ACPI_RSC_2BITFLAG,
+        ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
+        AML_OFFSET(start_dpf.flags),
+        0},
 
-       output_struct->data.dma.number_of_channels = i;
-       if (i > 0) {
-               /* Calculate the structure size based upon the number of interrupts */
-
-               struct_size += ((acpi_size) i - 1) * 4;
-       }
-
-       /* Point to Byte 2 */
-
-       buffer += 1;
-       temp8 = *buffer;
-
-       /* Check for transfer preference (Bits[1:0]) */
-
-       output_struct->data.dma.transfer = temp8 & 0x03;
-
-       if (0x03 == output_struct->data.dma.transfer) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Invalid DMA.Transfer preference (3)\n"));
-               return_ACPI_STATUS(AE_BAD_DATA);
-       }
-
-       /* Get bus master preference (Bit[2]) */
-
-       output_struct->data.dma.bus_master = (temp8 >> 2) & 0x01;
-
-       /* Get channel speed support (Bits[6:5]) */
-
-       output_struct->data.dma.type = (temp8 >> 5) & 0x03;
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_2BITFLAG,
+        ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
+        AML_OFFSET(start_dpf.flags),
+        2}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_dma_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_set_start_dpf
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_dma_stream(struct acpi_resource *linked_list,
-                  u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       u8 index;
-
-       ACPI_FUNCTION_TRACE("rs_dma_stream");
-
-       /* The descriptor field is static */
-
-       *buffer = 0x2A;
-       buffer += 1;
-       temp8 = 0;
-
-       /* Loop through all of the Channels and set the mask bits */
-
-       for (index = 0;
-            index < linked_list->data.dma.number_of_channels; index++) {
-               temp16 = (u16) linked_list->data.dma.channels[index];
-               temp8 |= 0x1 << temp16;
-       }
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Set the DMA Info */
-
-       temp8 = (u8) ((linked_list->data.dma.type & 0x03) << 5);
-       temp8 |= ((linked_list->data.dma.bus_master & 0x01) << 2);
-       temp8 |= (linked_list->data.dma.transfer & 0x03);
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
-}
+struct acpi_rsconvert_info acpi_rs_set_start_dpf[6] = {
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT,
+        sizeof(struct aml_resource_start_dependent),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_set_start_dpf)},
+
+       /* Set the default flag values */
+
+       {ACPI_RSC_2BITFLAG,
+        ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
+        AML_OFFSET(start_dpf.flags),
+        0},
+
+       {ACPI_RSC_2BITFLAG,
+        ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
+        AML_OFFSET(start_dpf.flags),
+        2},
+       /*
+        * All done if flags byte is necessary -- if either priority value
+        * is not ACPI_ACCEPTABLE_CONFIGURATION
+        */
+       {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+        ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
+        ACPI_ACCEPTABLE_CONFIGURATION},
+
+       {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+        ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
+        ACPI_ACCEPTABLE_CONFIGURATION},
+
+       /* Flag byte is not necessary */
+
+       {ACPI_RSC_LENGTH, 0, 0,
+        sizeof(struct aml_resource_start_dependent_noprio)}
+};
index 56043fee96cb8885f3a6d25ebf96b55206481545..1fa63bc2e36f54dac2a03766a0dfc33fef2e094d 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,504 +49,182 @@ ACPI_MODULE_NAME("rsirq")
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_irq_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_get_irq
  *
  ******************************************************************************/
-acpi_status
-acpi_rs_irq_resource(u8 * byte_stream_buffer,
-                    acpi_size * bytes_consumed,
-                    u8 ** output_buffer, acpi_size * structure_size)
-{
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       u8 index;
-       u8 i;
-       acpi_size struct_size = ACPI_SIZEOF_RESOURCE(struct acpi_resource_irq);
-
-       ACPI_FUNCTION_TRACE("rs_irq_resource");
-
-       /*
-        * The number of bytes consumed are contained in the descriptor
-        * (Bits:0-1)
-        */
-       temp8 = *buffer;
-       *bytes_consumed = (temp8 & 0x03) + 1;
-       output_struct->id = ACPI_RSTYPE_IRQ;
-
-       /* Point to the 16-bits of Bytes 1 and 2 */
-
-       buffer += 1;
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-       output_struct->data.irq.number_of_interrupts = 0;
-
-       /* Decode the IRQ bits */
-
-       for (i = 0, index = 0; index < 16; index++) {
-               if ((temp16 >> index) & 0x01) {
-                       output_struct->data.irq.interrupts[i] = index;
-                       i++;
-               }
-       }
+struct acpi_rsconvert_info acpi_rs_get_irq[7] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IRQ,
+        ACPI_RS_SIZE(struct acpi_resource_irq),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_get_irq)},
 
-       /* Zero interrupts is valid */
+       /* Get the IRQ mask (bytes 1:2) */
 
-       output_struct->data.irq.number_of_interrupts = i;
-       if (i > 0) {
-               /* Calculate the structure size based upon the number of interrupts */
+       {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]),
+        AML_OFFSET(irq.irq_mask),
+        ACPI_RS_OFFSET(data.irq.interrupt_count)},
 
-               struct_size += ((acpi_size) i - 1) * 4;
-       }
+       /* Set default flags (others are zero) */
 
-       /* Point to Byte 3 if it is used */
+       {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.irq.triggering),
+        ACPI_EDGE_SENSITIVE,
+        1},
 
-       if (4 == *bytes_consumed) {
-               buffer += 2;
-               temp8 = *buffer;
+       /* All done if no flag byte present in descriptor */
 
-               /* Check for HE, LL interrupts */
+       {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 3},
 
-               switch (temp8 & 0x09) {
-               case 0x01:      /* HE */
-                       output_struct->data.irq.edge_level =
-                           ACPI_EDGE_SENSITIVE;
-                       output_struct->data.irq.active_high_low =
-                           ACPI_ACTIVE_HIGH;
-                       break;
+       /* Get flags: Triggering[0], Polarity[3], Sharing[4] */
 
-               case 0x08:      /* LL */
-                       output_struct->data.irq.edge_level =
-                           ACPI_LEVEL_SENSITIVE;
-                       output_struct->data.irq.active_high_low =
-                           ACPI_ACTIVE_LOW;
-                       break;
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering),
+        AML_OFFSET(irq.flags),
+        0},
 
-               default:
-                       /*
-                        * Only _LL and _HE polarity/trigger interrupts
-                        * are allowed (ACPI spec, section "IRQ Format")
-                        * so 0x00 and 0x09 are illegal.
-                        */
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Invalid interrupt polarity/trigger in resource list, %X\n",
-                                         temp8));
-                       return_ACPI_STATUS(AE_BAD_DATA);
-               }
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity),
+        AML_OFFSET(irq.flags),
+        3},
 
-               /* Check for sharable */
-
-               output_struct->data.irq.shared_exclusive = (temp8 >> 3) & 0x01;
-       } else {
-               /*
-                * Assume Edge Sensitive, Active High, Non-Sharable
-                * per ACPI Specification
-                */
-               output_struct->data.irq.edge_level = ACPI_EDGE_SENSITIVE;
-               output_struct->data.irq.active_high_low = ACPI_ACTIVE_HIGH;
-               output_struct->data.irq.shared_exclusive = ACPI_EXCLUSIVE;
-       }
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable),
+        AML_OFFSET(irq.flags),
+        4}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_irq_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_set_irq
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_irq_stream(struct acpi_resource *linked_list,
-                  u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       u8 index;
-       u8 IRqinfo_byte_needed;
-
-       ACPI_FUNCTION_TRACE("rs_irq_stream");
-
-       /*
-        * The descriptor field is set based upon whether a third byte is
-        * needed to contain the IRQ Information.
-        */
-       if (ACPI_EDGE_SENSITIVE == linked_list->data.irq.edge_level &&
-           ACPI_ACTIVE_HIGH == linked_list->data.irq.active_high_low &&
-           ACPI_EXCLUSIVE == linked_list->data.irq.shared_exclusive) {
-               *buffer = 0x22;
-               IRqinfo_byte_needed = FALSE;
-       } else {
-               *buffer = 0x23;
-               IRqinfo_byte_needed = TRUE;
-       }
-
-       buffer += 1;
-       temp16 = 0;
-
-       /* Loop through all of the interrupts and set the mask bits */
-
-       for (index = 0;
-            index < linked_list->data.irq.number_of_interrupts; index++) {
-               temp8 = (u8) linked_list->data.irq.interrupts[index];
-               temp16 |= 0x1 << temp8;
-       }
-
-       ACPI_MOVE_16_TO_16(buffer, &temp16);
-       buffer += 2;
-
-       /* Set the IRQ Info byte if needed. */
-
-       if (IRqinfo_byte_needed) {
-               temp8 = 0;
-               temp8 = (u8) ((linked_list->data.irq.shared_exclusive &
-                              0x01) << 4);
-
-               if (ACPI_LEVEL_SENSITIVE == linked_list->data.irq.edge_level &&
-                   ACPI_ACTIVE_LOW == linked_list->data.irq.active_high_low) {
-                       temp8 |= 0x08;
-               } else {
-                       temp8 |= 0x01;
-               }
-
-               *buffer = temp8;
-               buffer += 1;
-       }
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_extended_irq_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-acpi_status
-acpi_rs_extended_irq_resource(u8 * byte_stream_buffer,
-                             acpi_size * bytes_consumed,
-                             u8 ** output_buffer, acpi_size * structure_size)
-{
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       u8 *temp_ptr;
-       u8 index;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_ext_irq);
-
-       ACPI_FUNCTION_TRACE("rs_extended_irq_resource");
-
-       /* Get the Descriptor Length field */
-
-       buffer += 1;
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-
-       /* Validate minimum descriptor length */
-
-       if (temp16 < 6) {
-               return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
-       }
-
-       *bytes_consumed = temp16 + 3;
-       output_struct->id = ACPI_RSTYPE_EXT_IRQ;
-
-       /* Point to the Byte3 */
-
-       buffer += 2;
-       temp8 = *buffer;
-
-       output_struct->data.extended_irq.producer_consumer = temp8 & 0x01;
+struct acpi_rsconvert_info acpi_rs_set_irq[9] = {
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IRQ,
+        sizeof(struct aml_resource_irq),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_set_irq)},
 
-       /*
-        * Check for Interrupt Mode
-        *
-        * The definition of an Extended IRQ changed between ACPI spec v1.0b
-        * and ACPI spec 2.0 (section 6.4.3.6 in both).
-        *
-        * - Edge/Level are defined opposite in the table vs the headers
-        */
-       output_struct->data.extended_irq.edge_level =
-           (temp8 & 0x2) ? ACPI_EDGE_SENSITIVE : ACPI_LEVEL_SENSITIVE;
-
-       /* Check Interrupt Polarity */
-
-       output_struct->data.extended_irq.active_high_low = (temp8 >> 2) & 0x1;
-
-       /* Check for sharable */
-
-       output_struct->data.extended_irq.shared_exclusive = (temp8 >> 3) & 0x01;
+       /* Convert interrupt list to 16-bit IRQ bitmask */
 
-       /* Point to Byte4 (IRQ Table length) */
+       {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]),
+        AML_OFFSET(irq.irq_mask),
+        ACPI_RS_OFFSET(data.irq.interrupt_count)},
 
-       buffer += 1;
-       temp8 = *buffer;
+       /* Set the flags byte by default */
 
-       /* Must have at least one IRQ */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering),
+        AML_OFFSET(irq.flags),
+        0},
 
-       if (temp8 < 1) {
-               return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
-       }
-
-       output_struct->data.extended_irq.number_of_interrupts = temp8;
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity),
+        AML_OFFSET(irq.flags),
+        3},
 
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable),
+        AML_OFFSET(irq.flags),
+        4},
        /*
-        * Add any additional structure size to properly calculate
-        * the next pointer at the end of this function
+        * Check if the flags byte is necessary. Not needed if the flags are:
+        * ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_HIGH, ACPI_EXCLUSIVE
         */
-       struct_size += (temp8 - 1) * 4;
-
-       /* Point to Byte5 (First IRQ Number) */
-
-       buffer += 1;
-
-       /* Cycle through every IRQ in the table */
-
-       for (index = 0; index < temp8; index++) {
-               ACPI_MOVE_32_TO_32(&output_struct->data.extended_irq.
-                                  interrupts[index], buffer);
-
-               /* Point to the next IRQ */
-
-               buffer += 4;
-       }
-
-       /*
-        * This will leave us pointing to the Resource Source Index
-        * If it is present, then save it off and calculate the
-        * pointer to where the null terminated string goes:
-        * Each Interrupt takes 32-bits + the 5 bytes of the
-        * stream that are default.
-        *
-        * Note: Some resource descriptors will have an additional null, so
-        * we add 1 to the length.
-        */
-       if (*bytes_consumed >
-           ((acpi_size) output_struct->data.extended_irq.number_of_interrupts *
-            4) + (5 + 1)) {
-               /* Dereference the Index */
-
-               temp8 = *buffer;
-               output_struct->data.extended_irq.resource_source.index =
-                   (u32) temp8;
-
-               /* Point to the String */
-
-               buffer += 1;
-
-               /* Point the String pointer to the end of this structure. */
-
-               output_struct->data.extended_irq.resource_source.string_ptr =
-                   (char *)((char *)output_struct + struct_size);
+       {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+        ACPI_RS_OFFSET(data.irq.triggering),
+        ACPI_EDGE_SENSITIVE},
 
-               temp_ptr = (u8 *)
-                   output_struct->data.extended_irq.resource_source.string_ptr;
+       {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+        ACPI_RS_OFFSET(data.irq.polarity),
+        ACPI_ACTIVE_HIGH},
 
-               /* Copy the string into the buffer */
+       {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+        ACPI_RS_OFFSET(data.irq.sharable),
+        ACPI_EXCLUSIVE},
 
-               index = 0;
-               while (*buffer) {
-                       *temp_ptr = *buffer;
+       /* irq_no_flags() descriptor can be used */
 
-                       temp_ptr += 1;
-                       buffer += 1;
-                       index += 1;
-               }
-
-               /* Add the terminating null */
-
-               *temp_ptr = 0;
-               output_struct->data.extended_irq.resource_source.string_length =
-                   index + 1;
-
-               /*
-                * In order for the struct_size to fall on a 32-bit boundary,
-                * calculate the length of the string and expand the
-                * struct_size to the next 32-bit boundary.
-                */
-               temp8 = (u8) (index + 1);
-               struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
-       } else {
-               output_struct->data.extended_irq.resource_source.index = 0;
-               output_struct->data.extended_irq.resource_source.string_length =
-                   0;
-               output_struct->data.extended_irq.resource_source.string_ptr =
-                   NULL;
-       }
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_irq_noflags)}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_extended_irq_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_convert_ext_irq
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_extended_irq_stream(struct acpi_resource *linked_list,
-                           u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u16 *length_field;
-       u8 temp8 = 0;
-       u8 index;
+struct acpi_rsconvert_info acpi_rs_convert_ext_irq[9] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_IRQ,
+        ACPI_RS_SIZE(struct acpi_resource_extended_irq),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_irq)},
 
-       ACPI_FUNCTION_TRACE("rs_extended_irq_stream");
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_IRQ,
+        sizeof(struct aml_resource_extended_irq),
+        0},
 
-       /* Set the Descriptor Type field */
+       /* Flag bits */
 
-       *buffer = ACPI_RDESC_TYPE_EXTENDED_XRUPT;
-       buffer += 1;
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.producer_consumer),
+        AML_OFFSET(extended_irq.flags),
+        0},
 
-       /* Save a pointer to the Length field - to be filled in later */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.triggering),
+        AML_OFFSET(extended_irq.flags),
+        1},
 
-       length_field = ACPI_CAST_PTR(u16, buffer);
-       buffer += 2;
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.polarity),
+        AML_OFFSET(extended_irq.flags),
+        2},
 
-       /* Set the Interrupt vector flags */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.sharable),
+        AML_OFFSET(extended_irq.flags),
+        3},
 
-       temp8 = (u8) (linked_list->data.extended_irq.producer_consumer & 0x01);
-       temp8 |=
-           ((linked_list->data.extended_irq.shared_exclusive & 0x01) << 3);
+       /* IRQ Table length (Byte4) */
 
-       /*
-        * Set the Interrupt Mode
-        *
-        * The definition of an Extended IRQ changed between ACPI spec v1.0b
-        * and ACPI spec 2.0 (section 6.4.3.6 in both).  This code does not
-        * implement the more restrictive definition of 1.0b
-        *
-        * - Edge/Level are defined opposite in the table vs the headers
-        */
-       if (ACPI_EDGE_SENSITIVE == linked_list->data.extended_irq.edge_level) {
-               temp8 |= 0x2;
-       }
-
-       /* Set the Interrupt Polarity */
+       {ACPI_RSC_COUNT, ACPI_RS_OFFSET(data.extended_irq.interrupt_count),
+        AML_OFFSET(extended_irq.interrupt_count),
+        sizeof(u32)}
+       ,
 
-       temp8 |= ((linked_list->data.extended_irq.active_high_low & 0x1) << 2);
+       /* Copy every IRQ in the table, each is 32 bits */
 
-       *buffer = temp8;
-       buffer += 1;
+       {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.extended_irq.interrupts[0]),
+        AML_OFFSET(extended_irq.interrupts[0]),
+        0}
+       ,
 
-       /* Set the Interrupt table length */
+       /* Optional resource_source (Index and String) */
 
-       temp8 = (u8) linked_list->data.extended_irq.number_of_interrupts;
+       {ACPI_RSC_SOURCEX, ACPI_RS_OFFSET(data.extended_irq.resource_source),
+        ACPI_RS_OFFSET(data.extended_irq.interrupts[0]),
+        sizeof(struct aml_resource_extended_irq)}
+};
 
-       *buffer = temp8;
-       buffer += 1;
-
-       for (index = 0;
-            index < linked_list->data.extended_irq.number_of_interrupts;
-            index++) {
-               ACPI_MOVE_32_TO_32(buffer,
-                                  &linked_list->data.extended_irq.
-                                  interrupts[index]);
-               buffer += 4;
-       }
+/*******************************************************************************
+ *
+ * acpi_rs_convert_dma
+ *
+ ******************************************************************************/
 
-       /* Resource Source Index and Resource Source are optional */
+struct acpi_rsconvert_info acpi_rs_convert_dma[6] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_DMA,
+        ACPI_RS_SIZE(struct acpi_resource_dma),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_dma)},
 
-       if (0 != linked_list->data.extended_irq.resource_source.string_length) {
-               *buffer =
-                   (u8) linked_list->data.extended_irq.resource_source.index;
-               buffer += 1;
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_DMA,
+        sizeof(struct aml_resource_dma),
+        0},
 
-               /* Copy the string */
+       /* Flags: transfer preference, bus mastering, channel speed */
 
-               ACPI_STRCPY((char *)buffer,
-                           linked_list->data.extended_irq.resource_source.
-                           string_ptr);
+       {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.dma.transfer),
+        AML_OFFSET(dma.flags),
+        0},
 
-               /*
-                * Buffer needs to be set to the length of the string + one for the
-                * terminating null
-                */
-               buffer +=
-                   (acpi_size) (ACPI_STRLEN
-                                (linked_list->data.extended_irq.
-                                 resource_source.string_ptr) + 1);
-       }
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.dma.bus_master),
+        AML_OFFSET(dma.flags),
+        2},
 
-       /* Return the number of bytes consumed in this operation */
+       {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.dma.type),
+        AML_OFFSET(dma.flags),
+        5},
 
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
+       /* DMA channel mask bits */
 
-       /*
-        * Set the length field to the number of bytes consumed
-        * minus the header size (3 bytes)
-        */
-       *length_field = (u16) (*bytes_consumed - 3);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_BITMASK, ACPI_RS_OFFSET(data.dma.channels[0]),
+        AML_OFFSET(dma.dma_channel_mask),
+        ACPI_RS_OFFSET(data.dma.channel_count)}
+};
index 103eb31c284e5070d63fcc99bd111bf1e6c9b606..1434e786477e82de414ebab1afdadd20daee6c00 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,52 +49,12 @@ ACPI_MODULE_NAME("rslist")
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_get_resource_type
+ * FUNCTION:    acpi_rs_convert_aml_to_resources
  *
- * PARAMETERS:  resource_start_byte     - Byte 0 of a resource descriptor
- *
- * RETURN:      The Resource Type with no extraneous bits
- *
- * DESCRIPTION: Extract the Resource Type/Name from the first byte of
- *              a resource descriptor.
- *
- ******************************************************************************/
-u8 acpi_rs_get_resource_type(u8 resource_start_byte)
-{
-
-       ACPI_FUNCTION_ENTRY();
-
-       /* Determine if this is a small or large resource */
-
-       switch (resource_start_byte & ACPI_RDESC_TYPE_MASK) {
-       case ACPI_RDESC_TYPE_SMALL:
-
-               /* Small Resource Type -- Only bits 6:3 are valid */
-
-               return ((u8) (resource_start_byte & ACPI_RDESC_SMALL_MASK));
-
-       case ACPI_RDESC_TYPE_LARGE:
-
-               /* Large Resource Type -- All bits are valid */
-
-               return (resource_start_byte);
-
-       default:
-               /* Invalid type */
-               break;
-       }
-
-       return (0xFF);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_byte_stream_to_list
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource byte stream
- *              byte_stream_buffer_length - Length of byte_stream_buffer
- *              output_buffer           - Pointer to the buffer that will
- *                                        contain the output structures
+ * PARAMETERS:  Aml                 - Pointer to the resource byte stream
+ *              aml_length          - Length of Aml
+ *              output_buffer       - Pointer to the buffer that will
+ *                                    contain the output structures
  *
  * RETURN:      Status
  *
@@ -102,241 +62,78 @@ u8 acpi_rs_get_resource_type(u8 resource_start_byte)
  *              linked list of resources in the caller's output buffer
  *
  ******************************************************************************/
-
 acpi_status
-acpi_rs_byte_stream_to_list(u8 * byte_stream_buffer,
-                           u32 byte_stream_buffer_length, u8 * output_buffer)
+acpi_rs_convert_aml_to_resources(u8 * aml, u32 aml_length, u8 * output_buffer)
 {
+       struct acpi_resource *resource = (void *)output_buffer;
        acpi_status status;
-       acpi_size bytes_parsed = 0;
-       u8 resource_type = 0;
-       acpi_size bytes_consumed = 0;
-       u8 *buffer = output_buffer;
-       acpi_size structure_size = 0;
-       u8 end_tag_processed = FALSE;
-       struct acpi_resource *resource;
-
-       ACPI_FUNCTION_TRACE("rs_byte_stream_to_list");
-
-       while (bytes_parsed < byte_stream_buffer_length && !end_tag_processed) {
-               /* The next byte in the stream is the resource type */
-
-               resource_type = acpi_rs_get_resource_type(*byte_stream_buffer);
-
-               switch (resource_type) {
-               case ACPI_RDESC_TYPE_MEMORY_24:
-                       /*
-                        * 24-Bit Memory Resource
-                        */
-                       status = acpi_rs_memory24_resource(byte_stream_buffer,
-                                                          &bytes_consumed,
-                                                          &buffer,
-                                                          &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_LARGE_VENDOR:
-                       /*
-                        * Vendor Defined Resource
-                        */
-                       status = acpi_rs_vendor_resource(byte_stream_buffer,
-                                                        &bytes_consumed,
-                                                        &buffer,
-                                                        &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_MEMORY_32:
-                       /*
-                        * 32-Bit Memory Range Resource
-                        */
-                       status =
-                           acpi_rs_memory32_range_resource(byte_stream_buffer,
-                                                           &bytes_consumed,
-                                                           &buffer,
-                                                           &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_FIXED_MEMORY_32:
-                       /*
-                        * 32-Bit Fixed Memory Resource
-                        */
-                       status =
-                           acpi_rs_fixed_memory32_resource(byte_stream_buffer,
-                                                           &bytes_consumed,
-                                                           &buffer,
-                                                           &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE:
-               case ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE:
-                       /*
-                        * 64-Bit Address Resource
-                        */
-                       status = acpi_rs_address64_resource(byte_stream_buffer,
-                                                           &bytes_consumed,
-                                                           &buffer,
-                                                           &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE:
-                       /*
-                        * 32-Bit Address Resource
-                        */
-                       status = acpi_rs_address32_resource(byte_stream_buffer,
-                                                           &bytes_consumed,
-                                                           &buffer,
-                                                           &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE:
-                       /*
-                        * 16-Bit Address Resource
-                        */
-                       status = acpi_rs_address16_resource(byte_stream_buffer,
-                                                           &bytes_consumed,
-                                                           &buffer,
-                                                           &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_EXTENDED_XRUPT:
-                       /*
-                        * Extended IRQ
-                        */
-                       status =
-                           acpi_rs_extended_irq_resource(byte_stream_buffer,
-                                                         &bytes_consumed,
-                                                         &buffer,
-                                                         &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_IRQ_FORMAT:
-                       /*
-                        * IRQ Resource
-                        */
-                       status = acpi_rs_irq_resource(byte_stream_buffer,
-                                                     &bytes_consumed, &buffer,
-                                                     &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_DMA_FORMAT:
-                       /*
-                        * DMA Resource
-                        */
-                       status = acpi_rs_dma_resource(byte_stream_buffer,
-                                                     &bytes_consumed, &buffer,
-                                                     &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_START_DEPENDENT:
-                       /*
-                        * Start Dependent Functions Resource
-                        */
-                       status =
-                           acpi_rs_start_depend_fns_resource
-                           (byte_stream_buffer, &bytes_consumed, &buffer,
-                            &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_END_DEPENDENT:
-                       /*
-                        * End Dependent Functions Resource
-                        */
-                       status =
-                           acpi_rs_end_depend_fns_resource(byte_stream_buffer,
-                                                           &bytes_consumed,
-                                                           &buffer,
-                                                           &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_IO_PORT:
-                       /*
-                        * IO Port Resource
-                        */
-                       status = acpi_rs_io_resource(byte_stream_buffer,
-                                                    &bytes_consumed, &buffer,
-                                                    &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_FIXED_IO_PORT:
-                       /*
-                        * Fixed IO Port Resource
-                        */
-                       status = acpi_rs_fixed_io_resource(byte_stream_buffer,
-                                                          &bytes_consumed,
-                                                          &buffer,
-                                                          &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_SMALL_VENDOR:
-                       /*
-                        * Vendor Specific Resource
-                        */
-                       status = acpi_rs_vendor_resource(byte_stream_buffer,
-                                                        &bytes_consumed,
-                                                        &buffer,
-                                                        &structure_size);
-                       break;
-
-               case ACPI_RDESC_TYPE_END_TAG:
-                       /*
-                        * End Tag
-                        */
-                       end_tag_processed = TRUE;
-                       status = acpi_rs_end_tag_resource(byte_stream_buffer,
-                                                         &bytes_consumed,
-                                                         &buffer,
-                                                         &structure_size);
-                       break;
-
-               default:
-                       /*
-                        * Invalid/Unknown resource type
-                        */
-                       status = AE_AML_INVALID_RESOURCE_TYPE;
-                       break;
-               }
+       u8 resource_index;
+       u8 *end_aml;
+
+       ACPI_FUNCTION_TRACE("rs_convert_aml_to_resources");
 
+       end_aml = aml + aml_length;
+
+       /* Loop until end-of-buffer or an end_tag is found */
+
+       while (aml < end_aml) {
+               /* Validate the Resource Type and Resource Length */
+
+               status = acpi_ut_validate_resource(aml, &resource_index);
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
 
-               /* Update the return value and counter */
+               /* Convert the AML byte stream resource to a local resource struct */
 
-               bytes_parsed += bytes_consumed;
+               status =
+                   acpi_rs_convert_aml_to_resource(resource,
+                                                   ACPI_CAST_PTR(union
+                                                                 aml_resource,
+                                                                 aml),
+                                                   acpi_gbl_get_resource_dispatch
+                                                   [resource_index]);
+               if (ACPI_FAILURE(status)) {
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Could not convert AML resource (Type %X)",
+                                       *aml));
+                       return_ACPI_STATUS(status);
+               }
 
-               /* Set the byte stream to point to the next resource */
+               /* Normal exit on completion of an end_tag resource descriptor */
 
-               byte_stream_buffer += bytes_consumed;
+               if (acpi_ut_get_resource_type(aml) ==
+                   ACPI_RESOURCE_NAME_END_TAG) {
+                       return_ACPI_STATUS(AE_OK);
+               }
 
-               /* Set the Buffer to the next structure */
+               /* Point to the next input AML resource */
 
-               resource = ACPI_CAST_PTR(struct acpi_resource, buffer);
-               resource->length =
-                   (u32) ACPI_ALIGN_RESOURCE_SIZE(resource->length);
-               buffer += ACPI_ALIGN_RESOURCE_SIZE(structure_size);
-       }
+               aml += acpi_ut_get_descriptor_length(aml);
 
-       /* Check the reason for exiting the while loop */
+               /* Point to the next structure in the output buffer */
 
-       if (!end_tag_processed) {
-               return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
+               resource =
+                   ACPI_ADD_PTR(struct acpi_resource, resource,
+                                resource->length);
        }
 
-       return_ACPI_STATUS(AE_OK);
+       /* Did not find an end_tag resource descriptor */
+
+       return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_list_to_byte_stream
+ * FUNCTION:    acpi_rs_convert_resources_to_aml
  *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              byte_steam_size_needed  - Calculated size of the byte stream
- *                                        needed from calling
- *                                        acpi_rs_get_byte_stream_length()
- *                                        The size of the output_buffer is
- *                                        guaranteed to be >=
- *                                        byte_stream_size_needed
- *              output_buffer           - Pointer to the buffer that will
- *                                        contain the byte stream
+ * PARAMETERS:  Resource            - Pointer to the resource linked list
+ *              aml_size_needed     - Calculated size of the byte stream
+ *                                    needed from calling acpi_rs_get_aml_length()
+ *                                    The size of the output_buffer is
+ *                                    guaranteed to be >= aml_size_needed
+ *              output_buffer       - Pointer to the buffer that will
+ *                                    contain the byte stream
  *
  * RETURN:      Status
  *
@@ -346,180 +143,73 @@ acpi_rs_byte_stream_to_list(u8 * byte_stream_buffer,
  ******************************************************************************/
 
 acpi_status
-acpi_rs_list_to_byte_stream(struct acpi_resource *linked_list,
-                           acpi_size byte_stream_size_needed,
-                           u8 * output_buffer)
+acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
+                                acpi_size aml_size_needed, u8 * output_buffer)
 {
+       u8 *aml = output_buffer;
+       u8 *end_aml = output_buffer + aml_size_needed;
        acpi_status status;
-       u8 *buffer = output_buffer;
-       acpi_size bytes_consumed = 0;
-       u8 done = FALSE;
-
-       ACPI_FUNCTION_TRACE("rs_list_to_byte_stream");
-
-       while (!done) {
-               switch (linked_list->id) {
-               case ACPI_RSTYPE_IRQ:
-                       /*
-                        * IRQ Resource
-                        */
-                       status =
-                           acpi_rs_irq_stream(linked_list, &buffer,
-                                              &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_DMA:
-                       /*
-                        * DMA Resource
-                        */
-                       status =
-                           acpi_rs_dma_stream(linked_list, &buffer,
-                                              &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_START_DPF:
-                       /*
-                        * Start Dependent Functions Resource
-                        */
-                       status = acpi_rs_start_depend_fns_stream(linked_list,
-                                                                &buffer,
-                                                                &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_END_DPF:
-                       /*
-                        * End Dependent Functions Resource
-                        */
-                       status = acpi_rs_end_depend_fns_stream(linked_list,
-                                                              &buffer,
-                                                              &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_IO:
-                       /*
-                        * IO Port Resource
-                        */
-                       status =
-                           acpi_rs_io_stream(linked_list, &buffer,
-                                             &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_FIXED_IO:
-                       /*
-                        * Fixed IO Port Resource
-                        */
-                       status =
-                           acpi_rs_fixed_io_stream(linked_list, &buffer,
-                                                   &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_VENDOR:
-                       /*
-                        * Vendor Defined Resource
-                        */
-                       status =
-                           acpi_rs_vendor_stream(linked_list, &buffer,
-                                                 &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_END_TAG:
-                       /*
-                        * End Tag
-                        */
-                       status =
-                           acpi_rs_end_tag_stream(linked_list, &buffer,
-                                                  &bytes_consumed);
-
-                       /* An End Tag indicates the end of the Resource Template */
-
-                       done = TRUE;
-                       break;
-
-               case ACPI_RSTYPE_MEM24:
-                       /*
-                        * 24-Bit Memory Resource
-                        */
-                       status =
-                           acpi_rs_memory24_stream(linked_list, &buffer,
-                                                   &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_MEM32:
-                       /*
-                        * 32-Bit Memory Range Resource
-                        */
-                       status =
-                           acpi_rs_memory32_range_stream(linked_list, &buffer,
-                                                         &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_FIXED_MEM32:
-                       /*
-                        * 32-Bit Fixed Memory Resource
-                        */
-                       status =
-                           acpi_rs_fixed_memory32_stream(linked_list, &buffer,
-                                                         &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_ADDRESS16:
-                       /*
-                        * 16-Bit Address Descriptor Resource
-                        */
-                       status = acpi_rs_address16_stream(linked_list, &buffer,
-                                                         &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_ADDRESS32:
-                       /*
-                        * 32-Bit Address Descriptor Resource
-                        */
-                       status = acpi_rs_address32_stream(linked_list, &buffer,
-                                                         &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_ADDRESS64:
-                       /*
-                        * 64-Bit Address Descriptor Resource
-                        */
-                       status = acpi_rs_address64_stream(linked_list, &buffer,
-                                                         &bytes_consumed);
-                       break;
-
-               case ACPI_RSTYPE_EXT_IRQ:
-                       /*
-                        * Extended IRQ Resource
-                        */
-                       status =
-                           acpi_rs_extended_irq_stream(linked_list, &buffer,
-                                                       &bytes_consumed);
-                       break;
-
-               default:
-                       /*
-                        * If we get here, everything is out of sync,
-                        * so exit with an error
-                        */
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Invalid descriptor type (%X) in resource list\n",
-                                         linked_list->id));
-                       status = AE_BAD_DATA;
-                       break;
+
+       ACPI_FUNCTION_TRACE("rs_convert_resources_to_aml");
+
+       /* Walk the resource descriptor list, convert each descriptor */
+
+       while (aml < end_aml) {
+               /* Validate the (internal) Resource Type */
+
+               if (resource->type > ACPI_RESOURCE_TYPE_MAX) {
+                       ACPI_ERROR((AE_INFO,
+                                   "Invalid descriptor type (%X) in resource list",
+                                   resource->type));
+                       return_ACPI_STATUS(AE_BAD_DATA);
                }
 
+               /* Perform the conversion */
+
+               status = acpi_rs_convert_resource_to_aml(resource,
+                                                        ACPI_CAST_PTR(union
+                                                                      aml_resource,
+                                                                      aml),
+                                                        acpi_gbl_set_resource_dispatch
+                                                        [resource->type]);
                if (ACPI_FAILURE(status)) {
+                       ACPI_EXCEPTION((AE_INFO, status,
+                                       "Could not convert resource (type %X) to AML",
+                                       resource->type));
                        return_ACPI_STATUS(status);
                }
 
-               /* Set the Buffer to point to the open byte */
+               /* Perform final sanity check on the new AML resource descriptor */
+
+               status =
+                   acpi_ut_validate_resource(ACPI_CAST_PTR
+                                             (union aml_resource, aml), NULL);
+               if (ACPI_FAILURE(status)) {
+                       return_ACPI_STATUS(status);
+               }
 
-               buffer += bytes_consumed;
+               /* Check for end-of-list, normal exit */
 
-               /* Point to the next object */
+               if (resource->type == ACPI_RESOURCE_TYPE_END_TAG) {
+                       /* An End Tag indicates the end of the input Resource Template */
 
-               linked_list = ACPI_PTR_ADD(struct acpi_resource,
-                                          linked_list, linked_list->length);
+                       return_ACPI_STATUS(AE_OK);
+               }
+
+               /*
+                * Extract the total length of the new descriptor and set the
+                * Aml to point to the next (output) resource descriptor
+                */
+               aml += acpi_ut_get_descriptor_length(aml);
+
+               /* Point to the next input resource descriptor */
+
+               resource =
+                   ACPI_ADD_PTR(struct acpi_resource, resource,
+                                resource->length);
        }
 
-       return_ACPI_STATUS(AE_OK);
+       /* Completed buffer, but did not find an end_tag resource descriptor */
+
+       return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
 }
index daba1a1ed46db522d747241567db8685e385e497..a5131936d6904187f9d6d480a795f6d7f5ae3fa8 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,454 +49,187 @@ ACPI_MODULE_NAME("rsmemory")
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_memory24_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_convert_memory24
  *
  ******************************************************************************/
-acpi_status
-acpi_rs_memory24_resource(u8 * byte_stream_buffer,
-                         acpi_size * bytes_consumed,
-                         u8 ** output_buffer, acpi_size * structure_size)
-{
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_mem24);
-
-       ACPI_FUNCTION_TRACE("rs_memory24_resource");
-
-       /* Point past the Descriptor to get the number of bytes consumed */
-
-       buffer += 1;
-
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-       buffer += 2;
-       *bytes_consumed = (acpi_size) temp16 + 3;
-       output_struct->id = ACPI_RSTYPE_MEM24;
-
-       /* Check Byte 3 the Read/Write bit */
-
-       temp8 = *buffer;
-       buffer += 1;
-       output_struct->data.memory24.read_write_attribute = temp8 & 0x01;
-
-       /* Get min_base_address (Bytes 4-5) */
-
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-       buffer += 2;
-       output_struct->data.memory24.min_base_address = temp16;
-
-       /* Get max_base_address (Bytes 6-7) */
-
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-       buffer += 2;
-       output_struct->data.memory24.max_base_address = temp16;
+struct acpi_rsconvert_info acpi_rs_convert_memory24[4] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY24,
+        ACPI_RS_SIZE(struct acpi_resource_memory24),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory24)},
 
-       /* Get Alignment (Bytes 8-9) */
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY24,
+        sizeof(struct aml_resource_memory24),
+        0},
 
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-       buffer += 2;
-       output_struct->data.memory24.alignment = temp16;
+       /* Read/Write bit */
 
-       /* Get range_length (Bytes 10-11) */
-
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-       output_struct->data.memory24.range_length = temp16;
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory24.write_protect),
+        AML_OFFSET(memory24.flags),
+        0},
+       /*
+        * These fields are contiguous in both the source and destination:
+        * Minimum Base Address
+        * Maximum Base Address
+        * Address Base Alignment
+        * Range Length
+        */
+       {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.memory24.minimum),
+        AML_OFFSET(memory24.minimum),
+        4}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_memory24_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_convert_memory32
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_memory24_stream(struct acpi_resource *linked_list,
-                       u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-
-       ACPI_FUNCTION_TRACE("rs_memory24_stream");
-
-       /* The descriptor field is static */
-
-       *buffer = 0x81;
-       buffer += 1;
+struct acpi_rsconvert_info acpi_rs_convert_memory32[4] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY32,
+        ACPI_RS_SIZE(struct acpi_resource_memory32),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory32)},
 
-       /* The length field is static */
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY32,
+        sizeof(struct aml_resource_memory32),
+        0},
 
-       temp16 = 0x09;
-       ACPI_MOVE_16_TO_16(buffer, &temp16);
-       buffer += 2;
+       /* Read/Write bit */
 
-       /* Set the Information Byte */
-
-       temp8 = (u8) (linked_list->data.memory24.read_write_attribute & 0x01);
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Set the Range minimum base address */
-
-       ACPI_MOVE_32_TO_16(buffer,
-                          &linked_list->data.memory24.min_base_address);
-       buffer += 2;
-
-       /* Set the Range maximum base address */
-
-       ACPI_MOVE_32_TO_16(buffer,
-                          &linked_list->data.memory24.max_base_address);
-       buffer += 2;
-
-       /* Set the base alignment */
-
-       ACPI_MOVE_32_TO_16(buffer, &linked_list->data.memory24.alignment);
-       buffer += 2;
-
-       /* Set the range length */
-
-       ACPI_MOVE_32_TO_16(buffer, &linked_list->data.memory24.range_length);
-       buffer += 2;
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory32.write_protect),
+        AML_OFFSET(memory32.flags),
+        0},
+       /*
+        * These fields are contiguous in both the source and destination:
+        * Minimum Base Address
+        * Maximum Base Address
+        * Address Base Alignment
+        * Range Length
+        */
+       {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.memory32.minimum),
+        AML_OFFSET(memory32.minimum),
+        4}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_memory32_range_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_convert_fixed_memory32
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_memory32_range_resource(u8 * byte_stream_buffer,
-                               acpi_size * bytes_consumed,
-                               u8 ** output_buffer, acpi_size * structure_size)
-{
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_mem32);
-
-       ACPI_FUNCTION_TRACE("rs_memory32_range_resource");
-
-       /* Point past the Descriptor to get the number of bytes consumed */
-
-       buffer += 1;
+struct acpi_rsconvert_info acpi_rs_convert_fixed_memory32[4] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_MEMORY32,
+        ACPI_RS_SIZE(struct acpi_resource_fixed_memory32),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_memory32)},
 
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
-       buffer += 2;
-       *bytes_consumed = (acpi_size) temp16 + 3;
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_MEMORY32,
+        sizeof(struct aml_resource_fixed_memory32),
+        0},
 
-       output_struct->id = ACPI_RSTYPE_MEM32;
+       /* Read/Write bit */
 
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.fixed_memory32.write_protect),
+        AML_OFFSET(fixed_memory32.flags),
+        0},
        /*
-        *  Point to the place in the output buffer where the data portion will
-        *  begin.
-        *  1. Set the RESOURCE_DATA * Data to point to its own address, then
-        *  2. Set the pointer to the next address.
-        *
-        *  NOTE: output_struct->Data is cast to u8, otherwise, this addition adds
-        *  4 * sizeof(RESOURCE_DATA) instead of 4 * sizeof(u8)
+        * These fields are contiguous in both the source and destination:
+        * Base Address
+        * Range Length
         */
-
-       /* Check Byte 3 the Read/Write bit */
-
-       temp8 = *buffer;
-       buffer += 1;
-
-       output_struct->data.memory32.read_write_attribute = temp8 & 0x01;
-
-       /* Get min_base_address (Bytes 4-7) */
-
-       ACPI_MOVE_32_TO_32(&output_struct->data.memory32.min_base_address,
-                          buffer);
-       buffer += 4;
-
-       /* Get max_base_address (Bytes 8-11) */
-
-       ACPI_MOVE_32_TO_32(&output_struct->data.memory32.max_base_address,
-                          buffer);
-       buffer += 4;
-
-       /* Get Alignment (Bytes 12-15) */
-
-       ACPI_MOVE_32_TO_32(&output_struct->data.memory32.alignment, buffer);
-       buffer += 4;
-
-       /* Get range_length (Bytes 16-19) */
-
-       ACPI_MOVE_32_TO_32(&output_struct->data.memory32.range_length, buffer);
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.fixed_memory32.address),
+        AML_OFFSET(fixed_memory32.address),
+        2}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_fixed_memory32_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_get_vendor_small
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_fixed_memory32_resource(u8 * byte_stream_buffer,
-                               acpi_size * bytes_consumed,
-                               u8 ** output_buffer, acpi_size * structure_size)
-{
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_fixed_mem32);
-
-       ACPI_FUNCTION_TRACE("rs_fixed_memory32_resource");
+struct acpi_rsconvert_info acpi_rs_get_vendor_small[3] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
+        ACPI_RS_SIZE(struct acpi_resource_vendor),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_small)},
 
-       /* Point past the Descriptor to get the number of bytes consumed */
+       /* Length of the vendor data (byte count) */
 
-       buffer += 1;
-       ACPI_MOVE_16_TO_16(&temp16, buffer);
+       {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
+        0,
+        sizeof(u8)}
+       ,
 
-       buffer += 2;
-       *bytes_consumed = (acpi_size) temp16 + 3;
+       /* Vendor data */
 
-       output_struct->id = ACPI_RSTYPE_FIXED_MEM32;
-
-       /* Check Byte 3 the Read/Write bit */
-
-       temp8 = *buffer;
-       buffer += 1;
-       output_struct->data.fixed_memory32.read_write_attribute = temp8 & 0x01;
-
-       /* Get range_base_address (Bytes 4-7) */
-
-       ACPI_MOVE_32_TO_32(&output_struct->data.fixed_memory32.
-                          range_base_address, buffer);
-       buffer += 4;
-
-       /* Get range_length (Bytes 8-11) */
-
-       ACPI_MOVE_32_TO_32(&output_struct->data.fixed_memory32.range_length,
-                          buffer);
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
+        sizeof(struct aml_resource_small_header),
+        0}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_memory32_range_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_get_vendor_large
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_memory32_range_stream(struct acpi_resource *linked_list,
-                             u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-
-       ACPI_FUNCTION_TRACE("rs_memory32_range_stream");
-
-       /* The descriptor field is static */
-
-       *buffer = 0x85;
-       buffer += 1;
-
-       /* The length field is static */
-
-       temp16 = 0x11;
-
-       ACPI_MOVE_16_TO_16(buffer, &temp16);
-       buffer += 2;
-
-       /* Set the Information Byte */
-
-       temp8 = (u8) (linked_list->data.memory32.read_write_attribute & 0x01);
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Set the Range minimum base address */
-
-       ACPI_MOVE_32_TO_32(buffer,
-                          &linked_list->data.memory32.min_base_address);
-       buffer += 4;
-
-       /* Set the Range maximum base address */
-
-       ACPI_MOVE_32_TO_32(buffer,
-                          &linked_list->data.memory32.max_base_address);
-       buffer += 4;
+struct acpi_rsconvert_info acpi_rs_get_vendor_large[3] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
+        ACPI_RS_SIZE(struct acpi_resource_vendor),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_large)},
 
-       /* Set the base alignment */
+       /* Length of the vendor data (byte count) */
 
-       ACPI_MOVE_32_TO_32(buffer, &linked_list->data.memory32.alignment);
-       buffer += 4;
+       {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
+        0,
+        sizeof(u8)}
+       ,
 
-       /* Set the range length */
+       /* Vendor data */
 
-       ACPI_MOVE_32_TO_32(buffer, &linked_list->data.memory32.range_length);
-       buffer += 4;
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
+        sizeof(struct aml_resource_large_header),
+        0}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_fixed_memory32_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_set_vendor
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_fixed_memory32_stream(struct acpi_resource *linked_list,
-                             u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-
-       ACPI_FUNCTION_TRACE("rs_fixed_memory32_stream");
+struct acpi_rsconvert_info acpi_rs_set_vendor[7] = {
+       /* Default is a small vendor descriptor */
 
-       /* The descriptor field is static */
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_SMALL,
+        sizeof(struct aml_resource_small_header),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_set_vendor)},
 
-       *buffer = 0x86;
-       buffer += 1;
+       /* Get the length and copy the data */
 
-       /* The length field is static */
+       {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
+        0,
+        0},
 
-       temp16 = 0x09;
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
+        sizeof(struct aml_resource_small_header),
+        0},
 
-       ACPI_MOVE_16_TO_16(buffer, &temp16);
-       buffer += 2;
-
-       /* Set the Information Byte */
-
-       temp8 =
-           (u8) (linked_list->data.fixed_memory32.read_write_attribute & 0x01);
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Set the Range base address */
-
-       ACPI_MOVE_32_TO_32(buffer,
-                          &linked_list->data.fixed_memory32.
-                          range_base_address);
-       buffer += 4;
+       /*
+        * All done if the Vendor byte length is 7 or less, meaning that it will
+        * fit within a small descriptor
+        */
+       {ACPI_RSC_EXIT_LE, 0, 0, 7},
 
-       /* Set the range length */
+       /* Must create a large vendor descriptor */
 
-       ACPI_MOVE_32_TO_32(buffer,
-                          &linked_list->data.fixed_memory32.range_length);
-       buffer += 4;
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_LARGE,
+        sizeof(struct aml_resource_large_header),
+        0},
 
-       /* Return the number of bytes consumed in this operation */
+       {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
+        0,
+        0},
 
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
+        sizeof(struct aml_resource_large_header),
+        0}
+};
index 7a8a34e757f506a2c4d758b206bec6458b7c54bc..ed866cf1c6d23c7f7ede4a11fb366ec64ecc9824 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #define _COMPONENT          ACPI_RESOURCES
 ACPI_MODULE_NAME("rsmisc")
 
+#define INIT_RESOURCE_TYPE(i)       i->resource_offset
+#define INIT_RESOURCE_LENGTH(i)     i->aml_offset
+#define INIT_TABLE_LENGTH(i)        i->value
+#define COMPARE_OPCODE(i)           i->resource_offset
+#define COMPARE_TARGET(i)           i->aml_offset
+#define COMPARE_VALUE(i)            i->value
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_end_tag_resource
+ * FUNCTION:    acpi_rs_convert_aml_to_resource
  *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
+ * PARAMETERS:  Resource            - Pointer to the resource descriptor
+ *              Aml                 - Where the AML descriptor is returned
+ *              Info                - Pointer to appropriate conversion table
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * DESCRIPTION: Convert an external AML resource descriptor to the corresponding
+ *              internal resource descriptor
  *
  ******************************************************************************/
 acpi_status
-acpi_rs_end_tag_resource(u8 * byte_stream_buffer,
-                        acpi_size * bytes_consumed,
-                        u8 ** output_buffer, acpi_size * structure_size)
+acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
+                               union aml_resource *aml,
+                               struct acpi_rsconvert_info *info)
 {
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       acpi_size struct_size = ACPI_RESOURCE_LENGTH;
-
-       ACPI_FUNCTION_TRACE("rs_end_tag_resource");
-
-       /* The number of bytes consumed is static */
-
-       *bytes_consumed = 2;
-
-       /*  Fill out the structure */
-
-       output_struct->id = ACPI_RSTYPE_END_TAG;
-
-       /* Set the Length parameter */
-
-       output_struct->length = 0;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_end_tag_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-acpi_status
-acpi_rs_end_tag_stream(struct acpi_resource *linked_list,
-                      u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u8 temp8 = 0;
-
-       ACPI_FUNCTION_TRACE("rs_end_tag_stream");
-
-       /* The descriptor field is static */
-
-       *buffer = 0x79;
-       buffer += 1;
-
-       /*
-        * Set the Checksum - zero means that the resource data is treated as if
-        * the checksum operation succeeded (ACPI Spec 1.0b Section 6.4.2.8)
-        */
-       temp8 = 0;
-
-       *buffer = temp8;
-       buffer += 1;
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_vendor_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-acpi_status
-acpi_rs_vendor_resource(u8 * byte_stream_buffer,
-                       acpi_size * bytes_consumed,
-                       u8 ** output_buffer, acpi_size * structure_size)
-{
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
+       acpi_rs_length aml_resource_length;
+       void *source;
+       void *destination;
+       char *target;
+       u8 count;
+       u8 flags_mode = FALSE;
+       u16 item_count = 0;
        u16 temp16 = 0;
-       u8 temp8 = 0;
-       u8 index;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_vendor);
-
-       ACPI_FUNCTION_TRACE("rs_vendor_resource");
-
-       /* Dereference the Descriptor to find if this is a large or small item. */
-
-       temp8 = *buffer;
-
-       if (temp8 & 0x80) {
-               /* Large Item, point to the length field */
-
-               buffer += 1;
 
-               /* Dereference */
+       ACPI_FUNCTION_TRACE("rs_get_resource");
 
-               ACPI_MOVE_16_TO_16(&temp16, buffer);
+       if (((acpi_native_uint) resource) & 0x3) {
+               /* Each internal resource struct is expected to be 32-bit aligned */
 
-               /* Calculate bytes consumed */
-
-               *bytes_consumed = (acpi_size) temp16 + 3;
-
-               /* Point to the first vendor byte */
-
-               buffer += 2;
-       } else {
-               /* Small Item, dereference the size */
-
-               temp16 = (u8) (*buffer & 0x07);
-
-               /* Calculate bytes consumed */
-
-               *bytes_consumed = (acpi_size) temp16 + 1;
-
-               /* Point to the first vendor byte */
-
-               buffer += 1;
+               ACPI_WARNING((AE_INFO,
+                             "Misaligned resource pointer (get): %p Type %2.2X Len %X",
+                             resource, resource->type, resource->length));
        }
 
-       output_struct->id = ACPI_RSTYPE_VENDOR;
-       output_struct->data.vendor_specific.length = temp16;
+       /* Extract the resource Length field (does not include header length) */
 
-       for (index = 0; index < temp16; index++) {
-               output_struct->data.vendor_specific.reserved[index] = *buffer;
-               buffer += 1;
-       }
+       aml_resource_length = acpi_ut_get_resource_length(aml);
 
        /*
-        * In order for the struct_size to fall on a 32-bit boundary,
-        * calculate the length of the vendor string and expand the
-        * struct_size to the next 32-bit boundary.
+        * First table entry must be ACPI_RSC_INITxxx and must contain the
+        * table length (# of table entries)
         */
-       struct_size += ACPI_ROUND_UP_to_32_bITS(temp16);
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_vendor_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-acpi_status
-acpi_rs_vendor_stream(struct acpi_resource *linked_list,
-                     u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u16 temp16 = 0;
-       u8 temp8 = 0;
-       u8 index;
-
-       ACPI_FUNCTION_TRACE("rs_vendor_stream");
-
-       /* Dereference the length to find if this is a large or small item. */
-
-       if (linked_list->data.vendor_specific.length > 7) {
-               /* Large Item, Set the descriptor field and length bytes */
-
-               *buffer = 0x84;
-               buffer += 1;
-
-               temp16 = (u16) linked_list->data.vendor_specific.length;
-
-               ACPI_MOVE_16_TO_16(buffer, &temp16);
-               buffer += 2;
-       } else {
-               /* Small Item, Set the descriptor field */
-
-               temp8 = 0x70;
-               temp8 |= (u8) linked_list->data.vendor_specific.length;
+       count = INIT_TABLE_LENGTH(info);
+
+       while (count) {
+               /*
+                * Source is the external AML byte stream buffer,
+                * destination is the internal resource descriptor
+                */
+               source = ACPI_ADD_PTR(void, aml, info->aml_offset);
+               destination =
+                   ACPI_ADD_PTR(void, resource, info->resource_offset);
+
+               switch (info->opcode) {
+               case ACPI_RSC_INITGET:
+                       /*
+                        * Get the resource type and the initial (minimum) length
+                        */
+                       ACPI_MEMSET(resource, 0, INIT_RESOURCE_LENGTH(info));
+                       resource->type = INIT_RESOURCE_TYPE(info);
+                       resource->length = INIT_RESOURCE_LENGTH(info);
+                       break;
+
+               case ACPI_RSC_INITSET:
+                       break;
+
+               case ACPI_RSC_FLAGINIT:
+
+                       flags_mode = TRUE;
+                       break;
+
+               case ACPI_RSC_1BITFLAG:
+                       /*
+                        * Mask and shift the flag bit
+                        */
+                       ACPI_SET8(destination) = (u8)
+                           ((ACPI_GET8(source) >> info->value) & 0x01);
+                       break;
+
+               case ACPI_RSC_2BITFLAG:
+                       /*
+                        * Mask and shift the flag bits
+                        */
+                       ACPI_SET8(destination) = (u8)
+                           ((ACPI_GET8(source) >> info->value) & 0x03);
+                       break;
+
+               case ACPI_RSC_COUNT:
+
+                       item_count = ACPI_GET8(source);
+                       ACPI_SET8(destination) = (u8) item_count;
+
+                       resource->length = resource->length +
+                           (info->value * (item_count - 1));
+                       break;
+
+               case ACPI_RSC_COUNT16:
+
+                       item_count = aml_resource_length;
+                       ACPI_SET16(destination) = item_count;
+
+                       resource->length = resource->length +
+                           (info->value * (item_count - 1));
+                       break;
+
+               case ACPI_RSC_LENGTH:
+
+                       resource->length = resource->length + info->value;
+                       break;
+
+               case ACPI_RSC_MOVE8:
+               case ACPI_RSC_MOVE16:
+               case ACPI_RSC_MOVE32:
+               case ACPI_RSC_MOVE64:
+                       /*
+                        * Raw data move. Use the Info value field unless item_count has
+                        * been previously initialized via a COUNT opcode
+                        */
+                       if (info->value) {
+                               item_count = info->value;
+                       }
+                       acpi_rs_move_data(destination, source, item_count,
+                                         info->opcode);
+                       break;
+
+               case ACPI_RSC_SET8:
+
+                       ACPI_MEMSET(destination, info->aml_offset, info->value);
+                       break;
+
+               case ACPI_RSC_DATA8:
+
+                       target = ACPI_ADD_PTR(char, resource, info->value);
+                       ACPI_MEMCPY(destination, source, ACPI_GET16(target));
+                       break;
+
+               case ACPI_RSC_ADDRESS:
+                       /*
+                        * Common handler for address descriptor flags
+                        */
+                       if (!acpi_rs_get_address_common(resource, aml)) {
+                               return_ACPI_STATUS
+                                   (AE_AML_INVALID_RESOURCE_TYPE);
+                       }
+                       break;
+
+               case ACPI_RSC_SOURCE:
+                       /*
+                        * Optional resource_source (Index and String)
+                        */
+                       resource->length +=
+                           acpi_rs_get_resource_source(aml_resource_length,
+                                                       info->value,
+                                                       destination, aml, NULL);
+                       break;
+
+               case ACPI_RSC_SOURCEX:
+                       /*
+                        * Optional resource_source (Index and String). This is the more
+                        * complicated case used by the Interrupt() macro
+                        */
+                       target =
+                           ACPI_ADD_PTR(char, resource,
+                                        info->aml_offset + (item_count * 4));
+
+                       resource->length +=
+                           acpi_rs_get_resource_source(aml_resource_length,
+                                                       (acpi_rs_length) (((item_count - 1) * sizeof(u32)) + info->value), destination, aml, target);
+                       break;
+
+               case ACPI_RSC_BITMASK:
+                       /*
+                        * 8-bit encoded bitmask (DMA macro)
+                        */
+                       item_count =
+                           acpi_rs_decode_bitmask(ACPI_GET8(source),
+                                                  destination);
+                       if (item_count) {
+                               resource->length += (item_count - 1);
+                       }
+
+                       target = ACPI_ADD_PTR(char, resource, info->value);
+                       ACPI_SET8(target) = (u8) item_count;
+                       break;
+
+               case ACPI_RSC_BITMASK16:
+                       /*
+                        * 16-bit encoded bitmask (IRQ macro)
+                        */
+                       ACPI_MOVE_16_TO_16(&temp16, source);
+
+                       item_count =
+                           acpi_rs_decode_bitmask(temp16, destination);
+                       if (item_count) {
+                               resource->length += (item_count - 1);
+                       }
+
+                       target = ACPI_ADD_PTR(char, resource, info->value);
+                       ACPI_SET8(target) = (u8) item_count;
+                       break;
+
+               case ACPI_RSC_EXIT_NE:
+                       /*
+                        * Control - Exit conversion if not equal
+                        */
+                       switch (info->resource_offset) {
+                       case ACPI_RSC_COMPARE_AML_LENGTH:
+                               if (aml_resource_length != info->value) {
+                                       goto exit;
+                               }
+                               break;
+
+                       case ACPI_RSC_COMPARE_VALUE:
+                               if (ACPI_GET8(source) != info->value) {
+                                       goto exit;
+                               }
+                               break;
+
+                       default:
+
+                               ACPI_ERROR((AE_INFO,
+                                           "Invalid conversion sub-opcode"));
+                               return_ACPI_STATUS(AE_BAD_PARAMETER);
+                       }
+                       break;
+
+               default:
+
+                       ACPI_ERROR((AE_INFO, "Invalid conversion opcode"));
+                       return_ACPI_STATUS(AE_BAD_PARAMETER);
+               }
 
-               *buffer = temp8;
-               buffer += 1;
+               count--;
+               info++;
        }
 
-       /* Loop through all of the Vendor Specific fields */
+      exit:
+       if (!flags_mode) {
+               /* Round the resource struct length up to the next 32-bit boundary */
 
-       for (index = 0; index < linked_list->data.vendor_specific.length;
-            index++) {
-               temp8 = linked_list->data.vendor_specific.reserved[index];
-
-               *buffer = temp8;
-               buffer += 1;
+               resource->length = ACPI_ROUND_UP_to_32_bITS(resource->length);
        }
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
        return_ACPI_STATUS(AE_OK);
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_start_depend_fns_resource
+ * FUNCTION:    acpi_rs_convert_resource_to_aml
  *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
+ * PARAMETERS:  Resource            - Pointer to the resource descriptor
+ *              Aml                 - Where the AML descriptor is returned
+ *              Info                - Pointer to appropriate conversion table
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * DESCRIPTION: Convert an internal resource descriptor to the corresponding
+ *              external AML resource descriptor.
  *
  ******************************************************************************/
 
 acpi_status
-acpi_rs_start_depend_fns_resource(u8 * byte_stream_buffer,
-                                 acpi_size * bytes_consumed,
-                                 u8 ** output_buffer,
-                                 acpi_size * structure_size)
+acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
+                               union aml_resource *aml,
+                               struct acpi_rsconvert_info *info)
 {
-       u8 *buffer = byte_stream_buffer;
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       u8 temp8 = 0;
-       acpi_size struct_size =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_start_dpf);
-
-       ACPI_FUNCTION_TRACE("rs_start_depend_fns_resource");
-
-       /* The number of bytes consumed are found in the descriptor (Bits:0-1) */
-
-       temp8 = *buffer;
-
-       *bytes_consumed = (temp8 & 0x01) + 1;
-
-       output_struct->id = ACPI_RSTYPE_START_DPF;
-
-       /* Point to Byte 1 if it is used */
-
-       if (2 == *bytes_consumed) {
-               buffer += 1;
-               temp8 = *buffer;
-
-               /* Check Compatibility priority */
-
-               output_struct->data.start_dpf.compatibility_priority =
-                   temp8 & 0x03;
-
-               if (3 == output_struct->data.start_dpf.compatibility_priority) {
-                       return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE);
-               }
-
-               /* Check Performance/Robustness preference */
+       void *source = NULL;
+       void *destination;
+       acpi_rsdesc_size aml_length = 0;
+       u8 count;
+       u16 temp16 = 0;
+       u16 item_count = 0;
 
-               output_struct->data.start_dpf.performance_robustness =
-                   (temp8 >> 2) & 0x03;
+       ACPI_FUNCTION_TRACE("rs_convert_resource_to_aml");
 
-               if (3 == output_struct->data.start_dpf.performance_robustness) {
-                       return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE);
+       /*
+        * First table entry must be ACPI_RSC_INITxxx and must contain the
+        * table length (# of table entries)
+        */
+       count = INIT_TABLE_LENGTH(info);
+
+       while (count) {
+               /*
+                * Source is the internal resource descriptor,
+                * destination is the external AML byte stream buffer
+                */
+               source = ACPI_ADD_PTR(void, resource, info->resource_offset);
+               destination = ACPI_ADD_PTR(void, aml, info->aml_offset);
+
+               switch (info->opcode) {
+               case ACPI_RSC_INITSET:
+
+                       ACPI_MEMSET(aml, 0, INIT_RESOURCE_LENGTH(info));
+                       aml_length = INIT_RESOURCE_LENGTH(info);
+                       acpi_rs_set_resource_header(INIT_RESOURCE_TYPE(info),
+                                                   aml_length, aml);
+                       break;
+
+               case ACPI_RSC_INITGET:
+                       break;
+
+               case ACPI_RSC_FLAGINIT:
+                       /*
+                        * Clear the flag byte
+                        */
+                       ACPI_SET8(destination) = 0;
+                       break;
+
+               case ACPI_RSC_1BITFLAG:
+                       /*
+                        * Mask and shift the flag bit
+                        */
+                       ACPI_SET8(destination) |= (u8)
+                           ((ACPI_GET8(source) & 0x01) << info->value);
+                       break;
+
+               case ACPI_RSC_2BITFLAG:
+                       /*
+                        * Mask and shift the flag bits
+                        */
+                       ACPI_SET8(destination) |= (u8)
+                           ((ACPI_GET8(source) & 0x03) << info->value);
+                       break;
+
+               case ACPI_RSC_COUNT:
+
+                       item_count = ACPI_GET8(source);
+                       ACPI_SET8(destination) = (u8) item_count;
+
+                       aml_length =
+                           (u16) (aml_length +
+                                  (info->value * (item_count - 1)));
+                       break;
+
+               case ACPI_RSC_COUNT16:
+
+                       item_count = ACPI_GET16(source);
+                       aml_length = (u16) (aml_length + item_count);
+                       acpi_rs_set_resource_length(aml_length, aml);
+                       break;
+
+               case ACPI_RSC_LENGTH:
+
+                       acpi_rs_set_resource_length(info->value, aml);
+                       break;
+
+               case ACPI_RSC_MOVE8:
+               case ACPI_RSC_MOVE16:
+               case ACPI_RSC_MOVE32:
+               case ACPI_RSC_MOVE64:
+
+                       if (info->value) {
+                               item_count = info->value;
+                       }
+                       acpi_rs_move_data(destination, source, item_count,
+                                         info->opcode);
+                       break;
+
+               case ACPI_RSC_ADDRESS:
+
+                       /* Set the Resource Type, General Flags, and Type-Specific Flags */
+
+                       acpi_rs_set_address_common(aml, resource);
+                       break;
+
+               case ACPI_RSC_SOURCEX:
+                       /*
+                        * Optional resource_source (Index and String)
+                        */
+                       aml_length =
+                           acpi_rs_set_resource_source(aml,
+                                                       (acpi_rs_length)
+                                                       aml_length, source);
+                       acpi_rs_set_resource_length(aml_length, aml);
+                       break;
+
+               case ACPI_RSC_SOURCE:
+                       /*
+                        * Optional resource_source (Index and String). This is the more
+                        * complicated case used by the Interrupt() macro
+                        */
+                       aml_length =
+                           acpi_rs_set_resource_source(aml, info->value,
+                                                       source);
+                       acpi_rs_set_resource_length(aml_length, aml);
+                       break;
+
+               case ACPI_RSC_BITMASK:
+                       /*
+                        * 8-bit encoded bitmask (DMA macro)
+                        */
+                       ACPI_SET8(destination) = (u8)
+                           acpi_rs_encode_bitmask(source,
+                                                  *ACPI_ADD_PTR(u8, resource,
+                                                                info->value));
+                       break;
+
+               case ACPI_RSC_BITMASK16:
+                       /*
+                        * 16-bit encoded bitmask (IRQ macro)
+                        */
+                       temp16 = acpi_rs_encode_bitmask(source,
+                                                       *ACPI_ADD_PTR(u8,
+                                                                     resource,
+                                                                     info->
+                                                                     value));
+                       ACPI_MOVE_16_TO_16(destination, &temp16);
+                       break;
+
+               case ACPI_RSC_EXIT_LE:
+                       /*
+                        * Control - Exit conversion if less than or equal
+                        */
+                       if (item_count <= info->value) {
+                               goto exit;
+                       }
+                       break;
+
+               case ACPI_RSC_EXIT_NE:
+                       /*
+                        * Control - Exit conversion if not equal
+                        */
+                       switch (COMPARE_OPCODE(info)) {
+                       case ACPI_RSC_COMPARE_VALUE:
+
+                               if (*ACPI_ADD_PTR(u8, resource,
+                                                 COMPARE_TARGET(info)) !=
+                                   COMPARE_VALUE(info)) {
+                                       goto exit;
+                               }
+                               break;
+
+                       default:
+
+                               ACPI_ERROR((AE_INFO,
+                                           "Invalid conversion sub-opcode"));
+                               return_ACPI_STATUS(AE_BAD_PARAMETER);
+                       }
+                       break;
+
+               default:
+
+                       ACPI_ERROR((AE_INFO, "Invalid conversion opcode"));
+                       return_ACPI_STATUS(AE_BAD_PARAMETER);
                }
-       } else {
-               output_struct->data.start_dpf.compatibility_priority =
-                   ACPI_ACCEPTABLE_CONFIGURATION;
 
-               output_struct->data.start_dpf.performance_robustness =
-                   ACPI_ACCEPTABLE_CONFIGURATION;
+               count--;
+               info++;
        }
 
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
+      exit:
        return_ACPI_STATUS(AE_OK);
 }
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_end_depend_fns_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
- *
- ******************************************************************************/
-
-acpi_status
-acpi_rs_end_depend_fns_resource(u8 * byte_stream_buffer,
-                               acpi_size * bytes_consumed,
-                               u8 ** output_buffer, acpi_size * structure_size)
-{
-       struct acpi_resource *output_struct = (void *)*output_buffer;
-       acpi_size struct_size = ACPI_RESOURCE_LENGTH;
-
-       ACPI_FUNCTION_TRACE("rs_end_depend_fns_resource");
-
-       /* The number of bytes consumed is static */
-
-       *bytes_consumed = 1;
+#if 0
+/* Previous resource validations */
 
-       /*  Fill out the structure */
-
-       output_struct->id = ACPI_RSTYPE_END_DPF;
-
-       /* Set the Length parameter */
-
-       output_struct->length = (u32) struct_size;
-
-       /* Return the final size of the structure */
-
-       *structure_size = struct_size;
-       return_ACPI_STATUS(AE_OK);
+if (aml->ext_address64.revision_iD != AML_RESOURCE_EXTENDED_ADDRESS_REVISION) {
+       return_ACPI_STATUS(AE_SUPPORT);
 }
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_start_depend_fns_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - u32 pointer that is filled with
- *                                        the number of bytes of the
- *                                        output_buffer used
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-acpi_status
-acpi_rs_start_depend_fns_stream(struct acpi_resource *linked_list,
-                               u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-       u8 temp8 = 0;
-
-       ACPI_FUNCTION_TRACE("rs_start_depend_fns_stream");
+if (resource->data.start_dpf.performance_robustness >= 3) {
+       return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE);
+}
 
+if (((aml->irq.flags & 0x09) == 0x00) || ((aml->irq.flags & 0x09) == 0x09)) {
        /*
-        * The descriptor field is set based upon whether a byte is needed
-        * to contain Priority data.
+        * Only [active_high, edge_sensitive] or [active_low, level_sensitive]
+        * polarity/trigger interrupts are allowed (ACPI spec, section
+        * "IRQ Format"), so 0x00 and 0x09 are illegal.
         */
-       if (ACPI_ACCEPTABLE_CONFIGURATION ==
-           linked_list->data.start_dpf.compatibility_priority &&
-           ACPI_ACCEPTABLE_CONFIGURATION ==
-           linked_list->data.start_dpf.performance_robustness) {
-               *buffer = 0x30;
-       } else {
-               *buffer = 0x31;
-               buffer += 1;
-
-               /* Set the Priority Byte Definition */
-
-               temp8 = 0;
-               temp8 =
-                   (u8) ((linked_list->data.start_dpf.
-                          performance_robustness & 0x03) << 2);
-               temp8 |=
-                   (linked_list->data.start_dpf.compatibility_priority & 0x03);
-               *buffer = temp8;
-       }
-
-       buffer += 1;
-
-       /* Return the number of bytes consumed in this operation */
-
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
+       ACPI_ERROR((AE_INFO,
+                   "Invalid interrupt polarity/trigger in resource list, %X",
+                   aml->irq.flags));
+       return_ACPI_STATUS(AE_BAD_DATA);
 }
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_end_depend_fns_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
- *
- ******************************************************************************/
-
-acpi_status
-acpi_rs_end_depend_fns_stream(struct acpi_resource *linked_list,
-                             u8 ** output_buffer, acpi_size * bytes_consumed)
-{
-       u8 *buffer = *output_buffer;
-
-       ACPI_FUNCTION_TRACE("rs_end_depend_fns_stream");
-
-       /* The descriptor field is static */
-
-       *buffer = 0x38;
-       buffer += 1;
+resource->data.extended_irq.interrupt_count = temp8;
+if (temp8 < 1) {
+       /* Must have at least one IRQ */
 
-       /* Return the number of bytes consumed in this operation */
+       return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
+}
 
-       *bytes_consumed = ACPI_PTR_DIFF(buffer, *output_buffer);
-       return_ACPI_STATUS(AE_OK);
+if (resource->data.dma.transfer == 0x03) {
+       ACPI_ERROR((AE_INFO, "Invalid DMA.Transfer preference (3)"));
+       return_ACPI_STATUS(AE_BAD_DATA);
 }
+#endif
index 4446778eaf7927df16f9b29a49fb2a6395871086..25b5aedd661201eb7d6573d758d380e993025d1e 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #define _COMPONENT          ACPI_RESOURCES
 ACPI_MODULE_NAME("rsutils")
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_decode_bitmask
+ *
+ * PARAMETERS:  Mask            - Bitmask to decode
+ *              List            - Where the converted list is returned
+ *
+ * RETURN:      Count of bits set (length of list)
+ *
+ * DESCRIPTION: Convert a bit mask into a list of values
+ *
+ ******************************************************************************/
+u8 acpi_rs_decode_bitmask(u16 mask, u8 * list)
+{
+       acpi_native_uint i;
+       u8 bit_count;
+
+       ACPI_FUNCTION_ENTRY();
+
+       /* Decode the mask bits */
+
+       for (i = 0, bit_count = 0; mask; i++) {
+               if (mask & 0x0001) {
+                       list[bit_count] = (u8) i;
+                       bit_count++;
+               }
+
+               mask >>= 1;
+       }
+
+       return (bit_count);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_encode_bitmask
+ *
+ * PARAMETERS:  List            - List of values to encode
+ *              Count           - Length of list
+ *
+ * RETURN:      Encoded bitmask
+ *
+ * DESCRIPTION: Convert a list of values to an encoded bitmask
+ *
+ ******************************************************************************/
+
+u16 acpi_rs_encode_bitmask(u8 * list, u8 count)
+{
+       acpi_native_uint i;
+       u16 mask;
+
+       ACPI_FUNCTION_ENTRY();
+
+       /* Encode the list into a single bitmask */
+
+       for (i = 0, mask = 0; i < count; i++) {
+               mask |= (0x0001 << list[i]);
+       }
+
+       return (mask);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_move_data
+ *
+ * PARAMETERS:  Destination         - Pointer to the destination descriptor
+ *              Source              - Pointer to the source descriptor
+ *              item_count          - How many items to move
+ *              move_type           - Byte width
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Move multiple data items from one descriptor to another. Handles
+ *              alignment issues and endian issues if necessary, as configured
+ *              via the ACPI_MOVE_* macros. (This is why a memcpy is not used)
+ *
+ ******************************************************************************/
+
+void
+acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
+{
+       acpi_native_uint i;
+
+       ACPI_FUNCTION_ENTRY();
+
+       /* One move per item */
+
+       for (i = 0; i < item_count; i++) {
+               switch (move_type) {
+                       /*
+                        * For the 8-bit case, we can perform the move all at once
+                        * since there are no alignment or endian issues
+                        */
+               case ACPI_RSC_MOVE8:
+                       ACPI_MEMCPY(destination, source, item_count);
+                       return;
+
+                       /*
+                        * 16-, 32-, and 64-bit cases must use the move macros that perform
+                        * endian conversion and/or accomodate hardware that cannot perform
+                        * misaligned memory transfers
+                        */
+               case ACPI_RSC_MOVE16:
+                       ACPI_MOVE_16_TO_16(&ACPI_CAST_PTR(u16, destination)[i],
+                                          &ACPI_CAST_PTR(u16, source)[i]);
+                       break;
+
+               case ACPI_RSC_MOVE32:
+                       ACPI_MOVE_32_TO_32(&ACPI_CAST_PTR(u32, destination)[i],
+                                          &ACPI_CAST_PTR(u32, source)[i]);
+                       break;
+
+               case ACPI_RSC_MOVE64:
+                       ACPI_MOVE_64_TO_64(&ACPI_CAST_PTR(u64, destination)[i],
+                                          &ACPI_CAST_PTR(u64, source)[i]);
+                       break;
+
+               default:
+                       return;
+               }
+       }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_set_resource_length
+ *
+ * PARAMETERS:  total_length        - Length of the AML descriptor, including
+ *                                    the header and length fields.
+ *              Aml                 - Pointer to the raw AML descriptor
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Set the resource_length field of an AML
+ *              resource descriptor, both Large and Small descriptors are
+ *              supported automatically. Note: Descriptor Type field must
+ *              be valid.
+ *
+ ******************************************************************************/
+
+void
+acpi_rs_set_resource_length(acpi_rsdesc_size total_length,
+                           union aml_resource *aml)
+{
+       acpi_rs_length resource_length;
+
+       ACPI_FUNCTION_ENTRY();
+
+       /* Length is the total descriptor length minus the header length */
+
+       resource_length = (acpi_rs_length)
+           (total_length - acpi_ut_get_resource_header_length(aml));
+
+       /* Length is stored differently for large and small descriptors */
+
+       if (aml->small_header.descriptor_type & ACPI_RESOURCE_NAME_LARGE) {
+               /* Large descriptor -- bytes 1-2 contain the 16-bit length */
+
+               ACPI_MOVE_16_TO_16(&aml->large_header.resource_length,
+                                  &resource_length);
+       } else {
+               /* Small descriptor -- bits 2:0 of byte 0 contain the length */
+
+               aml->small_header.descriptor_type = (u8)
+
+                   /* Clear any existing length, preserving descriptor type bits */
+                   ((aml->small_header.
+                     descriptor_type & ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK)
+
+                    | resource_length);
+       }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_set_resource_header
+ *
+ * PARAMETERS:  descriptor_type     - Byte to be inserted as the type
+ *              total_length        - Length of the AML descriptor, including
+ *                                    the header and length fields.
+ *              Aml                 - Pointer to the raw AML descriptor
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Set the descriptor_type and resource_length fields of an AML
+ *              resource descriptor, both Large and Small descriptors are
+ *              supported automatically
+ *
+ ******************************************************************************/
+
+void
+acpi_rs_set_resource_header(u8 descriptor_type,
+                           acpi_rsdesc_size total_length,
+                           union aml_resource *aml)
+{
+       ACPI_FUNCTION_ENTRY();
+
+       /* Set the Resource Type */
+
+       aml->small_header.descriptor_type = descriptor_type;
+
+       /* Set the Resource Length */
+
+       acpi_rs_set_resource_length(total_length, aml);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_strcpy
+ *
+ * PARAMETERS:  Destination         - Pointer to the destination string
+ *              Source              - Pointer to the source string
+ *
+ * RETURN:      String length, including NULL terminator
+ *
+ * DESCRIPTION: Local string copy that returns the string length, saving a
+ *              strcpy followed by a strlen.
+ *
+ ******************************************************************************/
+
+static u16 acpi_rs_strcpy(char *destination, char *source)
+{
+       u16 i;
+
+       ACPI_FUNCTION_ENTRY();
+
+       for (i = 0; source[i]; i++) {
+               destination[i] = source[i];
+       }
+
+       destination[i] = 0;
+
+       /* Return string length including the NULL terminator */
+
+       return ((u16) (i + 1));
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_get_resource_source
+ *
+ * PARAMETERS:  resource_length     - Length field of the descriptor
+ *              minimum_length      - Minimum length of the descriptor (minus
+ *                                    any optional fields)
+ *              resource_source     - Where the resource_source is returned
+ *              Aml                 - Pointer to the raw AML descriptor
+ *              string_ptr          - (optional) where to store the actual
+ *                                    resource_source string
+ *
+ * RETURN:      Length of the string plus NULL terminator, rounded up to 32 bit
+ *
+ * DESCRIPTION: Copy the optional resource_source data from a raw AML descriptor
+ *              to an internal resource descriptor
+ *
+ ******************************************************************************/
+
+acpi_rs_length
+acpi_rs_get_resource_source(acpi_rs_length resource_length,
+                           acpi_rs_length minimum_length,
+                           struct acpi_resource_source * resource_source,
+                           union aml_resource * aml, char *string_ptr)
+{
+       acpi_rsdesc_size total_length;
+       u8 *aml_resource_source;
+
+       ACPI_FUNCTION_ENTRY();
+
+       total_length =
+           resource_length + sizeof(struct aml_resource_large_header);
+       aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length);
+
+       /*
+        * resource_source is present if the length of the descriptor is longer than
+        * the minimum length.
+        *
+        * Note: Some resource descriptors will have an additional null, so
+        * we add 1 to the minimum length.
+        */
+       if (total_length > (acpi_rsdesc_size) (minimum_length + 1)) {
+               /* Get the resource_source_index */
+
+               resource_source->index = aml_resource_source[0];
+
+               resource_source->string_ptr = string_ptr;
+               if (!string_ptr) {
+                       /*
+                        * String destination pointer is not specified; Set the String
+                        * pointer to the end of the current resource_source structure.
+                        */
+                       resource_source->string_ptr =
+                           ACPI_ADD_PTR(char, resource_source,
+                                        sizeof(struct acpi_resource_source));
+               }
+
+               /*
+                * In order for the struct_size to fall on a 32-bit boundary, calculate
+                * the length of the string (+1 for the NULL terminator) and expand the
+                * struct_size to the next 32-bit boundary.
+                *
+                * Zero the entire area of the buffer.
+                */
+               total_length =
+                   ACPI_ROUND_UP_to_32_bITS(ACPI_STRLEN
+                                            ((char *)&aml_resource_source[1]) +
+                                            1);
+               ACPI_MEMSET(resource_source->string_ptr, 0, total_length);
+
+               /* Copy the resource_source string to the destination */
+
+               resource_source->string_length =
+                   acpi_rs_strcpy(resource_source->string_ptr,
+                                  (char *)&aml_resource_source[1]);
+
+               return ((acpi_rs_length) total_length);
+       }
+
+       /* resource_source is not present */
+
+       resource_source->index = 0;
+       resource_source->string_length = 0;
+       resource_source->string_ptr = NULL;
+       return (0);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_set_resource_source
+ *
+ * PARAMETERS:  Aml                 - Pointer to the raw AML descriptor
+ *              minimum_length      - Minimum length of the descriptor (minus
+ *                                    any optional fields)
+ *              resource_source     - Internal resource_source
+
+ *
+ * RETURN:      Total length of the AML descriptor
+ *
+ * DESCRIPTION: Convert an optional resource_source from internal format to a
+ *              raw AML resource descriptor
+ *
+ ******************************************************************************/
+
+acpi_rsdesc_size
+acpi_rs_set_resource_source(union aml_resource * aml,
+                           acpi_rs_length minimum_length,
+                           struct acpi_resource_source * resource_source)
+{
+       u8 *aml_resource_source;
+       acpi_rsdesc_size descriptor_length;
+
+       ACPI_FUNCTION_ENTRY();
+
+       descriptor_length = minimum_length;
+
+       /* Non-zero string length indicates presence of a resource_source */
+
+       if (resource_source->string_length) {
+               /* Point to the end of the AML descriptor */
+
+               aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length);
+
+               /* Copy the resource_source_index */
+
+               aml_resource_source[0] = (u8) resource_source->index;
+
+               /* Copy the resource_source string */
+
+               ACPI_STRCPY((char *)&aml_resource_source[1],
+                           resource_source->string_ptr);
+
+               /*
+                * Add the length of the string (+ 1 for null terminator) to the
+                * final descriptor length
+                */
+               descriptor_length +=
+                   ((acpi_rsdesc_size) resource_source->string_length + 1);
+       }
+
+       /* Return the new total length of the AML descriptor */
+
+       return (descriptor_length);
+}
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_rs_get_prt_method_data
@@ -65,8 +448,9 @@ ACPI_MODULE_NAME("rsutils")
  *              and the contents of the callers buffer is undefined.
  *
  ******************************************************************************/
+
 acpi_status
-acpi_rs_get_prt_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer)
+acpi_rs_get_prt_method_data(acpi_handle handle, struct acpi_buffer * ret_buffer)
 {
        union acpi_operand_object *obj_desc;
        acpi_status status;
@@ -284,7 +668,7 @@ acpi_rs_set_srs_method_data(acpi_handle handle, struct acpi_buffer *in_buffer)
         * Convert the linked list into a byte stream
         */
        buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
-       status = acpi_rs_create_byte_stream(in_buffer->pointer, &buffer);
+       status = acpi_rs_create_aml_resources(in_buffer->pointer, &buffer);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
index ee5a5c509199a59785b9ecb853f4eaf4eeb9b0dc..88b67077aeeb12cf1a1cd1f85db6be9daaef0526 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,13 +57,17 @@ ACPI_MODULE_NAME("rsxface")
        ACPI_COPY_FIELD(out, in, decode);                    \
        ACPI_COPY_FIELD(out, in, min_address_fixed);         \
        ACPI_COPY_FIELD(out, in, max_address_fixed);         \
-       ACPI_COPY_FIELD(out, in, attribute);                 \
+       ACPI_COPY_FIELD(out, in, info);                      \
        ACPI_COPY_FIELD(out, in, granularity);               \
-       ACPI_COPY_FIELD(out, in, min_address_range);         \
-       ACPI_COPY_FIELD(out, in, max_address_range);         \
-       ACPI_COPY_FIELD(out, in, address_translation_offset); \
+       ACPI_COPY_FIELD(out, in, minimum);                   \
+       ACPI_COPY_FIELD(out, in, maximum);                   \
+       ACPI_COPY_FIELD(out, in, translation_offset);        \
        ACPI_COPY_FIELD(out, in, address_length);            \
        ACPI_COPY_FIELD(out, in, resource_source);
+/* Local prototypes */
+static acpi_status
+acpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context);
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_get_irq_routing_table
@@ -86,6 +90,7 @@ ACPI_MODULE_NAME("rsxface")
  *              the object indicated by the passed device_handle.
  *
  ******************************************************************************/
+
 acpi_status
 acpi_get_irq_routing_table(acpi_handle device_handle,
                           struct acpi_buffer *ret_buffer)
@@ -222,12 +227,12 @@ EXPORT_SYMBOL(acpi_get_possible_resources);
  *
  * FUNCTION:    acpi_walk_resources
  *
- * PARAMETERS:  device_handle   - a handle to the device object for the
+ * PARAMETERS:  device_handle   - Handle to the device object for the
  *                                device we are querying
- *              Path            - method name of the resources we want
+ *              Name            - Method name of the resources we want
  *                                (METHOD_NAME__CRS or METHOD_NAME__PRS)
- *              user_function   - called for each resource
- *              Context         - passed to user_function
+ *              user_function   - Called for each resource
+ *              Context         - Passed to user_function
  *
  * RETURN:      Status
  *
@@ -239,79 +244,74 @@ EXPORT_SYMBOL(acpi_get_possible_resources);
 
 acpi_status
 acpi_walk_resources(acpi_handle device_handle,
-                   char *path,
+                   char *name,
                    ACPI_WALK_RESOURCE_CALLBACK user_function, void *context)
 {
        acpi_status status;
-       struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+       struct acpi_buffer buffer;
        struct acpi_resource *resource;
-       struct acpi_resource *buffer_end;
+       struct acpi_resource *resource_end;
 
        ACPI_FUNCTION_TRACE("acpi_walk_resources");
 
-       if (!device_handle ||
-           (ACPI_STRNCMP(path, METHOD_NAME__CRS, sizeof(METHOD_NAME__CRS)) &&
-            ACPI_STRNCMP(path, METHOD_NAME__PRS, sizeof(METHOD_NAME__PRS)))) {
+       /* Parameter validation */
+
+       if (!device_handle || !user_function || !name ||
+           (ACPI_STRNCMP(name, METHOD_NAME__CRS, sizeof(METHOD_NAME__CRS)) &&
+            ACPI_STRNCMP(name, METHOD_NAME__PRS, sizeof(METHOD_NAME__PRS)))) {
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
-       status = acpi_rs_get_method_data(device_handle, path, &buffer);
+       /* Get the _CRS or _PRS resource list */
+
+       buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
+       status = acpi_rs_get_method_data(device_handle, name, &buffer);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
 
-       /* Setup pointers */
+       /* Buffer now contains the resource list */
 
-       resource = (struct acpi_resource *)buffer.pointer;
-       buffer_end = ACPI_CAST_PTR(struct acpi_resource,
-                                  ((u8 *) buffer.pointer + buffer.length));
+       resource = ACPI_CAST_PTR(struct acpi_resource, buffer.pointer);
+       resource_end =
+           ACPI_ADD_PTR(struct acpi_resource, buffer.pointer, buffer.length);
 
-       /* Walk the resource list */
+       /* Walk the resource list until the end_tag is found (or buffer end) */
 
-       for (;;) {
-               if (!resource || resource->id == ACPI_RSTYPE_END_TAG) {
+       while (resource < resource_end) {
+               /* Sanity check the resource */
+
+               if (resource->type > ACPI_RESOURCE_TYPE_MAX) {
+                       status = AE_AML_INVALID_RESOURCE_TYPE;
                        break;
                }
 
-               status = user_function(resource, context);
-
-               switch (status) {
-               case AE_OK:
-               case AE_CTRL_DEPTH:
+               /* Invoke the user function, abort on any error returned */
 
-                       /* Just keep going */
+               status = user_function(resource, context);
+               if (ACPI_FAILURE(status)) {
+                       if (status == AE_CTRL_TERMINATE) {
+                               /* This is an OK termination by the user function */
 
-                       status = AE_OK;
+                               status = AE_OK;
+                       }
                        break;
+               }
 
-               case AE_CTRL_TERMINATE:
-
-                       /* Exit now, with OK stats */
-
-                       status = AE_OK;
-                       goto cleanup;
-
-               default:
-
-                       /* All others are valid exceptions */
+               /* end_tag indicates end-of-list */
 
-                       goto cleanup;
+               if (resource->type == ACPI_RESOURCE_TYPE_END_TAG) {
+                       break;
                }
 
                /* Get the next resource descriptor */
 
-               resource = ACPI_NEXT_RESOURCE(resource);
-
-               /* Check for end-of-buffer */
-
-               if (resource >= buffer_end) {
-                       goto cleanup;
-               }
+               resource =
+                   ACPI_ADD_PTR(struct acpi_resource, resource,
+                                resource->length);
        }
 
-      cleanup:
-
-       acpi_os_free(buffer.pointer);
+       ACPI_MEM_FREE(buffer.pointer);
        return_ACPI_STATUS(status);
 }
 
@@ -360,8 +360,8 @@ EXPORT_SYMBOL(acpi_set_current_resources);
  *
  * FUNCTION:    acpi_resource_to_address64
  *
- * PARAMETERS:  resource                - Pointer to a resource
- *              out                     - Pointer to the users's return
+ * PARAMETERS:  Resource                - Pointer to a resource
+ *              Out                     - Pointer to the users's return
  *                                        buffer (a struct
  *                                        struct acpi_resource_address64)
  *
@@ -381,20 +381,26 @@ acpi_resource_to_address64(struct acpi_resource *resource,
        struct acpi_resource_address16 *address16;
        struct acpi_resource_address32 *address32;
 
-       switch (resource->id) {
-       case ACPI_RSTYPE_ADDRESS16:
+       if (!resource || !out) {
+               return (AE_BAD_PARAMETER);
+       }
+
+       /* Convert 16 or 32 address descriptor to 64 */
+
+       switch (resource->type) {
+       case ACPI_RESOURCE_TYPE_ADDRESS16:
 
                address16 = (struct acpi_resource_address16 *)&resource->data;
                ACPI_COPY_ADDRESS(out, address16);
                break;
 
-       case ACPI_RSTYPE_ADDRESS32:
+       case ACPI_RESOURCE_TYPE_ADDRESS32:
 
                address32 = (struct acpi_resource_address32 *)&resource->data;
                ACPI_COPY_ADDRESS(out, address32);
                break;
 
-       case ACPI_RSTYPE_ADDRESS64:
+       case ACPI_RESOURCE_TYPE_ADDRESS64:
 
                /* Simple copy for 64 bit source */
 
@@ -410,3 +416,113 @@ acpi_resource_to_address64(struct acpi_resource *resource,
 }
 
 EXPORT_SYMBOL(acpi_resource_to_address64);
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_get_vendor_resource
+ *
+ * PARAMETERS:  device_handle       - Handle for the parent device object
+ *              Name                - Method name for the parent resource
+ *                                    (METHOD_NAME__CRS or METHOD_NAME__PRS)
+ *              Uuid                - Pointer to the UUID to be matched.
+ *                                    includes both subtype and 16-byte UUID
+ *              ret_buffer          - Where the vendor resource is returned
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Walk a resource template for the specified evice to find a
+ *              vendor-defined resource that matches the supplied UUID and
+ *              UUID subtype. Returns a struct acpi_resource of type Vendor.
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_get_vendor_resource(acpi_handle device_handle,
+                        char *name,
+                        struct acpi_vendor_uuid * uuid,
+                        struct acpi_buffer * ret_buffer)
+{
+       struct acpi_vendor_walk_info info;
+       acpi_status status;
+
+       /* Other parameters are validated by acpi_walk_resources */
+
+       if (!uuid || !ret_buffer) {
+               return (AE_BAD_PARAMETER);
+       }
+
+       info.uuid = uuid;
+       info.buffer = ret_buffer;
+       info.status = AE_NOT_EXIST;
+
+       /* Walk the _CRS or _PRS resource list for this device */
+
+       status =
+           acpi_walk_resources(device_handle, name,
+                               acpi_rs_match_vendor_resource, &info);
+       if (ACPI_FAILURE(status)) {
+               return (status);
+       }
+
+       return (info.status);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_rs_match_vendor_resource
+ *
+ * PARAMETERS:  ACPI_WALK_RESOURCE_CALLBACK
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Match a vendor resource via the ACPI 3.0 UUID
+ *
+ ******************************************************************************/
+
+static acpi_status
+acpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context)
+{
+       struct acpi_vendor_walk_info *info = context;
+       struct acpi_resource_vendor_typed *vendor;
+       struct acpi_buffer *buffer;
+       acpi_status status;
+
+       /* Ignore all descriptors except Vendor */
+
+       if (resource->type != ACPI_RESOURCE_TYPE_VENDOR) {
+               return (AE_OK);
+       }
+
+       vendor = &resource->data.vendor_typed;
+
+       /*
+        * For a valid match, these conditions must hold:
+        *
+        * 1) Length of descriptor data must be at least as long as a UUID struct
+        * 2) The UUID subtypes must match
+        * 3) The UUID data must match
+        */
+       if ((vendor->byte_length < (ACPI_UUID_LENGTH + 1)) ||
+           (vendor->uuid_subtype != info->uuid->subtype) ||
+           (ACPI_MEMCMP(vendor->uuid, info->uuid->data, ACPI_UUID_LENGTH))) {
+               return (AE_OK);
+       }
+
+       /* Validate/Allocate/Clear caller buffer */
+
+       buffer = info->buffer;
+       status = acpi_ut_initialize_buffer(buffer, resource->length);
+       if (ACPI_FAILURE(status)) {
+               return (status);
+       }
+
+       /* Found the correct resource, copy and return it */
+
+       ACPI_MEMCPY(buffer->pointer, resource, resource->length);
+       buffer->length = resource->length;
+
+       /* Found the desired descriptor, terminate resource walk */
+
+       info->status = AE_OK;
+       return (AE_CTRL_TERMINATE);
+}
index 3b26a7104363a6e060ef5524ae19e0e3ce513b9f..9271e5209ac1a310521d47e7213e9d6822b42547 100644 (file)
@@ -851,7 +851,7 @@ static void acpi_device_set_id(struct acpi_device *device,
         * ----
         * Fix for the system root bus device -- the only root-level device.
         */
-       if ((parent == ACPI_ROOT_OBJECT) && (type == ACPI_BUS_TYPE_DEVICE)) {
+       if (((acpi_handle)parent == ACPI_ROOT_OBJECT) && (type == ACPI_BUS_TYPE_DEVICE)) {
                hid = ACPI_BUS_HID;
                strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME);
                strcpy(device->pnp.device_class, ACPI_BUS_CLASS);
index af7935a95bcc821efea2c4236817e4c5cf0286be..47fb4b394eec568636b2a7da421e12210e96acc6 100644 (file)
@@ -33,9 +33,7 @@ int acpi_sleep_prepare(u32 acpi_state)
        ACPI_FLUSH_CPU_CACHE();
        acpi_enable_wakeup_device_prep(acpi_state);
 #endif
-       if (acpi_state == ACPI_STATE_S5) {
-               acpi_wakeup_gpe_poweroff_prepare();
-       }
+       acpi_gpe_sleep_prepare(acpi_state);
        acpi_enter_sleep_state_prep(acpi_state);
        return 0;
 }
@@ -53,11 +51,16 @@ void acpi_power_off(void)
 
 static int acpi_shutdown(struct sys_device *x)
 {
-       if (system_state == SYSTEM_POWER_OFF) {
-               /* Prepare if we are going to power off the system */
+       switch (system_state) {
+       case SYSTEM_POWER_OFF:
+               /* Prepare to power off the system */
                return acpi_sleep_prepare(ACPI_STATE_S5);
+       case SYSTEM_SUSPEND_DISK:
+               /* Prepare to suspend the system to disk */
+               return acpi_sleep_prepare(ACPI_STATE_S4);
+       default:
+               return 0;
        }
-       return 0;
 }
 
 static struct sysdev_class acpi_sysclass = {
index efd0001c6f05c85753a90a1ca1a26b4f782ba164..f3e70397a7d67d1a95c7652dd067bf90340a5a43 100644 (file)
@@ -5,4 +5,4 @@ extern int acpi_suspend (u32 state);
 extern void acpi_enable_wakeup_device_prep(u8 sleep_state);
 extern void acpi_enable_wakeup_device(u8 sleep_state);
 extern void acpi_disable_wakeup_device(u8 sleep_state);
-extern void acpi_wakeup_gpe_poweroff_prepare(void);
+extern void acpi_gpe_sleep_prepare(u32 sleep_state);
index 4134ed43d026537e1886b288081ae33a09b046e6..85df0ceda2a901277f49108b3cd292c8b980ce8e 100644 (file)
@@ -192,7 +192,7 @@ late_initcall(acpi_wakeup_device_init);
  * RUNTIME GPEs, we simply mark all GPES that
  * are not enabled for wakeup from S5 as RUNTIME.
  */
-void acpi_wakeup_gpe_poweroff_prepare(void)
+void acpi_gpe_sleep_prepare(u32 sleep_state)
 {
        struct list_head *node, *next;
 
@@ -201,8 +201,8 @@ void acpi_wakeup_gpe_poweroff_prepare(void)
                                                       struct acpi_device,
                                                       wakeup_list);
 
-               /* The GPE can wakeup system from S5, don't touch it */
-               if ((u32) dev->wakeup.sleep_state == ACPI_STATE_S5)
+               /* The GPE can wakeup system from this state, don't touch it */
+               if ((u32) dev->wakeup.sleep_state >= sleep_state)
                        continue;
                /* acpi_set_gpe_type will automatically disable GPE */
                acpi_set_gpe_type(dev->wakeup.gpe_device,
index a03939399fa9e309c7ef63ada9c01b90a0d4e2ad..03b37d2223bce30edea4c3aae5020404f2028bc3 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -501,8 +501,8 @@ acpi_status acpi_tb_convert_table_fadt(void)
         * at least as long as the version 1.0 FADT
         */
        if (acpi_gbl_FADT->length < sizeof(struct fadt_descriptor_rev1)) {
-               ACPI_REPORT_ERROR(("FADT is invalid, too short: 0x%X\n",
-                                  acpi_gbl_FADT->length));
+               ACPI_ERROR((AE_INFO, "FADT is invalid, too short: 0x%X",
+                           acpi_gbl_FADT->length));
                return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
        }
 
@@ -517,7 +517,10 @@ acpi_status acpi_tb_convert_table_fadt(void)
                if (acpi_gbl_FADT->length < sizeof(struct fadt_descriptor_rev2)) {
                        /* Length is too short to be a V2.0 table */
 
-                       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));
+                       ACPI_WARNING((AE_INFO,
+                                     "Inconsistent FADT length (0x%X) and revision (0x%X), using FADT V1.0 portion of table",
+                                     acpi_gbl_FADT->length,
+                                     acpi_gbl_FADT->revision));
 
                        acpi_tb_convert_fadt1(local_fadt,
                                              (void *)acpi_gbl_FADT);
@@ -554,7 +557,9 @@ acpi_status acpi_tb_convert_table_fadt(void)
        ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
                          "Hex dump of common internal FADT, size %d (%X)\n",
                          acpi_gbl_FADT->length, acpi_gbl_FADT->length));
-       ACPI_DUMP_BUFFER((u8 *) (acpi_gbl_FADT), acpi_gbl_FADT->length);
+
+       ACPI_DUMP_BUFFER(ACPI_CAST_PTR(u8, acpi_gbl_FADT),
+                        acpi_gbl_FADT->length);
 
        return_ACPI_STATUS(AE_OK);
 }
@@ -580,13 +585,15 @@ acpi_status acpi_tb_build_common_facs(struct acpi_table_desc *table_info)
        /* Absolute minimum length is 24, but the ACPI spec says 64 */
 
        if (acpi_gbl_FACS->length < 24) {
-               ACPI_REPORT_ERROR(("Invalid FACS table length: 0x%X\n",
-                                  acpi_gbl_FACS->length));
+               ACPI_ERROR((AE_INFO, "Invalid FACS table length: 0x%X",
+                           acpi_gbl_FACS->length));
                return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
        }
 
        if (acpi_gbl_FACS->length < 64) {
-               ACPI_REPORT_WARNING(("FACS is shorter than the ACPI specification allows: 0x%X, using anyway\n", acpi_gbl_FACS->length));
+               ACPI_WARNING((AE_INFO,
+                             "FACS is shorter than the ACPI specification allows: 0x%X, using anyway",
+                             acpi_gbl_FACS->length));
        }
 
        /* Copy fields to the new FACS */
index 6acd5aeb093efe9ebf7f31fdc71bf998a75493bc..09b4ee6dfd60a6e96e7aa2f1a50ba6c4cbabe47a 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -91,9 +91,9 @@ acpi_tb_get_table(struct acpi_pointer *address,
 
        status = acpi_tb_get_table_body(address, &header, table_info);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not get ACPI table (size %X), %s\n",
-                                  header.length,
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Could not get ACPI table (size %X)",
+                               header.length));
                return_ACPI_STATUS(status);
        }
 
@@ -148,7 +148,6 @@ acpi_tb_get_table_header(struct acpi_pointer *address,
                                            sizeof(struct acpi_table_header),
                                            (void *)&header);
                if (ACPI_FAILURE(status)) {
-                       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)));
                        return_ACPI_STATUS(status);
                }
 
@@ -161,8 +160,8 @@ acpi_tb_get_table_header(struct acpi_pointer *address,
 
        default:
 
-               ACPI_REPORT_ERROR(("Invalid address flags %X\n",
-                                  address->pointer_type));
+               ACPI_ERROR((AE_INFO, "Invalid address flags %X",
+                           address->pointer_type));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
@@ -253,8 +252,8 @@ acpi_tb_table_override(struct acpi_table_header *header,
        if (ACPI_FAILURE(status)) {
                /* Some severe error from the OSL, but we basically ignore it */
 
-               ACPI_REPORT_ERROR(("Could not override ACPI table, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Could not override ACPI table"));
                return_ACPI_STATUS(status);
        }
 
@@ -273,15 +272,14 @@ acpi_tb_table_override(struct acpi_table_header *header,
 
        status = acpi_tb_get_this_table(&address, new_table, table_info);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not copy override ACPI table, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "Could not copy ACPI table"));
                return_ACPI_STATUS(status);
        }
 
        /* Copy the table info */
 
-       ACPI_REPORT_INFO(("Table [%4.4s] replaced by host OS\n",
-                         table_info->pointer->signature));
+       ACPI_INFO((AE_INFO, "Table [%4.4s] replaced by host OS",
+                  table_info->pointer->signature));
 
        return_ACPI_STATUS(AE_OK);
 }
@@ -327,7 +325,9 @@ acpi_tb_get_this_table(struct acpi_pointer *address,
 
                full_table = ACPI_MEM_ALLOCATE(header->length);
                if (!full_table) {
-                       ACPI_REPORT_ERROR(("Could not allocate table memory for [%4.4s] length %X\n", header->signature, header->length));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not allocate table memory for [%4.4s] length %X",
+                                   header->signature, header->length));
                        return_ACPI_STATUS(AE_NO_MEMORY);
                }
 
@@ -351,7 +351,12 @@ acpi_tb_get_this_table(struct acpi_pointer *address,
                                            (acpi_size) header->length,
                                            (void *)&full_table);
                if (ACPI_FAILURE(status)) {
-                       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));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not map memory for table [%4.4s] at %8.8X%8.8X for length %X",
+                                   header->signature,
+                                   ACPI_FORMAT_UINT64(address->pointer.
+                                                      physical),
+                                   header->length));
                        return (status);
                }
 
@@ -362,8 +367,8 @@ acpi_tb_get_this_table(struct acpi_pointer *address,
 
        default:
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid address flags %X\n",
-                                 address->pointer_type));
+               ACPI_ERROR((AE_INFO, "Invalid address flags %X",
+                           address->pointer_type));
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
index 8d72343537e74719e3592a66db22a27212b9245c..134e5dce0bc172d03cf3d788cebb2cf4daa65a80 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -152,7 +152,9 @@ acpi_tb_get_secondary_table(struct acpi_pointer *address,
        /* Signature must match request */
 
        if (ACPI_STRNCMP(header.signature, signature, ACPI_NAME_SIZE)) {
-               ACPI_REPORT_ERROR(("Incorrect table signature - wanted [%s] found [%4.4s]\n", signature, header.signature));
+               ACPI_ERROR((AE_INFO,
+                           "Incorrect table signature - wanted [%s] found [%4.4s]",
+                           signature, header.signature));
                return_ACPI_STATUS(AE_BAD_SIGNATURE);
        }
 
@@ -231,14 +233,18 @@ acpi_status acpi_tb_get_required_tables(void)
                 */
                status = acpi_tb_get_primary_table(&address, &table_info);
                if ((status != AE_OK) && (status != AE_TABLE_NOT_SUPPORTED)) {
-                       ACPI_REPORT_WARNING(("%s, while getting table at %8.8X%8.8X\n", acpi_format_exception(status), ACPI_FORMAT_UINT64(address.pointer.value)));
+                       ACPI_WARNING((AE_INFO,
+                                     "%s, while getting table at %8.8X%8.8X",
+                                     acpi_format_exception(status),
+                                     ACPI_FORMAT_UINT64(address.pointer.
+                                                        value)));
                }
        }
 
        /* We must have a FADT to continue */
 
        if (!acpi_gbl_FADT) {
-               ACPI_REPORT_ERROR(("No FADT present in RSDT/XSDT\n"));
+               ACPI_ERROR((AE_INFO, "No FADT present in RSDT/XSDT"));
                return_ACPI_STATUS(AE_NO_ACPI_TABLES);
        }
 
@@ -248,7 +254,8 @@ acpi_status acpi_tb_get_required_tables(void)
         */
        status = acpi_tb_convert_table_fadt();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not convert FADT to internal common format\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Could not convert FADT to internal common format"));
                return_ACPI_STATUS(status);
        }
 
@@ -258,8 +265,8 @@ acpi_status acpi_tb_get_required_tables(void)
 
        status = acpi_tb_get_secondary_table(&address, FACS_SIG, &table_info);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not get/install the FACS, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Could not get/install the FACS"));
                return_ACPI_STATUS(status);
        }
 
@@ -278,7 +285,7 @@ acpi_status acpi_tb_get_required_tables(void)
 
        status = acpi_tb_get_secondary_table(&address, DSDT_SIG, &table_info);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not get/install the DSDT\n"));
+               ACPI_ERROR((AE_INFO, "Could not get/install the DSDT"));
                return_ACPI_STATUS(status);
        }
 
@@ -292,7 +299,9 @@ acpi_status acpi_tb_get_required_tables(void)
                          "Hex dump of entire DSDT, size %d (0x%X), Integer width = %d\n",
                          acpi_gbl_DSDT->length, acpi_gbl_DSDT->length,
                          acpi_gbl_integer_bit_width));
-       ACPI_DUMP_BUFFER((u8 *) acpi_gbl_DSDT, acpi_gbl_DSDT->length);
+
+       ACPI_DUMP_BUFFER(ACPI_CAST_PTR(u8, acpi_gbl_DSDT),
+                        acpi_gbl_DSDT->length);
 
        /* Always delete the RSDP mapping, we are done with it */
 
index 10db8484e462ce269f1d4c2f11820000f4318cad..7ffd0fddb4e55d1c7d75a192979d0657352915fc 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        status = acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not acquire table mutex, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Could not acquire table mutex"));
                return_ACPI_STATUS(status);
        }
 
@@ -146,9 +146,9 @@ acpi_status acpi_tb_install_table(struct acpi_table_desc *table_info)
 
        status = acpi_tb_init_table_descriptor(table_info->type, table_info);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Could not install table [%4.4s], %s\n",
-                                  table_info->pointer->signature,
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Could not install table [%4.4s]",
+                               table_info->pointer->signature));
        }
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s located at %p\n",
index ad0252c2f7dbd34d8a242f4bdf882a1c9203ce8d..4d308220225d216b8786f32d35ab34b83a4f6b59 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 {
        int no_match;
 
-       ACPI_FUNCTION_NAME("tb_validate_rsdt");
+       ACPI_FUNCTION_ENTRY();
 
        /*
         * Search for appropriate signature, RSDT or XSDT
@@ -192,24 +192,24 @@ acpi_status acpi_tb_validate_rsdt(struct acpi_table_header *table_ptr)
        if (no_match) {
                /* Invalid RSDT or XSDT signature */
 
-               ACPI_REPORT_ERROR(("Invalid signature where RSDP indicates RSDT/XSDT should be located\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Invalid signature where RSDP indicates RSDT/XSDT should be located. RSDP:"));
 
                ACPI_DUMP_BUFFER(acpi_gbl_RSDP, 20);
 
-               ACPI_DEBUG_PRINT_RAW((ACPI_DB_ERROR,
-                                     "RSDT/XSDT signature at %X (%p) is invalid\n",
-                                     acpi_gbl_RSDP->rsdt_physical_address,
-                                     (void *)(acpi_native_uint) acpi_gbl_RSDP->
-                                     rsdt_physical_address));
+               ACPI_ERROR((AE_INFO,
+                           "RSDT/XSDT signature at %X (%p) is invalid",
+                           acpi_gbl_RSDP->rsdt_physical_address,
+                           (void *)(acpi_native_uint) acpi_gbl_RSDP->
+                           rsdt_physical_address));
 
                if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) {
-                       ACPI_REPORT_ERROR(("Looking for RSDT\n"))
+                       ACPI_ERROR((AE_INFO, "Looking for RSDT"));
                } else {
-                       ACPI_REPORT_ERROR(("Looking for XSDT\n"))
+                       ACPI_ERROR((AE_INFO, "Looking for XSDT"));
                }
 
                ACPI_DUMP_BUFFER((char *)table_ptr, 48);
-
                return (AE_BAD_SIGNATURE);
        }
 
@@ -243,15 +243,13 @@ acpi_status acpi_tb_get_table_rsdt(void)
        table_info.type = ACPI_TABLE_XSDT;
        status = acpi_tb_get_table(&address, &table_info);
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Could not get the RSDT/XSDT, %s\n",
-                                 acpi_format_exception(status)));
-
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Could not get the RSDT/XSDT"));
                return_ACPI_STATUS(status);
        }
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                         "RSDP located at %p, points to RSDT physical=%8.8X%8.8X \n",
+                         "RSDP located at %p, points to RSDT physical=%8.8X%8.8X\n",
                          acpi_gbl_RSDP,
                          ACPI_FORMAT_UINT64(address.pointer.value)));
 
index 4b2fbb592f4933cf8b8138efe64f558c194a96fe..bc571592f087e784d93cca093e9a1f50472a0322 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
                     new_table_desc->pointer->length)
                    &&
                    (!ACPI_MEMCMP
-                    ((const char *)table_desc->pointer,
-                     (const char *)new_table_desc->pointer,
-                     (acpi_size) new_table_desc->pointer->length))) {
+                    (table_desc->pointer, new_table_desc->pointer,
+                     new_table_desc->pointer->length))) {
                        /* Match: this table is already installed */
 
                        ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
@@ -145,14 +144,13 @@ acpi_tb_validate_table_header(struct acpi_table_header *table_header)
 {
        acpi_name signature;
 
-       ACPI_FUNCTION_NAME("tb_validate_table_header");
+       ACPI_FUNCTION_ENTRY();
 
        /* Verify that this is a valid address */
 
        if (!acpi_os_readable(table_header, sizeof(struct acpi_table_header))) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Cannot read table header at %p\n",
-                                 table_header));
+               ACPI_ERROR((AE_INFO,
+                           "Cannot read table header at %p", table_header));
 
                return (AE_BAD_ADDRESS);
        }
@@ -161,12 +159,12 @@ acpi_tb_validate_table_header(struct acpi_table_header *table_header)
 
        ACPI_MOVE_32_TO_32(&signature, table_header->signature);
        if (!acpi_ut_valid_acpi_name(signature)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Table signature at %p [%p] has invalid characters\n",
-                                 table_header, &signature));
+               ACPI_ERROR((AE_INFO,
+                           "Table signature at %p [%p] has invalid characters",
+                           table_header, &signature));
 
-               ACPI_REPORT_WARNING(("Invalid table signature found: [%4.4s]\n",
-                                    (char *)&signature));
+               ACPI_WARNING((AE_INFO, "Invalid table signature found: [%4.4s]",
+                             ACPI_CAST_PTR(char, &signature)));
 
                ACPI_DUMP_BUFFER(table_header,
                                 sizeof(struct acpi_table_header));
@@ -176,11 +174,13 @@ acpi_tb_validate_table_header(struct acpi_table_header *table_header)
        /* Validate the table length */
 
        if (table_header->length < sizeof(struct acpi_table_header)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Invalid length in table header %p name %4.4s\n",
-                                 table_header, (char *)&signature));
+               ACPI_ERROR((AE_INFO,
+                           "Invalid length in table header %p name %4.4s",
+                           table_header, (char *)&signature));
 
-               ACPI_REPORT_WARNING(("Invalid table header length (0x%X) found\n", (u32) table_header->length));
+               ACPI_WARNING((AE_INFO,
+                             "Invalid table header length (0x%X) found",
+                             (u32) table_header->length));
 
                ACPI_DUMP_BUFFER(table_header,
                                 sizeof(struct acpi_table_header));
@@ -219,7 +219,10 @@ acpi_tb_verify_table_checksum(struct acpi_table_header * table_header)
        /* Return the appropriate exception */
 
        if (checksum) {
-               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));
+               ACPI_WARNING((AE_INFO,
+                             "Invalid checksum in table [%4.4s] (%02X, sum %02X is not zero)",
+                             table_header->signature,
+                             (u32) table_header->checksum, (u32) checksum));
 
                status = AE_BAD_CHECKSUM;
        }
@@ -241,16 +244,16 @@ acpi_tb_verify_table_checksum(struct acpi_table_header * table_header)
 
 u8 acpi_tb_generate_checksum(void *buffer, u32 length)
 {
-       const u8 *limit;
-       const u8 *rover;
+       u8 *end_buffer;
+       u8 *rover;
        u8 sum = 0;
 
        if (buffer && length) {
                /*  Buffer and Length are valid   */
 
-               limit = (u8 *) buffer + length;
+               end_buffer = ACPI_ADD_PTR(u8, buffer, length);
 
-               for (rover = buffer; rover < limit; rover++) {
+               for (rover = buffer; rover < end_buffer; rover++) {
                        sum = (u8) (sum + *rover);
                }
        }
@@ -292,8 +295,7 @@ acpi_tb_handle_to_object(u16 table_id,
                }
        }
 
-       ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "table_id=%X does not exist\n",
-                         table_id));
+       ACPI_ERROR((AE_INFO, "table_id=%X does not exist", table_id));
        return (AE_BAD_PARAMETER);
 }
 #endif
index 3f96a4909aadfb5683942c0a9b0ac661d3bc9eaa..9fe53c9d5b9ad4a78f30af8bfcd1cd35d1e30e8d 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -75,8 +75,7 @@ acpi_status acpi_load_tables(void)
        status = acpi_os_get_root_pointer(ACPI_LOGICAL_ADDRESSING,
                                          &rsdp_address);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("acpi_load_tables: Could not get RSDP, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "Could not get the RSDP"));
                goto error_exit;
        }
 
@@ -86,7 +85,7 @@ acpi_status acpi_load_tables(void)
 
        status = acpi_tb_verify_rsdp(&rsdp_address);
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("acpi_load_tables: RSDP Failed validation: %s\n", acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During RSDP validation"));
                goto error_exit;
        }
 
@@ -94,7 +93,7 @@ acpi_status acpi_load_tables(void)
 
        status = acpi_tb_get_table_rsdt();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("acpi_load_tables: Could not load RSDT: %s\n", acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "Could not load RSDT"));
                goto error_exit;
        }
 
@@ -102,7 +101,8 @@ acpi_status acpi_load_tables(void)
 
        status = acpi_tb_get_required_tables();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("acpi_load_tables: Error getting required tables (DSDT/FADT/FACS): %s\n", acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Could not get all required tables (DSDT/FADT/FACS)"));
                goto error_exit;
        }
 
@@ -112,16 +112,14 @@ acpi_status acpi_load_tables(void)
 
        status = acpi_ns_load_namespace();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("acpi_load_tables: Could not load namespace: %s\n", acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "Could not load namespace"));
                goto error_exit;
        }
 
        return_ACPI_STATUS(AE_OK);
 
       error_exit:
-       ACPI_REPORT_ERROR(("acpi_load_tables: Could not load tables: %s\n",
-                          acpi_format_exception(status)));
-
+       ACPI_EXCEPTION((AE_INFO, status, "Could not load tables"));
        return_ACPI_STATUS(status);
 }
 
index 3b8a7e063e8a14c5d5122d306dfcef19d61d8c94..a62db6af83c9139ad8ab02871862db6eeef9af90 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -251,7 +251,7 @@ acpi_get_firmware_table(acpi_string signature,
 
        acpi_tb_get_rsdt_address(&address);
        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                         "RSDP located at %p, RSDT physical=%8.8X%8.8X \n",
+                         "RSDP located at %p, RSDT physical=%8.8X%8.8X\n",
                          acpi_gbl_RSDP,
                          ACPI_FORMAT_UINT64(address.pointer.value)));
 
@@ -396,9 +396,8 @@ acpi_status acpi_find_root_pointer(u32 flags, struct acpi_pointer *rsdp_address)
 
        status = acpi_tb_find_rsdp(&table_info, flags);
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "RSDP structure not found, %s Flags=%X\n",
-                                 acpi_format_exception(status), flags));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "RSDP structure not found - Flags=%X", flags));
 
                return_ACPI_STATUS(AE_NO_ACPI_TABLES);
        }
@@ -503,10 +502,10 @@ acpi_tb_find_rsdp(struct acpi_table_desc *table_info, u32 flags)
                                            ACPI_EBDA_PTR_LENGTH,
                                            (void *)&table_ptr);
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Could not map memory at %8.8X for length %X\n",
-                                         ACPI_EBDA_PTR_LOCATION,
-                                         ACPI_EBDA_PTR_LENGTH));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not map memory at %8.8X for length %X",
+                                   ACPI_EBDA_PTR_LOCATION,
+                                   ACPI_EBDA_PTR_LENGTH));
 
                        return_ACPI_STATUS(status);
                }
@@ -530,10 +529,10 @@ acpi_tb_find_rsdp(struct acpi_table_desc *table_info, u32 flags)
                                                    ACPI_EBDA_WINDOW_SIZE,
                                                    (void *)&table_ptr);
                        if (ACPI_FAILURE(status)) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Could not map memory at %8.8X for length %X\n",
-                                                 physical_address,
-                                                 ACPI_EBDA_WINDOW_SIZE));
+                               ACPI_ERROR((AE_INFO,
+                                           "Could not map memory at %8.8X for length %X",
+                                           physical_address,
+                                           ACPI_EBDA_WINDOW_SIZE));
 
                                return_ACPI_STATUS(status);
                        }
@@ -563,10 +562,10 @@ acpi_tb_find_rsdp(struct acpi_table_desc *table_info, u32 flags)
                                            (void *)&table_ptr);
 
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Could not map memory at %8.8X for length %X\n",
-                                         ACPI_HI_RSDP_WINDOW_BASE,
-                                         ACPI_HI_RSDP_WINDOW_SIZE));
+                       ACPI_ERROR((AE_INFO,
+                                   "Could not map memory at %8.8X for length %X",
+                                   ACPI_HI_RSDP_WINDOW_BASE,
+                                   ACPI_HI_RSDP_WINDOW_SIZE));
 
                        return_ACPI_STATUS(status);
                }
@@ -635,7 +634,7 @@ acpi_tb_find_rsdp(struct acpi_table_desc *table_info, u32 flags)
 
        /* A valid RSDP was not found */
 
-       ACPI_REPORT_ERROR(("No valid RSDP was found\n"));
+       ACPI_ERROR((AE_INFO, "No valid RSDP was found"));
        return_ACPI_STATUS(AE_NOT_FOUND);
 }
 
index e87108b7338ade83486c66bf142a90a487b5f825..88eff14c48946900944f54f348ec0b0bf513b620 100644 (file)
@@ -2,7 +2,8 @@
 # Makefile for all Linux ACPI interpreter subdirectories
 #
 
-obj-y := utalloc.o  utdebug.o   uteval.o    utinit.o  utmisc.o    utxface.o \
-        utcopy.o   utdelete.o  utglobal.o  utmath.o  utobject.o utstate.o utmutex.o utobject.o utcache.o
+obj-y := utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \
+               utcopy.o utdelete.o utglobal.o utmath.o utobject.o \
+               utstate.o utmutex.o utobject.o utcache.o utresrc.o
 
 EXTRA_CFLAGS += $(ACPI_CFLAGS)
index 068450b36475a8b9b3552594bfcfbbf1409f87b0..03b0044974c22b3846472167e1e11768fc362aac 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,7 +47,7 @@
 ACPI_MODULE_NAME("utalloc")
 
 /* Local prototypes */
-#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
 static struct acpi_debug_mem_block *acpi_ut_find_allocation(void *allocation);
 
 static acpi_status
@@ -58,9 +58,7 @@ acpi_ut_track_allocation(struct acpi_debug_mem_block *address,
 static acpi_status
 acpi_ut_remove_allocation(struct acpi_debug_mem_block *address,
                          u32 component, char *module, u32 line);
-#endif                         /* ACPI_DBG_TRACK_ALLOCATIONS */
 
-#ifdef ACPI_DBG_TRACK_ALLOCATIONS
 static acpi_status
 acpi_ut_create_list(char *list_name,
                    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)
        /* Check for an inadvertent size of zero bytes */
 
        if (!size) {
-               _ACPI_REPORT_ERROR(module, line, component,
-                                  ("ut_allocate: Attempt to allocate zero bytes\n"));
+               ACPI_ERROR((module, line,
+                           "ut_allocate: Attempt to allocate zero bytes, allocating 1 byte"));
                size = 1;
        }
 
@@ -312,9 +310,9 @@ void *acpi_ut_allocate(acpi_size size, u32 component, char *module, u32 line)
        if (!allocation) {
                /* Report allocation error */
 
-               _ACPI_REPORT_ERROR(module, line, component,
-                                  ("ut_allocate: Could not allocate size %X\n",
-                                   (u32) size));
+               ACPI_ERROR((module, line,
+                           "ut_allocate: Could not allocate size %X",
+                           (u32) size));
 
                return_PTR(NULL);
        }
@@ -346,18 +344,17 @@ void *acpi_ut_callocate(acpi_size size, u32 component, char *module, u32 line)
        /* Check for an inadvertent size of zero bytes */
 
        if (!size) {
-               _ACPI_REPORT_ERROR(module, line, component,
-                                  ("ut_callocate: Attempt to allocate zero bytes\n"));
-               return_PTR(NULL);
+               ACPI_ERROR((module, line,
+                           "Attempt to allocate zero bytes, allocating 1 byte"));
+               size = 1;
        }
 
        allocation = acpi_os_allocate(size);
        if (!allocation) {
                /* Report allocation error */
 
-               _ACPI_REPORT_ERROR(module, line, component,
-                                  ("ut_callocate: Could not allocate size %X\n",
-                                   (u32) size));
+               ACPI_ERROR((module, line,
+                           "Could not allocate size %X", (u32) size));
                return_PTR(NULL);
        }
 
@@ -482,9 +479,8 @@ void *acpi_ut_callocate_and_track(acpi_size size,
        if (!allocation) {
                /* Report allocation error */
 
-               _ACPI_REPORT_ERROR(module, line, component,
-                                  ("ut_callocate: Could not allocate size %X\n",
-                                   (u32) size));
+               ACPI_ERROR((module, line,
+                           "Could not allocate size %X", (u32) size));
                return (NULL);
        }
 
@@ -526,8 +522,7 @@ acpi_ut_free_and_track(void *allocation, u32 component, char *module, u32 line)
        ACPI_FUNCTION_TRACE_PTR("ut_free", allocation);
 
        if (NULL == allocation) {
-               _ACPI_REPORT_ERROR(module, line, component,
-                                  ("acpi_ut_free: Attempt to delete a NULL address\n"));
+               ACPI_ERROR((module, line, "Attempt to delete a NULL address"));
 
                return_VOID;
        }
@@ -542,14 +537,11 @@ acpi_ut_free_and_track(void *allocation, u32 component, char *module, u32 line)
        status = acpi_ut_remove_allocation(debug_block,
                                           component, module, line);
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Could not free memory, %s\n",
-                                 acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "Could not free memory"));
        }
 
        acpi_os_free(debug_block);
-
        ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "%p freed\n", allocation));
-
        return_VOID;
 }
 
@@ -626,10 +618,12 @@ acpi_ut_track_allocation(struct acpi_debug_mem_block *allocation,
         */
        element = acpi_ut_find_allocation(allocation);
        if (element) {
-               ACPI_REPORT_ERROR(("ut_track_allocation: Allocation already present in list! (%p)\n", allocation));
+               ACPI_ERROR((AE_INFO,
+                           "ut_track_allocation: Allocation already present in list! (%p)",
+                           allocation));
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Element %p Address %p\n",
-                                 element, allocation));
+               ACPI_ERROR((AE_INFO, "Element %p Address %p",
+                           element, allocation));
 
                goto unlock_and_exit;
        }
@@ -689,8 +683,8 @@ acpi_ut_remove_allocation(struct acpi_debug_mem_block *allocation,
        if (NULL == mem_list->list_head) {
                /* No allocations! */
 
-               _ACPI_REPORT_ERROR(module, line, component,
-                                  ("ut_remove_allocation: Empty allocation list, nothing to free!\n"));
+               ACPI_ERROR((module, line,
+                           "Empty allocation list, nothing to free!"));
 
                return_ACPI_STATUS(AE_OK);
        }
@@ -865,12 +859,11 @@ void acpi_ut_dump_allocations(u32 component, char *module)
        /* Print summary */
 
        if (!num_outstanding) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "No outstanding allocations.\n"));
+               ACPI_INFO((AE_INFO, "No outstanding allocations"));
        } else {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "%d(%X) Outstanding allocations\n",
-                                 num_outstanding, num_outstanding));
+               ACPI_ERROR((AE_INFO,
+                           "%d(%X) Outstanding allocations",
+                           num_outstanding, num_outstanding));
        }
 
        return_VOID;
index 93d48681d2764c4fe5f404aa24320f35a1e9a29d..2177cb1ef2c43708c8af51e520bbdc8ad3e8a49f 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 5442b32de61156a70a852e7a31d67360746d6b57..df2d32096b72363e6a46301b41bdec19ae85c3b5 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
                 * Build a simple object (no nested objects)
                 */
                status = acpi_ut_copy_isimple_to_esimple(internal_object,
-                                                        (union acpi_object *)
-                                                        ret_buffer->pointer,
-                                                        ((u8 *) ret_buffer->
-                                                         pointer +
-                                                         ACPI_ROUND_UP_TO_NATIVE_WORD
-                                                         (sizeof
-                                                          (union
-                                                           acpi_object))),
+                                                        ACPI_CAST_PTR(union
+                                                                      acpi_object,
+                                                                      ret_buffer->
+                                                                      pointer),
+                                                        ACPI_ADD_PTR(u8,
+                                                                     ret_buffer->
+                                                                     pointer,
+                                                                     ACPI_ROUND_UP_TO_NATIVE_WORD
+                                                                     (sizeof
+                                                                      (union
+                                                                       acpi_object))),
                                                         &ret_buffer->length);
                /*
                 * 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,
                /*
                 * Packages as external input to control methods are not supported,
                 */
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Packages as parameters not implemented!\n"));
+               ACPI_ERROR((AE_INFO,
+                           "Packages as parameters not implemented!"));
 
                return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
        }
@@ -867,7 +870,7 @@ acpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj,
                                                         count +
                                                         1) * sizeof(void *));
        if (!dest_obj->package.elements) {
-               ACPI_REPORT_ERROR(("aml_build_copy_internal_package_object: Package allocation failure\n"));
+               ACPI_ERROR((AE_INFO, "Package allocation failure"));
                return_ACPI_STATUS(AE_NO_MEMORY);
        }
 
index d80e9263993251fc00202730df5ea941551530c0..35f3d581e0346f1df55bd9a0f4db512bd3408033 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 2bc878f7a12739952a1217be0d90a6ff356e3bcd..1db9695b002927d9efb311bfe2b18626e769c455 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        default:
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown action (%X)\n",
-                                 action));
+               ACPI_ERROR((AE_INFO, "Unknown action (%X)", action));
                break;
        }
 
@@ -374,9 +373,9 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
         */
        if (count > ACPI_MAX_REFERENCE_COUNT) {
 
-               ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                 "**** Warning **** Large Reference Count (%X) in object %p\n\n",
-                                 count, object));
+               ACPI_WARNING((AE_INFO,
+                             "Large Reference Count (%X) in object %p",
+                             count, object));
        }
 
        return;
@@ -535,8 +534,8 @@ acpi_ut_update_object_reference(union acpi_operand_object * object, u16 action)
 
       error_exit:
 
-       ACPI_REPORT_ERROR(("Could not update object reference count, %s\n",
-                          acpi_format_exception(status)));
+       ACPI_EXCEPTION((AE_INFO, status,
+                       "Could not update object reference count"));
 
        return_ACPI_STATUS(status);
 }
index 7b81d5ef3c32e4b90e79f63d2c89a7863c813d00..106cc97cb4af9c21815d13741bb4108cabdfad35 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
        for (i = 0; i < ACPI_NUM_OSI_STRINGS; i++) {
                if (!ACPI_STRCMP(string_desc->string.pointer,
-                                (char *)acpi_gbl_valid_osi_strings[i])) {
+                                ACPI_CAST_PTR(char,
+                                              acpi_gbl_valid_osi_strings[i])))
+               {
                        /* This string is supported */
 
                        return_desc->integer.value = 0xFFFFFFFF;
@@ -152,8 +154,8 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
                                          acpi_ut_get_node_name(prefix_node),
                                          path));
                } else {
-                       ACPI_REPORT_METHOD_ERROR("Method execution failed",
-                                                prefix_node, path, status);
+                       ACPI_ERROR_METHOD("Method execution failed",
+                                         prefix_node, path, status);
                }
 
                return_ACPI_STATUS(status);
@@ -163,9 +165,8 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
 
        if (!info.return_object) {
                if (expected_return_btypes) {
-                       ACPI_REPORT_METHOD_ERROR("No object was returned from",
-                                                prefix_node, path,
-                                                AE_NOT_EXIST);
+                       ACPI_ERROR_METHOD("No object was returned from",
+                                         prefix_node, path, AE_NOT_EXIST);
 
                        return_ACPI_STATUS(AE_NOT_EXIST);
                }
@@ -210,15 +211,14 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
        /* Is the return object one of the expected types? */
 
        if (!(expected_return_btypes & return_btype)) {
-               ACPI_REPORT_METHOD_ERROR("Return object type is incorrect",
-                                        prefix_node, path, AE_TYPE);
+               ACPI_ERROR_METHOD("Return object type is incorrect",
+                                 prefix_node, path, AE_TYPE);
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Type returned from %s was incorrect: %s, expected Btypes: %X\n",
-                                 path,
-                                 acpi_ut_get_object_type_name(info.
-                                                              return_object),
-                                 expected_return_btypes));
+               ACPI_ERROR((AE_INFO,
+                           "Type returned from %s was incorrect: %s, expected Btypes: %X",
+                           path,
+                           acpi_ut_get_object_type_name(info.return_object),
+                           expected_return_btypes));
 
                /* On error exit, we must delete the return object */
 
@@ -592,7 +592,7 @@ acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)
                                          "_STA on %4.4s was not found, assuming device is present\n",
                                          acpi_ut_get_node_name(device_node)));
 
-                       *flags = 0x0F;
+                       *flags = ACPI_UINT32_MAX;
                        status = AE_OK;
                }
 
@@ -637,17 +637,17 @@ acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest)
        for (i = 0; i < 4; i++) {
                highest[i] = 0xFF;
                status = acpi_ut_evaluate_object(device_node,
-                                                (char *)
-                                                acpi_gbl_highest_dstate_names
-                                                [i], ACPI_BTYPE_INTEGER,
-                                                &obj_desc);
+                                                ACPI_CAST_PTR(char,
+                                                              acpi_gbl_highest_dstate_names
+                                                              [i]),
+                                                ACPI_BTYPE_INTEGER, &obj_desc);
                if (ACPI_FAILURE(status)) {
                        if (status != AE_NOT_FOUND) {
                                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
                                                  "%s on Device %4.4s, %s\n",
-                                                 (char *)
-                                                 acpi_gbl_highest_dstate_names
-                                                 [i],
+                                                 ACPI_CAST_PTR(char,
+                                                               acpi_gbl_highest_dstate_names
+                                                               [i]),
                                                  acpi_ut_get_node_name
                                                  (device_node),
                                                  acpi_format_exception
index 399e64b5188673c41eb0b7bef4bae0ece4259a64..ffd13383a325ecae8ed8ae884187860b6566ce33 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -67,8 +67,11 @@ const char *acpi_format_exception(acpi_status status)
        acpi_status sub_status;
        const char *exception = NULL;
 
-       ACPI_FUNCTION_NAME("format_exception");
+       ACPI_FUNCTION_ENTRY();
 
+       /*
+        * Status is composed of two parts, a "type" and an actual code
+        */
        sub_status = (status & ~AE_CODE_MASK);
 
        switch (status & AE_CODE_MASK) {
@@ -118,13 +121,13 @@ const char *acpi_format_exception(acpi_status status)
        if (!exception) {
                /* Exception code was not recognized */
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unknown exception code: 0x%8.8X\n", status));
+               ACPI_ERROR((AE_INFO,
+                           "Unknown exception code: 0x%8.8X", status));
 
-               return ((const char *)"UNKNOWN_STATUS_CODE");
+               exception = "UNKNOWN_STATUS_CODE";
        }
 
-       return ((const char *)exception);
+       return (ACPI_CAST_PTR(const char, exception));
 }
 
 /*******************************************************************************
@@ -217,23 +220,23 @@ const char *acpi_gbl_valid_osi_strings[ACPI_NUM_OSI_STRINGS] = {
  * 2) _TZ_ is defined to be a thermal zone in order to allow ASL code to
  *    perform a Notify() operation on it.
  */
-const struct acpi_predefined_names acpi_gbl_pre_defined_names[] =
-    { {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL},
-{"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL},
-{"_SB_", ACPI_TYPE_DEVICE, NULL},
-{"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL},
-{"_TZ_", ACPI_TYPE_THERMAL, NULL},
-{"_REV", ACPI_TYPE_INTEGER, (char *)ACPI_CA_SUPPORT_LEVEL},
-{"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
-{"_GL_", ACPI_TYPE_MUTEX, (char *)1},
+const struct acpi_predefined_names acpi_gbl_pre_defined_names[] = {
+       {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL},
+       {"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL},
+       {"_SB_", ACPI_TYPE_DEVICE, NULL},
+       {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL},
+       {"_TZ_", ACPI_TYPE_THERMAL, NULL},
+       {"_REV", ACPI_TYPE_INTEGER, (char *)ACPI_CA_SUPPORT_LEVEL},
+       {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
+       {"_GL_", ACPI_TYPE_MUTEX, (char *)1},
 
 #if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
-{"_OSI", ACPI_TYPE_METHOD, (char *)1},
+       {"_OSI", ACPI_TYPE_METHOD, (char *)1},
 #endif
 
        /* Table terminator */
 
-{NULL, ACPI_TYPE_ANY, NULL}
+       {NULL, ACPI_TYPE_ANY, NULL}
 };
 
 /*
@@ -485,7 +488,7 @@ char *acpi_ut_get_region_name(u8 space_id)
                return ("invalid_space_id");
        }
 
-       return ((char *)acpi_gbl_region_types[space_id]);
+       return (ACPI_CAST_PTR(char, acpi_gbl_region_types[space_id]));
 }
 
 /*******************************************************************************
@@ -503,11 +506,13 @@ char *acpi_ut_get_region_name(u8 space_id)
 /* Event type decoding */
 
 static const char *acpi_gbl_event_types[ACPI_NUM_FIXED_EVENTS] = {
+/*! [Begin] no source code translation (keep these strings as-is) */
        "PM_Timer",
-       "global_lock",
-       "power_button",
-       "sleep_button",
-       "real_time_clock",
+       "GlobalLock",
+       "PowerButton",
+       "SleepButton",
+       "RealTimeClock",
+/*! [End] no source code translation !*/
 };
 
 char *acpi_ut_get_event_name(u32 event_id)
@@ -517,7 +522,7 @@ char *acpi_ut_get_event_name(u32 event_id)
                return ("invalid_event_iD");
        }
 
-       return ((char *)acpi_gbl_event_types[event_id]);
+       return (ACPI_CAST_PTR(char, acpi_gbl_event_types[event_id]));
 }
 
 /*******************************************************************************
@@ -545,12 +550,13 @@ static const char acpi_gbl_bad_type[] = "UNDEFINED";
 /* Printable names of the ACPI object types */
 
 static const char *acpi_gbl_ns_type_names[] = {
+/*! [Begin] no source code translation (keep these strings as-is) */
        /* 00 */ "Untyped",
        /* 01 */ "Integer",
        /* 02 */ "String",
        /* 03 */ "Buffer",
        /* 04 */ "Package",
-       /* 05 */ "field_unit",
+       /* 05 */ "FieldUnit",
        /* 06 */ "Device",
        /* 07 */ "Event",
        /* 08 */ "Method",
@@ -559,33 +565,34 @@ static const char *acpi_gbl_ns_type_names[] = {
        /* 11 */ "Power",
        /* 12 */ "Processor",
        /* 13 */ "Thermal",
-       /* 14 */ "buffer_field",
-       /* 15 */ "ddb_handle",
-       /* 16 */ "debug_object",
-       /* 17 */ "region_field",
-       /* 18 */ "bank_field",
-       /* 19 */ "index_field",
+       /* 14 */ "BufferField",
+       /* 15 */ "DdbHandle",
+       /* 16 */ "DebugObject",
+       /* 17 */ "RegionField",
+       /* 18 */ "BankField",
+       /* 19 */ "IndexField",
        /* 20 */ "Reference",
        /* 21 */ "Alias",
-       /* 22 */ "method_alias",
+       /* 22 */ "MethodAlias",
        /* 23 */ "Notify",
-       /* 24 */ "addr_handler",
-       /* 25 */ "resource_desc",
-       /* 26 */ "resource_fld",
+       /* 24 */ "AddrHandler",
+       /* 25 */ "ResourceDesc",
+       /* 26 */ "ResourceFld",
        /* 27 */ "Scope",
        /* 28 */ "Extra",
        /* 29 */ "Data",
        /* 30 */ "Invalid"
+/*! [End] no source code translation !*/
 };
 
 char *acpi_ut_get_type_name(acpi_object_type type)
 {
 
        if (type > ACPI_TYPE_INVALID) {
-               return ((char *)acpi_gbl_bad_type);
+               return (ACPI_CAST_PTR(char, acpi_gbl_bad_type));
        }
 
-       return ((char *)acpi_gbl_ns_type_names[type]);
+       return (ACPI_CAST_PTR(char, acpi_gbl_ns_type_names[type]));
 }
 
 char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc)
@@ -634,7 +641,7 @@ char *acpi_ut_get_node_name(void *object)
 
        /* Name must be a valid ACPI name */
 
-       if (!acpi_ut_valid_acpi_name(*(u32 *) node->name.ascii)) {
+       if (!acpi_ut_valid_acpi_name(node->name.integer)) {
                return ("????");
        }
 
@@ -658,15 +665,16 @@ char *acpi_ut_get_node_name(void *object)
 /* Printable names of object descriptor types */
 
 static const char *acpi_gbl_desc_type_names[] = {
+/*! [Begin] no source code translation (keep these ASL Keywords as-is) */
        /* 00 */ "Invalid",
        /* 01 */ "Cached",
        /* 02 */ "State-Generic",
        /* 03 */ "State-Update",
        /* 04 */ "State-Package",
        /* 05 */ "State-Control",
-       /* 06 */ "State-root_parse_scope",
-       /* 07 */ "State-parse_scope",
-       /* 08 */ "State-walk_scope",
+       /* 06 */ "State-RootParseScope",
+       /* 07 */ "State-ParseScope",
+       /* 08 */ "State-WalkScope",
        /* 09 */ "State-Result",
        /* 10 */ "State-Notify",
        /* 11 */ "State-Thread",
@@ -674,6 +682,7 @@ static const char *acpi_gbl_desc_type_names[] = {
        /* 13 */ "Parser",
        /* 14 */ "Operand",
        /* 15 */ "Node"
+/*! [End] no source code translation !*/
 };
 
 char *acpi_ut_get_descriptor_name(void *object)
@@ -684,11 +693,12 @@ char *acpi_ut_get_descriptor_name(void *object)
        }
 
        if (ACPI_GET_DESCRIPTOR_TYPE(object) > ACPI_DESC_TYPE_MAX) {
-               return ((char *)acpi_gbl_bad_type);
+               return (ACPI_CAST_PTR(char, acpi_gbl_bad_type));
        }
 
-       return ((char *)
-               acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE(object)]);
+       return (ACPI_CAST_PTR(char,
+                             acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE
+                                                      (object)]));
 
 }
 
@@ -787,6 +797,11 @@ void acpi_ut_init_globals(void)
                acpi_gbl_mutex_info[i].use_count = 0;
        }
 
+       for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) {
+               acpi_gbl_owner_id_mask[i] = 0;
+       }
+       acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;        /* Last ID is never valid */
+
        /* GPE support */
 
        acpi_gbl_gpe_xrupt_list_head = NULL;
@@ -824,7 +839,11 @@ void acpi_ut_init_globals(void)
        acpi_gbl_ns_lookup_count = 0;
        acpi_gbl_ps_find_count = 0;
        acpi_gbl_acpi_hardware_present = TRUE;
-       acpi_gbl_owner_id_mask = 0;
+       acpi_gbl_last_owner_id_index = 0;
+       acpi_gbl_next_owner_id_offset = 0;
+       acpi_gbl_trace_method_name = 0;
+       acpi_gbl_trace_dbg_level = 0;
+       acpi_gbl_trace_dbg_layer = 0;
        acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
        acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT;
 
@@ -836,7 +855,6 @@ void acpi_ut_init_globals(void)
        /* Namespace */
 
        acpi_gbl_root_node = NULL;
-
        acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME;
        acpi_gbl_root_node_struct.descriptor = ACPI_DESC_TYPE_NAMED;
        acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE;
index 9dde82b0beaf537f33a9d6a5612234b157d646ca..ba771b4f39bcde6b64b005705bf4ab4f628d9f8b 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -72,9 +72,9 @@ static void
 acpi_ut_fadt_register_error(char *register_name, u32 value, acpi_size offset)
 {
 
-       ACPI_REPORT_WARNING(("Invalid FADT value %s=%X at offset %X FADT=%p\n",
-                            register_name, value, (u32) offset,
-                            acpi_gbl_FADT));
+       ACPI_WARNING((AE_INFO,
+                     "Invalid FADT value %s=%X at offset %X FADT=%p",
+                     register_name, value, (u32) offset, acpi_gbl_FADT));
 }
 
 /******************************************************************************
@@ -221,15 +221,14 @@ void acpi_ut_subsystem_shutdown(void)
        /* Just exit if subsystem is already shutdown */
 
        if (acpi_gbl_shutdown) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "ACPI Subsystem is already terminated\n"));
+               ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated"));
                return_VOID;
        }
 
        /* Subsystem appears active, go ahead and shut it down */
 
        acpi_gbl_shutdown = TRUE;
-       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem...\n"));
+       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
 
        /* Close the acpi_event Handling */
 
index 68a0a6f94129845e401e43557326b04d524b7178..4a3360484e7201077cee7ad777ac897398b9edf1 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -82,7 +82,7 @@ acpi_ut_short_divide(acpi_integer dividend,
        /* Always check for a zero divisor */
 
        if (divisor == 0) {
-               ACPI_REPORT_ERROR(("acpi_ut_short_divide: Divide by zero\n"));
+               ACPI_ERROR((AE_INFO, "Divide by zero"));
                return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO);
        }
 
@@ -144,7 +144,7 @@ acpi_ut_divide(acpi_integer in_dividend,
        /* Always check for a zero divisor */
 
        if (in_divisor == 0) {
-               ACPI_REPORT_ERROR(("acpi_ut_divide: Divide by zero\n"));
+               ACPI_ERROR((AE_INFO, "Divide by zero"));
                return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO);
        }
 
@@ -266,7 +266,7 @@ acpi_ut_short_divide(acpi_integer in_dividend,
        /* Always check for a zero divisor */
 
        if (divisor == 0) {
-               ACPI_REPORT_ERROR(("acpi_ut_short_divide: Divide by zero\n"));
+               ACPI_ERROR((AE_INFO, "Divide by zero"));
                return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO);
        }
 
@@ -292,7 +292,7 @@ acpi_ut_divide(acpi_integer in_dividend,
        /* Always check for a zero divisor */
 
        if (in_divisor == 0) {
-               ACPI_REPORT_ERROR(("acpi_ut_divide: Divide by zero\n"));
+               ACPI_ERROR((AE_INFO, "Divide by zero"));
                return_ACPI_STATUS(AE_AML_DIVIDE_BY_ZERO);
        }
 
index 2ce872d75890b99f44e5aa4712d828ba6ee0ff9c..7364f5f8c9cd63556e80c5da13022620d46b11ac 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -63,6 +63,8 @@ ACPI_MODULE_NAME("utmisc")
 acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
 {
        acpi_native_uint i;
+       acpi_native_uint j;
+       acpi_native_uint k;
        acpi_status status;
 
        ACPI_FUNCTION_TRACE("ut_allocate_owner_id");
@@ -70,8 +72,8 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
        /* Guard against multiple allocations of ID to the same location */
 
        if (*owner_id) {
-               ACPI_REPORT_ERROR(("Owner ID [%2.2X] already exists\n",
-                                  *owner_id));
+               ACPI_ERROR((AE_INFO, "Owner ID [%2.2X] already exists",
+                           *owner_id));
                return_ACPI_STATUS(AE_ALREADY_EXISTS);
        }
 
@@ -82,31 +84,67 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
                return_ACPI_STATUS(status);
        }
 
-       /* Find a free owner ID */
+       /*
+        * Find a free owner ID, cycle through all possible IDs on repeated
+        * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
+        * to be scanned twice.
+        */
+       for (i = 0, j = acpi_gbl_last_owner_id_index;
+            i < (ACPI_NUM_OWNERID_MASKS + 1); i++, j++) {
+               if (j >= ACPI_NUM_OWNERID_MASKS) {
+                       j = 0;  /* Wraparound to start of mask array */
+               }
+
+               for (k = acpi_gbl_next_owner_id_offset; k < 32; k++) {
+                       if (acpi_gbl_owner_id_mask[j] == ACPI_UINT32_MAX) {
+                               /* There are no free IDs in this mask */
 
-       for (i = 0; i < 64; i++) {
-               if (!(acpi_gbl_owner_id_mask & (1ULL << i))) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
-                                         "Current owner_id mask: %16.16LX New ID: %2.2X\n",
-                                         acpi_gbl_owner_id_mask,
-                                         (unsigned int)(i + 1)));
+                               break;
+                       }
 
-                       acpi_gbl_owner_id_mask |= (1ULL << i);
-                       *owner_id = (acpi_owner_id) (i + 1);
-                       goto exit;
+                       if (!(acpi_gbl_owner_id_mask[j] & (1 << k))) {
+                               /*
+                                * Found a free ID. The actual ID is the bit index plus one,
+                                * making zero an invalid Owner ID. Save this as the last ID
+                                * allocated and update the global ID mask.
+                                */
+                               acpi_gbl_owner_id_mask[j] |= (1 << k);
+
+                               acpi_gbl_last_owner_id_index = (u8) j;
+                               acpi_gbl_next_owner_id_offset = (u8) (k + 1);
+
+                               /*
+                                * Construct encoded ID from the index and bit position
+                                *
+                                * Note: Last [j].k (bit 255) is never used and is marked
+                                * permanently allocated (prevents +1 overflow)
+                                */
+                               *owner_id =
+                                   (acpi_owner_id) ((k + 1) + ACPI_MUL_32(j));
+
+                               ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
+                                                 "Allocated owner_id: %2.2X\n",
+                                                 (unsigned int)*owner_id));
+                               goto exit;
+                       }
                }
+
+               acpi_gbl_next_owner_id_offset = 0;
        }
 
        /*
-        * If we are here, all owner_ids have been allocated. This probably should
+        * All owner_ids have been allocated. This typically should
         * not happen since the IDs are reused after deallocation. The IDs are
         * allocated upon table load (one per table) and method execution, and
         * they are released when a table is unloaded or a method completes
         * execution.
+        *
+        * If this error happens, there may be very deep nesting of invoked control
+        * methods, or there may be a bug where the IDs are not released.
         */
-       *owner_id = 0;
        status = AE_OWNER_ID_LIMIT;
-       ACPI_REPORT_ERROR(("Could not allocate new owner_id (64 max), AE_OWNER_ID_LIMIT\n"));
+       ACPI_ERROR((AE_INFO,
+                   "Could not allocate new owner_id (255 max), AE_OWNER_ID_LIMIT"));
 
       exit:
        (void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
@@ -123,7 +161,7 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
  *              control method or unloading a table. Either way, we would
  *              ignore any error anyway.
  *
- * DESCRIPTION: Release a table or method owner ID.  Valid IDs are 1 - 64
+ * DESCRIPTION: Release a table or method owner ID.  Valid IDs are 1 - 255
  *
  ******************************************************************************/
 
@@ -131,6 +169,8 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
 {
        acpi_owner_id owner_id = *owner_id_ptr;
        acpi_status status;
+       acpi_native_uint index;
+       u32 bit;
 
        ACPI_FUNCTION_TRACE_U32("ut_release_owner_id", owner_id);
 
@@ -140,8 +180,8 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
 
        /* Zero is not a valid owner_iD */
 
-       if ((owner_id == 0) || (owner_id > 64)) {
-               ACPI_REPORT_ERROR(("Invalid owner_id: %2.2X\n", owner_id));
+       if (owner_id == 0) {
+               ACPI_ERROR((AE_INFO, "Invalid owner_id: %2.2X", owner_id));
                return_VOID;
        }
 
@@ -156,10 +196,19 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
 
        owner_id--;
 
+       /* Decode ID to index/offset pair */
+
+       index = ACPI_DIV_32(owner_id);
+       bit = 1 << ACPI_MOD_32(owner_id);
+
        /* Free the owner ID only if it is valid */
 
-       if (acpi_gbl_owner_id_mask & (1ULL << owner_id)) {
-               acpi_gbl_owner_id_mask ^= (1ULL << owner_id);
+       if (acpi_gbl_owner_id_mask[index] & bit) {
+               acpi_gbl_owner_id_mask[index] ^= bit;
+       } else {
+               ACPI_ERROR((AE_INFO,
+                           "Release of non-allocated owner_id: %2.2X",
+                           owner_id + 1));
        }
 
        (void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
@@ -790,109 +839,97 @@ u8 acpi_ut_generate_checksum(u8 * buffer, u32 length)
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ut_get_resource_end_tag
+ * FUNCTION:    acpi_ut_error, acpi_ut_warning, acpi_ut_info
  *
- * PARAMETERS:  obj_desc        - The resource template buffer object
+ * PARAMETERS:  module_name         - Caller's module name (for error output)
+ *              line_number         - Caller's line number (for error output)
+ *              Format              - Printf format string + additional args
  *
- * RETURN:      Pointer to the end tag
+ * RETURN:      None
  *
- * DESCRIPTION: Find the END_TAG resource descriptor in a resource template
+ * DESCRIPTION: Print message with module/line/version info
  *
  ******************************************************************************/
 
-u8 *acpi_ut_get_resource_end_tag(union acpi_operand_object * obj_desc)
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_error(char *module_name, u32 line_number, char *format, ...)
 {
-       u8 buffer_byte;
-       u8 *buffer;
-       u8 *end_buffer;
+       va_list args;
 
-       buffer = obj_desc->buffer.pointer;
-       end_buffer = buffer + obj_desc->buffer.length;
+       acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
 
-       while (buffer < end_buffer) {
-               buffer_byte = *buffer;
-               if (buffer_byte & ACPI_RDESC_TYPE_MASK) {
-                       /* Large Descriptor - Length is next 2 bytes */
+       va_start(args, format);
+       acpi_os_vprintf(format, args);
+       acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
+}
 
-                       buffer += ((*(buffer + 1) | (*(buffer + 2) << 8)) + 3);
-               } else {
-                       /* Small Descriptor.  End Tag will be found here */
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_exception(char *module_name,
+                 u32 line_number, acpi_status status, char *format, ...)
+{
+       va_list args;
 
-                       if ((buffer_byte & ACPI_RDESC_SMALL_MASK) ==
-                           ACPI_RDESC_TYPE_END_TAG) {
-                               /* Found the end tag descriptor, all done. */
+       acpi_os_printf("ACPI Exception (%s-%04d): %s, ", module_name,
+                      line_number, acpi_format_exception(status));
 
-                               return (buffer);
-                       }
+       va_start(args, format);
+       acpi_os_vprintf(format, args);
+       acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
+}
 
-                       /* Length is in the header */
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_warning(char *module_name, u32 line_number, char *format, ...)
+{
+       va_list args;
 
-                       buffer += ((buffer_byte & 0x07) + 1);
-               }
-       }
+       acpi_os_printf("ACPI Warning (%s-%04d): ", module_name, line_number);
+
+       va_start(args, format);
+       acpi_os_vprintf(format, args);
+       acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
+}
+
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_info(char *module_name, u32 line_number, char *format, ...)
+{
+       va_list args;
 
-       /* End tag not found */
+       acpi_os_printf("ACPI (%s-%04d): ", module_name, line_number);
 
-       return (NULL);
+       va_start(args, format);
+       acpi_os_vprintf(format, args);
+       acpi_os_printf(" [%X]\n", ACPI_CA_VERSION);
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_ut_report_error
+ * FUNCTION:    acpi_ut_report_error, Warning, Info
  *
  * PARAMETERS:  module_name         - Caller's module name (for error output)
  *              line_number         - Caller's line number (for error output)
- *              component_id        - Caller's component ID (for error output)
  *
  * RETURN:      None
  *
  * DESCRIPTION: Print error message
  *
+ * Note: Legacy only, should be removed when no longer used by drivers.
+ *
  ******************************************************************************/
 
-void acpi_ut_report_error(char *module_name, u32 line_number, u32 component_id)
+void acpi_ut_report_error(char *module_name, u32 line_number)
 {
 
-       acpi_os_printf("%8s-%04d: *** Error: ", module_name, line_number);
+       acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
 }
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_report_warning
- *
- * PARAMETERS:  module_name         - Caller's module name (for error output)
- *              line_number         - Caller's line number (for error output)
- *              component_id        - Caller's component ID (for error output)
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print warning message
- *
- ******************************************************************************/
-
-void
-acpi_ut_report_warning(char *module_name, u32 line_number, u32 component_id)
+void acpi_ut_report_warning(char *module_name, u32 line_number)
 {
 
-       acpi_os_printf("%8s-%04d: *** Warning: ", module_name, line_number);
+       acpi_os_printf("ACPI Warning (%s-%04d): ", module_name, line_number);
 }
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_report_info
- *
- * PARAMETERS:  module_name         - Caller's module name (for error output)
- *              line_number         - Caller's line number (for error output)
- *              component_id        - Caller's component ID (for error output)
- *
- * RETURN:      None
- *
- * DESCRIPTION: Print information message
- *
- ******************************************************************************/
-
-void acpi_ut_report_info(char *module_name, u32 line_number, u32 component_id)
+void acpi_ut_report_info(char *module_name, u32 line_number)
 {
 
-       acpi_os_printf("%8s-%04d: *** Info: ", module_name, line_number);
+       acpi_os_printf("ACPI (%s-%04d): ", module_name, line_number);
 }
index 90134c56ece9343607f578232860f1d55f8c99a8..45a7244df924c8ac774bef892f77b7196b898ede 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
                 * the ACPI subsystem code.
                 */
                for (i = mutex_id; i < MAX_MUTEX; i++) {
-                       if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) {
+                       if (acpi_gbl_mutex_info[i].thread_id == this_thread_id) {
                                if (i == mutex_id) {
-                                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                         "Mutex [%s] already acquired by this thread [%X]\n",
-                                                         acpi_ut_get_mutex_name
-                                                         (mutex_id),
-                                                         this_thread_id));
+                                       ACPI_ERROR((AE_INFO,
+                                                   "Mutex [%s] already acquired by this thread [%X]",
+                                                   acpi_ut_get_mutex_name
+                                                   (mutex_id),
+                                                   this_thread_id));
 
                                        return (AE_ALREADY_ACQUIRED);
                                }
 
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Invalid acquire order: Thread %X owns [%s], wants [%s]\n",
-                                                 this_thread_id,
-                                                 acpi_ut_get_mutex_name(i),
-                                                 acpi_ut_get_mutex_name
-                                                 (mutex_id)));
+                               ACPI_ERROR((AE_INFO,
+                                           "Invalid acquire order: Thread %X owns [%s], wants [%s]",
+                                           this_thread_id,
+                                           acpi_ut_get_mutex_name(i),
+                                           acpi_ut_get_mutex_name(mutex_id)));
 
                                return (AE_ACQUIRE_DEADLOCK);
                        }
@@ -253,11 +252,9 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
                acpi_gbl_mutex_info[mutex_id].use_count++;
                acpi_gbl_mutex_info[mutex_id].thread_id = this_thread_id;
        } else {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Thread %X could not acquire Mutex [%s] %s\n",
-                                 this_thread_id,
-                                 acpi_ut_get_mutex_name(mutex_id),
-                                 acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Thread %X could not acquire Mutex [%X]",
+                               this_thread_id, mutex_id));
        }
 
        return (status);
@@ -295,9 +292,9 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)
         * Mutex must be acquired in order to release it!
         */
        if (acpi_gbl_mutex_info[mutex_id].thread_id == ACPI_MUTEX_NOT_ACQUIRED) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Mutex [%s] is not acquired, cannot release\n",
-                                 acpi_ut_get_mutex_name(mutex_id)));
+               ACPI_ERROR((AE_INFO,
+                           "Mutex [%X] is not acquired, cannot release",
+                           mutex_id));
 
                return (AE_NOT_ACQUIRED);
        }
@@ -313,16 +310,15 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)
                 * the ACPI subsystem code.
                 */
                for (i = mutex_id; i < MAX_MUTEX; i++) {
-                       if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) {
+                       if (acpi_gbl_mutex_info[i].thread_id == this_thread_id) {
                                if (i == mutex_id) {
                                        continue;
                                }
 
-                               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                                 "Invalid release order: owns [%s], releasing [%s]\n",
-                                                 acpi_ut_get_mutex_name(i),
-                                                 acpi_ut_get_mutex_name
-                                                 (mutex_id)));
+                               ACPI_ERROR((AE_INFO,
+                                           "Invalid release order: owns [%s], releasing [%s]",
+                                           acpi_ut_get_mutex_name(i),
+                                           acpi_ut_get_mutex_name(mutex_id)));
 
                                return (AE_RELEASE_DEADLOCK);
                        }
@@ -338,11 +334,9 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id)
            acpi_os_signal_semaphore(acpi_gbl_mutex_info[mutex_id].mutex, 1);
 
        if (ACPI_FAILURE(status)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Thread %X could not release Mutex [%s] %s\n",
-                                 this_thread_id,
-                                 acpi_ut_get_mutex_name(mutex_id),
-                                 acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "Thread %X could not release Mutex [%X]",
+                               this_thread_id, mutex_id));
        } else {
                ACPI_DEBUG_PRINT((ACPI_DB_MUTEX,
                                  "Thread %X released Mutex [%s]\n",
index 3015e15400536d2890617179589f67cd1cbadec7..7ee2d1d980719e40cf8115064e26401b7f228029 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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)
 
                buffer = ACPI_MEM_CALLOCATE(buffer_size);
                if (!buffer) {
-                       ACPI_REPORT_ERROR(("create_buffer: could not allocate size %X\n", (u32) buffer_size));
+                       ACPI_ERROR((AE_INFO, "Could not allocate size %X",
+                                   (u32) buffer_size));
                        acpi_ut_remove_reference(buffer_desc);
                        return_PTR(NULL);
                }
@@ -228,7 +229,8 @@ union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size)
         */
        string = ACPI_MEM_CALLOCATE(string_size + 1);
        if (!string) {
-               ACPI_REPORT_ERROR(("create_string: could not allocate size %X\n", (u32) string_size));
+               ACPI_ERROR((AE_INFO, "Could not allocate size %X",
+                           (u32) string_size));
                acpi_ut_remove_reference(string_desc);
                return_PTR(NULL);
        }
@@ -310,8 +312,8 @@ void *acpi_ut_allocate_object_desc_dbg(char *module_name,
 
        object = acpi_os_acquire_object(acpi_gbl_operand_cache);
        if (!object) {
-               _ACPI_REPORT_ERROR(module_name, line_number, component_id,
-                                  ("Could not allocate an object descriptor\n"));
+               ACPI_ERROR((module_name, line_number,
+                           "Could not allocate an object descriptor"));
 
                return_PTR(NULL);
        }
@@ -345,9 +347,9 @@ void acpi_ut_delete_object_desc(union acpi_operand_object *object)
        /* Object must be an union acpi_operand_object    */
 
        if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "%p is not an ACPI Operand object [%s]\n",
-                                 object, acpi_ut_get_descriptor_name(object)));
+               ACPI_ERROR((AE_INFO,
+                           "%p is not an ACPI Operand object [%s]", object,
+                           acpi_ut_get_descriptor_name(object)));
                return_VOID;
        }
 
@@ -449,10 +451,10 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
                         * Notably, Locals and Args are not supported, but this may be
                         * required eventually.
                         */
-                       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                         "Unsupported Reference opcode=%X in object %p\n",
-                                         internal_object->reference.opcode,
-                                         internal_object));
+                       ACPI_ERROR((AE_INFO,
+                                   "Unsupported Reference opcode=%X in object %p",
+                                   internal_object->reference.opcode,
+                                   internal_object));
                        status = AE_TYPE;
                        break;
                }
@@ -460,10 +462,9 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
 
        default:
 
-               ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-                                 "Unsupported type=%X in object %p\n",
-                                 ACPI_GET_OBJECT_TYPE(internal_object),
-                                 internal_object));
+               ACPI_ERROR((AE_INFO, "Unsupported type=%X in object %p",
+                           ACPI_GET_OBJECT_TYPE(internal_object),
+                           internal_object));
                status = AE_TYPE;
                break;
        }
diff --git a/drivers/acpi/utilities/utresrc.c b/drivers/acpi/utilities/utresrc.c
new file mode 100644 (file)
index 0000000..1646131
--- /dev/null
@@ -0,0 +1,554 @@
+/*******************************************************************************
+ *
+ * Module Name: utresrc - Resource managment utilities
+ *
+ ******************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2006, R. Byron Moore
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ */
+
+#include <acpi/acpi.h>
+#include <acpi/amlresrc.h>
+
+#define _COMPONENT          ACPI_UTILITIES
+ACPI_MODULE_NAME("utmisc")
+
+#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
+/*
+ * Strings used to decode resource descriptors.
+ * Used by both the disasssembler and the debugger resource dump routines
+ */
+const char *acpi_gbl_BMdecode[2] = {
+       "not_bus_master",
+       "bus_master"
+};
+
+const char *acpi_gbl_config_decode[4] = {
+       "0 - Good Configuration",
+       "1 - Acceptable Configuration",
+       "2 - Suboptimal Configuration",
+       "3 - ***Invalid Configuration***",
+};
+
+const char *acpi_gbl_consume_decode[2] = {
+       "resource_producer",
+       "resource_consumer"
+};
+
+const char *acpi_gbl_DECdecode[2] = {
+       "pos_decode",
+       "sub_decode"
+};
+
+const char *acpi_gbl_HEdecode[2] = {
+       "Level",
+       "Edge"
+};
+
+const char *acpi_gbl_io_decode[2] = {
+       "Decode10",
+       "Decode16"
+};
+
+const char *acpi_gbl_LLdecode[2] = {
+       "active_high",
+       "active_low"
+};
+
+const char *acpi_gbl_max_decode[2] = {
+       "max_not_fixed",
+       "max_fixed"
+};
+
+const char *acpi_gbl_MEMdecode[4] = {
+       "non_cacheable",
+       "Cacheable",
+       "write_combining",
+       "Prefetchable"
+};
+
+const char *acpi_gbl_min_decode[2] = {
+       "min_not_fixed",
+       "min_fixed"
+};
+
+const char *acpi_gbl_MTPdecode[4] = {
+       "address_range_memory",
+       "address_range_reserved",
+       "address_range_aCPI",
+       "address_range_nVS"
+};
+
+const char *acpi_gbl_RNGdecode[4] = {
+       "invalid_ranges",
+       "non_iSAonly_ranges",
+       "ISAonly_ranges",
+       "entire_range"
+};
+
+const char *acpi_gbl_RWdecode[2] = {
+       "read_only",
+       "read_write"
+};
+
+const char *acpi_gbl_SHRdecode[2] = {
+       "Exclusive",
+       "Shared"
+};
+
+const char *acpi_gbl_SIZdecode[4] = {
+       "Transfer8",
+       "Transfer8_16",
+       "Transfer16",
+       "invalid_size"
+};
+
+const char *acpi_gbl_TRSdecode[2] = {
+       "dense_translation",
+       "sparse_translation"
+};
+
+const char *acpi_gbl_TTPdecode[2] = {
+       "type_static",
+       "type_translation"
+};
+
+const char *acpi_gbl_TYPdecode[4] = {
+       "Compatibility",
+       "type_a",
+       "type_b",
+       "type_f"
+};
+
+#endif
+
+/*
+ * Base sizes of the raw AML resource descriptors, indexed by resource type.
+ * Zero indicates a reserved (and therefore invalid) resource type.
+ */
+const u8 acpi_gbl_resource_aml_sizes[] = {
+       /* Small descriptors */
+
+       0,
+       0,
+       0,
+       0,
+       ACPI_AML_SIZE_SMALL(struct aml_resource_irq),
+       ACPI_AML_SIZE_SMALL(struct aml_resource_dma),
+       ACPI_AML_SIZE_SMALL(struct aml_resource_start_dependent),
+       ACPI_AML_SIZE_SMALL(struct aml_resource_end_dependent),
+       ACPI_AML_SIZE_SMALL(struct aml_resource_io),
+       ACPI_AML_SIZE_SMALL(struct aml_resource_fixed_io),
+       0,
+       0,
+       0,
+       0,
+       ACPI_AML_SIZE_SMALL(struct aml_resource_vendor_small),
+       ACPI_AML_SIZE_SMALL(struct aml_resource_end_tag),
+
+       /* Large descriptors */
+
+       0,
+       ACPI_AML_SIZE_LARGE(struct aml_resource_memory24),
+       ACPI_AML_SIZE_LARGE(struct aml_resource_generic_register),
+       0,
+       ACPI_AML_SIZE_LARGE(struct aml_resource_vendor_large),
+       ACPI_AML_SIZE_LARGE(struct aml_resource_memory32),
+       ACPI_AML_SIZE_LARGE(struct aml_resource_fixed_memory32),
+       ACPI_AML_SIZE_LARGE(struct aml_resource_address32),
+       ACPI_AML_SIZE_LARGE(struct aml_resource_address16),
+       ACPI_AML_SIZE_LARGE(struct aml_resource_extended_irq),
+       ACPI_AML_SIZE_LARGE(struct aml_resource_address64),
+       ACPI_AML_SIZE_LARGE(struct aml_resource_extended_address64)
+};
+
+/*
+ * Resource types, used to validate the resource length field.
+ * The length of fixed-length types must match exactly, variable
+ * lengths must meet the minimum required length, etc.
+ * Zero indicates a reserved (and therefore invalid) resource type.
+ */
+static const u8 acpi_gbl_resource_types[] = {
+       /* Small descriptors */
+
+       0,
+       0,
+       0,
+       0,
+       ACPI_SMALL_VARIABLE_LENGTH,
+       ACPI_FIXED_LENGTH,
+       ACPI_SMALL_VARIABLE_LENGTH,
+       ACPI_FIXED_LENGTH,
+       ACPI_FIXED_LENGTH,
+       ACPI_FIXED_LENGTH,
+       0,
+       0,
+       0,
+       0,
+       ACPI_VARIABLE_LENGTH,
+       ACPI_FIXED_LENGTH,
+
+       /* Large descriptors */
+
+       0,
+       ACPI_FIXED_LENGTH,
+       ACPI_FIXED_LENGTH,
+       0,
+       ACPI_VARIABLE_LENGTH,
+       ACPI_FIXED_LENGTH,
+       ACPI_FIXED_LENGTH,
+       ACPI_VARIABLE_LENGTH,
+       ACPI_VARIABLE_LENGTH,
+       ACPI_VARIABLE_LENGTH,
+       ACPI_VARIABLE_LENGTH,
+       ACPI_FIXED_LENGTH
+};
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_validate_resource
+ *
+ * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
+ *              return_index    - Where the resource index is returned. NULL
+ *                                if the index is not required.
+ *
+ * RETURN:      Status, and optionally the Index into the global resource tables
+ *
+ * DESCRIPTION: Validate an AML resource descriptor by checking the Resource
+ *              Type and Resource Length. Returns an index into the global
+ *              resource information/dispatch tables for later use.
+ *
+ ******************************************************************************/
+
+acpi_status acpi_ut_validate_resource(void *aml, u8 * return_index)
+{
+       u8 resource_type;
+       u8 resource_index;
+       acpi_rs_length resource_length;
+       acpi_rs_length minimum_resource_length;
+
+       ACPI_FUNCTION_ENTRY();
+
+       /*
+        * 1) Validate the resource_type field (Byte 0)
+        */
+       resource_type = ACPI_GET8(aml);
+
+       /*
+        * Byte 0 contains the descriptor name (Resource Type)
+        * Examine the large/small bit in the resource header
+        */
+       if (resource_type & ACPI_RESOURCE_NAME_LARGE) {
+               /* Verify the large resource type (name) against the max */
+
+               if (resource_type > ACPI_RESOURCE_NAME_LARGE_MAX) {
+                       return (AE_AML_INVALID_RESOURCE_TYPE);
+               }
+
+               /*
+                * Large Resource Type -- bits 6:0 contain the name
+                * Translate range 0x80-0x8B to index range 0x10-0x1B
+                */
+               resource_index = (u8) (resource_type - 0x70);
+       } else {
+               /*
+                * Small Resource Type -- bits 6:3 contain the name
+                * Shift range to index range 0x00-0x0F
+                */
+               resource_index = (u8)
+                   ((resource_type & ACPI_RESOURCE_NAME_SMALL_MASK) >> 3);
+       }
+
+       /* Check validity of the resource type, zero indicates name is invalid */
+
+       if (!acpi_gbl_resource_types[resource_index]) {
+               return (AE_AML_INVALID_RESOURCE_TYPE);
+       }
+
+       /*
+        * 2) Validate the resource_length field. This ensures that the length
+        *    is at least reasonable, and guarantees that it is non-zero.
+        */
+       resource_length = acpi_ut_get_resource_length(aml);
+       minimum_resource_length = acpi_gbl_resource_aml_sizes[resource_index];
+
+       /* Validate based upon the type of resource - fixed length or variable */
+
+       switch (acpi_gbl_resource_types[resource_index]) {
+       case ACPI_FIXED_LENGTH:
+
+               /* Fixed length resource, length must match exactly */
+
+               if (resource_length != minimum_resource_length) {
+                       return (AE_AML_BAD_RESOURCE_LENGTH);
+               }
+               break;
+
+       case ACPI_VARIABLE_LENGTH:
+
+               /* Variable length resource, length must be at least the minimum */
+
+               if (resource_length < minimum_resource_length) {
+                       return (AE_AML_BAD_RESOURCE_LENGTH);
+               }
+               break;
+
+       case ACPI_SMALL_VARIABLE_LENGTH:
+
+               /* Small variable length resource, length can be (Min) or (Min-1) */
+
+               if ((resource_length > minimum_resource_length) ||
+                   (resource_length < (minimum_resource_length - 1))) {
+                       return (AE_AML_BAD_RESOURCE_LENGTH);
+               }
+               break;
+
+       default:
+
+               /* Shouldn't happen (because of validation earlier), but be sure */
+
+               return (AE_AML_INVALID_RESOURCE_TYPE);
+       }
+
+       /* Optionally return the resource table index */
+
+       if (return_index) {
+               *return_index = resource_index;
+       }
+
+       return (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_get_resource_type
+ *
+ * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
+ *
+ * RETURN:      The Resource Type with no extraneous bits (except the
+ *              Large/Small descriptor bit -- this is left alone)
+ *
+ * DESCRIPTION: Extract the Resource Type/Name from the first byte of
+ *              a resource descriptor.
+ *
+ ******************************************************************************/
+
+u8 acpi_ut_get_resource_type(void *aml)
+{
+       ACPI_FUNCTION_ENTRY();
+
+       /*
+        * Byte 0 contains the descriptor name (Resource Type)
+        * Examine the large/small bit in the resource header
+        */
+       if (ACPI_GET8(aml) & ACPI_RESOURCE_NAME_LARGE) {
+               /* Large Resource Type -- bits 6:0 contain the name */
+
+               return (ACPI_GET8(aml));
+       } else {
+               /* Small Resource Type -- bits 6:3 contain the name */
+
+               return ((u8) (ACPI_GET8(aml) & ACPI_RESOURCE_NAME_SMALL_MASK));
+       }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_get_resource_length
+ *
+ * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
+ *
+ * RETURN:      Byte Length
+ *
+ * DESCRIPTION: Get the "Resource Length" of a raw AML descriptor. By
+ *              definition, this does not include the size of the descriptor
+ *              header or the length field itself.
+ *
+ ******************************************************************************/
+
+u16 acpi_ut_get_resource_length(void *aml)
+{
+       acpi_rs_length resource_length;
+
+       ACPI_FUNCTION_ENTRY();
+
+       /*
+        * Byte 0 contains the descriptor name (Resource Type)
+        * Examine the large/small bit in the resource header
+        */
+       if (ACPI_GET8(aml) & ACPI_RESOURCE_NAME_LARGE) {
+               /* Large Resource type -- bytes 1-2 contain the 16-bit length */
+
+               ACPI_MOVE_16_TO_16(&resource_length, ACPI_ADD_PTR(u8, aml, 1));
+
+       } else {
+               /* Small Resource type -- bits 2:0 of byte 0 contain the length */
+
+               resource_length = (u16) (ACPI_GET8(aml) &
+                                        ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK);
+       }
+
+       return (resource_length);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_get_resource_header_length
+ *
+ * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
+ *
+ * RETURN:      Length of the AML header (depends on large/small descriptor)
+ *
+ * DESCRIPTION: Get the length of the header for this resource.
+ *
+ ******************************************************************************/
+
+u8 acpi_ut_get_resource_header_length(void *aml)
+{
+       ACPI_FUNCTION_ENTRY();
+
+       /* Examine the large/small bit in the resource header */
+
+       if (ACPI_GET8(aml) & ACPI_RESOURCE_NAME_LARGE) {
+               return (sizeof(struct aml_resource_large_header));
+       } else {
+               return (sizeof(struct aml_resource_small_header));
+       }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_get_descriptor_length
+ *
+ * PARAMETERS:  Aml             - Pointer to the raw AML resource descriptor
+ *
+ * RETURN:      Byte length
+ *
+ * DESCRIPTION: Get the total byte length of a raw AML descriptor, including the
+ *              length of the descriptor header and the length field itself.
+ *              Used to walk descriptor lists.
+ *
+ ******************************************************************************/
+
+u32 acpi_ut_get_descriptor_length(void *aml)
+{
+       ACPI_FUNCTION_ENTRY();
+
+       /*
+        * Get the Resource Length (does not include header length) and add
+        * the header length (depends on if this is a small or large resource)
+        */
+       return (acpi_ut_get_resource_length(aml) +
+               acpi_ut_get_resource_header_length(aml));
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_get_resource_end_tag
+ *
+ * PARAMETERS:  obj_desc        - The resource template buffer object
+ *              end_tag         - Where the pointer to the end_tag is returned
+ *
+ * RETURN:      Status, pointer to the end tag
+ *
+ * DESCRIPTION: Find the end_tag resource descriptor in an AML resource template
+ *              Note: allows a buffer length of zero.
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ut_get_resource_end_tag(union acpi_operand_object * obj_desc,
+                            u8 ** end_tag)
+{
+       acpi_status status;
+       u8 *aml;
+       u8 *end_aml;
+
+       ACPI_FUNCTION_TRACE("ut_get_resource_end_tag");
+
+       /* Get start and end pointers */
+
+       aml = obj_desc->buffer.pointer;
+       end_aml = aml + obj_desc->buffer.length;
+
+       /* Allow a buffer length of zero */
+
+       if (!obj_desc->buffer.length) {
+               *end_tag = aml;
+               return_ACPI_STATUS(AE_OK);
+       }
+
+       /* Walk the resource template, one descriptor per iteration */
+
+       while (aml < end_aml) {
+               /* Validate the Resource Type and Resource Length */
+
+               status = acpi_ut_validate_resource(aml, NULL);
+               if (ACPI_FAILURE(status)) {
+                       return_ACPI_STATUS(status);
+               }
+
+               /* end_tag resource indicates the end of the resource template */
+
+               if (acpi_ut_get_resource_type(aml) ==
+                   ACPI_RESOURCE_NAME_END_TAG) {
+                       /*
+                        * There must be at least one more byte in the buffer for
+                        * the 2nd byte of the end_tag
+                        */
+                       if ((aml + 1) >= end_aml) {
+                               return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
+                       }
+
+                       /* Return the pointer to the end_tag */
+
+                       *end_tag = aml;
+                       return_ACPI_STATUS(AE_OK);
+               }
+
+               /*
+                * Point to the next resource descriptor in the AML buffer. The
+                * descriptor length is guaranteed to be non-zero by resource
+                * validation above.
+                */
+               aml += acpi_ut_get_descriptor_length(aml);
+       }
+
+       /* Did not find an end_tag resource descriptor */
+
+       return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
+}
index c1cb27583be88aab80dbe2f44e3b711bde3d01ed..4b134a72290711b81753003c81c30ed170386abb 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -63,7 +63,7 @@ acpi_status
 acpi_ut_create_pkg_state_and_push(void *internal_object,
                                  void *external_object,
                                  u16 index,
-                                 union acpi_generic_state ** state_list)
+                                 union acpi_generic_state **state_list)
 {
        union acpi_generic_state *state;
 
index f06bd5e5e9d1b2970b4cb33f897552177f786f6c..308a960871be8a7a919fe1e070cda35d2abfd5ec 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -75,8 +75,7 @@ acpi_status acpi_initialize_subsystem(void)
 
        status = acpi_os_initialize();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("OSD failed to initialize, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status, "During OSL initialization"));
                return_ACPI_STATUS(status);
        }
 
@@ -88,8 +87,8 @@ acpi_status acpi_initialize_subsystem(void)
 
        status = acpi_ut_mutex_initialize();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Global mutex creation failure, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "During Global Mutex creation"));
                return_ACPI_STATUS(status);
        }
 
@@ -99,15 +98,14 @@ acpi_status acpi_initialize_subsystem(void)
         */
        status = acpi_ns_root_initialize();
        if (ACPI_FAILURE(status)) {
-               ACPI_REPORT_ERROR(("Namespace initialization failure, %s\n",
-                                  acpi_format_exception(status)));
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "During Namespace initialization"));
                return_ACPI_STATUS(status);
        }
 
        /* If configured, initialize the AML debugger */
 
        ACPI_DEBUGGER_EXEC(status = acpi_db_initialize());
-
        return_ACPI_STATUS(status);
 }
 
@@ -154,8 +152,7 @@ acpi_status acpi_enable_subsystem(u32 flags)
 
                status = acpi_enable();
                if (ACPI_FAILURE(status)) {
-                       ACPI_DEBUG_PRINT((ACPI_DB_WARN,
-                                         "acpi_enable failed.\n"));
+                       ACPI_WARNING((AE_INFO, "acpi_enable failed"));
                        return_ACPI_STATUS(status);
                }
        }
@@ -178,10 +175,14 @@ acpi_status acpi_enable_subsystem(u32 flags)
        /*
         * Initialize ACPI Event handling (Fixed and General Purpose)
         *
-        * NOTE: We must have the hardware AND events initialized before we can
-        * execute ANY control methods SAFELY.  Any control method can require
-        * ACPI hardware support, so the hardware MUST be initialized before
-        * execution!
+        * Note1: We must have the hardware and events initialized before we can
+        * execute any control methods safely. Any control method can require
+        * ACPI hardware support, so the hardware must be fully initialized before
+        * any method execution!
+        *
+        * Note2: Fixed events are initialized and enabled here. GPEs are
+        * initialized, but cannot be enabled until after the hardware is
+        * completely initialized (SCI and global_lock activated)
         */
        if (!(flags & ACPI_NO_EVENT_INIT)) {
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -193,8 +194,10 @@ acpi_status acpi_enable_subsystem(u32 flags)
                }
        }
 
-       /* Install the SCI handler and Global Lock handler */
-
+       /*
+        * Install the SCI handler and Global Lock handler. This completes the
+        * hardware initialization.
+        */
        if (!(flags & ACPI_NO_HANDLER_INIT)) {
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
                                  "[Init] Installing SCI/GL handlers\n"));
@@ -205,6 +208,24 @@ acpi_status acpi_enable_subsystem(u32 flags)
                }
        }
 
+       /*
+        * Complete the GPE initialization for the GPE blocks defined in the FADT
+        * (GPE block 0 and 1).
+        *
+        * Note1: This is where the _PRW methods are executed for the GPEs. These
+        * methods can only be executed after the SCI and Global Lock handlers are
+        * installed and initialized.
+        *
+        * Note2: Currently, there seems to be no need to run the _REG methods
+        * before execution of the _PRW methods and enabling of the GPEs.
+        */
+       if (!(flags & ACPI_NO_EVENT_INIT)) {
+               status = acpi_ev_install_fadt_gpes();
+               if (ACPI_FAILURE(status)) {
+                       return (status);
+               }
+       }
+
        return_ACPI_STATUS(status);
 }
 
@@ -230,9 +251,9 @@ acpi_status acpi_initialize_objects(u32 flags)
        /*
         * Run all _REG methods
         *
-        * NOTE: Any objects accessed
-        * by the _REG methods will be automatically initialized, even if they
-        * contain executable AML (see call to acpi_ns_initialize_objects below).
+        * Note: Any objects accessed by the _REG methods will be automatically
+        * initialized, even if they contain executable AML (see the call to
+        * acpi_ns_initialize_objects below).
         */
        if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -245,9 +266,9 @@ acpi_status acpi_initialize_objects(u32 flags)
        }
 
        /*
-        * Initialize the objects that remain uninitialized.  This
-        * runs the executable AML that may be part of the declaration of these
-        * objects: operation_regions, buffer_fields, Buffers, and Packages.
+        * Initialize the objects that remain uninitialized. This runs the
+        * executable AML that may be part of the declaration of these objects:
+        * operation_regions, buffer_fields, Buffers, and Packages.
         */
        if (!(flags & ACPI_NO_OBJECT_INIT)) {
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -260,8 +281,8 @@ acpi_status acpi_initialize_objects(u32 flags)
        }
 
        /*
-        * Initialize all device objects in the namespace
-        * This runs the _STA and _INI methods.
+        * Initialize all device objects in the namespace. This runs the device
+        * _STA and _INI methods.
         */
        if (!(flags & ACPI_NO_DEVICE_INIT)) {
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
index d10668f146997d07c53630b722d15fad2054ed98..bd4887518373e2a2111cf9f2af755519d749361d 100644 (file)
@@ -920,8 +920,8 @@ static int acpi_video_device_add_fs(struct acpi_device *device)
                ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
                                  "Unable to create 'state' fs entry\n"));
        else {
+               acpi_video_device_state_fops.write = acpi_video_device_write_state;
                entry->proc_fops = &acpi_video_device_state_fops;
-               entry->proc_fops->write = acpi_video_device_write_state;
                entry->data = acpi_driver_data(device);
                entry->owner = THIS_MODULE;
        }
@@ -934,8 +934,8 @@ static int acpi_video_device_add_fs(struct acpi_device *device)
                ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
                                  "Unable to create 'brightness' fs entry\n"));
        else {
+               acpi_video_device_brightness_fops.write = acpi_video_device_write_brightness;
                entry->proc_fops = &acpi_video_device_brightness_fops;
-               entry->proc_fops->write = acpi_video_device_write_brightness;
                entry->data = acpi_driver_data(device);
                entry->owner = THIS_MODULE;
        }
@@ -1239,8 +1239,8 @@ static int acpi_video_bus_add_fs(struct acpi_device *device)
                ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
                                  "Unable to create 'POST' fs entry\n"));
        else {
+               acpi_video_bus_POST_fops.write = acpi_video_bus_write_POST;
                entry->proc_fops = &acpi_video_bus_POST_fops;
-               entry->proc_fops->write = acpi_video_bus_write_POST;
                entry->data = acpi_driver_data(device);
                entry->owner = THIS_MODULE;
        }
@@ -1253,8 +1253,8 @@ static int acpi_video_bus_add_fs(struct acpi_device *device)
                ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
                                  "Unable to create 'DOS' fs entry\n"));
        else {
+               acpi_video_bus_DOS_fops.write = acpi_video_bus_write_DOS;
                entry->proc_fops = &acpi_video_bus_DOS_fops;
-               entry->proc_fops->write = acpi_video_bus_write_DOS;
                entry->data = acpi_driver_data(device);
                entry->owner = THIS_MODULE;
        }
index 4135d8c5bcae1e2d6f4278764bb42a6bbea13a33..4c67727d75b146f50fb8e0b368334af711cca314 100644 (file)
@@ -992,7 +992,7 @@ config HPET_MMAP
 
 config HANGCHECK_TIMER
        tristate "Hangcheck timer"
-       depends on X86 || IA64 || PPC64 || S390
+       depends on X86 || IA64 || PPC64
        help
          The hangcheck-timer module detects when the system has gone
          out to lunch past a certain margin.  It can reboot the system
index 40a67c86420ccc4540c54b5c18b050e2e3338b3c..ac626418b3290e060c5feed990bbe8236ba626d6 100644 (file)
@@ -117,12 +117,9 @@ __setup("hcheck_reboot", hangcheck_parse_reboot);
 __setup("hcheck_dump_tasks", hangcheck_parse_dump_tasks);
 #endif /* not MODULE */
 
-#if defined(CONFIG_X86)
+#if defined(CONFIG_X86) || defined(CONFIG_S390)
 # define HAVE_MONOTONIC
 # define TIMER_FREQ 1000000000ULL
-#elif defined(CONFIG_S390)
-/* FA240000 is 1 Second in the IBM time universe (Page 4-38 Principles of Op for zSeries */
-# define TIMER_FREQ 0xFA240000ULL
 #elif defined(CONFIG_IA64)
 # define TIMER_FREQ ((unsigned long long)local_cpu_data->itc_freq)
 #elif defined(CONFIG_PPC64)
@@ -134,12 +131,7 @@ extern unsigned long long monotonic_clock(void);
 #else
 static inline unsigned long long monotonic_clock(void)
 {
-# ifdef __s390__
-       /* returns the TOD.  see 4-38 Principles of Op of zSeries */
-       return get_clock();
-# else
        return get_cycles();
-# endif  /* __s390__ */
 }
 #endif  /* HAVE_MONOTONIC */
 
@@ -188,8 +180,6 @@ static int __init hangcheck_init(void)
               VERSION_STR, hangcheck_tick, hangcheck_margin);
 #if defined (HAVE_MONOTONIC)
        printk("Hangcheck: Using monotonic_clock().\n");
-#elif defined(__s390__)
-       printk("Hangcheck: Using TOD.\n");
 #else
        printk("Hangcheck: Using get_cycles().\n");
 #endif  /* HAVE_MONOTONIC */
index 3808d95726195d3bb5c18ab8946d77cc341d765b..66a2fee06eb9151607ac97fb617962f8563b0e8c 100644 (file)
@@ -927,9 +927,9 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
        if (ACPI_SUCCESS(status)) {
                unsigned long size;
 
-               size = addr.max_address_range - addr.min_address_range + 1;
-               hdp->hd_phys_address = addr.min_address_range;
-               hdp->hd_address = ioremap(addr.min_address_range, size);
+               size = addr.maximum - addr.minimum + 1;
+               hdp->hd_phys_address = addr.minimum;
+               hdp->hd_address = ioremap(addr.minimum, size);
 
                if (hpet_is_known(hdp)) {
                        printk(KERN_DEBUG "%s: 0x%lx is busy\n",
@@ -937,15 +937,15 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
                        iounmap(hdp->hd_address);
                        return -EBUSY;
                }
-       } else if (res->id == ACPI_RSTYPE_FIXED_MEM32) {
-               struct acpi_resource_fixed_mem32 *fixmem32;
+       } else if (res->type == ACPI_RESOURCE_TYPE_FIXED_MEMORY32) {
+               struct acpi_resource_fixed_memory32 *fixmem32;
 
                fixmem32 = &res->data.fixed_memory32;
                if (!fixmem32)
                        return -EINVAL;
 
-               hdp->hd_phys_address = fixmem32->range_base_address;
-               hdp->hd_address = ioremap(fixmem32->range_base_address,
+               hdp->hd_phys_address = fixmem32->address;
+               hdp->hd_address = ioremap(fixmem32->address,
                                                HPET_RANGE_SIZE);
 
                if (hpet_is_known(hdp)) {
@@ -954,20 +954,20 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
                        iounmap(hdp->hd_address);
                        return -EBUSY;
                }
-       } else if (res->id == ACPI_RSTYPE_EXT_IRQ) {
-               struct acpi_resource_ext_irq *irqp;
+       } else if (res->type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ) {
+               struct acpi_resource_extended_irq *irqp;
                int i;
 
                irqp = &res->data.extended_irq;
 
-               if (irqp->number_of_interrupts > 0) {
-                       hdp->hd_nirqs = irqp->number_of_interrupts;
+               if (irqp->interrupt_count > 0) {
+                       hdp->hd_nirqs = irqp->interrupt_count;
 
                        for (i = 0; i < hdp->hd_nirqs; i++) {
                                int rc =
                                    acpi_register_gsi(irqp->interrupts[i],
-                                                     irqp->edge_level,
-                                                     irqp->active_high_low);
+                                                     irqp->triggering,
+                                                     irqp->polarity);
                                if (rc < 0)
                                        return AE_ERROR;
                                hdp->hd_irq[i] = rc;
index c67ef3e47ad55603f08e1b8f3c91f9c2813459f3..6ed213bd702c2dc74c533cd29417a07ff79438ed 100644 (file)
@@ -1580,11 +1580,6 @@ static int try_init_acpi(int intf_num, struct smi_info **new_info)
        if (! is_new_interface(-1, addr_space, spmi->addr.address))
                return -ENODEV;
 
-       if (! spmi->addr.register_bit_width) {
-               acpi_failure = 1;
-               return -ENODEV;
-       }
-
        /* Figure out the interface type. */
        switch (spmi->InterfaceType)
        {
@@ -1634,9 +1629,6 @@ static int try_init_acpi(int intf_num, struct smi_info **new_info)
                regspacings[intf_num] = spmi->addr.register_bit_width / 8;
                info->io.regspacing = spmi->addr.register_bit_width / 8;
        } else {
-               /* Some broken systems get this wrong and set the value
-                * to zero.  Assume it is the default spacing.  If that
-                * is wrong, too bad, the vendor should fix the tables. */
                regspacings[intf_num] = DEFAULT_REGSPACING;
                info->io.regspacing = DEFAULT_REGSPACING;
        }
index aedf7a8e6da7eec6d91c825f4e9121ae3774fb72..537aa45d8c67a9cb98ca4fb44c7abdf85d625414 100644 (file)
@@ -191,7 +191,7 @@ static int get_event_name(char *dest, struct tcpa_event *event,
        const char *name = "";
        char data[40] = "";
        int i, n_len = 0, d_len = 0;
-       u32 event_id, event_data_size;
+       u32 event_id;
 
        switch(event->event_type) {
        case PREBOOT:
@@ -220,8 +220,7 @@ static int get_event_name(char *dest, struct tcpa_event *event,
                }
                break;
        case EVENT_TAG:
-               event_id = be32_to_cpu(event_entry);
-               event_data_size = be32_to_cpu(&event_entry[4]);
+               event_id = be32_to_cpu(*((u32 *)event_entry));
 
                /* ToDo Row data -> Base64 */
 
@@ -376,7 +375,7 @@ static int read_log(struct tpm_bios_log *log)
 {
        struct acpi_tcpa *buff;
        acpi_status status;
-       void *virt;
+       struct acpi_table_header *virt;
 
        if (log->bios_event_log != NULL) {
                printk(KERN_ERR
@@ -413,7 +412,7 @@ static int read_log(struct tpm_bios_log *log)
 
        log->bios_event_log_end = log->bios_event_log + buff->log_max_len;
 
-       acpi_os_map_memory(buff->log_start_addr, buff->log_max_len, &virt);
+       acpi_os_map_memory(buff->log_start_addr, buff->log_max_len, (void *) &virt);
 
        memcpy(log->bios_event_log, virt, buff->log_max_len);
 
@@ -487,26 +486,35 @@ struct file_operations tpm_binary_bios_measurements_ops = {
        .release = tpm_bios_measurements_release,
 };
 
+static int is_bad(void *p)
+{
+       if (!p)
+               return 1;
+       if (IS_ERR(p) && (PTR_ERR(p) != -ENODEV))
+               return 1;
+       return 0;
+}
+
 struct dentry **tpm_bios_log_setup(char *name)
 {
        struct dentry **ret = NULL, *tpm_dir, *bin_file, *ascii_file;
 
        tpm_dir = securityfs_create_dir(name, NULL);
-       if (!tpm_dir)
+       if (is_bad(tpm_dir))
                goto out;
 
        bin_file =
            securityfs_create_file("binary_bios_measurements",
                                   S_IRUSR | S_IRGRP, tpm_dir, NULL,
                                   &tpm_binary_bios_measurements_ops);
-       if (!bin_file)
+       if (is_bad(bin_file))
                goto out_tpm;
 
        ascii_file =
            securityfs_create_file("ascii_bios_measurements",
                                   S_IRUSR | S_IRGRP, tpm_dir, NULL,
                                   &tpm_ascii_bios_measurements_ops);
-       if (!ascii_file)
+       if (is_bad(ascii_file))
                goto out_bin;
 
        ret = kmalloc(3 * sizeof(struct dentry *), GFP_KERNEL);
@@ -538,3 +546,4 @@ void tpm_bios_log_teardown(struct dentry **lst)
                securityfs_remove(lst[i]);
 }
 EXPORT_SYMBOL_GPL(tpm_bios_log_teardown);
+MODULE_LICENSE("GPL");
index 8198dbb7370f1596a3b55eed4c7ac7cbaa429408..ec7590951af520378f77759abe0cc274421d6f7f 100644 (file)
@@ -441,7 +441,7 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
 
                if ((ioh << 8 | iol) != tpm_inf.base) {
                        dev_err(&dev->dev,
-                               "Could not set IO-ports to %04x\n",
+                               "Could not set IO-ports to 0x%lx\n",
                                tpm_inf.base);
                        release_region(tpm_inf.base, TPM_INF_PORT_LEN);
                        return -EIO;
index f1d9cb7feae65c7e54edadec884b1636424608e7..0900d1dbee59916e28bd60b7cb650cea7d9a3b41 100644 (file)
@@ -3213,6 +3213,7 @@ void getconsxy(struct vc_data *vc, unsigned char *p)
 
 void putconsxy(struct vc_data *vc, unsigned char *p)
 {
+       hide_cursor(vc);
        gotoxy(vc, p[0], p[1]);
        set_cursor(vc);
 }
index ed6d3174d66050f1ca3358909469770682111243..69596f6438e9d5a6d37d4dc38c931332ab5e4d1b 100644 (file)
@@ -140,10 +140,9 @@ static int macio_uevent(struct device *dev, char **envp, int num_envp,
 {
        struct macio_dev * macio_dev;
        struct of_device * of;
-       char *scratch, *compat;
+       char *scratch, *compat, *compat2;
        int i = 0;
-       int length = 0;
-       int cplen, seen = 0;
+       int length, cplen, cplen2, seen = 0;
 
        if (!dev)
                return -ENODEV;
@@ -153,23 +152,22 @@ static int macio_uevent(struct device *dev, char **envp, int num_envp,
                return -ENODEV;
 
        of = &macio_dev->ofdev;
-       scratch = buffer;
 
        /* stuff we want to pass to /sbin/hotplug */
-       envp[i++] = scratch;
-       length += scnprintf (scratch, buffer_size - length, "OF_NAME=%s",
-                            of->node->name);
-       if ((buffer_size - length <= 0) || (i >= num_envp))
-               return -ENOMEM;
+       envp[i++] = scratch = buffer;
+       length = scnprintf (scratch, buffer_size, "OF_NAME=%s", of->node->name);
        ++length;
+       buffer_size -= length;
+       if ((buffer_size <= 0) || (i >= num_envp))
+               return -ENOMEM;
        scratch += length;
 
        envp[i++] = scratch;
-       length += scnprintf (scratch, buffer_size - length, "OF_TYPE=%s",
-                            of->node->type);
-       if ((buffer_size - length <= 0) || (i >= num_envp))
-               return -ENOMEM;
+       length = scnprintf (scratch, buffer_size, "OF_TYPE=%s", of->node->type);
        ++length;
+       buffer_size -= length;
+       if ((buffer_size <= 0) || (i >= num_envp))
+               return -ENOMEM;
        scratch += length;
 
         /* Since the compatible field can contain pretty much anything
@@ -177,29 +175,55 @@ static int macio_uevent(struct device *dev, char **envp, int num_envp,
          * up using a number of environment variables instead. */
 
        compat = (char *) get_property(of->node, "compatible", &cplen);
+       compat2 = compat;
+       cplen2= cplen;
        while (compat && cplen > 0) {
-               int l;
                 envp[i++] = scratch;
-               length += scnprintf (scratch, buffer_size - length,
+               length = scnprintf (scratch, buffer_size,
                                     "OF_COMPATIBLE_%d=%s", seen, compat);
-               if ((buffer_size - length <= 0) || (i >= num_envp))
+               ++length;
+               buffer_size -= length;
+               if ((buffer_size <= 0) || (i >= num_envp))
                        return -ENOMEM;
-               length++;
                scratch += length;
-               l = strlen (compat) + 1;
-               compat += l;
-               cplen -= l;
+               length = strlen (compat) + 1;
+               compat += length;
+               cplen -= length;
                seen++;
        }
 
        envp[i++] = scratch;
-       length += scnprintf (scratch, buffer_size - length,
-                            "OF_COMPATIBLE_N=%d", seen);
-       if ((buffer_size - length <= 0) || (i >= num_envp))
-               return -ENOMEM;
+       length = scnprintf (scratch, buffer_size, "OF_COMPATIBLE_N=%d", seen);
        ++length;
+       buffer_size -= length;
+       if ((buffer_size <= 0) || (i >= num_envp))
+               return -ENOMEM;
+       scratch += length;
+
+       envp[i++] = scratch;
+       length = scnprintf (scratch, buffer_size, "MODALIAS=of:N%sT%s",
+                       of->node->name, of->node->type);
+       /* overwrite '\0' */
+       buffer_size -= length;
+       if ((buffer_size <= 0) || (i >= num_envp))
+               return -ENOMEM;
        scratch += length;
 
+       if (!compat2) {
+               compat2 = "";
+               cplen2 = 1;
+       }
+       while (cplen2 > 0) {
+               length = snprintf (scratch, buffer_size, "C%s", compat2);
+               buffer_size -= length;
+               if (buffer_size <= 0)
+                       return -ENOMEM;
+               scratch += length;
+               length = strlen (compat2) + 1;
+               compat2 += length;
+               cplen2 -= length;
+       }
+
        envp[i] = NULL;
 
        return 0;
index 1235135b384bea5ac1e82129926e30c85d36bd9f..442e2be6052e330f283379b3cc9eb02f7a5855df 100644 (file)
@@ -1359,16 +1359,11 @@ static int ctl_ioctl(struct inode *inode, struct file *file,
         * Copy the parameters into kernel space.
         */
        r = copy_params(user, &param);
-       if (r) {
-               current->flags &= ~PF_MEMALLOC;
-               return r;
-       }
 
-       /*
-        * FIXME: eventually we will remove the PF_MEMALLOC flag
-        * here.  However the tools still do nasty things like
-        * 'load' while a device is suspended.
-        */
+       current->flags &= ~PF_MEMALLOC;
+
+       if (r)
+               return r;
 
        r = validate_params(cmd, param);
        if (r)
@@ -1386,7 +1381,6 @@ static int ctl_ioctl(struct inode *inode, struct file *file,
 
  out:
        free_params(param);
-       current->flags &= ~PF_MEMALLOC;
        return r;
 }
 
index efe4adf7853041bd61c43fcd87488b72a42bbaba..74039db846baa3eb19c4574c91827f4d58cb9050 100644 (file)
@@ -112,7 +112,7 @@ void dm_destroy_dirty_log(struct dirty_log *log)
 /*
  * The on-disk version of the metadata.
  */
-#define MIRROR_DISK_VERSION 1
+#define MIRROR_DISK_VERSION 2
 #define LOG_OFFSET 2
 
 struct log_header {
@@ -157,7 +157,6 @@ struct log_c {
        struct log_header *disk_header;
 
        struct io_region bits_location;
-       uint32_t *disk_bits;
 };
 
 /*
@@ -166,20 +165,20 @@ struct log_c {
  */
 static  inline int log_test_bit(uint32_t *bs, unsigned bit)
 {
-       return test_bit(bit, (unsigned long *) bs) ? 1 : 0;
+       return ext2_test_bit(bit, (unsigned long *) bs) ? 1 : 0;
 }
 
 static inline void log_set_bit(struct log_c *l,
                               uint32_t *bs, unsigned bit)
 {
-       set_bit(bit, (unsigned long *) bs);
+       ext2_set_bit(bit, (unsigned long *) bs);
        l->touched = 1;
 }
 
 static inline void log_clear_bit(struct log_c *l,
                                 uint32_t *bs, unsigned bit)
 {
-       clear_bit(bit, (unsigned long *) bs);
+       ext2_clear_bit(bit, (unsigned long *) bs);
        l->touched = 1;
 }
 
@@ -219,6 +218,11 @@ static int read_header(struct log_c *log)
                log->header.nr_regions = 0;
        }
 
+#ifdef __LITTLE_ENDIAN
+       if (log->header.version == 1)
+               log->header.version = 2;
+#endif
+
        if (log->header.version != MIRROR_DISK_VERSION) {
                DMWARN("incompatible disk log version");
                return -EINVAL;
@@ -239,45 +243,24 @@ static inline int write_header(struct log_c *log)
 /*----------------------------------------------------------------
  * Bits IO
  *--------------------------------------------------------------*/
-static inline void bits_to_core(uint32_t *core, uint32_t *disk, unsigned count)
-{
-       unsigned i;
-
-       for (i = 0; i < count; i++)
-               core[i] = le32_to_cpu(disk[i]);
-}
-
-static inline void bits_to_disk(uint32_t *core, uint32_t *disk, unsigned count)
-{
-       unsigned i;
-
-       /* copy across the clean/dirty bitset */
-       for (i = 0; i < count; i++)
-               disk[i] = cpu_to_le32(core[i]);
-}
-
 static int read_bits(struct log_c *log)
 {
        int r;
        unsigned long ebits;
 
        r = dm_io_sync_vm(1, &log->bits_location, READ,
-                         log->disk_bits, &ebits);
+                         log->clean_bits, &ebits);
        if (r)
                return r;
 
-       bits_to_core(log->clean_bits, log->disk_bits,
-                    log->bitset_uint32_count);
        return 0;
 }
 
 static int write_bits(struct log_c *log)
 {
        unsigned long ebits;
-       bits_to_disk(log->clean_bits, log->disk_bits,
-                    log->bitset_uint32_count);
        return dm_io_sync_vm(1, &log->bits_location, WRITE,
-                            log->disk_bits, &ebits);
+                            log->clean_bits, &ebits);
 }
 
 /*----------------------------------------------------------------
@@ -433,11 +416,6 @@ static int disk_ctr(struct dirty_log *log, struct dm_target *ti,
        size = dm_round_up(lc->bitset_uint32_count * sizeof(uint32_t),
                           1 << SECTOR_SHIFT);
        lc->bits_location.count = size >> SECTOR_SHIFT;
-       lc->disk_bits = vmalloc(size);
-       if (!lc->disk_bits) {
-               vfree(lc->disk_header);
-               goto bad;
-       }
        return 0;
 
  bad:
@@ -451,7 +429,6 @@ static void disk_dtr(struct dirty_log *log)
        struct log_c *lc = (struct log_c *) log->context;
        dm_put_device(lc->ti, lc->log_dev);
        vfree(lc->disk_header);
-       vfree(lc->disk_bits);
        core_dtr(log);
 }
 
index 87727d84dbbac9bdd013aab25e78122976b23980..f3759dd7828e585ed81b0819e9908fbf546da543 100644 (file)
@@ -373,16 +373,11 @@ static inline ulong round_up(ulong n, ulong size)
 
 static void read_snapshot_metadata(struct dm_snapshot *s)
 {
-       if (s->have_metadata)
-               return;
-
        if (s->store.read_metadata(&s->store)) {
                down_write(&s->lock);
                s->valid = 0;
                up_write(&s->lock);
        }
-
-       s->have_metadata = 1;
 }
 
 /*
@@ -471,7 +466,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        s->chunk_shift = ffs(chunk_size) - 1;
 
        s->valid = 1;
-       s->have_metadata = 0;
+       s->active = 0;
        s->last_percent = 0;
        init_rwsem(&s->lock);
        s->table = ti->table;
@@ -506,7 +501,11 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
                goto bad5;
        }
 
+       /* Metadata must only be loaded into one table at once */
+       read_snapshot_metadata(s);
+
        /* Add snapshot to the list of snapshots for this origin */
+       /* Exceptions aren't triggered till snapshot_resume() is called */
        if (register_snapshot(s)) {
                r = -EINVAL;
                ti->error = "Cannot register snapshot origin";
@@ -793,6 +792,9 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio,
        if (!s->valid)
                return -EIO;
 
+       if (unlikely(bio_barrier(bio)))
+               return -EOPNOTSUPP;
+
        /*
         * Write to snapshot - higher level takes care of RW/RO
         * flags so we should only get this if we are
@@ -862,7 +864,9 @@ static void snapshot_resume(struct dm_target *ti)
 {
        struct dm_snapshot *s = (struct dm_snapshot *) ti->private;
 
-       read_snapshot_metadata(s);
+       down_write(&s->lock);
+       s->active = 1;
+       up_write(&s->lock);
 }
 
 static int snapshot_status(struct dm_target *ti, status_type_t type,
@@ -932,8 +936,8 @@ static int __origin_write(struct list_head *snapshots, struct bio *bio)
        /* Do all the snapshots on this origin */
        list_for_each_entry (snap, snapshots, list) {
 
-               /* Only deal with valid snapshots */
-               if (!snap->valid)
+               /* Only deal with valid and active snapshots */
+               if (!snap->valid || !snap->active)
                        continue;
 
                /* Nothing to do if writing beyond end of snapshot */
@@ -1057,6 +1061,9 @@ static int origin_map(struct dm_target *ti, struct bio *bio,
        struct dm_dev *dev = (struct dm_dev *) ti->private;
        bio->bi_bdev = dev->bdev;
 
+       if (unlikely(bio_barrier(bio)))
+               return -EOPNOTSUPP;
+
        /* Only tell snapshots if this is a write */
        return (bio_rw(bio) == WRITE) ? do_origin(dev, bio) : 1;
 }
@@ -1104,7 +1111,7 @@ static int origin_status(struct dm_target *ti, status_type_t type, char *result,
 
 static struct target_type origin_target = {
        .name    = "snapshot-origin",
-       .version = {1, 0, 1},
+       .version = {1, 1, 0},
        .module  = THIS_MODULE,
        .ctr     = origin_ctr,
        .dtr     = origin_dtr,
@@ -1115,7 +1122,7 @@ static struct target_type origin_target = {
 
 static struct target_type snapshot_target = {
        .name    = "snapshot",
-       .version = {1, 0, 1},
+       .version = {1, 1, 0},
        .module  = THIS_MODULE,
        .ctr     = snapshot_ctr,
        .dtr     = snapshot_dtr,
index 375aa24d4d7d88ee8e2b7fb437108db19349e916..fdec1e2dc87183926cac41e1d62fc961e9aab851 100644 (file)
@@ -99,7 +99,9 @@ struct dm_snapshot {
 
        /* You can't use a snapshot if this is 0 (e.g. if full) */
        int valid;
-       int have_metadata;
+
+       /* Origin writes don't trigger exceptions until this is set */
+       int active;
 
        /* Used for display of table */
        char type;
index a6f2dc66c3db12b09606218e1595e147b20c8a57..9b1e2f5ca63049dbb1dd2dad9e642382374fbbf5 100644 (file)
@@ -508,7 +508,7 @@ int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
                if (q->merge_bvec_fn)
                        rs->max_sectors =
                                min_not_zero(rs->max_sectors,
-                                            (unsigned short)(PAGE_SIZE >> 9));
+                                            (unsigned int) (PAGE_SIZE >> 9));
 
                rs->max_phys_segments =
                        min_not_zero(rs->max_phys_segments,
index 8c16359f8b0189c5a77d6eb19106ceb21231c0ce..e9adeb9d172fa80c0f6140a6fcf4a034f4f0fdca 100644 (file)
@@ -31,6 +31,7 @@ struct dm_io {
        int error;
        struct bio *bio;
        atomic_t io_count;
+       unsigned long start_time;
 };
 
 /*
@@ -244,6 +245,36 @@ static inline void free_tio(struct mapped_device *md, struct target_io *tio)
        mempool_free(tio, md->tio_pool);
 }
 
+static void start_io_acct(struct dm_io *io)
+{
+       struct mapped_device *md = io->md;
+
+       io->start_time = jiffies;
+
+       preempt_disable();
+       disk_round_stats(dm_disk(md));
+       preempt_enable();
+       dm_disk(md)->in_flight = atomic_inc_return(&md->pending);
+}
+
+static int end_io_acct(struct dm_io *io)
+{
+       struct mapped_device *md = io->md;
+       struct bio *bio = io->bio;
+       unsigned long duration = jiffies - io->start_time;
+       int pending;
+       int rw = bio_data_dir(bio);
+
+       preempt_disable();
+       disk_round_stats(dm_disk(md));
+       preempt_enable();
+       dm_disk(md)->in_flight = pending = atomic_dec_return(&md->pending);
+
+       disk_stat_add(dm_disk(md), ticks[rw], duration);
+
+       return !pending;
+}
+
 /*
  * Add the bio to the list of deferred io.
  */
@@ -299,7 +330,7 @@ static void dec_pending(struct dm_io *io, int error)
                io->error = error;
 
        if (atomic_dec_and_test(&io->io_count)) {
-               if (atomic_dec_and_test(&io->md->pending))
+               if (end_io_acct(io))
                        /* nudge anyone waiting on suspend queue */
                        wake_up(&io->md->wait);
 
@@ -554,7 +585,7 @@ static void __split_bio(struct mapped_device *md, struct bio *bio)
        ci.sector_count = bio_sectors(bio);
        ci.idx = bio->bi_idx;
 
-       atomic_inc(&md->pending);
+       start_io_acct(ci.io);
        while (ci.sector_count)
                __clone_and_map(&ci);
 
@@ -573,10 +604,14 @@ static void __split_bio(struct mapped_device *md, struct bio *bio)
 static int dm_request(request_queue_t *q, struct bio *bio)
 {
        int r;
+       int rw = bio_data_dir(bio);
        struct mapped_device *md = q->queuedata;
 
        down_read(&md->io_lock);
 
+       disk_stat_inc(dm_disk(md), ios[rw]);
+       disk_stat_add(dm_disk(md), sectors[rw], bio_sectors(bio));
+
        /*
         * If we're suspended we have to queue
         * this io for later.
index 0b6c2096ec66bb367eeb0928e4686eec23e68e07..aad4a18aafd662ff6de64d6ae1e5b328366b1540 100644 (file)
@@ -484,7 +484,7 @@ static struct saa7146_ext_vv vv_data = {
 };
 
 static struct saa7146_extension extension = {
-       .name = "hexium HV-PCI6/Orion",
+       .name = "hexium HV-PCI6 Orion",
        .flags = 0,             // SAA7146_USE_I2C_IRQ,
 
        .pci_tbl = &pci_tbl[0],
index 9e21e6c02f80df8af03aec9fdd9f0d8cd6cfd062..0f915ac3102e21dba8a8b9fc5c9a5624f20ff183 100644 (file)
@@ -62,7 +62,7 @@ static void tsunami_flash_copy_to(
 static struct map_info tsunami_flash_map = {
        .name = "flash chip on the Tsunami TIG bus",
        .size = MAX_TIG_FLASH_SIZE,
-       .phys = NO_XIP;
+       .phys = NO_XIP,
        .bankwidth = 1,
        .read = tsunami_flash_read8,
        .copy_from = tsunami_flash_copy_from,
index 6139f06d7d2b9b398bb1649f14f87f90d1c513f6..94d5ea1ce8bd9b9c9e14f05694e699c387eff662 100644 (file)
@@ -56,8 +56,6 @@ PORT  SIZE ACTION MEANING
 All other communication is through memory!
 */
 
-#define SLOW_DOWN_IO udelay(5)
-
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/delay.h>
index 916b24c544e2ec662521ca45bbb8386408f9b4d6..14beab4bc91cba2e21a7af20a8a6cc6dbe8241b5 100644 (file)
@@ -2456,7 +2456,7 @@ static void ipw_eeprom_init_sram(struct ipw_priv *priv)
           copy.  Otherwise let the firmware know to perform the operation
           on it's own
         */
-       if ((priv->eeprom + EEPROM_VERSION) != 0) {
+       if (priv->eeprom[EEPROM_VERSION] != 0) {
                IPW_DEBUG_INFO("Writing EEPROM data into SRAM\n");
 
                /* write the eeprom data to sram */
index 04cc1e7275ce1c57cb78a768ed6808b88cba8124..78943e064b5977babc6d3d51bbd1ef3b113dbf08 100644 (file)
@@ -159,6 +159,7 @@ int rpaphp_deregister_slot(struct slot *slot)
        dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval);
        return retval;
 }
+EXPORT_SYMBOL_GPL(rpaphp_deregister_slot);
 
 int rpaphp_register_slot(struct slot *slot)
 {
index 816479ad217b044dd3c9eb5cd27d3b6683616e6a..f104577f73e09f7daac4c3523e04b280b28fc779 100644 (file)
 
 static int num = 0;
 
+/* We need only to blacklist devices that have already an acpi driver that
+ * can't use pnp layer. We don't need to blacklist device that are directly
+ * used by the kernel (PCI root, ...), as it is harmless and there were
+ * already present in pnpbios. But there is an exception for devices that
+ * have irqs (PIC, Timer) because we call acpi_register_gsi.
+ * Finaly only devices that have a CRS method need to be in this list.
+ */
 static char __initdata excluded_id_list[] =
-       "PNP0C0A," /* Battery */
-       "PNP0C0C,PNP0C0E,PNP0C0D," /* Button */
        "PNP0C09," /* EC */
-       "PNP0C0B," /* Fan */
-       "PNP0A03," /* PCI root */
        "PNP0C0F," /* Link device */
        "PNP0000," /* PIC */
        "PNP0100," /* Timer */
@@ -131,7 +134,8 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
        struct pnp_id *dev_id;
        struct pnp_dev *dev;
 
-       if (!ispnpidacpi(acpi_device_hid(device)) ||
+       status = acpi_get_handle(device->handle, "_CRS", &temp);
+       if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) ||
                is_exclusive_device(device))
                return 0;
 
index 416d30debe6c97a12582c7646d3bb6d3eab46ec8..407b4eaddcbffe6202ae40623430f9f638b23cb2 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2004 Matthieu Castet <castet.matthieu@free.fr>
  * Copyright (c) 2004 Li Shaohua <shaohua.li@intel.com>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
  * Free Software Foundation; either version 2, or (at your option) any
 /*
  * Allocated Resources
  */
-static int irq_flags(int edge_level, int active_high_low)
+static int irq_flags(int triggering, int polarity)
 {
        int flag;
-       if (edge_level == ACPI_LEVEL_SENSITIVE) {
-               if(active_high_low == ACPI_ACTIVE_LOW)
+       if (triggering == ACPI_LEVEL_SENSITIVE) {
+               if(polarity == ACPI_ACTIVE_LOW)
                        flag = IORESOURCE_IRQ_LOWLEVEL;
                else
                        flag = IORESOURCE_IRQ_HIGHLEVEL;
        }
        else {
-               if(active_high_low == ACPI_ACTIVE_LOW)
+               if(polarity == ACPI_ACTIVE_LOW)
                        flag = IORESOURCE_IRQ_LOWEDGE;
                else
                        flag = IORESOURCE_IRQ_HIGHEDGE;
@@ -50,31 +50,31 @@ static int irq_flags(int edge_level, int active_high_low)
        return flag;
 }
 
-static void decode_irq_flags(int flag, int *edge_level, int *active_high_low)
+static void decode_irq_flags(int flag, int *triggering, int *polarity)
 {
        switch (flag) {
        case IORESOURCE_IRQ_LOWLEVEL:
-               *edge_level = ACPI_LEVEL_SENSITIVE;
-               *active_high_low = ACPI_ACTIVE_LOW;
+               *triggering = ACPI_LEVEL_SENSITIVE;
+               *polarity = ACPI_ACTIVE_LOW;
                break;
        case IORESOURCE_IRQ_HIGHLEVEL:  
-               *edge_level = ACPI_LEVEL_SENSITIVE;
-               *active_high_low = ACPI_ACTIVE_HIGH;
+               *triggering = ACPI_LEVEL_SENSITIVE;
+               *polarity = ACPI_ACTIVE_HIGH;
                break;
        case IORESOURCE_IRQ_LOWEDGE:
-               *edge_level = ACPI_EDGE_SENSITIVE;
-               *active_high_low = ACPI_ACTIVE_LOW;
+               *triggering = ACPI_EDGE_SENSITIVE;
+               *polarity = ACPI_ACTIVE_LOW;
                break;
        case IORESOURCE_IRQ_HIGHEDGE:
-               *edge_level = ACPI_EDGE_SENSITIVE;
-               *active_high_low = ACPI_ACTIVE_HIGH;
+               *triggering = ACPI_EDGE_SENSITIVE;
+               *polarity = ACPI_ACTIVE_HIGH;
                break;
        }
 }
 
 static void
 pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, u32 gsi,
-       int edge_level, int active_high_low)
+       int triggering, int polarity)
 {
        int i = 0;
        int irq;
@@ -89,7 +89,7 @@ pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, u32 gsi,
                return;
 
        res->irq_resource[i].flags = IORESOURCE_IRQ;  // Also clears _UNSET flag
-       irq = acpi_register_gsi(gsi, edge_level, active_high_low);
+       irq = acpi_register_gsi(gsi, triggering, polarity);
        if (irq < 0) {
                res->irq_resource[i].flags |= IORESOURCE_DISABLED;
                return;
@@ -163,77 +163,96 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
        struct pnp_resource_table * res_table = (struct pnp_resource_table *)data;
        int i;
 
-       switch (res->id) {
-       case ACPI_RSTYPE_IRQ:
+       switch (res->type) {
+       case ACPI_RESOURCE_TYPE_IRQ:
                /*
                 * Per spec, only one interrupt per descriptor is allowed in
                 * _CRS, but some firmware violates this, so parse them all.
                 */
-               for (i = 0; i < res->data.irq.number_of_interrupts; i++) {
+               for (i = 0; i < res->data.irq.interrupt_count; i++) {
                        pnpacpi_parse_allocated_irqresource(res_table,
                                res->data.irq.interrupts[i],
-                               res->data.irq.edge_level,
-                               res->data.irq.active_high_low);
+                               res->data.irq.triggering,
+                               res->data.irq.polarity);
                }
                break;
 
-       case ACPI_RSTYPE_EXT_IRQ:
-               for (i = 0; i < res->data.extended_irq.number_of_interrupts; i++) {
-                       pnpacpi_parse_allocated_irqresource(res_table,
-                               res->data.extended_irq.interrupts[i],
-                               res->data.extended_irq.edge_level,
-                               res->data.extended_irq.active_high_low);
-               }
-               break;
-       case ACPI_RSTYPE_DMA:
-               if (res->data.dma.number_of_channels > 0)
-                       pnpacpi_parse_allocated_dmaresource(res_table, 
+       case ACPI_RESOURCE_TYPE_DMA:
+               if (res->data.dma.channel_count > 0)
+                       pnpacpi_parse_allocated_dmaresource(res_table,
                                        res->data.dma.channels[0]);
                break;
-       case ACPI_RSTYPE_IO:
-               pnpacpi_parse_allocated_ioresource(res_table, 
-                               res->data.io.min_base_address, 
-                               res->data.io.range_length);
+
+       case ACPI_RESOURCE_TYPE_IO:
+               pnpacpi_parse_allocated_ioresource(res_table,
+                               res->data.io.minimum,
+                               res->data.io.address_length);
                break;
-       case ACPI_RSTYPE_FIXED_IO:
-               pnpacpi_parse_allocated_ioresource(res_table, 
-                               res->data.fixed_io.base_address, 
-                               res->data.fixed_io.range_length);
+
+       case ACPI_RESOURCE_TYPE_START_DEPENDENT:
+       case ACPI_RESOURCE_TYPE_END_DEPENDENT:
                break;
-       case ACPI_RSTYPE_MEM24:
-               pnpacpi_parse_allocated_memresource(res_table, 
-                               res->data.memory24.min_base_address, 
-                               res->data.memory24.range_length);
+
+       case ACPI_RESOURCE_TYPE_FIXED_IO:
+               pnpacpi_parse_allocated_ioresource(res_table,
+                               res->data.fixed_io.address,
+                               res->data.fixed_io.address_length);
+               break;
+
+       case ACPI_RESOURCE_TYPE_VENDOR:
                break;
-       case ACPI_RSTYPE_MEM32:
-               pnpacpi_parse_allocated_memresource(res_table, 
-                               res->data.memory32.min_base_address, 
-                               res->data.memory32.range_length);
+
+       case ACPI_RESOURCE_TYPE_END_TAG:
+               break;
+
+       case ACPI_RESOURCE_TYPE_MEMORY24:
+               pnpacpi_parse_allocated_memresource(res_table,
+                               res->data.memory24.minimum,
+                               res->data.memory24.address_length);
                break;
-       case ACPI_RSTYPE_FIXED_MEM32:
-               pnpacpi_parse_allocated_memresource(res_table, 
-                               res->data.fixed_memory32.range_base_address, 
-                               res->data.fixed_memory32.range_length);
+       case ACPI_RESOURCE_TYPE_MEMORY32:
+               pnpacpi_parse_allocated_memresource(res_table,
+                               res->data.memory32.minimum,
+                               res->data.memory32.address_length);
                break;
-       case ACPI_RSTYPE_ADDRESS16:
-               pnpacpi_parse_allocated_memresource(res_table, 
-                               res->data.address16.min_address_range, 
+       case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+               pnpacpi_parse_allocated_memresource(res_table,
+                               res->data.fixed_memory32.address,
+                               res->data.fixed_memory32.address_length);
+               break;
+       case ACPI_RESOURCE_TYPE_ADDRESS16:
+               pnpacpi_parse_allocated_memresource(res_table,
+                               res->data.address16.minimum,
                                res->data.address16.address_length);
                break;
-       case ACPI_RSTYPE_ADDRESS32:
-               pnpacpi_parse_allocated_memresource(res_table, 
-                               res->data.address32.min_address_range, 
+       case ACPI_RESOURCE_TYPE_ADDRESS32:
+               pnpacpi_parse_allocated_memresource(res_table,
+                               res->data.address32.minimum,
                                res->data.address32.address_length);
                break;
-       case ACPI_RSTYPE_ADDRESS64:
-               pnpacpi_parse_allocated_memresource(res_table, 
-               res->data.address64.min_address_range, 
+       case ACPI_RESOURCE_TYPE_ADDRESS64:
+               pnpacpi_parse_allocated_memresource(res_table,
+               res->data.address64.minimum,
                res->data.address64.address_length);
                break;
-       case ACPI_RSTYPE_VENDOR:
+
+       case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+               break;
+
+       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+               for (i = 0; i < res->data.extended_irq.interrupt_count; i++) {
+                       pnpacpi_parse_allocated_irqresource(res_table,
+                               res->data.extended_irq.interrupts[i],
+                               res->data.extended_irq.triggering,
+                               res->data.extended_irq.polarity);
+               }
+               break;
+
+       case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
                break;
+
        default:
-               pnp_warn("PnPACPI: unknown resource type %d", res->id);
+               pnp_warn("PnPACPI: unknown resource type %d", res->type);
                return AE_ERROR;
        }
                        
@@ -253,13 +272,13 @@ static void pnpacpi_parse_dma_option(struct pnp_option *option, struct acpi_reso
        int i;
        struct pnp_dma * dma;
 
-       if (p->number_of_channels == 0)
+       if (p->channel_count == 0)
                return;
        dma = kcalloc(1, sizeof(struct pnp_dma), GFP_KERNEL);
        if (!dma)
                return;
 
-       for(i = 0; i < p->number_of_channels; i++)
+       for(i = 0; i < p->channel_count; i++)
                dma->map |= 1 << p->channels[i];
        dma->flags = 0;
        if (p->bus_master)
@@ -309,37 +328,37 @@ static void pnpacpi_parse_irq_option(struct pnp_option *option,
        int i;
        struct pnp_irq * irq;
        
-       if (p->number_of_interrupts == 0)
+       if (p->interrupt_count == 0)
                return;
        irq = kcalloc(1, sizeof(struct pnp_irq), GFP_KERNEL);
        if (!irq)
                return;
 
-       for(i = 0; i < p->number_of_interrupts; i++)
+       for(i = 0; i < p->interrupt_count; i++)
                if (p->interrupts[i])
                        __set_bit(p->interrupts[i], irq->map);
-       irq->flags = irq_flags(p->edge_level, p->active_high_low);
+       irq->flags = irq_flags(p->triggering, p->polarity);
 
        pnp_register_irq_resource(option, irq);
        return;
 }
 
 static void pnpacpi_parse_ext_irq_option(struct pnp_option *option,
-       struct acpi_resource_ext_irq *p)
+       struct acpi_resource_extended_irq *p)
 {
        int i;
        struct pnp_irq * irq;
 
-       if (p->number_of_interrupts == 0)
+       if (p->interrupt_count == 0)
                return;
        irq = kcalloc(1, sizeof(struct pnp_irq), GFP_KERNEL);
        if (!irq)
                return;
 
-       for(i = 0; i < p->number_of_interrupts; i++)
+       for(i = 0; i < p->interrupt_count; i++)
                if (p->interrupts[i])
                        __set_bit(p->interrupts[i], irq->map);
-       irq->flags = irq_flags(p->edge_level, p->active_high_low);
+       irq->flags = irq_flags(p->triggering, p->polarity);
 
        pnp_register_irq_resource(option, irq);
        return;
@@ -351,16 +370,16 @@ pnpacpi_parse_port_option(struct pnp_option *option,
 {
        struct pnp_port * port;
 
-       if (io->range_length == 0)
+       if (io->address_length == 0)
                return;
        port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL);
        if (!port)
                return;
-       port->min = io->min_base_address;
-       port->max = io->max_base_address;
+       port->min = io->minimum;
+       port->max = io->maximum;
        port->align = io->alignment;
-       port->size = io->range_length;
-       port->flags = ACPI_DECODE_16 == io->io_decode ? 
+       port->size = io->address_length;
+       port->flags = ACPI_DECODE_16 == io->io_decode ?
                PNP_PORT_FLAG_16BITADDR : 0;
        pnp_register_port_resource(option,port);
        return;
@@ -372,13 +391,13 @@ pnpacpi_parse_fixed_port_option(struct pnp_option *option,
 {
        struct pnp_port * port;
 
-       if (io->range_length == 0)
+       if (io->address_length == 0)
                return;
        port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL);
        if (!port)
                return;
-       port->min = port->max = io->base_address;
-       port->size = io->range_length;
+       port->min = port->max = io->address;
+       port->size = io->address_length;
        port->align = 0;
        port->flags = PNP_PORT_FLAG_FIXED;
        pnp_register_port_resource(option,port);
@@ -387,21 +406,21 @@ pnpacpi_parse_fixed_port_option(struct pnp_option *option,
 
 static void
 pnpacpi_parse_mem24_option(struct pnp_option *option,
-       struct acpi_resource_mem24 *p)
+       struct acpi_resource_memory24 *p)
 {
        struct pnp_mem * mem;
 
-       if (p->range_length == 0)
+       if (p->address_length == 0)
                return;
        mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL);
        if (!mem)
                return;
-       mem->min = p->min_base_address;
-       mem->max = p->max_base_address;
+       mem->min = p->minimum;
+       mem->max = p->maximum;
        mem->align = p->alignment;
-       mem->size = p->range_length;
+       mem->size = p->address_length;
 
-       mem->flags = (ACPI_READ_WRITE_MEMORY == p->read_write_attribute) ?
+       mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
                        IORESOURCE_MEM_WRITEABLE : 0;
 
        pnp_register_mem_resource(option,mem);
@@ -410,21 +429,21 @@ pnpacpi_parse_mem24_option(struct pnp_option *option,
 
 static void
 pnpacpi_parse_mem32_option(struct pnp_option *option,
-       struct acpi_resource_mem32 *p)
+       struct acpi_resource_memory32 *p)
 {
        struct pnp_mem * mem;
 
-       if (p->range_length == 0)
+       if (p->address_length == 0)
                return;
        mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL);
        if (!mem)
                return;
-       mem->min = p->min_base_address;
-       mem->max = p->max_base_address;
+       mem->min = p->minimum;
+       mem->max = p->maximum;
        mem->align = p->alignment;
-       mem->size = p->range_length;
+       mem->size = p->address_length;
 
-       mem->flags = (ACPI_READ_WRITE_MEMORY == p->read_write_attribute) ?
+       mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
                        IORESOURCE_MEM_WRITEABLE : 0;
 
        pnp_register_mem_resource(option,mem);
@@ -433,33 +452,72 @@ pnpacpi_parse_mem32_option(struct pnp_option *option,
 
 static void
 pnpacpi_parse_fixed_mem32_option(struct pnp_option *option,
-       struct acpi_resource_fixed_mem32 *p)
+       struct acpi_resource_fixed_memory32 *p)
 {
        struct pnp_mem * mem;
 
-       if (p->range_length == 0)
+       if (p->address_length == 0)
                return;
        mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL);
        if (!mem)
                return;
-       mem->min = mem->max = p->range_base_address;
-       mem->size = p->range_length;
+       mem->min = mem->max = p->address;
+       mem->size = p->address_length;
        mem->align = 0;
 
-       mem->flags = (ACPI_READ_WRITE_MEMORY == p->read_write_attribute) ?
+       mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
                        IORESOURCE_MEM_WRITEABLE : 0;
 
        pnp_register_mem_resource(option,mem);
        return;
 }
 
+static void
+pnpacpi_parse_address_option(struct pnp_option *option, struct acpi_resource *r)
+{
+       struct acpi_resource_address64 addr, *p = &addr;
+       acpi_status status;
+       struct pnp_mem * mem;
+       struct pnp_port * port;
+
+       status = acpi_resource_to_address64(r, p);
+       if (!ACPI_SUCCESS(status)) {
+               pnp_warn("PnPACPI: failed to convert resource type %d", r->type);
+               return;
+       }
+
+       if (p->address_length == 0)
+               return;
+
+       if (p->resource_type == ACPI_MEMORY_RANGE) {
+               mem = kcalloc(1, sizeof(struct pnp_mem), GFP_KERNEL);
+               if (!mem)
+                       return;
+               mem->min = mem->max = p->minimum;
+               mem->size = p->address_length;
+               mem->align = 0;
+               mem->flags = (p->info.mem.write_protect ==
+                   ACPI_READ_WRITE_MEMORY) ? IORESOURCE_MEM_WRITEABLE : 0;
+               pnp_register_mem_resource(option,mem);
+       } else if (p->resource_type == ACPI_IO_RANGE) {
+               port = kcalloc(1, sizeof(struct pnp_port), GFP_KERNEL);
+               if (!port)
+                       return;
+               port->min = port->max = p->minimum;
+               port->size = p->address_length;
+               port->align = 0;
+               port->flags = PNP_PORT_FLAG_FIXED;
+               pnp_register_port_resource(option,port);
+       }
+}
+
 struct acpipnp_parse_option_s {
        struct pnp_option *option;
        struct pnp_option *option_independent;
        struct pnp_dev *dev;
 };
 
-static acpi_status pnpacpi_option_resource(struct acpi_resource *res, 
+static acpi_status pnpacpi_option_resource(struct acpi_resource *res,
        void *data)
 {
        int priority = 0;
@@ -467,35 +525,16 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res,
        struct pnp_dev *dev = parse_data->dev;
        struct pnp_option *option = parse_data->option;
 
-       switch (res->id) {
-               case ACPI_RSTYPE_IRQ:
+       switch (res->type) {
+               case ACPI_RESOURCE_TYPE_IRQ:
                        pnpacpi_parse_irq_option(option, &res->data.irq);
                        break;
-               case ACPI_RSTYPE_EXT_IRQ:
-                       pnpacpi_parse_ext_irq_option(option,
-                               &res->data.extended_irq);
-                       break;
-               case ACPI_RSTYPE_DMA:
+
+               case ACPI_RESOURCE_TYPE_DMA:
                        pnpacpi_parse_dma_option(option, &res->data.dma);       
                        break;
-               case ACPI_RSTYPE_IO:
-                       pnpacpi_parse_port_option(option, &res->data.io);
-                       break;
-               case ACPI_RSTYPE_FIXED_IO:
-                       pnpacpi_parse_fixed_port_option(option,
-                               &res->data.fixed_io);
-                       break;
-               case ACPI_RSTYPE_MEM24:
-                       pnpacpi_parse_mem24_option(option, &res->data.memory24);
-                       break;
-               case ACPI_RSTYPE_MEM32:
-                       pnpacpi_parse_mem32_option(option, &res->data.memory32);
-                       break;
-               case ACPI_RSTYPE_FIXED_MEM32:
-                       pnpacpi_parse_fixed_mem32_option(option,
-                               &res->data.fixed_memory32);
-                       break;
-               case ACPI_RSTYPE_START_DPF:
+
+               case ACPI_RESOURCE_TYPE_START_DEPENDENT:
                        switch (res->data.start_dpf.compatibility_priority) {
                                case ACPI_GOOD_CONFIGURATION:
                                        priority = PNP_RES_PRIORITY_PREFERRED;
@@ -518,7 +557,8 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res,
                                return AE_ERROR;
                        parse_data->option = option;    
                        break;
-               case ACPI_RSTYPE_END_DPF:
+
+               case ACPI_RESOURCE_TYPE_END_DEPENDENT:
                        /*only one EndDependentFn is allowed*/
                        if (!parse_data->option_independent) {
                                pnp_warn("PnPACPI: more than one EndDependentFn");
@@ -527,15 +567,59 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res,
                        parse_data->option = parse_data->option_independent;
                        parse_data->option_independent = NULL;
                        break;
+
+               case ACPI_RESOURCE_TYPE_IO:
+                       pnpacpi_parse_port_option(option, &res->data.io);
+                       break;
+
+               case ACPI_RESOURCE_TYPE_FIXED_IO:
+                       pnpacpi_parse_fixed_port_option(option,
+                               &res->data.fixed_io);
+                       break;
+
+               case ACPI_RESOURCE_TYPE_VENDOR:
+               case ACPI_RESOURCE_TYPE_END_TAG:
+                       break;
+
+               case ACPI_RESOURCE_TYPE_MEMORY24:
+                       pnpacpi_parse_mem24_option(option, &res->data.memory24);
+                       break;
+
+               case ACPI_RESOURCE_TYPE_MEMORY32:
+                       pnpacpi_parse_mem32_option(option, &res->data.memory32);
+                       break;
+
+               case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+                       pnpacpi_parse_fixed_mem32_option(option,
+                               &res->data.fixed_memory32);
+                       break;
+
+               case ACPI_RESOURCE_TYPE_ADDRESS16:
+               case ACPI_RESOURCE_TYPE_ADDRESS32:
+               case ACPI_RESOURCE_TYPE_ADDRESS64:
+                       pnpacpi_parse_address_option(option, res);
+                       break;
+
+               case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+                       break;
+
+               case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+                       pnpacpi_parse_ext_irq_option(option,
+                               &res->data.extended_irq);
+                       break;
+
+               case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
+                       break;
+
                default:
-                       pnp_warn("PnPACPI: unknown resource type %d", res->id);
+                       pnp_warn("PnPACPI: unknown resource type %d", res->type);
                        return AE_ERROR;
        }
                        
        return AE_OK;
 }
 
-acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle, 
+acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle,
        struct pnp_dev *dev)
 {
        acpi_status status;
@@ -546,7 +630,7 @@ acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle,
                return AE_ERROR;
        parse_data.option_independent = parse_data.option;
        parse_data.dev = dev;
-       status = acpi_walk_resources(handle, METHOD_NAME__PRS, 
+       status = acpi_walk_resources(handle, METHOD_NAME__PRS,
                pnpacpi_option_resource, &parse_data);
 
        return status;
@@ -559,21 +643,24 @@ static acpi_status pnpacpi_count_resources(struct acpi_resource *res,
        void *data)
 {
        int *res_cnt = (int *)data;
-       switch (res->id) {
-       case ACPI_RSTYPE_IRQ:
-       case ACPI_RSTYPE_EXT_IRQ:
-       case ACPI_RSTYPE_DMA:
-       case ACPI_RSTYPE_IO:
-       case ACPI_RSTYPE_FIXED_IO:
-       case ACPI_RSTYPE_MEM24:
-       case ACPI_RSTYPE_MEM32:
-       case ACPI_RSTYPE_FIXED_MEM32:
-#if 0
-       case ACPI_RSTYPE_ADDRESS16:
-       case ACPI_RSTYPE_ADDRESS32:
-       case ACPI_RSTYPE_ADDRESS64:
-#endif
+       switch (res->type) {
+       case ACPI_RESOURCE_TYPE_IRQ:
+       case ACPI_RESOURCE_TYPE_DMA:
+       case ACPI_RESOURCE_TYPE_IO:
+       case ACPI_RESOURCE_TYPE_FIXED_IO:
+       case ACPI_RESOURCE_TYPE_MEMORY24:
+       case ACPI_RESOURCE_TYPE_MEMORY32:
+       case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+       case ACPI_RESOURCE_TYPE_ADDRESS16:
+       case ACPI_RESOURCE_TYPE_ADDRESS32:
+       case ACPI_RESOURCE_TYPE_ADDRESS64:
+       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
                (*res_cnt) ++;
+       case ACPI_RESOURCE_TYPE_START_DEPENDENT:
+       case ACPI_RESOURCE_TYPE_END_DEPENDENT:
+       case ACPI_RESOURCE_TYPE_VENDOR:
+       case ACPI_RESOURCE_TYPE_END_TAG:
+       case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
        default:
                return AE_OK;
        }
@@ -584,22 +671,25 @@ static acpi_status pnpacpi_type_resources(struct acpi_resource *res,
        void *data)
 {
        struct acpi_resource **resource = (struct acpi_resource **)data;        
-       switch (res->id) {
-       case ACPI_RSTYPE_IRQ:
-       case ACPI_RSTYPE_EXT_IRQ:
-       case ACPI_RSTYPE_DMA:
-       case ACPI_RSTYPE_IO:
-       case ACPI_RSTYPE_FIXED_IO:
-       case ACPI_RSTYPE_MEM24:
-       case ACPI_RSTYPE_MEM32:
-       case ACPI_RSTYPE_FIXED_MEM32:
-#if 0
-       case ACPI_RSTYPE_ADDRESS16:
-       case ACPI_RSTYPE_ADDRESS32:
-       case ACPI_RSTYPE_ADDRESS64:
-#endif
-               (*resource)->id = res->id;
+       switch (res->type) {
+       case ACPI_RESOURCE_TYPE_IRQ:
+       case ACPI_RESOURCE_TYPE_DMA:
+       case ACPI_RESOURCE_TYPE_IO:
+       case ACPI_RESOURCE_TYPE_FIXED_IO:
+       case ACPI_RESOURCE_TYPE_MEMORY24:
+       case ACPI_RESOURCE_TYPE_MEMORY32:
+       case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
+       case ACPI_RESOURCE_TYPE_ADDRESS16:
+       case ACPI_RESOURCE_TYPE_ADDRESS32:
+       case ACPI_RESOURCE_TYPE_ADDRESS64:
+       case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+               (*resource)->type = res->type;
                (*resource)++;
+       case ACPI_RESOURCE_TYPE_START_DEPENDENT:
+       case ACPI_RESOURCE_TYPE_END_DEPENDENT:
+       case ACPI_RESOURCE_TYPE_VENDOR:
+       case ACPI_RESOURCE_TYPE_END_TAG:
+       case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
        default:
                return AE_OK;
        }
@@ -607,14 +697,14 @@ static acpi_status pnpacpi_type_resources(struct acpi_resource *res,
        return AE_OK;
 }
 
-int pnpacpi_build_resource_template(acpi_handle handle, 
+int pnpacpi_build_resource_template(acpi_handle handle,
        struct acpi_buffer *buffer)
 {
        struct acpi_resource *resource;
        int res_cnt = 0;
        acpi_status status;
 
-       status = acpi_walk_resources(handle, METHOD_NAME__CRS, 
+       status = acpi_walk_resources(handle, METHOD_NAME__CRS,
                pnpacpi_count_resources, &res_cnt);
        if (ACPI_FAILURE(status)) {
                pnp_err("Evaluate _CRS failed");
@@ -628,7 +718,7 @@ int pnpacpi_build_resource_template(acpi_handle handle,
                return -ENOMEM;
        pnp_dbg("Res cnt %d", res_cnt);
        resource = (struct acpi_resource *)buffer->pointer;
-       status = acpi_walk_resources(handle, METHOD_NAME__CRS, 
+       status = acpi_walk_resources(handle, METHOD_NAME__CRS,
                pnpacpi_type_resources, &resource);
        if (ACPI_FAILURE(status)) {
                kfree(buffer->pointer);
@@ -636,54 +726,54 @@ int pnpacpi_build_resource_template(acpi_handle handle,
                return -EINVAL;
        }
        /* resource will pointer the end resource now */
-       resource->id = ACPI_RSTYPE_END_TAG;
+       resource->type = ACPI_RESOURCE_TYPE_END_TAG;
 
        return 0;
 }
 
-static void pnpacpi_encode_irq(struct acpi_resource *resource, 
+static void pnpacpi_encode_irq(struct acpi_resource *resource,
        struct resource *p)
 {
-       int edge_level, active_high_low;
+       int triggering, polarity;
        
-       decode_irq_flags(p->flags & IORESOURCE_BITS, &edge_level, 
-               &active_high_low);
-       resource->id = ACPI_RSTYPE_IRQ;
+       decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering,
+               &polarity);
+       resource->type = ACPI_RESOURCE_TYPE_IRQ;
        resource->length = sizeof(struct acpi_resource);
-       resource->data.irq.edge_level = edge_level;
-       resource->data.irq.active_high_low = active_high_low;
-       if (edge_level == ACPI_EDGE_SENSITIVE)
-               resource->data.irq.shared_exclusive = ACPI_EXCLUSIVE;
+       resource->data.irq.triggering = triggering;
+       resource->data.irq.polarity = polarity;
+       if (triggering == ACPI_EDGE_SENSITIVE)
+               resource->data.irq.sharable = ACPI_EXCLUSIVE;
        else
-               resource->data.irq.shared_exclusive = ACPI_SHARED;
-       resource->data.irq.number_of_interrupts = 1;
+               resource->data.irq.sharable = ACPI_SHARED;
+       resource->data.irq.interrupt_count = 1;
        resource->data.irq.interrupts[0] = p->start;
 }
 
 static void pnpacpi_encode_ext_irq(struct acpi_resource *resource,
        struct resource *p)
 {
-       int edge_level, active_high_low;
+       int triggering, polarity;
        
-       decode_irq_flags(p->flags & IORESOURCE_BITS, &edge_level, 
-               &active_high_low);
-       resource->id = ACPI_RSTYPE_EXT_IRQ;
+       decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering,
+               &polarity);
+       resource->type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
        resource->length = sizeof(struct acpi_resource);
        resource->data.extended_irq.producer_consumer = ACPI_CONSUMER;
-       resource->data.extended_irq.edge_level = edge_level;
-       resource->data.extended_irq.active_high_low = active_high_low;
-       if (edge_level == ACPI_EDGE_SENSITIVE)
-               resource->data.irq.shared_exclusive = ACPI_EXCLUSIVE;
+       resource->data.extended_irq.triggering = triggering;
+       resource->data.extended_irq.polarity = polarity;
+       if (triggering == ACPI_EDGE_SENSITIVE)
+               resource->data.irq.sharable = ACPI_EXCLUSIVE;
        else
-               resource->data.irq.shared_exclusive = ACPI_SHARED;
-       resource->data.extended_irq.number_of_interrupts = 1;
+               resource->data.irq.sharable = ACPI_SHARED;
+       resource->data.extended_irq.interrupt_count = 1;
        resource->data.extended_irq.interrupts[0] = p->start;
 }
 
 static void pnpacpi_encode_dma(struct acpi_resource *resource,
        struct resource *p)
 {
-       resource->id = ACPI_RSTYPE_DMA;
+       resource->type = ACPI_RESOURCE_TYPE_DMA;
        resource->length = sizeof(struct acpi_resource);
        /* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */
        if (p->flags & IORESOURCE_DMA_COMPATIBLE)
@@ -701,75 +791,75 @@ static void pnpacpi_encode_dma(struct acpi_resource *resource,
        else if (p->flags & IORESOURCE_DMA_16BIT)
                resource->data.dma.transfer = ACPI_TRANSFER_16;
        resource->data.dma.bus_master = p->flags & IORESOURCE_DMA_MASTER;
-       resource->data.dma.number_of_channels = 1;
+       resource->data.dma.channel_count = 1;
        resource->data.dma.channels[0] = p->start;
 }
 
 static void pnpacpi_encode_io(struct acpi_resource *resource,
        struct resource *p)
 {
-       resource->id = ACPI_RSTYPE_IO;
+       resource->type = ACPI_RESOURCE_TYPE_IO;
        resource->length = sizeof(struct acpi_resource);
        /* Note: pnp_assign_port will copy pnp_port->flags into p->flags */
        resource->data.io.io_decode = (p->flags & PNP_PORT_FLAG_16BITADDR)?
-               ACPI_DECODE_16 : ACPI_DECODE_10; 
-       resource->data.io.min_base_address = p->start;
-       resource->data.io.max_base_address = p->end;
+               ACPI_DECODE_16 : ACPI_DECODE_10;
+       resource->data.io.minimum = p->start;
+       resource->data.io.maximum = p->end;
        resource->data.io.alignment = 0; /* Correct? */
-       resource->data.io.range_length = p->end - p->start + 1;
+       resource->data.io.address_length = p->end - p->start + 1;
 }
 
 static void pnpacpi_encode_fixed_io(struct acpi_resource *resource,
        struct resource *p)
 {
-       resource->id = ACPI_RSTYPE_FIXED_IO;
+       resource->type = ACPI_RESOURCE_TYPE_FIXED_IO;
        resource->length = sizeof(struct acpi_resource);
-       resource->data.fixed_io.base_address = p->start;
-       resource->data.fixed_io.range_length = p->end - p->start + 1;
+       resource->data.fixed_io.address = p->start;
+       resource->data.fixed_io.address_length = p->end - p->start + 1;
 }
 
 static void pnpacpi_encode_mem24(struct acpi_resource *resource,
        struct resource *p)
 {
-       resource->id = ACPI_RSTYPE_MEM24;
+       resource->type = ACPI_RESOURCE_TYPE_MEMORY24;
        resource->length = sizeof(struct acpi_resource);
        /* Note: pnp_assign_mem will copy pnp_mem->flags into p->flags */
-       resource->data.memory24.read_write_attribute =
+       resource->data.memory24.write_protect =
                (p->flags & IORESOURCE_MEM_WRITEABLE) ?
                ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
-       resource->data.memory24.min_base_address = p->start;
-       resource->data.memory24.max_base_address = p->end;
+       resource->data.memory24.minimum = p->start;
+       resource->data.memory24.maximum = p->end;
        resource->data.memory24.alignment = 0;
-       resource->data.memory24.range_length = p->end - p->start + 1;
+       resource->data.memory24.address_length = p->end - p->start + 1;
 }
 
 static void pnpacpi_encode_mem32(struct acpi_resource *resource,
        struct resource *p)
 {
-       resource->id = ACPI_RSTYPE_MEM32;
+       resource->type = ACPI_RESOURCE_TYPE_MEMORY32;
        resource->length = sizeof(struct acpi_resource);
-       resource->data.memory32.read_write_attribute =
+       resource->data.memory32.write_protect =
                (p->flags & IORESOURCE_MEM_WRITEABLE) ?
                ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
-       resource->data.memory32.min_base_address = p->start;
-       resource->data.memory32.max_base_address = p->end;
+       resource->data.memory32.minimum = p->start;
+       resource->data.memory32.maximum = p->end;
        resource->data.memory32.alignment = 0;
-       resource->data.memory32.range_length = p->end - p->start + 1;
+       resource->data.memory32.address_length = p->end - p->start + 1;
 }
 
 static void pnpacpi_encode_fixed_mem32(struct acpi_resource *resource,
        struct resource *p)
 {
-       resource->id = ACPI_RSTYPE_FIXED_MEM32;
+       resource->type = ACPI_RESOURCE_TYPE_FIXED_MEMORY32;
        resource->length = sizeof(struct acpi_resource);
-       resource->data.fixed_memory32.read_write_attribute =
+       resource->data.fixed_memory32.write_protect =
                (p->flags & IORESOURCE_MEM_WRITEABLE) ?
                ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
-       resource->data.fixed_memory32.range_base_address = p->start;
-       resource->data.fixed_memory32.range_length = p->end - p->start + 1;
+       resource->data.fixed_memory32.address = p->start;
+       resource->data.fixed_memory32.address_length = p->end - p->start + 1;
 }
 
-int pnpacpi_encode_resources(struct pnp_resource_table *res_table, 
+int pnpacpi_encode_resources(struct pnp_resource_table *res_table,
        struct acpi_buffer *buffer)
 {
        int i = 0;
@@ -780,58 +870,67 @@ int pnpacpi_encode_resources(struct pnp_resource_table *res_table,
 
        pnp_dbg("res cnt %d", res_cnt);
        while (i < res_cnt) {
-               switch(resource->id) {
-               case ACPI_RSTYPE_IRQ:
+               switch(resource->type) {
+               case ACPI_RESOURCE_TYPE_IRQ:
                        pnp_dbg("Encode irq");
-                       pnpacpi_encode_irq(resource, 
+                       pnpacpi_encode_irq(resource,
                                &res_table->irq_resource[irq]);
                        irq++;
                        break;
 
-               case ACPI_RSTYPE_EXT_IRQ:
-                       pnp_dbg("Encode ext irq");
-                       pnpacpi_encode_ext_irq(resource, 
-                               &res_table->irq_resource[irq]);
-                       irq++;
-                       break;
-               case ACPI_RSTYPE_DMA:
+               case ACPI_RESOURCE_TYPE_DMA:
                        pnp_dbg("Encode dma");
-                       pnpacpi_encode_dma(resource, 
+                       pnpacpi_encode_dma(resource,
                                &res_table->dma_resource[dma]);
                        dma ++;
                        break;
-               case ACPI_RSTYPE_IO:
+               case ACPI_RESOURCE_TYPE_IO:
                        pnp_dbg("Encode io");
-                       pnpacpi_encode_io(resource, 
+                       pnpacpi_encode_io(resource,
                                &res_table->port_resource[port]);
                        port ++;
                        break;
-               case ACPI_RSTYPE_FIXED_IO:
+               case ACPI_RESOURCE_TYPE_FIXED_IO:
                        pnp_dbg("Encode fixed io");
                        pnpacpi_encode_fixed_io(resource,
                                &res_table->port_resource[port]);
                        port ++;
                        break;
-               case ACPI_RSTYPE_MEM24:
+               case ACPI_RESOURCE_TYPE_MEMORY24:
                        pnp_dbg("Encode mem24");
                        pnpacpi_encode_mem24(resource,
                                &res_table->mem_resource[mem]);
                        mem ++;
                        break;
-               case ACPI_RSTYPE_MEM32:
+               case ACPI_RESOURCE_TYPE_MEMORY32:
                        pnp_dbg("Encode mem32");
                        pnpacpi_encode_mem32(resource,
                                &res_table->mem_resource[mem]);
                        mem ++;
                        break;
-               case ACPI_RSTYPE_FIXED_MEM32:
+               case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
                        pnp_dbg("Encode fixed mem32");
                        pnpacpi_encode_fixed_mem32(resource,
                                &res_table->mem_resource[mem]);
                        mem ++;
                        break;
+               case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+                       pnp_dbg("Encode ext irq");
+                       pnpacpi_encode_ext_irq(resource,
+                               &res_table->irq_resource[irq]);
+                       irq++;
+                       break;
+               case ACPI_RESOURCE_TYPE_START_DEPENDENT:
+               case ACPI_RESOURCE_TYPE_END_DEPENDENT:
+               case ACPI_RESOURCE_TYPE_VENDOR:
+               case ACPI_RESOURCE_TYPE_END_TAG:
+               case ACPI_RESOURCE_TYPE_ADDRESS16:
+               case ACPI_RESOURCE_TYPE_ADDRESS32:
+               case ACPI_RESOURCE_TYPE_ADDRESS64:
+               case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+               case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
                default: /* other type */
-                       pnp_warn("unknown resource type %d", resource->id);
+                       pnp_warn("unknown resource type %d", resource->type);
                        return -EINVAL;
                }
                resource ++;
index a86a650f3d6df13684cb07526469d9e8e7d283e3..721787cc5a1c71ef69e50d777cef841ccf23c637 100644 (file)
@@ -51,6 +51,13 @@ config UNIX98_PTY_COUNT
          When not in use, each additional set of 256 PTYs occupy
          approximately 8 KB of kernel memory on 32-bit architectures.
 
+config HANGCHECK_TIMER
+       tristate "Hangcheck timer"
+       help
+         The hangcheck-timer module detects when the system has gone
+         out to lunch past a certain margin.  It can reboot the system
+         or merely print a warning.
+
 source "drivers/char/watchdog/Kconfig"
 
 comment "S/390 character device drivers"
index ef4c687e7c01164af3e9ecc7417dcb8cb90d63b6..abdf1ee633e7ecf3dced11ca4850237e3b2fc807 100644 (file)
@@ -7,7 +7,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
  *
- * $Revision: 1.172 $
  */
 
 #include <linux/config.h>
@@ -675,11 +674,8 @@ dasd_term_IO(struct dasd_ccw_req * cqr)
                rc = ccw_device_clear(device->cdev, (long) cqr);
                switch (rc) {
                case 0: /* termination successful */
-                       if (cqr->retries > 0) {
-                               cqr->retries--;
-                               cqr->status = DASD_CQR_CLEAR;
-                       } else
-                               cqr->status = DASD_CQR_FAILED;
+                       cqr->retries--;
+                       cqr->status = DASD_CQR_CLEAR;
                        cqr->stopclk = get_clock();
                        DBF_DEV_EVENT(DBF_DEBUG, device,
                                      "terminate cqr %p successful",
@@ -1308,7 +1304,7 @@ dasd_tasklet(struct dasd_device * device)
        /* Now call the callback function of requests with final status */
        list_for_each_safe(l, n, &final_queue) {
                cqr = list_entry(l, struct dasd_ccw_req, list);
-               list_del(&cqr->list);
+               list_del_init(&cqr->list);
                if (cqr->callback != NULL)
                        (cqr->callback)(cqr, cqr->callback_data);
        }
@@ -1393,7 +1389,9 @@ _wait_for_wakeup(struct dasd_ccw_req *cqr)
 
        device = cqr->device;
        spin_lock_irq(get_ccwdev_lock(device->cdev));
-       rc = cqr->status == DASD_CQR_DONE || cqr->status == DASD_CQR_FAILED;
+       rc = ((cqr->status == DASD_CQR_DONE ||
+              cqr->status == DASD_CQR_FAILED) &&
+             list_empty(&cqr->list));
        spin_unlock_irq(get_ccwdev_lock(device->cdev));
        return rc;
 }
@@ -1457,15 +1455,37 @@ dasd_sleep_on_interruptible(struct dasd_ccw_req * cqr)
        while (!finished) {
                rc = wait_event_interruptible(wait_q, _wait_for_wakeup(cqr));
                if (rc != -ERESTARTSYS) {
-                       /* Request status is either done or failed. */
-                       rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0;
+                       /* Request is final (done or failed) */
+                       rc = (cqr->status == DASD_CQR_DONE) ? 0 : -EIO;
                        break;
                }
                spin_lock_irq(get_ccwdev_lock(device->cdev));
-               if (cqr->status == DASD_CQR_IN_IO &&
-                   device->discipline->term_IO(cqr) == 0) {
-                       list_del(&cqr->list);
+               switch (cqr->status) {
+               case DASD_CQR_IN_IO:
+                        /* terminate runnig cqr */
+                       if (device->discipline->term_IO) {
+                               cqr->retries = -1;
+                               device->discipline->term_IO(cqr);
+                               /*nished =
+                                * wait (non-interruptible) for final status
+                                * because signal ist still pending
+                                */
+                               spin_unlock_irq(get_ccwdev_lock(device->cdev));
+                               wait_event(wait_q, _wait_for_wakeup(cqr));
+                               spin_lock_irq(get_ccwdev_lock(device->cdev));
+                               rc = (cqr->status == DASD_CQR_DONE) ? 0 : -EIO;
+                               finished = 1;
+                       }
+                       break;
+               case DASD_CQR_QUEUED:
+                       /* request  */
+                       list_del_init(&cqr->list);
+                       rc = -EIO;
                        finished = 1;
+                       break;
+               default:
+                       /* cqr with 'non-interruptable' status - just wait */
+                       break;
                }
                spin_unlock_irq(get_ccwdev_lock(device->cdev));
        }
index 84565c8f584e0361dabd8af6d26ab07e0083fa81..1d11c2a9525d3d1ab7f158efd6f96df53e541949 100644 (file)
@@ -4,7 +4,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000
  *
- * $Revision: 1.9 $
  */
 
 #define PRINTK_HEADER "dasd_erp(3370)"
index c143ecb53d9d1e750975b4caa3120345a69737bd..4ee0f934e325388c779e20c05e32098b55ebe1ce 100644 (file)
@@ -5,7 +5,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000, 2001
  *
- * $Revision: 1.36 $
  */
 
 #include <linux/timer.h>
index 01e87170a3a24e20fddf75ce22c6c3555620a20a..dc861446d0562b991427433df7605111429a818e 100644 (file)
@@ -4,7 +4,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000
  *
- * $Revision: 1.8 $
  */
 
 #define PRINTK_HEADER "dasd_erp(9336)"
index 2a23b74faf3f74dd8d406ae15d9e950f640ed210..4a5b79569aaaa463461f55a25dffc09f0d9b3b32 100644 (file)
@@ -4,7 +4,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000
  *
- * $Revision: 1.13 $
  */
 
 #define PRINTK_HEADER "dasd_erp(9343)"
index 4f365bff275c7881472ad1173bf01b1cc2bcd633..e88f73ee72ce7ae00f30e41a166af9720abb4a0d 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * linux/drivers/s390/block/dasd_cmb.c ($Revision: 1.9 $)
- *
  * Linux on zSeries Channel Measurement Facility support
  *  (dasd device driver interface)
  *
index caee16a3dc624d48c3fbb84de7678c9557adbe5d..1629b27c48ab7d57a73e433156269a323d4a900e 100644 (file)
@@ -11,7 +11,6 @@
  * functions may not be called from interrupt context. In particular
  * dasd_get_device is a no-no from interrupt context.
  *
- * $Revision: 1.43 $
  */
 
 #include <linux/config.h>
index ba80fdea7ebf09f43e925ca3ce38e854a82d4622..3f9d704d2657483f739dcced896a212413665882 100644 (file)
@@ -6,7 +6,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.53 $
  */
 
 #include <linux/config.h>
index a4f80bd735f1e94730fabd434c7615b7c7972186..38a4e55f89539b90f514ea9f80b77d4f4d139475 100644 (file)
@@ -6,7 +6,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.9 $
  */
 
 #define MDSK_WRITE_REQ 0x01
index 96eb48258580f5a0b2b3d5a90cbd7e43a0c203ee..822e2a265578ca798afe71ee7279610de496ada2 100644 (file)
@@ -7,7 +7,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.74 $
  */
 
 #include <linux/config.h>
index b6888c68b2244c5f4de0caaea4c0cbcff3d37b14..bc3823d35223362d97a0b939f59ca687b1345759 100644 (file)
@@ -5,7 +5,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.10 $
  */
 
 #ifndef DASD_ECKD_H
index 7cb98d25f341683aaa987985acdbb34575800dfe..8fd71ab02ef055df625a0182cff83bd795459b66 100644 (file)
@@ -7,7 +7,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
  *
- * $Revision: 1.14 $
  */
 
 #include <linux/config.h>
index 8ec75dc08e2cc3ea16f4fa17335a051fa84297e8..91145698f8e926c7265e3d1581abf61479d62b9b 100644 (file)
@@ -4,7 +4,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.41 $
  */
 
 #include <linux/config.h>
index 624f0402ee22e3adfec84abb7bc31ac46b4d7e44..da1fa91fc01dd42a94cffe047459c9ffc6a00136 100644 (file)
@@ -4,7 +4,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.6 $
  */
 
 #ifndef DASD_FBA_H
index a601c9a33541cb7362223fee666de8f5a54d7284..65dc844b975cffb00a5d45251c48f6dbddf1269a 100644 (file)
@@ -9,7 +9,6 @@
  *
  * gendisk related functions for the dasd driver.
  *
- * $Revision: 1.51 $
  */
 
 #include <linux/config.h>
index e4b401500b019e61b03ec8e5cf30694a8d42923f..c20af9874500019fff41d20b7d200cfd84f187c1 100644 (file)
@@ -6,7 +6,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.68 $
  */
 
 #ifndef DASD_INT_H
index 9396fcacb8f8900338b7479daa807735dea6246b..fafeeae52675ea396a1c71c67f9395fc635b78af 100644 (file)
@@ -7,8 +7,6 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
  *
- * $Revision: 1.50 $
- *
  * i/o controls for the dasd driver.
  */
 #include <linux/config.h>
@@ -423,8 +421,15 @@ dasd_ioctl_information(struct block_device *bdev, int no, long args)
        dasd_info->cu_model = cdev->id.cu_model;
        dasd_info->dev_type = cdev->id.dev_type;
        dasd_info->dev_model = cdev->id.dev_model;
-       dasd_info->open_count = atomic_read(&device->open_count);
        dasd_info->status = device->state;
+       /*
+        * The open_count is increased for every opener, that includes
+        * the blkdev_get in dasd_scan_partitions.
+        * This must be hidden from user-space.
+        */
+       dasd_info->open_count = atomic_read(&device->open_count);
+       if (!device->bdev)
+               dasd_info->open_count++;
        
        /*
         * check if device is really formatted
index fff9020d48866bd2910fad640f105a9ccd0032e4..2d5da3c75ca712cf1f5abb3632993e8815ffa97a 100644 (file)
@@ -9,7 +9,6 @@
  *
  * /proc interface for the dasd driver.
  *
- * $Revision: 1.33 $
  */
 
 #include <linux/config.h>
index 1f060914cfa429275333377b21dcae3d27937135..606f6ad285a0e3db07ea97f919d467c35818d6c1 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/init.h>
 #include <linux/console.h>
 #include <linux/interrupt.h>
+#include <linux/err.h>
 
 #include <linux/slab.h>
 #include <linux/bootmem.h>
@@ -864,7 +865,7 @@ con3215_init(void)
        }
 
        cdev = ccw_device_probe_console();
-       if (!cdev)
+       if (IS_ERR(cdev))
                return -ENODEV;
 
        raw3215[0] = raw = (struct raw3215_info *)
index c570a9f6ce9cfcd499ca50cdb64cbae6be462ecb..ef607a1de55a30707ac2098eeea64a9f3cc41b24 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/interrupt.h>
 #include <linux/list.h>
 #include <linux/types.h>
+#include <linux/err.h>
 
 #include <asm/ccwdev.h>
 #include <asm/cio.h>
@@ -597,7 +598,7 @@ con3270_init(void)
        }
 
        cdev = ccw_device_probe_console();
-       if (!cdev)
+       if (IS_ERR(cdev))
                return -ENODEV;
        rp = raw3270_setup_console(cdev);
        if (IS_ERR(rp))
index 5bda2340a39d93a843fd1f090da240f0d1c6af36..a317a123daba4bf0debbacfb4e9d59b6170e81f9 100644 (file)
@@ -440,7 +440,11 @@ do_kdgkb_ioctl(struct kbd_data *kbd, struct kbsentry __user *u_kbs,
                        return -EPERM;
                len = strnlen_user(u_kbs->kb_string,
                                   sizeof(u_kbs->kb_string) - 1);
-               p = kmalloc(len, GFP_KERNEL);
+               if (!len)
+                       return -EFAULT;
+               if (len > sizeof(u_kbs->kb_string) - 1)
+                       return -EINVAL;
+               p = kmalloc(len + 1, GFP_KERNEL);
                if (!p)
                        return -ENOMEM;
                if (copy_from_user(p, u_kbs->kb_string, len)) {
index 20be88e91fa1a7abff383f8e0aac20976f8beac0..682039cac15b7d0bbdf68b5f5fa5040a986a7bbf 100644 (file)
@@ -1357,7 +1357,7 @@ tape_34xx_init (void)
        debug_set_level(TAPE_DBF_AREA, 6);
 #endif
 
-       DBF_EVENT(3, "34xx init: $Revision: 1.23 $\n");
+       DBF_EVENT(3, "34xx init\n");
        /* Register driver for 3480/3490 tapes. */
        rc = ccw_driver_register(&tape_34xx_driver);
        if (rc)
@@ -1377,8 +1377,7 @@ tape_34xx_exit(void)
 
 MODULE_DEVICE_TABLE(ccw, tape_34xx_ids);
 MODULE_AUTHOR("(C) 2001-2002 IBM Deutschland Entwicklung GmbH");
-MODULE_DESCRIPTION("Linux on zSeries channel attached 3480 tape "
-                  "device driver ($Revision: 1.23 $)");
+MODULE_DESCRIPTION("Linux on zSeries channel attached 3480 tape device driver");
 MODULE_LICENSE("GPL");
 
 module_init(tape_34xx_init);
index fcaee447d6fe58122a4f8c5c9aa8855ce76c64ab..b3569c82bb16a2f7716147ca307ea1449b60db70 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright IBM Corp. 2004
- * tape_class.c ($Revision: 1.8 $)
+ * tape_class.c
  *
  * Tape class device support
  *
@@ -12,7 +12,7 @@
 MODULE_AUTHOR("Stefan Bader <shbader@de.ibm.com>");
 MODULE_DESCRIPTION(
        "(C) Copyright IBM Corp. 2004   All Rights Reserved.\n"
-       "tape_class.c ($Revision: 1.8 $)"
+       "tape_class.c"
 );
 MODULE_LICENSE("GPL");
 
index 33133ad00ba218a370d547dcc8d5be80b8835eec..3d0ca054cdee75fb2b51dfcad55f92889216874b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright IBM Corp. 2004   All Rights Reserved.
- * tape_class.h ($Revision: 1.4 $)
+ * tape_class.h
  *
  * Tape class device support
  *
index 8f486e1a85075657fd890c94b3016ab4f99a80f1..4ea438c749c9c6f4764ea1056c1baae1d1c52446 100644 (file)
@@ -1239,7 +1239,7 @@ tape_init (void)
 #ifdef DBF_LIKE_HELL
        debug_set_level(TAPE_DBF_AREA, 6);
 #endif
-       DBF_EVENT(3, "tape init: ($Revision: 1.54 $)\n");
+       DBF_EVENT(3, "tape init\n");
        tape_proc_init();
        tapechar_init ();
        tapeblock_init ();
@@ -1263,8 +1263,7 @@ tape_exit(void)
 
 MODULE_AUTHOR("(C) 2001 IBM Deutschland Entwicklung GmbH by Carsten Otte and "
              "Michael Holzheu (cotte@de.ibm.com,holzheu@de.ibm.com)");
-MODULE_DESCRIPTION("Linux on zSeries channel attached "
-                  "tape device driver ($Revision: 1.54 $)");
+MODULE_DESCRIPTION("Linux on zSeries channel attached tape device driver");
 MODULE_LICENSE("GPL");
 
 module_init(tape_init);
index cd2cc28e16a70181780ac3cc2d425f4422ddb035..5287631fbfc8439d92c921c6664998bf1eea5caa 100644 (file)
@@ -2,8 +2,6 @@
  *  drivers/s390/cio/airq.c
  *   S/390 common I/O routines -- support for adapter interruptions
  *
- *   $Revision: 1.15 $
- *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *                           IBM Corporation
  *    Author(s): Ingo Adlung (adlung@de.ibm.com)
index 72f27c151c09fba2c78b5e6b3f1dfb0ef9484f4b..cb8e2e672b68664680dddf99832ec9940d980f66 100644 (file)
@@ -1,7 +1,6 @@
 /*
  *  drivers/s390/cio/blacklist.c
  *   S/390 common I/O routines -- blacklisting of specific devices
- *   $Revision: 1.42 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *                           IBM Corporation
index 6c077ad71edc41e5c16e24ae270107a4bb490828..8013c8eb76fef98ef9db541597153bf164b8dde3 100644 (file)
@@ -1,7 +1,6 @@
 /*
  *  drivers/s390/cio/ccwgroup.c
  *  bus driver for ccwgroup
- *   $Revision: 1.35 $
  *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *                       IBM Corporation
index 2cbb724791a822bf34d3bea4cc4806140f7b5dcd..92be75d99a56eb84743cdea07e91e445e3e455b6 100644 (file)
@@ -1,7 +1,6 @@
 /*
  *  drivers/s390/cio/chsc.c
  *   S/390 common I/O routines -- channel subsystem call
- *   $Revision: 1.128 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *                           IBM Corporation
index 6223b06d27d5d767a86333451b3e11ef1d23d80c..cbb86fa5f293b71a244b37c4d9a39d323665e46c 100644 (file)
@@ -1,7 +1,6 @@
 /*
  *  drivers/s390/cio/cio.c
  *   S/390 common I/O routines -- low level i/o calls
- *   $Revision: 1.140 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *                           IBM Corporation
index 0b03714e696a12c7960a54b1164b7efcbdedcbe7..07ef3f640f4aa73ec17460a93ab020f21a9bfb2e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/s390/cio/cmf.c ($Revision: 1.19 $)
+ * linux/drivers/s390/cio/cmf.c
  *
  * Linux on zSeries Channel Measurement Facility support
  *
index 516108779f6038b9e4c4ca2f9e68997b345ceba8..1bbf231f8aafa125b87e7a2842e51642eab0fcc8 100644 (file)
@@ -1,7 +1,6 @@
 /*
  *  drivers/s390/cio/css.c
  *  driver for channel subsystem
- *   $Revision: 1.96 $
  *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *                      IBM Corporation
index a67e7e60e33009b27f7812003195dbccb93737b2..062fb100d94c17035c5b0cd30ef47930637f9e3e 100644 (file)
@@ -1,7 +1,6 @@
 /*
  *  drivers/s390/cio/device.c
  *  bus driver for ccw devices
- *   $Revision: 1.140 $
  *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *                      IBM Corporation
@@ -255,7 +254,7 @@ modalias_show (struct device *dev, struct device_attribute *attr, char *buf)
        struct ccw_device_id *id = &(cdev->id);
        int ret;
 
-       ret = sprintf(buf, "ccw:t%04Xm%02x",
+       ret = sprintf(buf, "ccw:t%04Xm%02X",
                        id->cu_type, id->cu_model);
        if (id->dev_type != 0)
                ret += sprintf(buf + ret, "dt%04Xdm%02X\n",
@@ -1013,7 +1012,7 @@ ccw_device_probe_console(void)
        int ret;
 
        if (xchg(&console_cdev_in_use, 1) != 0)
-               return NULL;
+               return ERR_PTR(-EBUSY);
        sch = cio_probe_console();
        if (IS_ERR(sch)) {
                console_cdev_in_use = 0;
index 8b0218949b6287eb9b4480821e0d197a6c82414c..3a50b190328792183aefa1b975ab31ba43852403 100644 (file)
@@ -1,8 +1,6 @@
 /*
  *  drivers/s390/cio/device_ops.c
  *
- *   $Revision: 1.61 $
- *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *                      IBM Corporation
  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
index 77be2c39bfe40df778ec6c021ba7bcf37b9170f9..45ce032772f4e6a785bcdc42f9f68744c44dc2e4 100644 (file)
@@ -56,8 +56,6 @@
 #include "ioasm.h"
 #include "chsc.h"
 
-#define VERSION_QDIO_C "$Revision: 1.117 $"
-
 /****************** MODULE PARAMETER VARIABLES ********************/
 MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>");
 MODULE_DESCRIPTION("QDIO base support version 2, " \
@@ -66,8 +64,7 @@ MODULE_LICENSE("GPL");
 
 /******************** HERE WE GO ***********************************/
 
-static const char version[] = "QDIO base support version 2 ("
-       VERSION_QDIO_C "/" VERSION_QDIO_H  "/" VERSION_CIO_QDIO_H ")";
+static const char version[] = "QDIO base support version 2";
 
 #ifdef QDIO_PERFORMANCE_STATS
 static int proc_perf_file_registration;
index fa385e761fe177034551ab5a82038d8ff38f3693..ceb3ab31ee088409abc275dd0b0361ad1033fd89 100644 (file)
@@ -5,8 +5,6 @@
 
 #include "schid.h"
 
-#define VERSION_CIO_QDIO_H "$Revision: 1.40 $"
-
 #ifdef CONFIG_QDIO_DEBUG
 #define QDIO_VERBOSE_LEVEL 9
 #else /* CONFIG_QDIO_DEBUG */
index f87c785f2039f04ffa67b1b06bf41c8bd24d3535..dbbcda3c846a34fa29f91a02cd0c698eef99a144 100644 (file)
@@ -27,8 +27,6 @@
 #ifndef _Z90COMMON_H_
 #define _Z90COMMON_H_
 
-#define VERSION_Z90COMMON_H "$Revision: 1.17 $"
-
 
 #define RESPBUFFSIZE 256
 #define PCI_FUNC_KEY_DECRYPT 0x5044
index 3a18443fdfa714412f3030ae4c34fa5eaf038365..5e6b1f535f625b700496fdc909328a25b39dd6e1 100644 (file)
@@ -29,8 +29,6 @@
 
 #include <linux/ioctl.h>
 
-#define VERSION_Z90CRYPT_H "$Revision: 1.2.2.4 $"
-
 #define z90crypt_VERSION 1
 #define z90crypt_RELEASE 3     // 2 = PCIXCC, 3 = rewrite for coding standards
 #define z90crypt_VARIANT 3     // 3 = CEX2A support
index d7f7494a0cbef4db65233b1fbf8030b054cbb593..4141919da8053c56b3db2e446c62fadbba11ed4e 100644 (file)
 #include "z90crypt.h"
 #include "z90common.h"
 
-#define VERSION_Z90HARDWARE_C "$Revision: 1.34 $"
-
-char z90hardware_version[] __initdata =
-       "z90hardware.o (" VERSION_Z90HARDWARE_C "/"
-                         VERSION_Z90COMMON_H "/" VERSION_Z90CRYPT_H ")";
-
 struct cca_token_hdr {
        unsigned char  token_identifier;
        unsigned char  version;
index 2f54d033d7cf8925502ba7a3f09c81c7599777d9..7d6f19030ef97f013059cb52cb46b275ee92f7d4 100644 (file)
 #include "z90crypt.h"
 #include "z90common.h"
 
-#define VERSION_Z90MAIN_C "$Revision: 1.62 $"
-
-static char z90main_version[] __initdata =
-       "z90main.o (" VERSION_Z90MAIN_C "/"
-                      VERSION_Z90COMMON_H "/" VERSION_Z90CRYPT_H ")";
-
-extern char z90hardware_version[];
-
 /**
  * Defaults that may be modified.
  */
@@ -594,8 +586,6 @@ z90crypt_init_module(void)
                PRINTKN("Version %d.%d.%d loaded, built on %s %s\n",
                        z90crypt_VERSION, z90crypt_RELEASE, z90crypt_VARIANT,
                        __DATE__, __TIME__);
-               PRINTKN("%s\n", z90main_version);
-               PRINTKN("%s\n", z90hardware_version);
                PDEBUG("create_z90crypt (domain index %d) successful.\n",
                       domain);
        } else
index e70af7f39946b6fef7748d760761b74b50658cc5..a86436a7a606bc1ddcab90f2e3a1846598c6eb05 100644 (file)
@@ -2,8 +2,6 @@
  *  drivers/s390/net/claw.c
  *    ESCON CLAW network driver
  *
- *    $Revision: 1.38 $ $Date: 2005/08/29 09:47:04 $
- *
  *  Linux for zSeries version
  *    Copyright (C) 2002,2005 IBM Corporation
  *  Author(s) Original code written by:
@@ -4391,14 +4389,7 @@ static int __init
 claw_init(void)
 {
        int ret = 0;
-       printk(KERN_INFO "claw: starting driver "
-#ifdef MODULE
-                "module "
-#else
-                "compiled into kernel "
-#endif
-                " $Revision: 1.38 $ $Date: 2005/08/29 09:47:04 $ \n");
-
+       printk(KERN_INFO "claw: starting driver\n");
 
 #ifdef FUNCTRACE
         printk(KERN_INFO "claw: %s() enter \n",__FUNCTION__);
index 3df71970f6010de60801b4e43f68dde8eb08e941..969be465309c2a266a0f6f317d169ef8555bd5f0 100644 (file)
@@ -2,7 +2,7 @@
 *  Define constants                                    *
 *                                                      *
 ********************************************************/
-#define VERSION_CLAW_H "$Revision: 1.6 $"
+
 /*-----------------------------------------------------*
 *     CCW command codes for CLAW protocol              *
 *------------------------------------------------------*/
index 0e2a8bb930322ec9d4f6aacc4c8c5924df8a04ad..e6e72deb36b5559f00c62dc2837818e4b05d46c4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/ctcdbug.c ($Revision: 1.6 $)
+ * linux/drivers/s390/net/ctcdbug.c
  *
  * CTC / ESCON network driver - s390 dbf exploit.
  *
@@ -9,8 +9,6 @@
  *    Author(s): Original Code written by
  *                       Peter Tiedemann (ptiedem@de.ibm.com)
  *
- *    $Revision: 1.6 $  $Date: 2005/05/11 08:10:17 $
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2, or (at your option)
@@ -80,4 +78,3 @@ ctc_register_dbf_views(void)
        return 0;
 }
 
-
index 7d6afa1627c3534cc86f1805f9f4da45c92fa47e..413925ee23d17c31761df918eabee7534e25b743 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/ctcdbug.h ($Revision: 1.6 $)
+ * linux/drivers/s390/net/ctcdbug.h
  *
  * CTC / ESCON network driver - s390 dbf exploit.
  *
@@ -9,8 +9,6 @@
  *    Author(s): Original Code written by
  *                       Peter Tiedemann (ptiedem@de.ibm.com)
  *
- *    $Revision: 1.6 $  $Date: 2005/05/11 08:10:17 $
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2, or (at your option)
index 1901feef07d9a83d7df43447c5c32ee13924cf04..af9f212314b3a3c00cf5e298daba5f95d9b1acce 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id: ctcmain.c,v 1.79 2006/01/11 11:32:18 cohuck Exp $
- *
  * CTC / ESCON network driver
  *
  * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
@@ -37,8 +35,6 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.79 $
- *
  */
 #undef DEBUG
 #include <linux/module.h>
@@ -248,22 +244,11 @@ static void
 print_banner(void)
 {
        static int printed = 0;
-       char vbuf[] = "$Revision: 1.79 $";
-       char *version = vbuf;
 
        if (printed)
                return;
-       if ((version = strchr(version, ':'))) {
-               char *p = strchr(version + 1, '$');
-               if (p)
-                       *p = '\0';
-       } else
-               version = " ??? ";
-       printk(KERN_INFO "CTC driver Version%s"
-#ifdef DEBUG
-                   " (DEBUG-VERSION, " __DATE__ __TIME__ ")"
-#endif
-                   " initialized\n", version);
+
+       printk(KERN_INFO "CTC driver initialized\n");
        printed = 1;
 }
 
index ba3605f16335dba918a656bb1b94589fb8008490..d2e835c0c1344296de249deeb11e804c691534c1 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id: ctcmain.h,v 1.4 2005/03/24 09:04:17 mschwide Exp $
- *
  * CTC / ESCON network driver
  *
  * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
@@ -29,8 +27,6 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.4 $
- *
  */
 
 #ifndef _CTCMAIN_H_
index 93d1725eb79b988db630d07da7cb9e605eee5c2c..5cdcdbf92962ee89e8be5534ed5d5152f7a5a9a3 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id: ctctty.c,v 1.29 2005/04/05 08:50:44 mschwide Exp $
- *
  * CTC / ESCON network driver, tty interface.
  *
  * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
index 84b2f8f23ab3c93c121b8a0c8e13de78472c32a5..7254dc006311e0e751024aa12fac867d86cd9cf7 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id: ctctty.h,v 1.4 2003/09/18 08:01:10 mschwide Exp $
- *
  * CTC / ESCON network driver, tty interface.
  *
  * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
index 2014fb7a4881f131052c79716e37f920dca4e156..b12533104c1ff5b38242791d22d0e94c0f0293de 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id: cu3088.c,v 1.38 2006/01/12 14:33:09 cohuck Exp $
- *
  * CTC / LCS ccw_device driver
  *
  * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
index 24029bd9c7d09e682fb97ab8397c4ff6b5c99b51..6caf5fa6a3b525166b4af47e4b29656bc88be74e 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * $Id: fsm.c,v 1.6 2003/10/15 11:37:29 mschwide Exp $
- *
  * A generic FSM based on fsm used in isdn4linux
  *
  */
index 5b98253be7aa43b1bc196d92fd2c4e7dc8b0f477..af679c10f1bd307deea0674458fb96f9ecc866b6 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id: fsm.h,v 1.1.1.1 2002/03/13 19:33:09 mschwide Exp $
- */
 #ifndef _FSM_H_
 #define _FSM_H_
 
index ea8177392564194f4ce9e5c7389cfbda1e14550b..760e77ec5a11aa52e4907701372a3e6217fb2889 100644 (file)
@@ -1,6 +1,4 @@
 /* 
- * $Id: iucv.c,v 1.47 2005/11/21 11:35:22 mschwide Exp $
- *
  * IUCV network driver
  *
  * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
@@ -29,8 +27,6 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.47 $
- *
  */
 \f
 /* #define DEBUG */
@@ -355,17 +351,7 @@ do { \
 static void
 iucv_banner(void)
 {
-       char vbuf[] = "$Revision: 1.47 $";
-       char *version = vbuf;
-
-       if ((version = strchr(version, ':'))) {
-               char *p = strchr(version + 1, '$');
-               if (p)
-                       *p = '\0';
-       } else
-               version = " ??? ";
-       printk(KERN_INFO
-              "IUCV lowlevel driver Version%s initialized\n", version);
+       printk(KERN_INFO "IUCV lowlevel driver initialized\n");
 }
 
 /**
index da8c515743e871e4066f3dcc583d6e4b922838ff..6229ba4995ad0e527e496f5b1775f8d90f277724 100644 (file)
@@ -11,8 +11,6 @@
  *                       Frank Pavlic (fpavlic@de.ibm.com) and
  *                       Martin Schwidefsky <schwidefsky@de.ibm.com>
  *
- *    $Revision: 1.99 $         $Date: 2005/05/11 08:10:17 $
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2, or (at your option)
@@ -59,9 +57,8 @@
 /**
  * initialization string for output
  */
-#define VERSION_LCS_C  "$Revision: 1.99 $"
 
-static char version[] __initdata = "LCS driver ("VERSION_LCS_C "/" VERSION_LCS_H ")";
+static char version[] __initdata = "LCS driver";
 static char debug_buffer[255];
 
 /**
index a7f348ef1b0891c556a8d8da58ff2cfba650f176..08e60ad439167ea987eaff40249dbd5db006d1af 100644 (file)
@@ -6,8 +6,6 @@
 #include <linux/workqueue.h>
 #include <asm/ccwdev.h>
 
-#define VERSION_LCS_H "$Revision: 1.19 $"
-
 #define LCS_DBF_TEXT(level, name, text) \
        do { \
                debug_text_event(lcs_dbf_##name, level, text); \
index ac4c4b83fe1701f297329c03e1ef9f2f1a7a752d..71d3853e86826da731b906ece3bb4a72cdeecede 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id: netiucv.c,v 1.69 2006/01/12 14:33:09 cohuck Exp $
- *
  * IUCV network driver
  *
  * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
@@ -31,8 +29,6 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV network driver $Revision: 1.69 $
- *
  */
 \f
 #undef DEBUG
@@ -2077,16 +2073,7 @@ DRIVER_ATTR(remove, 0200, NULL, remove_write);
 static void
 netiucv_banner(void)
 {
-       char vbuf[] = "$Revision: 1.69 $";
-       char *version = vbuf;
-
-       if ((version = strchr(version, ':'))) {
-               char *p = strchr(version + 1, '$');
-               if (p)
-                       *p = '\0';
-       } else
-               version = " ??? ";
-       PRINT_INFO("NETIUCV driver Version%s initialized\n", version);
+       PRINT_INFO("NETIUCV driver initialized\n");
 }
 
 static void __exit
index d238c7ed103b2e6cfd3bf73e808116bd4712a5b7..9a064d4727ad196821b62cc89b2d038d0f9bd190 100644 (file)
@@ -25,8 +25,6 @@
 
 #include "qeth_mpc.h"
 
-#define VERSION_QETH_H                 "$Revision: 1.152 $"
-
 #ifdef CONFIG_QETH_IPV6
 #define QETH_VERSION_IPV6      ":IPv6"
 #else
index f94f1f25eec60a8e57ba9d311a90c47b2df58594..b023131277807f4d343cf3b59eaf9f8c19855331 100644 (file)
@@ -1,6 +1,5 @@
 /*
- *
- * linux/drivers/s390/net/qeth_eddp.c ($Revision: 1.13 $)
+ * linux/drivers/s390/net/qeth_eddp.c
  *
  * Enhanced Device Driver Packing (EDDP) support for the qeth driver.
  *
@@ -8,8 +7,6 @@
  *
  *    Author(s): Thomas Spatzier <tspat@de.ibm.com>
  *
- *    $Revision: 1.13 $         $Date: 2005/05/04 20:19:18 $
- *
  */
 #include <linux/config.h>
 #include <linux/errno.h>
index e1b51860bc57b803258e8c3627b7af371b93d849..cae9ba26505689d5cd1ff57679def80211f5fc86 100644 (file)
@@ -1,14 +1,12 @@
 /*
- * linux/drivers/s390/net/qeth_eddp.c ($Revision: 1.5 $)
+ * linux/drivers/s390/net/qeth_eddp.h
  *
- * Header file for qeth enhanced device driver pakcing.
+ * Header file for qeth enhanced device driver packing.
  *
  * Copyright 2004 IBM Corporation
  *
  *    Author(s): Thomas Spatzier <tspat@de.ibm.com>
  *
- *    $Revision: 1.5 $  $Date: 2005/03/24 09:04:18 $
- *
  */
 #ifndef __QETH_EDDP_H__
 #define __QETH_EDDP_H__
index c0b4c8d82c45e3108927eb6c2d27c61147199db0..e422b41c656e26ba11185c225f350c0113d9cd38 100644 (file)
 #ifndef __QETH_FS_H__
 #define __QETH_FS_H__
 
-#define VERSION_QETH_FS_H "$Revision: 1.10 $"
-
-extern const char *VERSION_QETH_PROC_C;
-extern const char *VERSION_QETH_SYS_C;
-
 #ifdef CONFIG_PROC_FS
 extern int
 qeth_create_procfs_entries(void);
index 97f927c01a82b57db43497217e4b97377ab47866..410abeada6c4990ee97df032cc25703a517ee675 100644 (file)
@@ -1,6 +1,5 @@
 /*
- *
- * linux/drivers/s390/net/qeth_main.c ($Revision: 1.251 $)
+ * linux/drivers/s390/net/qeth_main.c
  *
  * Linux on zSeries OSA Express and HiperSockets support
  *
@@ -12,8 +11,6 @@
  *                       Frank Pavlic (fpavlic@de.ibm.com) and
  *                       Thomas Spatzier <tspat@de.ibm.com>
  *
- *    $Revision: 1.251 $        $Date: 2005/05/04 20:19:18 $
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2, or (at your option)
@@ -73,7 +70,6 @@
 #include "qeth_eddp.h"
 #include "qeth_tso.h"
 
-#define VERSION_QETH_C "$Revision: 1.251 $"
 static const char *version = "qeth S/390 OSA-Express driver";
 
 /**
@@ -8626,12 +8622,7 @@ qeth_init(void)
 {
        int rc=0;
 
-       PRINT_INFO("loading %s (%s/%s/%s/%s/%s/%s/%s %s %s)\n",
-                  version, VERSION_QETH_C, VERSION_QETH_H,
-                  VERSION_QETH_MPC_H, VERSION_QETH_MPC_C,
-                  VERSION_QETH_FS_H, VERSION_QETH_PROC_C,
-                  VERSION_QETH_SYS_C, QETH_VERSION_IPV6,
-                  QETH_VERSION_VLAN);
+       PRINT_INFO("loading %s\n", version);
 
        INIT_LIST_HEAD(&qeth_card_list.list);
        INIT_LIST_HEAD(&qeth_notify_list);
index 5f8754addc14fe62fc0f4d675fc6822594644579..77c83209d70ee697da2abc2ad3c4c73a042aeaaf 100644 (file)
@@ -11,8 +11,6 @@
 #include <asm/cio.h>
 #include "qeth_mpc.h"
 
-const char *VERSION_QETH_MPC_C = "$Revision: 1.13 $";
-
 unsigned char IDX_ACTIVATE_READ[]={
        0x00,0x00,0x80,0x00, 0x00,0x00,0x00,0x00,
        0x19,0x01,0x01,0x80, 0x00,0x00,0x00,0x00,
index 864cec5f6c62c516aa91ed360ee5fd80f3f0c899..011c41041029addb84d96eb478bd533780f261e2 100644 (file)
 
 #include <asm/qeth.h>
 
-#define VERSION_QETH_MPC_H "$Revision: 1.46 $"
-
-extern const char *VERSION_QETH_MPC_C;
-
 #define IPA_PDU_HEADER_SIZE    0x40
 #define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e)
 #define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26)
index 7bf35098831e50603107d74befd95314d4062893..3c6339df879d185bd45f7eb30cc1dc644af1b2c0 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_fs.c ($Revision: 1.16 $)
+ * linux/drivers/s390/net/qeth_fs.c
  *
  * Linux on zSeries OSA Express and HiperSockets support
  * This file contains code related to procfs.
@@ -21,8 +21,6 @@
 #include "qeth_mpc.h"
 #include "qeth_fs.h"
 
-const char *VERSION_QETH_PROC_C = "$Revision: 1.16 $";
-
 /***** /proc/qeth *****/
 #define QETH_PROCFILE_NAME "qeth"
 static struct proc_dir_entry *qeth_procfile;
index 0ea185f70f75277f49a26221640db8c3bbf8859c..c1831f57258536b0f484a34b7c30e370e468cb48 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.60 $)
+ * linux/drivers/s390/net/qeth_sys.c
  *
  * Linux on zSeries OSA Express and HiperSockets support
  * This file contains code related to sysfs.
@@ -20,8 +20,6 @@
 #include "qeth_mpc.h"
 #include "qeth_fs.h"
 
-const char *VERSION_QETH_SYS_C = "$Revision: 1.60 $";
-
 /*****************************************************************************/
 /*                                                                           */
 /*          /sys-fs stuff UNDER DEVELOPMENT !!!                              */
index 3c50b6f24f5170aaa3093bbe3fc86f6c68feaaa5..1286ddea450b9e5b83d7642e9caed26c9817bc16 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/s390/net/qeth_tso.h ($Revision: 1.8 $)
+ * linux/drivers/s390/net/qeth_tso.h
  *
  * Header file for qeth TCP Segmentation Offload support.
  *
@@ -7,8 +7,6 @@
  *
  *    Author(s): Frank Pavlic <fpavlic@de.ibm.com>
  *
- *    $Revision: 1.8 $  $Date: 2005/05/04 20:19:18 $
- *
  */
 #ifndef __QETH_TSO_H__
 #define __QETH_TSO_H__
index 206518c7d3322dba7d723ada73df1d3b48dca6f8..e3f64716982786f23878d4554dc023ab25513452 100644 (file)
@@ -1,7 +1,6 @@
 /*
  *  drivers/s390/s390_rdev.c
  *  s390 root device
- *   $Revision: 1.4 $
  *
  *    Copyright (C) 2002, 2005 IBM Deutschland Entwicklung GmbH,
  *                      IBM Corporation
index d9ea7ed2e46e9ceead16eab686ebdff3086ee8fe..7abb42a09ae2e9a162123fc45fceda10500994d8 100644 (file)
@@ -90,15 +90,16 @@ struct crw {
 
 static inline int stcrw(struct crw *pcrw )
 {
-        int ccode;
+       int ccode;
 
-        __asm__ __volatile__(
-                "STCRW 0(%1)\n\t"
-                "IPM %0\n\t"
-                "SRL %0,28\n\t"
-                : "=d" (ccode) : "a" (pcrw)
-                : "cc", "1" );
-        return ccode;
+       __asm__ __volatile__(
+               "stcrw 0(%2)\n\t"
+               "ipm %0\n\t"
+               "srl %0,28\n\t"
+               : "=d" (ccode), "=m" (*pcrw)
+               : "a" (pcrw)
+               : "cc" );
+       return ccode;
 }
 
 #endif /* __s390mach */
index 167fef39d8a789400d0a41968e23d64f7972ef79..95b92f317b6fcff2e0a073462d920434b74117aa 100644 (file)
@@ -29,8 +29,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_AUX_REVISION "$Revision: 1.145 $"
-
 #include "zfcp_ext.h"
 
 /* accumulated log level (module parameter) */
index 0fc46381fc22735d1a884fe24f913e200dfbb770..241136d0c6eb689b7ba3fcd3da02c1e459815b58 100644 (file)
@@ -27,8 +27,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_CCW_C_REVISION "$Revision: 1.58 $"
-
 #include "zfcp_ext.h"
 
 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_CONFIG
index 95599719f8ab9e02c8294b53e3885c7df7087c6a..4d7d47cf2394a38ea9d4d760cfecd12bbc10f149 100644 (file)
@@ -23,8 +23,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_DBF_REVISION "$Revision$"
-
 #include <asm/debug.h>
 #include <linux/ctype.h>
 #include "zfcp_ext.h"
index 9bb511083a261a4a40c9506a26d0f26a8a1d559a..e260d19fa717f212e60d3e7bbb40d0de652a47e7 100644 (file)
@@ -34,8 +34,6 @@
 #ifndef ZFCP_DEF_H
 #define ZFCP_DEF_H
 
-#define ZFCP_DEF_REVISION "$Revision: 1.111 $"
-
 /*************************** INCLUDES *****************************************/
 
 #include <linux/init.h>
index c065cb836c97a8bd611dd482dfb5aa8e2242d84e..da947e662031f6114b02121591b0f912ac41ff73 100644 (file)
@@ -31,8 +31,6 @@
 
 #define ZFCP_LOG_AREA                  ZFCP_LOG_AREA_ERP
 
-#define ZFCP_ERP_REVISION "$Revision: 1.86 $"
-
 #include "zfcp_ext.h"
 
 static int zfcp_erp_adisc(struct zfcp_port *);
index c3782261cb5cc9f61dab8d4948e61cff6aed47fa..c1ba7cf1b49619367973ed84b02d915c9a54b2b9 100644 (file)
@@ -32,8 +32,6 @@
 #ifndef ZFCP_EXT_H
 #define ZFCP_EXT_H
 
-#define ZFCP_EXT_REVISION "$Revision: 1.62 $"
-
 #include "zfcp_def.h"
 
 extern struct zfcp_data zfcp_data;
index cbfab09899c89ca7104dd3bfb4abc8c28f5e279b..9f0cb3d820c06ce1753854e3946ebc4add466cfd 100644 (file)
@@ -30,8 +30,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_FSF_C_REVISION "$Revision: 1.92 $"
-
 #include "zfcp_ext.h"
 
 static int zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *);
index d719f66a29a4f9d7ebde41e3b7060d81f9070e78..1c3275163c915fd9fdb20c83aa80cafad19cd8d2 100644 (file)
@@ -29,8 +29,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_QDIO_C_REVISION "$Revision: 1.20 $"
-
 #include "zfcp_ext.h"
 
 static inline void zfcp_qdio_sbal_limit(struct zfcp_fsf_req *, int);
index 3c2cbcccbf54c559598e663cc5caa522b2f42f55..e0803757c0fa054c8f23df5f43f477a501518b14 100644 (file)
@@ -31,8 +31,6 @@
 
 #define ZFCP_LOG_AREA                  ZFCP_LOG_AREA_SCSI
 
-#define ZFCP_SCSI_REVISION "$Revision: 1.74 $"
-
 #include "zfcp_ext.h"
 
 static void zfcp_scsi_slave_destroy(struct scsi_device *sdp);
index 9f262250043a5d006e99b0b3850f3a351b4821f1..dfc07370f412acf1231303ac9ce5e3705a53d1d4 100644 (file)
@@ -27,8 +27,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_SYSFS_ADAPTER_C_REVISION "$Revision: 1.38 $"
-
 #include "zfcp_ext.h"
 
 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_CONFIG
index 77a5e2dcc0ff56002718943dc41d31fc608c9fb7..6622d55e0a452142b703b9d1e331d1ef23d6b8d0 100644 (file)
@@ -27,8 +27,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_SYSFS_DRIVER_C_REVISION "$Revision: 1.17 $"
-
 #include "zfcp_ext.h"
 
 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_CONFIG
index 3924eb38805c5e24cae27b148af445f20ce73477..f401d42db21c26674fb147b599a4aabfa71cf5ac 100644 (file)
@@ -28,8 +28,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_SYSFS_PORT_C_REVISION "$Revision: 1.47 $"
-
 #include "zfcp_ext.h"
 
 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_CONFIG
index 2f50815f65c746d386d051545fe540637676ea9b..ad5dfb889bee81c6d9ec73d36c0d7d5c50df6696 100644 (file)
@@ -28,8 +28,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_SYSFS_UNIT_C_REVISION "$Revision: 1.30 $"
-
 #include "zfcp_ext.h"
 
 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_CONFIG
index 3c688ef54660e781c638fd633dde208a57090e2a..0cf0e4c7ac0c751645945efdf29d582a1ac3ef36 100644 (file)
@@ -751,9 +751,8 @@ static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
        idescsi_add_settings(drive);
 }
 
-static int ide_scsi_remove(struct device *dev)
+static void ide_scsi_remove(ide_drive_t *drive)
 {
-       ide_drive_t *drive = to_ide_device(dev);
        struct Scsi_Host *scsihost = drive->driver_data;
        struct ide_scsi_obj *scsi = scsihost_to_idescsi(scsihost);
        struct gendisk *g = scsi->disk;
@@ -768,11 +767,9 @@ static int ide_scsi_remove(struct device *dev)
 
        scsi_remove_host(scsihost);
        ide_scsi_put(scsi);
-
-       return 0;
 }
 
-static int ide_scsi_probe(struct device *);
+static int ide_scsi_probe(ide_drive_t *);
 
 #ifdef CONFIG_PROC_FS
 static ide_proc_entry_t idescsi_proc[] = {
@@ -788,9 +785,9 @@ static ide_driver_t idescsi_driver = {
                .owner          = THIS_MODULE,
                .name           = "ide-scsi",
                .bus            = &ide_bus_type,
-               .probe          = ide_scsi_probe,
-               .remove         = ide_scsi_remove,
        },
+       .probe                  = ide_scsi_probe,
+       .remove                 = ide_scsi_remove,
        .version                = IDESCSI_VERSION,
        .media                  = ide_scsi,
        .supports_dsc_overlap   = 0,
@@ -1119,9 +1116,8 @@ static struct scsi_host_template idescsi_template = {
        .proc_name              = "ide-scsi",
 };
 
-static int ide_scsi_probe(struct device *dev)
+static int ide_scsi_probe(ide_drive_t *drive)
 {
-       ide_drive_t *drive = to_ide_device(dev);
        idescsi_scsi_t *idescsi;
        struct Scsi_Host *host;
        struct gendisk *g;
index a802bdce6e5dd02a044f343cddc4dd1a71fe5308..809f89ab965c9ad569974449e4d26c94aade500e 100644 (file)
@@ -27,7 +27,7 @@ struct serial_private {
 static acpi_status acpi_serial_mmio(struct uart_port *port,
                                    struct acpi_resource_address64 *addr)
 {
-       port->mapbase = addr->min_address_range;
+       port->mapbase = addr->minimum;
        port->iotype = UPIO_MEM;
        port->flags |= UPF_IOREMAP;
        return AE_OK;
@@ -36,8 +36,8 @@ static acpi_status acpi_serial_mmio(struct uart_port *port,
 static acpi_status acpi_serial_port(struct uart_port *port,
                                    struct acpi_resource_io *io)
 {
-       if (io->range_length) {
-               port->iobase = io->min_base_address;
+       if (io->address_length) {
+               port->iobase = io->minimum;
                port->iotype = UPIO_PORT;
        } else
                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,
 }
 
 static acpi_status acpi_serial_ext_irq(struct uart_port *port,
-                                      struct acpi_resource_ext_irq *ext_irq)
+                                      struct acpi_resource_extended_irq *ext_irq)
 {
        int rc;
 
-       if (ext_irq->number_of_interrupts > 0) {
+       if (ext_irq->interrupt_count > 0) {
                rc = acpi_register_gsi(ext_irq->interrupts[0],
-                          ext_irq->edge_level, ext_irq->active_high_low);
+                          ext_irq->triggering, ext_irq->polarity);
                if (rc < 0)
                        return AE_ERROR;
                port->irq = rc;
@@ -64,9 +64,9 @@ static acpi_status acpi_serial_irq(struct uart_port *port,
 {
        int rc;
 
-       if (irq->number_of_interrupts > 0) {
+       if (irq->interrupt_count > 0) {
                rc = acpi_register_gsi(irq->interrupts[0],
-                          irq->edge_level, irq->active_high_low);
+                          irq->triggering, irq->polarity);
                if (rc < 0)
                        return AE_ERROR;
                port->irq = rc;
@@ -83,11 +83,11 @@ static acpi_status acpi_serial_resource(struct acpi_resource *res, void *data)
        status = acpi_resource_to_address64(res, &addr);
        if (ACPI_SUCCESS(status))
                return acpi_serial_mmio(port, &addr);
-       else if (res->id == ACPI_RSTYPE_IO)
+       else if (res->type == ACPI_RESOURCE_TYPE_IO)
                return acpi_serial_port(port, &res->data.io);
-       else if (res->id == ACPI_RSTYPE_EXT_IRQ)
+       else if (res->type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ)
                return acpi_serial_ext_irq(port, &res->data.extended_irq);
-       else if (res->id == ACPI_RSTYPE_IRQ)
+       else if (res->type == ACPI_RESOURCE_TYPE_IRQ)
                return acpi_serial_irq(port, &res->data.irq);
        return AE_OK;
 }
index 6f22b42d93372065918ab21548f08f7ab74908aa..87e4e2cf8ce756e96882d66233360ec82a30df46 100644 (file)
@@ -965,56 +965,47 @@ static void neo_param(struct jsm_channel *ch)
                        baud = ch->ch_custom_speed;
                        if (ch->ch_flags & CH_BAUD0)
                                ch->ch_flags &= ~(CH_BAUD0);
-               } else {
-                       int iindex = 0;
-                       int jindex = 0;
-
-                       const u64 bauds[4][16] = {
-                               {
-                                       0,      50,     75,     110,
-                                       134,    150,    200,    300,
-                                       600,    1200,   1800,   2400,
-                                       4800,   9600,   19200,  38400 },
-                               {
-                                       0,      57600,  115200, 230400,
-                                       460800, 150,    200,    921600,
-                                       600,    1200,   1800,   2400,
-                                       4800,   9600,   19200,  38400 },
-                               {
-                                       0,      57600,  76800, 115200,
-                                       131657, 153600, 230400, 460800,
-                                       921600, 1200,   1800,   2400,
-                                       4800,   9600,   19200,  38400 },
-                               {
-                                       0,      57600,  115200, 230400,
-                                       460800, 150,    200,    921600,
-                                       600,    1200,   1800,   2400,
-                                       4800,   9600,   19200,  38400 }
-                       };
-
-                       baud = C_BAUD(ch->uart_port.info->tty) & 0xff;
-
-                       if (ch->ch_c_cflag & CBAUDEX)
-                               iindex = 1;
-
-                       jindex = baud;
-
-                       if ((iindex >= 0) && (iindex < 4) && (jindex >= 0) && (jindex < 16))
-                               baud = bauds[iindex][jindex];
-                       else {
-                               jsm_printk(IOCTL, DEBUG, &ch->ch_bd->pci_dev,
-                                       "baud indices were out of range (%d)(%d)",
-                               iindex, jindex);
-                               baud = 0;
+       } else {
+               int i;
+               unsigned int cflag;
+               static struct {
+                       unsigned int rate;
+                       unsigned int cflag;
+               } baud_rates[] = {
+                       { 921600, B921600 },
+                       { 460800, B460800 },
+                       { 230400, B230400 },
+                       { 115200, B115200 },
+                       {  57600, B57600  },
+                       {  38400, B38400  },
+                       {  19200, B19200  },
+                       {   9600, B9600   },
+                       {   4800, B4800   },
+                       {   2400, B2400   },
+                       {   1200, B1200   },
+                       {    600, B600    },
+                       {    300, B300    },
+                       {    200, B200    },
+                       {    150, B150    },
+                       {    134, B134    },
+                       {    110, B110    },
+                       {     75, B75     },
+                       {     50, B50     },
+               };
+
+               cflag = C_BAUD(ch->uart_port.info->tty);
+               baud = 9600;
+               for (i = 0; i < ARRAY_SIZE(baud_rates); i++) {
+                       if (baud_rates[i].cflag == cflag) {
+                               baud = baud_rates[i].rate;
+                               break;
                        }
-
-                       if (baud == 0)
-                               baud = 9600;
-
-                       if (ch->ch_flags & CH_BAUD0)
-                               ch->ch_flags &= ~(CH_BAUD0);
                }
 
+               if (ch->ch_flags & CH_BAUD0)
+                       ch->ch_flags &= ~(CH_BAUD0);
+       }
+
        if (ch->ch_c_cflag & PARENB)
                lcr |= UART_LCR_PARITY;
 
index 0111206327cac4505c2469cd326b7b09ba490fbf..80737c131ce70fe0b60f2053771980631c5fcdb3 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/delay.h>
 #include <linux/console.h>
 #include <linux/bitops.h>
+#include <linux/generic_serial.h>
 
 #ifdef CONFIG_CPU_FREQ
 #include <linux/notifier.h>
@@ -53,7 +54,9 @@
 #include <asm/irq.h>
 #include <asm/uaccess.h>
 
-#include <linux/generic_serial.h>
+#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
+#include <asm/clock.h>
+#endif
 
 #ifdef CONFIG_SH_STANDARD_BIOS
 #include <asm/sh_bios.h>
@@ -86,9 +89,11 @@ static void sci_stop_rx(struct uart_port *port);
 static int sci_request_irq(struct sci_port *port);
 static void sci_free_irq(struct sci_port *port);
 
-static struct sci_port sci_ports[SCI_NPORTS];
+static struct sci_port sci_ports[];
 static struct uart_driver sci_uart_driver;
 
+#define SCI_NPORTS sci_uart_driver.nr
+
 #if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB)
 
 static void handle_error(struct uart_port *port)
@@ -168,7 +173,7 @@ static void put_string(struct sci_port *sci_port, const char *buffer, int count)
        int usegdb=0;
 
 #ifdef CONFIG_SH_STANDARD_BIOS
-       /* This call only does a trap the first time it is
+       /* This call only does a trap the first time it is
         * called, and so is safe to do here unconditionally
         */
        usegdb |= sh_bios_in_gdb_mode();
@@ -324,47 +329,46 @@ static void sci_init_pins_sci(struct uart_port* port, unsigned int cflag)
        /* tx mark output*/
        H8300_SCI_DR(ch) |= h8300_sci_pins[ch].tx;
 }
-#else
-static void sci_init_pins_sci(struct uart_port *port, unsigned int cflag)
-{
-}
 #endif
 #endif
 
 #if defined(SCIF_ONLY) || defined(SCI_AND_SCIF)
-#if defined(CONFIG_CPU_SH3)
-/* For SH7705, SH7707, SH7709, SH7709A, SH7729, SH7300*/
+#if defined(CONFIG_CPU_SUBTYPE_SH7300)
+/* SH7300 doesn't use RTS/CTS */
+static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag)
+{
+       sci_out(port, SCFCR, 0);
+}
+#elif defined(CONFIG_CPU_SH3)
+/* For SH7705, SH7707, SH7709, SH7709A, SH7729 */
 static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag)
 {
        unsigned int fcr_val = 0;
-#if !defined(CONFIG_CPU_SUBTYPE_SH7300) /* SH7300 doesn't use RTS/CTS */
-       {
-               unsigned short data;
+       unsigned short data;
+
+       /* We need to set SCPCR to enable RTS/CTS */
+       data = ctrl_inw(SCPCR);
+       /* Clear out SCP7MD1,0, SCP6MD1,0, SCP4MD1,0*/
+       ctrl_outw(data & 0x0fcf, SCPCR);
 
-               /* We need to set SCPCR to enable RTS/CTS */
-               data = ctrl_inw(SCPCR);
-               /* Clear out SCP7MD1,0, SCP6MD1,0, SCP4MD1,0*/
-               ctrl_outw(data&0x0fcf, SCPCR);
-       }
        if (cflag & CRTSCTS)
                fcr_val |= SCFCR_MCE;
        else {
-               unsigned short data;
-
                /* We need to set SCPCR to enable RTS/CTS */
                data = ctrl_inw(SCPCR);
                /* Clear out SCP7MD1,0, SCP4MD1,0,
                   Set SCP6MD1,0 = {01} (output)  */
-               ctrl_outw((data&0x0fcf)|0x1000, SCPCR);
+               ctrl_outw((data & 0x0fcf) | 0x1000, SCPCR);
 
                data = ctrl_inb(SCPDR);
                /* Set /RTS2 (bit6) = 0 */
-               ctrl_outb(data&0xbf, SCPDR);
+               ctrl_outb(data & 0xbf, SCPDR);
        }
-#endif
+
        sci_out(port, SCFCR, fcr_val);
 }
 
+#if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709)
 static void sci_init_pins_irda(struct uart_port *port, unsigned int cflag)
 {
        unsigned int fcr_val = 0;
@@ -374,7 +378,7 @@ static void sci_init_pins_irda(struct uart_port *port, unsigned int cflag)
 
        sci_out(port, SCFCR, fcr_val);
 }
-
+#endif
 #else
 
 /* For SH7750 */
@@ -385,7 +389,11 @@ static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag)
        if (cflag & CRTSCTS) {
                fcr_val |= SCFCR_MCE;
        } else {
+#ifdef CONFIG_CPU_SUBTYPE_SH7780
+               ctrl_outw(0x0080, SCSPTR0); /* Set RTS = 1 */
+#else
                ctrl_outw(0x0080, SCSPTR2); /* Set RTS = 1 */
+#endif
        }
        sci_out(port, SCFCR, fcr_val);
 }
@@ -422,7 +430,11 @@ static void sci_transmit_chars(struct uart_port *port)
 
 #if !defined(SCI_ONLY)
        if (port->type == PORT_SCIF) {
+#if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780)
+               txroom = SCIF_TXROOM_MAX - (sci_in(port, SCTFDR) & 0x7f);
+#else
                txroom = SCIF_TXROOM_MAX - (sci_in(port, SCFDR)>>8);
+#endif
        } else {
                txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0;
        }
@@ -491,7 +503,11 @@ static inline void sci_receive_chars(struct uart_port *port,
        while (1) {
 #if !defined(SCI_ONLY)
                if (port->type == PORT_SCIF) {
+#if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780)
+                       count = sci_in(port, SCRFDR) & 0x7f;
+#else
                        count = sci_in(port, SCFDR)&SCIF_RFDC_MASK ;
+#endif
                } else {
                        count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0;
                }
@@ -652,7 +668,7 @@ static inline int sci_handle_breaks(struct uart_port *port)
        struct tty_struct *tty = port->info->tty;
        struct sci_port *s = &sci_ports[port->line];
 
-       if (!s->break_flag && status & SCxSR_BRK(port))
+       if (!s->break_flag && status & SCxSR_BRK(port)) {
 #if defined(CONFIG_CPU_SH3)
                /* Debounce break */
                s->break_flag = 1;
@@ -783,6 +799,7 @@ static int sci_notifier(struct notifier_block *self, unsigned long phase, void *
            (phase == CPUFREQ_RESUMECHANGE)){
                for (i = 0; i < SCI_NPORTS; i++) {
                        struct uart_port *port = &sci_ports[i].port;
+                       struct clk *clk;
 
                        /*
                         * Update the uartclk per-port if frequency has
@@ -795,7 +812,9 @@ static int sci_notifier(struct notifier_block *self, unsigned long phase, void *
                         *
                         * Clean this up later..
                         */
-                       port->uartclk = current_cpu_data.module_clock * 16;
+                       clk = clk_get("module_clk");
+                       port->uartclk = clk_get_rate(clk) * 16;
+                       clk_put(clk);
                }
 
                printk("%s: got a postchange notification for cpu %d (old %d, new %d)\n",
@@ -1008,15 +1027,20 @@ static void sci_set_termios(struct uart_port *port, struct termios *termios,
        sci_out(port, SCSMR, smr_val);
 
        switch (baud) {
-               case 0:         t = -1;         break;
-               case 2400:      t = BPS_2400;   break;
-               case 4800:      t = BPS_4800;   break;
-               case 9600:      t = BPS_9600;   break;
-               case 19200:     t = BPS_19200;  break;
-               case 38400:     t = BPS_38400;  break;
-               case 57600:     t = BPS_57600;  break;
-               case 115200:    t = BPS_115200; break;
-               default:        t = SCBRR_VALUE(baud); break;
+               case 0:
+                       t = -1;
+                       break;
+               default:
+               {
+#if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
+                       struct clk *clk = clk_get("module_clk");
+                       t = SCBRR_VALUE(baud, clk_get_rate(clk));
+                       clk_put(clk);
+#else
+                       t = SCBRR_VALUE(baud);
+#endif
+               }
+                       break;
        }
 
        if (t > 0) {
@@ -1030,7 +1054,9 @@ static void sci_set_termios(struct uart_port *port, struct termios *termios,
                udelay((1000000+(baud-1)) / baud); /* Wait one bit interval */
        }
 
-       s->init_pins(port, termios->c_cflag);
+       if (likely(s->init_pins))
+               s->init_pins(port, termios->c_cflag);
+
        sci_out(port, SCSCR, SCSCR_INIT(port));
 
        if ((termios->c_cflag & CREAD) != 0)
@@ -1107,7 +1133,7 @@ static struct uart_ops sci_uart_ops = {
        .verify_port    = sci_verify_port,
 };
 
-static struct sci_port sci_ports[SCI_NPORTS] = {
+static struct sci_port sci_ports[] = {
 #if defined(CONFIG_CPU_SUBTYPE_SH7708)
        {
                .port   = {
@@ -1121,7 +1147,6 @@ static struct sci_port sci_ports[SCI_NPORTS] = {
                },
                .type           = PORT_SCI,
                .irqs           = SCI_IRQS,
-               .init_pins      = sci_init_pins_sci,
        },
 #elif defined(CONFIG_CPU_SUBTYPE_SH7705)
        {
@@ -1165,7 +1190,6 @@ static struct sci_port sci_ports[SCI_NPORTS] = {
                },
                .type           = PORT_SCI,
                .irqs           = SCI_IRQS,
-               .init_pins      = sci_init_pins_sci,
        },
        {
                .port   = {
@@ -1225,7 +1249,7 @@ static struct sci_port sci_ports[SCI_NPORTS] = {
                .irqs           = SH73180_SCIF_IRQS,
                .init_pins      = sci_init_pins_scif,
        },
-#elif defined(CONFIG_SH_RTS7751R2D)
+#elif defined(CONFIG_CPU_SUBTYPE_SH4_202)
        {
                .port   = {
                        .membase        = (void *)0xffe80000,
@@ -1253,7 +1277,6 @@ static struct sci_port sci_ports[SCI_NPORTS] = {
                },
                .type           = PORT_SCI,
                .irqs           = SCI_IRQS,
-               .init_pins      = sci_init_pins_sci,
        },
        {
                .port   = {
@@ -1312,21 +1335,6 @@ static struct sci_port sci_ports[SCI_NPORTS] = {
                .irqs           = SH7760_SCIF2_IRQS,
                .init_pins      = sci_init_pins_scif,
        },
-#elif defined(CONFIG_CPU_SUBTYPE_SH4_202)
-       {
-               .port   = {
-                       .membase        = (void *)0xffe80000,
-                       .mapbase        = 0xffe80000,
-                       .iotype         = UPIO_MEM,
-                       .irq            = 43,
-                       .ops            = &sci_uart_ops,
-                       .flags          = UPF_BOOT_AUTOCONF,
-                       .line           = 0,
-               },
-               .type           = PORT_SCIF,
-               .irqs           = SH4_SCIF_IRQS,
-               .init_pins      = sci_init_pins_scif,
-       },
 #elif defined(CONFIG_CPU_SUBTYPE_ST40STB1)
        {
                .port   = {
@@ -1455,6 +1463,78 @@ static struct sci_port sci_ports[SCI_NPORTS] = {
                .irqs           = H8S_SCI_IRQS2,
                .init_pins      = sci_init_pins_sci,
        },
+#elif defined(CONFIG_CPU_SUBTYPE_SH7770)
+       {
+               .port   = {
+                       .membase        = (void *)0xff923000,
+                       .mapbase        = 0xff923000,
+                       .iotype         = SERIAL_IO_MEM,
+                       .irq            = 61,
+                       .ops            = &sci_uart_ops,
+                       .flags          = ASYNC_BOOT_AUTOCONF,
+                       .line           = 0,
+               },
+               .type           = PORT_SCIF,
+               .irqs           = SH7770_SCIF0_IRQS,
+               .init_pins      = sci_init_pins_scif,
+       },
+       {
+               .port   = {
+                       .membase        = (void *)0xff924000,
+                       .mapbase        = 0xff924000,
+                       .iotype         = SERIAL_IO_MEM,
+                       .irq            = 62,
+                       .ops            = &sci_uart_ops,
+                       .flags          = ASYNC_BOOT_AUTOCONF,
+                       .line           = 1,
+               },
+               .type           = PORT_SCIF,
+               .irqs           = SH7770_SCIF1_IRQS,
+               .init_pins      = sci_init_pins_scif,
+       },
+       {
+               .port   = {
+                       .membase        = (void *)0xff925000,
+                       .mapbase        = 0xff925000,
+                       .iotype         = SERIAL_IO_MEM,
+                       .irq            = 63,
+                       .ops            = &sci_uart_ops,
+                       .flags          = ASYNC_BOOT_AUTOCONF,
+                       .line           = 2,
+               },
+               .type           = PORT_SCIF,
+               .irqs           = SH7770_SCIF2_IRQS,
+               .init_pins      = sci_init_pins_scif,
+       },
+#elif defined(CONFIG_CPU_SUBTYPE_SH7780)
+       {
+               .port   = {
+                       .membase        = (void *)0xffe00000,
+                       .mapbase        = 0xffe00000,
+                       .iotype         = SERIAL_IO_MEM,
+                       .irq            = 43,
+                       .ops            = &sci_uart_ops,
+                       .flags          = ASYNC_BOOT_AUTOCONF,
+                       .line           = 0,
+               },
+               .type           = PORT_SCIF,
+               .irqs           = SH7780_SCIF0_IRQS,
+               .init_pins      = sci_init_pins_scif,
+       },
+       {
+               .port   = {
+                       .membase        = (void *)0xffe10000,
+                       .mapbase        = 0xffe10000,
+                       .iotype         = SERIAL_IO_MEM,
+                       .irq            = 79,
+                       .ops            = &sci_uart_ops,
+                       .flags          = ASYNC_BOOT_AUTOCONF,
+                       .line           = 1,
+               },
+               .type           = PORT_SCIF,
+               .irqs           = SH7780_SCIF1_IRQS,
+               .init_pins      = sci_init_pins_scif,
+       },
 #else
 #error "CPU subtype not defined"
 #endif
@@ -1480,9 +1560,6 @@ static int __init serial_console_setup(struct console *co, char *options)
        int flow = 'n';
        int ret;
 
-       if (co->index >= SCI_NPORTS)
-               co->index = 0;
-
        serial_console_port = &sci_ports[co->index];
        port = &serial_console_port->port;
        port->type = serial_console_port->type;
@@ -1496,13 +1573,20 @@ static int __init serial_console_setup(struct console *co, char *options)
         * We need to set the initial uartclk here, since otherwise it will
         * only ever be setup at sci_init() time.
         */
-#if !defined(__H8300H__) && !defined(__H8300S__)
-       port->uartclk = current_cpu_data.module_clock * 16;
-#else
+#if defined(__H8300H__) || defined(__H8300S__)
        port->uartclk = CONFIG_CPU_CLOCK;
-#endif
+
 #if defined(__H8300S__)
        h8300_sci_enable(port, sci_enable);
+#endif
+#elif defined(CONFIG_SUPERH64)
+       port->uartclk = current_cpu_info.module_clock * 16;
+#else
+       {
+               struct clk *clk = clk_get("module_clk");
+               port->uartclk = clk_get_rate(clk) * 16;
+               clk_put(clk);
+       }
 #endif
        if (options)
                uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -1566,7 +1650,7 @@ int __init kgdb_console_setup(struct console *co, char *options)
        int parity = 'n';
        int flow = 'n';
 
-       if (co->index >= SCI_NPORTS || co->index != kgdb_portnum)
+       if (co->index != kgdb_portnum)
                co->index = kgdb_portnum;
 
        if (options)
@@ -1606,7 +1690,7 @@ console_initcall(kgdb_console_init);
 #elif defined(CONFIG_SERIAL_SH_SCI_CONSOLE)
 #define SCI_CONSOLE    &serial_console
 #else
-#define SCI_CONSOLE    0
+#define SCI_CONSOLE    0
 #endif
 
 static char banner[] __initdata =
@@ -1621,7 +1705,6 @@ static struct uart_driver sci_uart_driver = {
        .dev_name       = "ttySC",
        .major          = SCI_MAJOR,
        .minor          = SCI_MINOR_START,
-       .nr             = SCI_NPORTS,
        .cons           = SCI_CONSOLE,
 };
 
@@ -1631,15 +1714,21 @@ static int __init sci_init(void)
 
        printk("%s", banner);
 
+       sci_uart_driver.nr = ARRAY_SIZE(sci_ports);
+
        ret = uart_register_driver(&sci_uart_driver);
        if (ret == 0) {
                for (chan = 0; chan < SCI_NPORTS; chan++) {
                        struct sci_port *sciport = &sci_ports[chan];
 
-#if !defined(__H8300H__) && !defined(__H8300S__)
-                       sciport->port.uartclk = (current_cpu_data.module_clock * 16);
-#else
+#if defined(__H8300H__) || defined(__H8300S__)
                        sciport->port.uartclk = CONFIG_CPU_CLOCK;
+#elif defined(CONFIG_SUPERH64)
+                       sciport->port.uartclk = current_cpu_info.module_clock * 16;
+#else
+                       struct clk *clk = clk_get("module_clk");
+                       sciport->port.uartclk = clk_get_rate(clk) * 16;
+                       clk_put(clk);
 #endif
                        uart_add_one_port(&sci_uart_driver, &sciport->port);
                        sciport->break_timer.data = (unsigned long)sciport;
index 2892169eff0544c52b6fee7847a9c7b192f37c49..1f14bb4382f6ef5bfc6094b1b766d432454e9791 100644 (file)
 #define H8S_SCI_IRQS1 {92, 93, 94,   0 }
 #define H8S_SCI_IRQS2 {96, 97, 98,   0 }
 #define SH5_SCIF_IRQS {39, 40, 42,   0 }
+#define        SH7770_SCIF0_IRQS {61, 61, 61, 61 }
+#define        SH7770_SCIF1_IRQS {62, 62, 62, 62 }
+#define        SH7770_SCIF2_IRQS {63, 63, 63, 63 }
+#define        SH7780_SCIF0_IRQS {40, 41, 43, 42 }
+#define        SH7780_SCIF1_IRQS {76, 77, 79, 78 }
 
 #if defined(CONFIG_CPU_SUBTYPE_SH7708)
-# define SCI_NPORTS 1
 # define SCSPTR 0xffffff7c /* 8 bit */
 # define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
 # define SCI_ONLY
 #elif defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709)
-# define SCI_NPORTS 3
 # define SCPCR  0xA4000116 /* 16 bit SCI and SCIF */
 # define SCPDR  0xA4000136 /* 8  bit SCI and SCIF */
 # define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
@@ -61,9 +64,8 @@
 #elif defined(CONFIG_CPU_SUBTYPE_SH7705)
 # define SCIF0         0xA4400000
 # define SCIF2         0xA4410000
-# define SCSMR_Ir      0xA44A0000
-# define IRDA_SCIF     SCIF0
-# define SCI_NPORTS 2
+# define SCSMR_Ir      0xA44A0000
+# define IRDA_SCIF     SCIF0
 # define SCPCR 0xA4000116
 # define SCPDR 0xA4000136
 
 # define SCSCR_INIT(port) (port->mapbase == SCIF2) ? 0xF3 : 0xF0
 # define SCIF_ONLY
 #elif defined(CONFIG_SH_RTS7751R2D)
-# define SCI_NPORTS 1
-# define SCSPTR1 0xffe0001c /* 8  bit SCI */
 # define SCSPTR2 0xFFE80020 /* 16 bit SCIF */
 # define SCIF_ORER 0x0001   /* overrun error bit */
 # define SCSCR_INIT(port) 0x3a /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
 # define SCIF_ONLY
 #elif defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751)
-# define SCI_NPORTS 2
 # define SCSPTR1 0xffe0001c /* 8  bit SCI */
 # define SCSPTR2 0xFFE80020 /* 16 bit SCIF */
 # define SCIF_ORER 0x0001   /* overrun error bit */
        0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ )
 # define SCI_AND_SCIF
 #elif defined(CONFIG_CPU_SUBTYPE_SH7760)
-# define SCI_NPORTS 3
-# define SCSPTR0 0xfe600000 /* 16 bit SCIF */
-# define SCSPTR1 0xfe610000 /* 16 bit SCIF */
-# define SCSPTR2 0xfe620000 /* 16 bit SCIF */
+# define SCSPTR0 0xfe600024 /* 16 bit SCIF */
+# define SCSPTR1 0xfe610024 /* 16 bit SCIF */
+# define SCSPTR2 0xfe620024 /* 16 bit SCIF */
 # define SCIF_ORER 0x0001  /* overrun error bit */
 # define SCSCR_INIT(port)          0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
 # define SCIF_ONLY
 #elif defined(CONFIG_CPU_SUBTYPE_SH7300)
-# define SCI_NPORTS 1
 # define SCPCR  0xA4050116        /* 16 bit SCIF */
 # define SCPDR  0xA4050136        /* 16 bit SCIF */
 # define SCSCR_INIT(port)  0x0030 /* TIE=0,RIE=0,TE=1,RE=1 */
 # define SCIF_ONLY
 #elif defined(CONFIG_CPU_SUBTYPE_SH73180)
-# define SCI_NPORTS 1
 # define SCPDR  0xA4050138        /* 16 bit SCIF */
 # define SCSPTR2 SCPDR
 # define SCIF_ORER 0x0001   /* overrun error bit */
 # define SCSCR_INIT(port)  0x0038 /* TIE=0,RIE=0,TE=1,RE=1 */
 # define SCIF_ONLY
 #elif defined(CONFIG_CPU_SUBTYPE_SH4_202)
-# define SCI_NPORTS 1
 # define SCSPTR2 0xffe80020 /* 16 bit SCIF */
 # define SCIF_ORER 0x0001   /* overrun error bit */
 # define SCSCR_INIT(port) 0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
 # define SCIF_ONLY
 #elif defined(CONFIG_CPU_SUBTYPE_ST40STB1)
-# define SCI_NPORTS 2
 # define SCSPTR1 0xffe00020 /* 16 bit SCIF */
 # define SCSPTR2 0xffe80020 /* 16 bit SCIF */
 # define SCIF_ORER 0x0001   /* overrun error bit */
 # define SCIF_ADDR_SH5     PHYS_PERIPHERAL_BLOCK+SCIF_BASE_ADDR
 # define SCIF_PTR2_OFFS    0x0000020
 # define SCIF_LSR2_OFFS    0x0000024
-# define SCI_NPORTS 1
-# define SCI_INIT { \
-  { {}, PORT_SCIF, 0, \
-     SH5_SCIF_IRQS, sci_init_pins_scif }  \
-}
 # define SCSPTR2           ((port->mapbase)+SCIF_PTR2_OFFS) /* 16 bit SCIF */
 # define SCLSR2            ((port->mapbase)+SCIF_LSR2_OFFS) /* 16 bit SCIF */
 # define SCSCR_INIT(port)  0x38                           /* TIE=0,RIE=0,
                                                             TE=1,RE=1,REIE=1 */
 # define SCIF_ONLY
 #elif defined(CONFIG_H83007) || defined(CONFIG_H83068)
-# define SCI_NPORTS 3
 # define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
 # define SCI_ONLY
 # define H8300_SCI_DR(ch) *(volatile char *)(P1DR + h8300_sci_pins[ch].port)
 #elif defined(CONFIG_H8S2678)
-# define SCI_NPORTS 3
 # define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
 # define SCI_ONLY
 # define H8300_SCI_DR(ch) *(volatile char *)(P1DR + h8300_sci_pins[ch].port)
+#elif defined(CONFIG_CPU_SUBTYPE_SH7770)
+# define SCSPTR0 0xff923020 /* 16 bit SCIF */
+# define SCSPTR1 0xff924020 /* 16 bit SCIF */
+# define SCSPTR2 0xff925020 /* 16 bit SCIF */
+# define SCIF_ORER 0x0001  /* overrun error bit */
+# define SCSCR_INIT(port)      0x3c /* TIE=0,RIE=0,TE=1,RE=1,REIE=1,cke=2 */
+# define SCIF_ONLY
+#elif defined(CONFIG_CPU_SUBTYPE_SH7780)
+# define SCSPTR0       0xffe00024      /* 16 bit SCIF */
+# define SCSPTR1       0xffe10024      /* 16 bit SCIF */
+# define SCIF_OPER     0x0001          /* Overrun error bit */
+# define SCSCR_INIT(port)      0x3a    /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
+# define SCIF_ONLY
 #else
 # error CPU subtype not defined
 #endif
 #define SCI_CTRL_FLAGS_RIE  0x40 /* all */
 #define SCI_CTRL_FLAGS_TE   0x20 /* all */
 #define SCI_CTRL_FLAGS_RE   0x10 /* all */
-#if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751)
+#if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH7780)
 #define SCI_CTRL_FLAGS_REIE 0x08 /* 7750 SCIF */
 #else
 #define SCI_CTRL_FLAGS_REIE 0
 # define SCxSR_RDxF_CLEAR(port)                0xbc
 # define SCxSR_ERROR_CLEAR(port)       0xc4
 # define SCxSR_TDxE_CLEAR(port)                0x78
-# define SCxSR_BREAK_CLEAR(port)       0xc4
+# define SCxSR_BREAK_CLEAR(port)       0xc4
 #elif defined(SCIF_ONLY)
 # define SCxSR_TEND(port)              SCIF_TEND
 # define SCxSR_ERRORS(port)            SCIF_ERRORS
 # define SCxSR_RDxF_CLEAR(port)                0x00fc
 # define SCxSR_ERROR_CLEAR(port)       0x0073
 # define SCxSR_TDxE_CLEAR(port)                0x00df
-# define SCxSR_BREAK_CLEAR(port)       0x00e3
+# define SCxSR_BREAK_CLEAR(port)       0x00e3
 #endif
 #else
 # define SCxSR_TEND(port)       (((port)->type == PORT_SCI) ? SCI_TEND   : SCIF_TEND)
@@ -285,14 +285,14 @@ struct sci_port {
 
 #define SCI_IN(size, offset)                                   \
   unsigned int addr = port->mapbase + (offset);                        \
-  if ((size) == 8) {                                           \
+  if ((size) == 8) {                                           \
     return ctrl_inb(addr);                                     \
-  } else {                                                     \
+  } else {                                                     \
     return ctrl_inw(addr);                                     \
   }
 #define SCI_OUT(size, offset, value)                           \
   unsigned int addr = port->mapbase + (offset);                        \
-  if ((size) == 8) {                                           \
+  if ((size) == 8) {                                           \
     ctrl_outb(value, addr);                                    \
   } else {                                                     \
     ctrl_outw(value, addr);                                    \
@@ -301,10 +301,10 @@ struct sci_port {
 #define CPU_SCIx_FNS(name, sci_offset, sci_size, scif_offset, scif_size)\
   static inline unsigned int sci_##name##_in(struct uart_port *port)   \
   {                                                                    \
-    if (port->type == PORT_SCI) {                                      \
+    if (port->type == PORT_SCI) {                                      \
       SCI_IN(sci_size, sci_offset)                                     \
     } else {                                                           \
-      SCI_IN(scif_size, scif_offset);                                  \
+      SCI_IN(scif_size, scif_offset);                                  \
     }                                                                  \
   }                                                                    \
   static inline void sci_##name##_out(struct uart_port *port, unsigned int value) \
@@ -319,7 +319,7 @@ struct sci_port {
 #define CPU_SCIF_FNS(name, scif_offset, scif_size)                             \
   static inline unsigned int sci_##name##_in(struct uart_port *port)   \
   {                                                                    \
-    SCI_IN(scif_size, scif_offset);                                    \
+    SCI_IN(scif_size, scif_offset);                                    \
   }                                                                    \
   static inline void sci_##name##_out(struct uart_port *port, unsigned int value) \
   {                                                                    \
@@ -329,7 +329,7 @@ struct sci_port {
 #define CPU_SCI_FNS(name, sci_offset, sci_size)                                \
   static inline unsigned int sci_##name##_in(struct uart_port* port)   \
   {                                                                    \
-    SCI_IN(sci_size, sci_offset);                                      \
+    SCI_IN(sci_size, sci_offset);                                      \
   }                                                                    \
   static inline void sci_##name##_out(struct uart_port* port, unsigned int value) \
   {                                                                    \
@@ -385,10 +385,17 @@ SCIx_FNS(SCxTDR, 0x06,  8, 0x0c,  8, 0x06,  8, 0x0C,  8, 0x03,  8)
 SCIx_FNS(SCxSR,  0x08,  8, 0x10,  8, 0x08, 16, 0x10, 16, 0x04,  8)
 SCIx_FNS(SCxRDR, 0x0a,  8, 0x14,  8, 0x0A,  8, 0x14,  8, 0x05,  8)
 SCIF_FNS(SCFCR,                      0x0c,  8, 0x18, 16)
+#if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780)
+SCIF_FNS(SCTFDR,                    0x0e, 16, 0x1C, 16)
+SCIF_FNS(SCRFDR,                    0x0e, 16, 0x20, 16)
+SCIF_FNS(SCSPTR,                       0,  0, 0x24, 16)
+SCIF_FNS(SCLSR,                                0,  0, 0x28, 16)
+#else
 SCIF_FNS(SCFDR,                      0x0e, 16, 0x1C, 16)
 SCIF_FNS(SCSPTR,                        0,  0, 0x20, 16)
 SCIF_FNS(SCLSR,                         0,  0, 0x24, 16)
 #endif
+#endif
 #define sci_in(port, reg) sci_##reg##_in(port)
 #define sci_out(port, reg, value) sci_##reg##_out(port, value)
 
@@ -518,6 +525,24 @@ static inline int sci_rxd_in(struct uart_port *port)
        int ch = (port->mapbase - SMR0) >> 3;
        return (H8300_SCI_DR(ch) & h8300_sci_pins[ch].rx) ? 1 : 0;
 }
+#elif defined(CONFIG_CPU_SUBTYPE_SH7770)
+static inline int sci_rxd_in(struct uart_port *port)
+{
+       if (port->mapbase == 0xff923000)
+               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
+       if (port->mapbase == 0xff924000)
+               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
+       if (port->mapbase == 0xff925000)
+               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
+}
+#elif defined(CONFIG_CPU_SUBTYPE_SH7780)
+static inline int sci_rxd_in(struct uart_port *port)
+{
+       if (port->mapbase == 0xffe00000)
+               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
+       if (port->mapbase == 0xffe10000)
+               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
+}
 #endif
 
 /*
@@ -552,22 +577,15 @@ static inline int sci_rxd_in(struct uart_port *port)
  * -- Mitch Davis - 15 Jul 2000
  */
 
-#define PCLK           (current_cpu_data.module_clock)
-
-#if defined(CONFIG_CPU_SUBTYPE_SH7300)
-#define SCBRR_VALUE(bps) ((PCLK+16*bps)/(16*bps)-1)
+#if defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7780)
+#define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(16*bps)-1)
 #elif defined(CONFIG_CPU_SUBTYPE_SH7705)
-#define SCBRR_VALUE(bps) (((PCLK*2)+16*bps)/(32*bps)-1)
-#elif !defined(__H8300H__) && !defined(__H8300S__)
-#define SCBRR_VALUE(bps) ((PCLK+16*bps)/(32*bps)-1)
-#else
+#define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(32*bps)-1)
+#elif defined(__H8300H__) || defined(__H8300S__)
 #define SCBRR_VALUE(bps) (((CONFIG_CPU_CLOCK*1000/32)/bps)-1)
+#elif defined(CONFIG_SUPERH64)
+#define SCBRR_VALUE(bps) ((current_cpu_data.module_clock+16*bps)/(32*bps)-1)
+#else /* Generic SH */
+#define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(32*bps)-1)
 #endif
-#define BPS_2400       SCBRR_VALUE(2400)
-#define BPS_4800       SCBRR_VALUE(4800)
-#define BPS_9600       SCBRR_VALUE(9600)
-#define BPS_19200      SCBRR_VALUE(19200)
-#define BPS_38400      SCBRR_VALUE(38400)
-#define BPS_57600      SCBRR_VALUE(57600)
-#define BPS_115200     SCBRR_VALUE(115200)
 
index aaa009f4a7bf0567afa499966286a996f96fb981..c70ae81b5d984d14350d047a6265bb1d079f17ec 100644 (file)
@@ -843,9 +843,9 @@ MODULE_AUTHOR("Stanislaw Skowronek <skylark@linux-mips.org>");
 MODULE_DESCRIPTION("PCI driver for SGI IOC3");
 MODULE_LICENSE("GPL");
 
-EXPORT_SYMBOL(ioc3_register_submodule);
-EXPORT_SYMBOL(ioc3_unregister_submodule);
-EXPORT_SYMBOL(ioc3_ack);
-EXPORT_SYMBOL(ioc3_gpcr_set);
-EXPORT_SYMBOL(ioc3_disable);
-EXPORT_SYMBOL(ioc3_enable);
+EXPORT_SYMBOL_GPL(ioc3_register_submodule);
+EXPORT_SYMBOL_GPL(ioc3_unregister_submodule);
+EXPORT_SYMBOL_GPL(ioc3_ack);
+EXPORT_SYMBOL_GPL(ioc3_gpcr_set);
+EXPORT_SYMBOL_GPL(ioc3_disable);
+EXPORT_SYMBOL_GPL(ioc3_enable);
index 996d543d6609af9d00fa70bb31a03f7f6885314b..9d996f2c10d5775099629340901c03bbac95774d 100644 (file)
@@ -50,3 +50,11 @@ config BACKLIGHT_CORGI
          If you have a Sharp Zaurus SL-C7xx, say y to enable the
          backlight driver.
 
+config BACKLIGHT_HP680
+       tristate "HP Jornada 680 Backlight Driver"
+       depends on BACKLIGHT_DEVICE && SH_HP6XX
+       default y
+       help
+         If you have a HP Jornada 680, say y to enable the
+         backlight driver.
+
index 4af321fae3901a42c0e9b1473fb138d5ebfb696f..744210c38e743600ca283a8a73ee1959e8678047 100644 (file)
@@ -3,4 +3,5 @@
 obj-$(CONFIG_LCD_CLASS_DEVICE)     += lcd.o
 obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
 obj-$(CONFIG_BACKLIGHT_CORGI)  += corgi_bl.o
+obj-$(CONFIG_BACKLIGHT_HP680)  += hp680_bl.o
 obj-$(CONFIG_SHARP_LOCOMO)     += locomolcd.o
diff --git a/drivers/video/backlight/hp680_bl.c b/drivers/video/backlight/hp680_bl.c
new file mode 100644 (file)
index 0000000..95da4c9
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ *  Backlight Driver for HP Jornada 680
+ *
+ *  Copyright (c) 2005 Andriy Skulysh
+ *
+ *  Based on Sharp's Corgi Backlight Driver
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/spinlock.h>
+#include <linux/fb.h>
+#include <linux/backlight.h>
+
+#include <asm/cpu/dac.h>
+#include <asm/hp6xx/hp6xx.h>
+#include <asm/hd64461/hd64461.h>
+
+#define HP680_MAX_INTENSITY 255
+#define HP680_DEFAULT_INTENSITY 10
+
+static int hp680bl_powermode = FB_BLANK_UNBLANK;
+static int current_intensity = 0;
+static spinlock_t bl_lock = SPIN_LOCK_UNLOCKED;
+
+static void hp680bl_send_intensity(int intensity)
+{
+       unsigned long flags;
+
+       if (hp680bl_powermode != FB_BLANK_UNBLANK)
+               intensity = 0;
+
+       spin_lock_irqsave(&bl_lock, flags);
+       sh_dac_output(255-(u8)intensity, DAC_LCD_BRIGHTNESS);
+       spin_unlock_irqrestore(&bl_lock, flags);
+}
+
+static void hp680bl_blank(int blank)
+{
+       u16 v;
+
+       switch(blank) {
+
+       case FB_BLANK_NORMAL:
+       case FB_BLANK_VSYNC_SUSPEND:
+       case FB_BLANK_HSYNC_SUSPEND:
+       case FB_BLANK_POWERDOWN:
+               if (hp680bl_powermode == FB_BLANK_UNBLANK) {
+                       hp680bl_send_intensity(0);
+                       hp680bl_powermode = blank;
+                       sh_dac_disable(DAC_LCD_BRIGHTNESS);
+                       v = inw(HD64461_GPBDR);
+                       v |= HD64461_GPBDR_LCDOFF;
+                       outw(v, HD64461_GPBDR);
+               }
+               break;
+       case FB_BLANK_UNBLANK:
+               if (hp680bl_powermode != FB_BLANK_UNBLANK) {
+                       sh_dac_enable(DAC_LCD_BRIGHTNESS);
+                       v = inw(HD64461_GPBDR);
+                       v &= ~HD64461_GPBDR_LCDOFF;
+                       outw(v, HD64461_GPBDR);
+                       hp680bl_powermode = blank;
+                       hp680bl_send_intensity(current_intensity);
+               }
+               break;
+       }
+}
+
+#ifdef CONFIG_PM
+static int hp680bl_suspend(struct device *dev, pm_message_t state, u32 level)
+{
+       if (level == SUSPEND_POWER_DOWN)
+               hp680bl_blank(FB_BLANK_POWERDOWN);
+       return 0;
+}
+
+static int hp680bl_resume(struct device *dev, u32 level)
+{
+       if (level == RESUME_POWER_ON)
+               hp680bl_blank(FB_BLANK_UNBLANK);
+       return 0;
+}
+#else
+#define hp680bl_suspend        NULL
+#define hp680bl_resume NULL
+#endif
+
+
+static int hp680bl_set_power(struct backlight_device *bd, int state)
+{
+       hp680bl_blank(state);
+       return 0;
+}
+
+static int hp680bl_get_power(struct backlight_device *bd)
+{
+       return hp680bl_powermode;
+}
+
+static int hp680bl_set_intensity(struct backlight_device *bd, int intensity)
+{
+       if (intensity > HP680_MAX_INTENSITY)
+               intensity = HP680_MAX_INTENSITY;
+       hp680bl_send_intensity(intensity);
+       current_intensity = intensity;
+       return 0;
+}
+
+static int hp680bl_get_intensity(struct backlight_device *bd)
+{
+       return current_intensity;
+}
+
+static struct backlight_properties hp680bl_data = {
+       .owner          = THIS_MODULE,
+       .get_power      = hp680bl_get_power,
+       .set_power      = hp680bl_set_power,
+       .max_brightness = HP680_MAX_INTENSITY,
+       .get_brightness = hp680bl_get_intensity,
+       .set_brightness = hp680bl_set_intensity,
+};
+
+static struct backlight_device *hp680_backlight_device;
+
+static int __init hp680bl_probe(struct device *dev)
+{
+       hp680_backlight_device = backlight_device_register ("hp680-bl",
+               NULL, &hp680bl_data);
+       if (IS_ERR (hp680_backlight_device))
+               return PTR_ERR (hp680_backlight_device);
+
+       hp680bl_set_intensity(NULL, HP680_DEFAULT_INTENSITY);
+
+       return 0;
+}
+
+static int hp680bl_remove(struct device *dev)
+{
+       backlight_device_unregister(hp680_backlight_device);
+
+       return 0;
+}
+
+static struct device_driver hp680bl_driver = {
+       .name           = "hp680-bl",
+       .bus            = &platform_bus_type,
+       .probe          = hp680bl_probe,
+       .remove         = hp680bl_remove,
+       .suspend        = hp680bl_suspend,
+       .resume         = hp680bl_resume,
+};
+
+static struct platform_device hp680bl_device = {
+       .name   = "hp680-bl",
+       .id     = -1,
+};
+
+static int __init hp680bl_init(void)
+{
+       int ret;
+
+       ret=driver_register(&hp680bl_driver);
+       if (!ret) {
+               ret = platform_device_register(&hp680bl_device);
+               if (ret)
+                       driver_unregister(&hp680bl_driver);
+       }
+       return ret;
+}
+
+static void __exit hp680bl_exit(void)
+{
+       platform_device_unregister(&hp680bl_device);
+       driver_unregister(&hp680bl_driver);
+}
+
+module_init(hp680bl_init);
+module_exit(hp680bl_exit);
+
+MODULE_AUTHOR("Andriy Skulysh <askulysh@image.kiev.ua>");
+MODULE_DESCRIPTION("HP Jornada 680 Backlight Driver");
+MODULE_LICENSE("GPL");
index bd410e06db73f1f267071450eba64d23a605a053..e3c8b5f1ca764261f9a89c44ebcc7040399da3c7 100644 (file)
@@ -191,11 +191,11 @@ int i810_probe_i2c_connector(struct fb_info *info, u8 **out_edid, int conn)
         u8 *edid = NULL;
         int i;
 
-       DPRINTK("i810-i2c: Probe DDC%i Bus\n", conn);
-       if (conn < 4) {
+       DPRINTK("i810-i2c: Probe DDC%i Bus\n", conn+1);
+       if (conn < par->ddc_num) {
                for (i = 0; i < 3; i++) {
                        /* Do the real work */
-                       edid = i810_do_probe_i2c_edid(&par->chan[conn-1]);
+                       edid = i810_do_probe_i2c_edid(&par->chan[conn]);
                        if (edid)
                                break;
                }
index 6c187d5fe95170e337ccc09f86457d993d98e207..579195c2bea3030bbd2922158cd3289c683d67cf 100644 (file)
@@ -280,6 +280,7 @@ struct i810fb_par {
        u32 blit_bpp;
        u32 ovract;
        u32 cur_state;
+       u32 ddc_num;
        int mtrr_reg;
        u16 bltcntl;
        u8 interlace;
index 266d0ab926635fe760f646b00dbe8fe974d8124b..d8467c03b49f69d608a7aa506735cfdc5cf53f76 100644 (file)
@@ -149,6 +149,7 @@ static int vyres      __devinitdata;
 static int sync       __devinitdata;
 static int extvga     __devinitdata;
 static int dcolor     __devinitdata;
+static int ddc3       __devinitdata = 2;
 
 /*------------------------------------------------------------*/
 
@@ -1763,6 +1764,8 @@ static void __devinit i810_init_defaults(struct i810fb_par *par,
        if (sync) 
                par->dev_flags |= ALWAYS_SYNC;
 
+       par->ddc_num = ddc3;
+
        if (bpp < 8)
                bpp = 8;
        
@@ -1885,7 +1888,7 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info)
        int found = 0;
 #ifdef CONFIG_FB_I810_I2C
        int i;
-       int err;
+       int err = 1;
        struct i810fb_par *par = info->par;
 #endif
 
@@ -1895,8 +1898,8 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info)
 #ifdef CONFIG_FB_I810_I2C
        i810_create_i2c_busses(par);
 
-       for (i = 0; i < 4; i++) {
-               err = i810_probe_i2c_connector(info, &par->edid, i+1);
+       for (i = 0; i < par->ddc_num + 1; i++) {
+               err = i810_probe_i2c_connector(info, &par->edid, i);
                if (!err)
                        break;
        }
@@ -1983,6 +1986,8 @@ static int __devinit i810fb_setup(char *options)
                        vsync2 = simple_strtoul(this_opt+7, NULL, 0);
                else if (!strncmp(this_opt, "dcolor", 6))
                        dcolor = 1;
+               else if (!strncmp(this_opt, "ddc3", 4))
+                       ddc3 = 3;
                else
                        mode_option = this_opt;
        }
@@ -2190,6 +2195,8 @@ MODULE_PARM_DESC(sync, "wait for accel engine to finish drawing"
 module_param(dcolor, bool, 0);
 MODULE_PARM_DESC(dcolor, "use DirectColor visuals"
                 " (default = 0 = TrueColor)");
+module_param(ddc3, bool, 0);
+MODULE_PARM_DESC(ddc3, "Probe DDC bus 3 (default = 0 = no)");
 module_param(mode_option, charp, 0);
 MODULE_PARM_DESC(mode_option, "Specify initial video mode");
 
index ef78e3a42d322c5435fc200f93f5c93a18ddc75f..93b5dc4082ff24e3e015244c31ff3e7a35d757d1 100644 (file)
@@ -1327,7 +1327,7 @@ config UFS_FS
 
 config UFS_FS_WRITE
        bool "UFS file system write support (DANGEROUS)"
-       depends on UFS_FS && EXPERIMENTAL
+       depends on UFS_FS && EXPERIMENTAL && BROKEN
        help
          Say Y here if you want to try writing to UFS partitions. This is
          experimental, so you should back up your UFS partitions beforehand.
index 3dc712f29d2d60fe4bdac9d1e84a20332384fef3..5e4a90ee103f5eacedc1f8acaafacb847f56b5ec 100644 (file)
@@ -1022,6 +1022,7 @@ try_again:
 
                bh->b_state = 0;
                atomic_set(&bh->b_count, 0);
+               bh->b_private = NULL;
                bh->b_size = size;
 
                /* Link the buffer to its page */
@@ -3049,6 +3050,66 @@ asmlinkage long sys_bdflush(int func, long data)
        return 0;
 }
 
+/*
+ * Migration function for pages with buffers. This function can only be used
+ * if the underlying filesystem guarantees that no other references to "page"
+ * exist.
+ */
+#ifdef CONFIG_MIGRATION
+int buffer_migrate_page(struct page *newpage, struct page *page)
+{
+       struct address_space *mapping = page->mapping;
+       struct buffer_head *bh, *head;
+
+       if (!mapping)
+               return -EAGAIN;
+
+       if (!page_has_buffers(page))
+               return migrate_page(newpage, page);
+
+       head = page_buffers(page);
+
+       if (migrate_page_remove_references(newpage, page, 3))
+               return -EAGAIN;
+
+       bh = head;
+       do {
+               get_bh(bh);
+               lock_buffer(bh);
+               bh = bh->b_this_page;
+
+       } while (bh != head);
+
+       ClearPagePrivate(page);
+       set_page_private(newpage, page_private(page));
+       set_page_private(page, 0);
+       put_page(page);
+       get_page(newpage);
+
+       bh = head;
+       do {
+               set_bh_page(bh, newpage, bh_offset(bh));
+               bh = bh->b_this_page;
+
+       } while (bh != head);
+
+       SetPagePrivate(newpage);
+
+       migrate_page_copy(newpage, page);
+
+       bh = head;
+       do {
+               unlock_buffer(bh);
+               put_bh(bh);
+               bh = bh->b_this_page;
+
+       } while (bh != head);
+
+       return 0;
+}
+EXPORT_SYMBOL(buffer_migrate_page);
+#endif
+
 /*
  * Buffer-head allocation
  */
index 88f60aa520584a87acab13422d22940063f2b536..e488603fb1e77f29c601e7892d6f683d9e43b804 100644 (file)
@@ -1785,7 +1785,16 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
                } else if(volume_info.wsize)
                        cifs_sb->wsize = volume_info.wsize;
                else
-                       cifs_sb->wsize = CIFSMaxBufSize; /* default */
+                       cifs_sb->wsize = 
+                               min_t(const int, PAGEVEC_SIZE * PAGE_CACHE_SIZE,
+                                       127*1024);
+                       /* old default of CIFSMaxBufSize was too small now
+                          that SMB Write2 can send multiple pages in kvec.   
+                          RFC1001 does not describe what happens when frame
+                          bigger than 128K is sent so use that as max in
+                          conjunction with 52K kvec constraint on arch with 4K
+                          page size  */
+
                if(cifs_sb->rsize < PAGE_CACHE_SIZE) {
                        cifs_sb->rsize = PAGE_CACHE_SIZE; 
                        /* Windows ME does this */
index 77c990f0cb981706c55dcd936958c654d8f543e5..d17c97d07c80e44895503e6d336b8328c0ffd348 100644 (file)
@@ -1190,7 +1190,6 @@ retry:
                                        /* BB what if continued retry is
                                           requested via mount flags? */
                                        set_bit(AS_EIO, &mapping->flags);
-                                       SetPageError(page);
                                } else {
                                        cifs_stats_bytes_written(cifs_sb->tcon,
                                                                 bytes_written);
@@ -1198,6 +1197,13 @@ retry:
                        }
                        for (i = 0; i < n_iov; i++) {
                                page = pvec.pages[first + i];
+                               /* Should we also set page error on
+                               success rc but too little data written? */
+                               /* BB investigate retry logic on temporary
+                               server crash cases and how recovery works
+                               when page marked as error */ 
+                               if(rc)
+                                       SetPageError(page);
                                kunmap(page);
                                unlock_page(page);
                                page_cache_release(page);
index 7b98792150ea7ebba3d449e994906483dcadf4a3..b12cb8a7da7c87ec2fe01561dd1e5891f674c1ec 100644 (file)
@@ -498,7 +498,6 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
                        else
                                *pRespBufType = CIFS_SMALL_BUFFER;
                        iov[0].iov_len = receive_len + 4;
-                       iov[1].iov_len = 0;
 
                        dump_smb(midQ->resp_buf, 80);
                        /* convert the length into a more usable form */
index ff0bafcff7204ac1dc24204ef0c3a47f919eed6c..70c5af4cc2704d3097848783825835456a52f8ee 100644 (file)
@@ -73,17 +73,17 @@ asmlinkage long compat_sys_utime(char __user *filename, struct compat_utimbuf __
        return do_utimes(AT_FDCWD, filename, t ? tv : NULL);
 }
 
-asmlinkage long compat_sys_futimesat(int dfd, char __user *filename, struct compat_timeval __user *t)
+asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename, struct compat_timeval __user *t)
 {
        struct timeval tv[2];
 
-       if (t) { 
+       if (t) {
                if (get_user(tv[0].tv_sec, &t[0].tv_sec) ||
                    get_user(tv[0].tv_usec, &t[0].tv_usec) ||
                    get_user(tv[1].tv_sec, &t[1].tv_sec) ||
                    get_user(tv[1].tv_usec, &t[1].tv_usec))
-                       return -EFAULT; 
-       } 
+                       return -EFAULT;
+       }
        return do_utimes(dfd, filename, t ? tv : NULL);
 }
 
@@ -114,7 +114,7 @@ asmlinkage long compat_sys_newlstat(char __user * filename,
        return error;
 }
 
-asmlinkage long compat_sys_newfstatat(int dfd, char __user *filename,
+asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user *filename,
                struct compat_stat __user *statbuf, int flag)
 {
        struct kstat stat;
@@ -1326,7 +1326,7 @@ compat_sys_open(const char __user *filename, int flags, int mode)
  * O_LARGEFILE flag.
  */
 asmlinkage long
-compat_sys_openat(int dfd, const char __user *filename, int flags, int mode)
+compat_sys_openat(unsigned int dfd, const char __user *filename, int flags, int mode)
 {
        return do_sys_open(dfd, filename, flags, mode);
 }
@@ -1781,7 +1781,7 @@ asmlinkage long compat_sys_pselect7(int n, compat_ulong_t __user *inp,
 {
        compat_sigset_t ss32;
        sigset_t ksigmask, sigsaved;
-       long timeout = MAX_SCHEDULE_TIMEOUT;
+       s64 timeout = MAX_SCHEDULE_TIMEOUT;
        struct compat_timespec ts;
        int ret;
 
index e7d3f0522d0165fc1f7d6ceb5aad03b607e168b2..a717837f272e66a9b422a8383ec3ae92b6da50ec 100644 (file)
@@ -706,6 +706,7 @@ struct address_space_operations ext2_aops = {
        .bmap                   = ext2_bmap,
        .direct_IO              = ext2_direct_IO,
        .writepages             = ext2_writepages,
+       .migratepage            = buffer_migrate_page,
 };
 
 struct address_space_operations ext2_aops_xip = {
@@ -723,6 +724,7 @@ struct address_space_operations ext2_nobh_aops = {
        .bmap                   = ext2_bmap,
        .direct_IO              = ext2_direct_IO,
        .writepages             = ext2_writepages,
+       .migratepage            = buffer_migrate_page,
 };
 
 /*
index 8824e84f8a56a58b8f0aee6ac99cbc9307038565..3fc4238e9703dca7b67b3fe9f81a221376901e45 100644 (file)
@@ -1559,6 +1559,7 @@ static struct address_space_operations ext3_ordered_aops = {
        .invalidatepage = ext3_invalidatepage,
        .releasepage    = ext3_releasepage,
        .direct_IO      = ext3_direct_IO,
+       .migratepage    = buffer_migrate_page,
 };
 
 static struct address_space_operations ext3_writeback_aops = {
@@ -1572,6 +1573,7 @@ static struct address_space_operations ext3_writeback_aops = {
        .invalidatepage = ext3_invalidatepage,
        .releasepage    = ext3_releasepage,
        .direct_IO      = ext3_direct_IO,
+       .migratepage    = buffer_migrate_page,
 };
 
 static struct address_space_operations ext3_journalled_aops = {
index a7ef5e716f3c3dd9a36ae9fd72fc8cf987c2e610..296351615b0014a2f564dfa3d2fb1ce725e00f6f 100644 (file)
@@ -335,9 +335,14 @@ static void fuse_send_readpages(struct fuse_req *req, struct file *file,
        loff_t pos = page_offset(req->pages[0]);
        size_t count = req->num_pages << PAGE_CACHE_SHIFT;
        req->out.page_zeroing = 1;
-       req->end = fuse_readpages_end;
        fuse_read_fill(req, file, inode, pos, count, FUSE_READ);
-       request_send_background(fc, req);
+       if (fc->async_read) {
+               req->end = fuse_readpages_end;
+               request_send_background(fc, req);
+       } else {
+               request_send(fc, req);
+               fuse_readpages_end(fc, req);
+       }
 }
 
 struct fuse_readpages_data {
index 46cf933aa3bf2dc22129c74a866628d9313984c6..4a83adfec968ebae108b9ae71802e14db6ef6dbb 100644 (file)
@@ -272,6 +272,9 @@ struct fuse_conn {
            reply, before any other request, and never cleared */
        unsigned conn_error : 1;
 
+       /** Do readpages asynchronously?  Only set in INIT */
+       unsigned async_read : 1;
+
        /*
         * The following bitfields are only for optimization purposes
         * and hence races in setting them will not cause malfunction
index c755a0440a6640848fff524c522e940da50b294a..879e6fba94803eca6a1844d9d14d500116086ae7 100644 (file)
@@ -473,6 +473,16 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
        if (req->out.h.error || arg->major != FUSE_KERNEL_VERSION)
                fc->conn_error = 1;
        else {
+               unsigned long ra_pages;
+
+               if (arg->minor >= 6) {
+                       ra_pages = arg->max_readahead / PAGE_CACHE_SIZE;
+                       if (arg->flags & FUSE_ASYNC_READ)
+                               fc->async_read = 1;
+               } else
+                       ra_pages = fc->max_read / PAGE_CACHE_SIZE;
+
+               fc->bdi.ra_pages = min(fc->bdi.ra_pages, ra_pages);
                fc->minor = arg->minor;
                fc->max_write = arg->minor < 5 ? 4096 : arg->max_write;
        }
@@ -496,6 +506,8 @@ static void fuse_send_init(struct fuse_conn *fc)
 
        arg->major = FUSE_KERNEL_VERSION;
        arg->minor = FUSE_KERNEL_MINOR_VERSION;
+       arg->max_readahead = fc->bdi.ra_pages * PAGE_CACHE_SIZE;
+       arg->flags |= FUSE_ASYNC_READ;
        req->in.h.opcode = FUSE_INIT;
        req->in.numargs = 1;
        req->in.args[0].size = sizeof(*arg);
@@ -552,8 +564,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
        fc->user_id = d.user_id;
        fc->group_id = d.group_id;
        fc->max_read = d.max_read;
-       if (fc->max_read / PAGE_CACHE_SIZE < fc->bdi.ra_pages)
-               fc->bdi.ra_pages = fc->max_read / PAGE_CACHE_SIZE;
 
        /* Used by get_root_inode() */
        sb->s_fs_info = fc;
index f568102da1e8df3be5126e91a50914d55dc5c0bb..b351952899453be64165ba7315e5f59bd0c851ac 100644 (file)
@@ -72,8 +72,8 @@ huge_pages_needed(struct address_space *mapping, struct vm_area_struct *vma)
        unsigned long start = vma->vm_start;
        unsigned long end = vma->vm_end;
        unsigned long hugepages = (end - start) >> HPAGE_SHIFT;
-       pgoff_t next = vma->vm_pgoff;
-       pgoff_t endpg = next + ((end - start) >> PAGE_SHIFT);
+       pgoff_t next = vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT);
+       pgoff_t endpg = next + hugepages;
 
        pagevec_init(&pvec, 0);
        while (next < endpg) {
index 108138d4e909301ed1e6389bb3132127fdb9e4b4..d0be6159eb7fcd4ab65f82d6dc3f0cc353b51d94 100644 (file)
@@ -1179,7 +1179,7 @@ EXPORT_SYMBOL(bmap);
 /**
  *     touch_atime     -       update the access time
  *     @mnt: mount the inode is accessed on
- *     @inode: inode accessed
+ *     @dentry: dentry accessed
  *
  *     Update the accessed time on an inode and mark it for writeback.
  *     This function automatically handles read only file systems and media,
index 4acdac043b6bb0a1d42b66b7a601513b2049f06b..7ac9fb4acb2c7d265fc48dff00810861f65cc4ce 100644 (file)
@@ -1161,6 +1161,7 @@ static int __path_lookup_intent_open(int dfd, const char *name,
 
 /**
  * path_lookup_open - lookup a file path with open intent
+ * @dfd: the directory to use as base, or AT_FDCWD
  * @name: pointer to file name
  * @lookup_flags: lookup intent flags
  * @nd: pointer to nameidata
@@ -1175,6 +1176,7 @@ int path_lookup_open(int dfd, const char *name, unsigned int lookup_flags,
 
 /**
  * path_lookup_create - lookup a file path with open + create intent
+ * @dfd: the directory to use as base, or AT_FDCWD
  * @name: pointer to file name
  * @lookup_flags: lookup intent flags
  * @nd: pointer to nameidata
index 89ed04696865a9595d67a2922ec33c55786862c2..1d163b6169151ce870c911dc1c7eb0eb40c80a74 100644 (file)
@@ -64,6 +64,32 @@ struct nfsd_list {
 };
 static struct list_head nfsd_list = LIST_HEAD_INIT(nfsd_list);
 
+#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
+static struct svc_stat nfsd_acl_svcstats;
+static struct svc_version *    nfsd_acl_version[] = {
+       [2] = &nfsd_acl_version2,
+       [3] = &nfsd_acl_version3,
+};
+
+#define NFSD_ACL_MINVERS            2
+#define NFSD_ACL_NRVERS                (sizeof(nfsd_acl_version)/sizeof(nfsd_acl_version[0]))
+static struct svc_version *nfsd_acl_versions[NFSD_ACL_NRVERS];
+
+static struct svc_program      nfsd_acl_program = {
+       .pg_prog                = NFS_ACL_PROGRAM,
+       .pg_nvers               = NFSD_ACL_NRVERS,
+       .pg_vers                = nfsd_acl_versions,
+       .pg_name                = "nfsd",
+       .pg_class               = "nfsd",
+       .pg_stats               = &nfsd_acl_svcstats,
+       .pg_authenticate        = &svc_set_client,
+};
+
+static struct svc_stat nfsd_acl_svcstats = {
+       .program        = &nfsd_acl_program,
+};
+#endif /* defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) */
+
 static struct svc_version *    nfsd_version[] = {
        [2] = &nfsd_version2,
 #if defined(CONFIG_NFSD_V3)
@@ -79,6 +105,9 @@ static struct svc_version *  nfsd_version[] = {
 static struct svc_version *nfsd_versions[NFSD_NRVERS];
 
 struct svc_program             nfsd_program = {
+#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
+       .pg_next                = &nfsd_acl_program,
+#endif
        .pg_prog                = NFS_PROGRAM,          /* program number */
        .pg_nvers               = NFSD_NRVERS,          /* nr of entries in nfsd_version */
        .pg_vers                = nfsd_versions,        /* version table */
@@ -147,6 +176,26 @@ nfsd_svc(unsigned short port, int nrservs)
                                nfsd_program.pg_vers[i] = nfsd_version[i];
                }
 
+
+#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
+               found_one = 0;
+
+               for (i = NFSD_ACL_MINVERS; i < NFSD_ACL_NRVERS; i++) {
+                       if (NFSCTL_VERISSET(nfsd_versbits, i)) {
+                               nfsd_acl_program.pg_vers[i] =
+                                       nfsd_acl_version[i];
+                               found_one = 1;
+                       } else
+                               nfsd_acl_program.pg_vers[i] = NULL;
+               }
+
+               if (!found_one) {
+                       for (i = NFSD_ACL_MINVERS; i < NFSD_ACL_NRVERS; i++)
+                               nfsd_acl_program.pg_vers[i] =
+                                       nfsd_acl_version[i];
+               }
+#endif
+
                atomic_set(&nfsd_busy, 0);
                error = -ENOMEM;
                nfsd_serv = svc_create(&nfsd_program, NFSD_BUFSIZE);
@@ -411,30 +460,3 @@ nfsd_dispatch(struct svc_rqst *rqstp, u32 *statp)
        nfsd_cache_update(rqstp, proc->pc_cachetype, statp + 1);
        return 1;
 }
-
-#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
-static struct svc_stat nfsd_acl_svcstats;
-static struct svc_version *    nfsd_acl_version[] = {
-       [2] = &nfsd_acl_version2,
-       [3] = &nfsd_acl_version3,
-};
-
-#define NFSD_ACL_NRVERS                (sizeof(nfsd_acl_version)/sizeof(nfsd_acl_version[0]))
-static struct svc_program      nfsd_acl_program = {
-       .pg_prog                = NFS_ACL_PROGRAM,
-       .pg_nvers               = NFSD_ACL_NRVERS,
-       .pg_vers                = nfsd_acl_version,
-       .pg_name                = "nfsd",
-       .pg_class               = "nfsd",
-       .pg_stats               = &nfsd_acl_svcstats,
-       .pg_authenticate        = &svc_set_client,
-};
-
-static struct svc_stat nfsd_acl_svcstats = {
-       .program        = &nfsd_acl_program,
-};
-
-#define nfsd_acl_program_p     &nfsd_acl_program
-#else
-#define nfsd_acl_program_p     NULL
-#endif /* defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) */
index 9dd71e8070349c20f73102aad0d73de003cb7628..d71ac657928931e114ea0798342e501f27558a79 100644 (file)
@@ -150,18 +150,15 @@ static int reiserfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
                                if (d_reclen <= 32) {
                                        local_buf = small_buf;
                                } else {
-                                       local_buf =
-                                           reiserfs_kmalloc(d_reclen, GFP_NOFS,
-                                                            inode->i_sb);
+                                       local_buf = kmalloc(d_reclen,
+                                                           GFP_NOFS);
                                        if (!local_buf) {
                                                pathrelse(&path_to_entry);
                                                ret = -ENOMEM;
                                                goto out;
                                        }
                                        if (item_moved(&tmp_ih, &path_to_entry)) {
-                                               reiserfs_kfree(local_buf,
-                                                              d_reclen,
-                                                              inode->i_sb);
+                                               kfree(local_buf);
                                                goto research;
                                        }
                                }
@@ -174,15 +171,12 @@ static int reiserfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
                                    (dirent, local_buf, d_reclen, d_off, d_ino,
                                     DT_UNKNOWN) < 0) {
                                        if (local_buf != small_buf) {
-                                               reiserfs_kfree(local_buf,
-                                                              d_reclen,
-                                                              inode->i_sb);
+                                               kfree(local_buf);
                                        }
                                        goto end;
                                }
                                if (local_buf != small_buf) {
-                                       reiserfs_kfree(local_buf, d_reclen,
-                                                      inode->i_sb);
+                                       kfree(local_buf);
                                }
                                // next entry should be looked for with such offset
                                next_pos = deh_offset(deh) + 1;
index ad6fa964b0e7e892de207307223a71887d1bc6ac..f3473176c83a4dad8a137225923f375414e5b404 100644 (file)
@@ -192,6 +192,8 @@ static int reiserfs_allocate_blocks_for_region(struct reiserfs_transaction_handl
 
        allocated_blocks = kmalloc((blocks_to_allocate + will_prealloc) *
                                   sizeof(b_blocknr_t), GFP_NOFS);
+       if (!allocated_blocks)
+               return -ENOMEM;
 
        /* First we compose a key to point at the writing position, we want to do
           that outside of any locking region. */
@@ -1285,6 +1287,23 @@ static ssize_t reiserfs_file_write(struct file *file,    /* the file we are going t
        struct reiserfs_transaction_handle th;
        th.t_trans_id = 0;
 
+       /* If a filesystem is converted from 3.5 to 3.6, we'll have v3.5 items
+       * lying around (most of the disk, in fact). Despite the filesystem
+       * now being a v3.6 format, the old items still can't support large
+       * file sizes. Catch this case here, as the rest of the VFS layer is
+       * oblivious to the different limitations between old and new items.
+       * reiserfs_setattr catches this for truncates. This chunk is lifted
+       * from generic_write_checks. */
+       if (get_inode_item_key_version (inode) == KEY_FORMAT_3_5 &&
+           *ppos + count > MAX_NON_LFS) {
+               if (*ppos >= MAX_NON_LFS) {
+                       send_sig(SIGXFSZ, current, 0);
+                       return -EFBIG;
+               }
+               if (count > MAX_NON_LFS - (unsigned long)*ppos)
+                       count = MAX_NON_LFS - (unsigned long)*ppos;
+       }
+
        if (file->f_flags & O_DIRECT) { // Direct IO needs treatment
                ssize_t result, after_file_end = 0;
                if ((*ppos + count >= inode->i_size)
index 45829889dcdc0a13dd93bcd523b305c5756f71dc..aa22588019ecd56fd32b0e80ac7f5c58f9671899 100644 (file)
@@ -2021,38 +2021,6 @@ static int get_neighbors(struct tree_balance *p_s_tb, int n_h)
        return CARRY_ON;
 }
 
-#ifdef CONFIG_REISERFS_CHECK
-void *reiserfs_kmalloc(size_t size, gfp_t flags, struct super_block *s)
-{
-       void *vp;
-       static size_t malloced;
-
-       vp = kmalloc(size, flags);
-       if (vp) {
-               REISERFS_SB(s)->s_kmallocs += size;
-               if (REISERFS_SB(s)->s_kmallocs > malloced + 200000) {
-                       reiserfs_warning(s,
-                                        "vs-8301: reiserfs_kmalloc: allocated memory %d",
-                                        REISERFS_SB(s)->s_kmallocs);
-                       malloced = REISERFS_SB(s)->s_kmallocs;
-               }
-       }
-       return vp;
-}
-
-void reiserfs_kfree(const void *vp, size_t size, struct super_block *s)
-{
-       kfree(vp);
-
-       REISERFS_SB(s)->s_kmallocs -= size;
-       if (REISERFS_SB(s)->s_kmallocs < 0)
-               reiserfs_warning(s,
-                                "vs-8302: reiserfs_kfree: allocated memory %d",
-                                REISERFS_SB(s)->s_kmallocs);
-
-}
-#endif
-
 static int get_virtual_node_size(struct super_block *sb, struct buffer_head *bh)
 {
        int max_num_of_items;
@@ -2086,7 +2054,7 @@ static int get_mem_for_virtual_node(struct tree_balance *tb)
                /* we have to allocate more memory for virtual node */
                if (tb->vn_buf) {
                        /* free memory allocated before */
-                       reiserfs_kfree(tb->vn_buf, tb->vn_buf_size, tb->tb_sb);
+                       kfree(tb->vn_buf);
                        /* this is not needed if kfree is atomic */
                        check_fs = 1;
                }
@@ -2095,24 +2063,15 @@ static int get_mem_for_virtual_node(struct tree_balance *tb)
                tb->vn_buf_size = size;
 
                /* get memory for virtual item */
-               buf =
-                   reiserfs_kmalloc(size, GFP_ATOMIC | __GFP_NOWARN,
-                                    tb->tb_sb);
+               buf = kmalloc(size, GFP_ATOMIC | __GFP_NOWARN);
                if (!buf) {
                        /* getting memory with GFP_KERNEL priority may involve
                           balancing now (due to indirect_to_direct conversion on
                           dcache shrinking). So, release path and collected
                           resources here */
                        free_buffers_in_tb(tb);
-                       buf = reiserfs_kmalloc(size, GFP_NOFS, tb->tb_sb);
+                       buf = kmalloc(size, GFP_NOFS);
                        if (!buf) {
-#ifdef CONFIG_REISERFS_CHECK
-                               reiserfs_warning(tb->tb_sb,
-                                                "vs-8345: get_mem_for_virtual_node: "
-                                                "kmalloc failed. reiserfs kmalloced %d bytes",
-                                                REISERFS_SB(tb->tb_sb)->
-                                                s_kmallocs);
-#endif
                                tb->vn_buf_size = 0;
                        }
                        tb->vn_buf = buf;
@@ -2619,7 +2578,6 @@ void unfix_nodes(struct tree_balance *tb)
                }
        }
 
-       if (tb->vn_buf)
-               reiserfs_kfree(tb->vn_buf, tb->vn_buf_size, tb->tb_sb);
+       kfree(tb->vn_buf);
 
 }
index ffa34b861bdb8c4d3db90d223a329a0abdd1e0e5..b33d67bba2fdfd548f30fd47ea81191b042e3e08 100644 (file)
@@ -2363,6 +2363,13 @@ static int reiserfs_write_full_page(struct page *page,
        int bh_per_page = PAGE_CACHE_SIZE / s->s_blocksize;
        th.t_trans_id = 0;
 
+       /* no logging allowed when nonblocking or from PF_MEMALLOC */
+       if (checked && (current->flags & PF_MEMALLOC)) {
+               redirty_page_for_writepage(wbc, page);
+               unlock_page(page);
+               return 0;
+       }
+
        /* The page dirty bit is cleared before writepage is called, which
         * means we have to tell create_empty_buffers to make dirty buffers
         * The page really should be up to date at this point, so tossing
@@ -2743,6 +2750,7 @@ static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh)
        int ret = 1;
        struct reiserfs_journal *j = SB_JOURNAL(inode->i_sb);
 
+       lock_buffer(bh);
        spin_lock(&j->j_dirty_buffers_lock);
        if (!buffer_mapped(bh)) {
                goto free_jh;
@@ -2758,7 +2766,7 @@ static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh)
                if (buffer_journaled(bh) || buffer_journal_dirty(bh)) {
                        ret = 0;
                }
-       } else if (buffer_dirty(bh) || buffer_locked(bh)) {
+       } else  if (buffer_dirty(bh)) {
                struct reiserfs_journal_list *jl;
                struct reiserfs_jh *jh = bh->b_private;
 
@@ -2784,6 +2792,7 @@ static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh)
                reiserfs_free_jh(bh);
        }
        spin_unlock(&j->j_dirty_buffers_lock);
+       unlock_buffer(bh);
        return ret;
 }
 
index 4491fcf2a0e60b55ca66d61f222b4a807ca0b385..b7a179560ab40a2a137754780d7a46c8784addd3 100644 (file)
@@ -152,18 +152,16 @@ static struct reiserfs_bitmap_node *allocate_bitmap_node(struct super_block
        struct reiserfs_bitmap_node *bn;
        static int id;
 
-       bn = reiserfs_kmalloc(sizeof(struct reiserfs_bitmap_node), GFP_NOFS,
-                             p_s_sb);
+       bn = kmalloc(sizeof(struct reiserfs_bitmap_node), GFP_NOFS);
        if (!bn) {
                return NULL;
        }
-       bn->data = reiserfs_kmalloc(p_s_sb->s_blocksize, GFP_NOFS, p_s_sb);
+       bn->data = kzalloc(p_s_sb->s_blocksize, GFP_NOFS);
        if (!bn->data) {
-               reiserfs_kfree(bn, sizeof(struct reiserfs_bitmap_node), p_s_sb);
+               kfree(bn);
                return NULL;
        }
        bn->id = id++;
-       memset(bn->data, 0, p_s_sb->s_blocksize);
        INIT_LIST_HEAD(&bn->list);
        return bn;
 }
@@ -197,8 +195,8 @@ static inline void free_bitmap_node(struct super_block *p_s_sb,
        struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
        journal->j_used_bitmap_nodes--;
        if (journal->j_free_bitmap_nodes > REISERFS_MAX_BITMAP_NODES) {
-               reiserfs_kfree(bn->data, p_s_sb->s_blocksize, p_s_sb);
-               reiserfs_kfree(bn, sizeof(struct reiserfs_bitmap_node), p_s_sb);
+               kfree(bn->data);
+               kfree(bn);
        } else {
                list_add(&bn->list, &journal->j_bitmap_nodes);
                journal->j_free_bitmap_nodes++;
@@ -276,8 +274,8 @@ static int free_bitmap_nodes(struct super_block *p_s_sb)
        while (next != &journal->j_bitmap_nodes) {
                bn = list_entry(next, struct reiserfs_bitmap_node, list);
                list_del(next);
-               reiserfs_kfree(bn->data, p_s_sb->s_blocksize, p_s_sb);
-               reiserfs_kfree(bn, sizeof(struct reiserfs_bitmap_node), p_s_sb);
+               kfree(bn->data);
+               kfree(bn);
                next = journal->j_bitmap_nodes.next;
                journal->j_free_bitmap_nodes--;
        }
@@ -581,7 +579,7 @@ static inline void put_journal_list(struct super_block *s,
                               jl->j_trans_id, jl->j_refcount);
        }
        if (--jl->j_refcount == 0)
-               reiserfs_kfree(jl, sizeof(struct reiserfs_journal_list), s);
+               kfree(jl);
 }
 
 /*
@@ -848,6 +846,14 @@ static int write_ordered_buffers(spinlock_t * lock,
                        spin_lock(lock);
                        goto loop_next;
                }
+               /* in theory, dirty non-uptodate buffers should never get here,
+                * but the upper layer io error paths still have a few quirks.
+                * Handle them here as gracefully as we can
+                */
+               if (!buffer_uptodate(bh) && buffer_dirty(bh)) {
+                       clear_buffer_dirty(bh);
+                       ret = -EIO;
+               }
                if (buffer_dirty(bh)) {
                        list_del_init(&jh->list);
                        list_add(&jh->list, &tmp);
@@ -879,6 +885,19 @@ static int write_ordered_buffers(spinlock_t * lock,
                if (!buffer_uptodate(bh)) {
                        ret = -EIO;
                }
+               /* ugly interaction with invalidatepage here.
+                * reiserfs_invalidate_page will pin any buffer that has a valid
+                * journal head from an older transaction.  If someone else sets
+                * our buffer dirty after we write it in the first loop, and
+                * then someone truncates the page away, nobody will ever write
+                * the buffer. We're safe if we write the page one last time
+                * after freeing the journal header.
+                */
+               if (buffer_dirty(bh) && unlikely(bh->b_page->mapping == NULL)) {
+                       spin_unlock(lock);
+                       ll_rw_block(WRITE, 1, &bh);
+                       spin_lock(lock);
+               }
                put_bh(bh);
                cond_resched_lock(lock);
        }
@@ -977,6 +996,7 @@ static int flush_commit_list(struct super_block *s,
        struct reiserfs_journal *journal = SB_JOURNAL(s);
        int barrier = 0;
        int retval = 0;
+       int write_len;
 
        reiserfs_check_lock_depth(s, "flush_commit_list");
 
@@ -1018,24 +1038,35 @@ static int flush_commit_list(struct super_block *s,
        }
 
        if (!list_empty(&jl->j_bh_list)) {
+               int ret;
                unlock_kernel();
-               write_ordered_buffers(&journal->j_dirty_buffers_lock,
-                                     journal, jl, &jl->j_bh_list);
+               ret = write_ordered_buffers(&journal->j_dirty_buffers_lock,
+                                           journal, jl, &jl->j_bh_list);
+               if (ret < 0 && retval == 0)
+                       retval = ret;
                lock_kernel();
        }
        BUG_ON(!list_empty(&jl->j_bh_list));
        /*
         * for the description block and all the log blocks, submit any buffers
-        * that haven't already reached the disk
+        * that haven't already reached the disk.  Try to write at least 256
+        * log blocks. later on, we will only wait on blocks that correspond
+        * to this transaction, but while we're unplugging we might as well
+        * get a chunk of data on there.
         */
        atomic_inc(&journal->j_async_throttle);
-       for (i = 0; i < (jl->j_len + 1); i++) {
+       write_len = jl->j_len + 1;
+       if (write_len < 256)
+               write_len = 256;
+       for (i = 0 ; i < write_len ; i++) {
                bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) + (jl->j_start + i) %
                    SB_ONDISK_JOURNAL_SIZE(s);
                tbh = journal_find_get_block(s, bn);
-               if (buffer_dirty(tbh))  /* redundant, ll_rw_block() checks */
-                       ll_rw_block(SWRITE, 1, &tbh);
-               put_bh(tbh);
+               if (tbh) {
+                       if (buffer_dirty(tbh))
+                           ll_rw_block(WRITE, 1, &tbh) ;
+                       put_bh(tbh) ;
+               }
        }
        atomic_dec(&journal->j_async_throttle);
 
@@ -1818,8 +1849,7 @@ void remove_journal_hash(struct super_block *sb,
 static void free_journal_ram(struct super_block *p_s_sb)
 {
        struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-       reiserfs_kfree(journal->j_current_jl,
-                      sizeof(struct reiserfs_journal_list), p_s_sb);
+       kfree(journal->j_current_jl);
        journal->j_num_lists--;
 
        vfree(journal->j_cnode_free_orig);
@@ -2093,21 +2123,15 @@ static int journal_read_transaction(struct super_block *p_s_sb,
        }
        trans_id = get_desc_trans_id(desc);
        /* now we know we've got a good transaction, and it was inside the valid time ranges */
-       log_blocks =
-           reiserfs_kmalloc(get_desc_trans_len(desc) *
-                            sizeof(struct buffer_head *), GFP_NOFS, p_s_sb);
-       real_blocks =
-           reiserfs_kmalloc(get_desc_trans_len(desc) *
-                            sizeof(struct buffer_head *), GFP_NOFS, p_s_sb);
+       log_blocks = kmalloc(get_desc_trans_len(desc) *
+                            sizeof(struct buffer_head *), GFP_NOFS);
+       real_blocks = kmalloc(get_desc_trans_len(desc) *
+                             sizeof(struct buffer_head *), GFP_NOFS);
        if (!log_blocks || !real_blocks) {
                brelse(c_bh);
                brelse(d_bh);
-               reiserfs_kfree(log_blocks,
-                              get_desc_trans_len(desc) *
-                              sizeof(struct buffer_head *), p_s_sb);
-               reiserfs_kfree(real_blocks,
-                              get_desc_trans_len(desc) *
-                              sizeof(struct buffer_head *), p_s_sb);
+               kfree(log_blocks);
+               kfree(real_blocks);
                reiserfs_warning(p_s_sb,
                                 "journal-1169: kmalloc failed, unable to mount FS");
                return -1;
@@ -2145,12 +2169,8 @@ static int journal_read_transaction(struct super_block *p_s_sb,
                        brelse_array(real_blocks, i);
                        brelse(c_bh);
                        brelse(d_bh);
-                       reiserfs_kfree(log_blocks,
-                                      get_desc_trans_len(desc) *
-                                      sizeof(struct buffer_head *), p_s_sb);
-                       reiserfs_kfree(real_blocks,
-                                      get_desc_trans_len(desc) *
-                                      sizeof(struct buffer_head *), p_s_sb);
+                       kfree(log_blocks);
+                       kfree(real_blocks);
                        return -1;
                }
        }
@@ -2166,12 +2186,8 @@ static int journal_read_transaction(struct super_block *p_s_sb,
                        brelse_array(real_blocks, get_desc_trans_len(desc));
                        brelse(c_bh);
                        brelse(d_bh);
-                       reiserfs_kfree(log_blocks,
-                                      get_desc_trans_len(desc) *
-                                      sizeof(struct buffer_head *), p_s_sb);
-                       reiserfs_kfree(real_blocks,
-                                      get_desc_trans_len(desc) *
-                                      sizeof(struct buffer_head *), p_s_sb);
+                       kfree(log_blocks);
+                       kfree(real_blocks);
                        return -1;
                }
                memcpy(real_blocks[i]->b_data, log_blocks[i]->b_data,
@@ -2193,12 +2209,8 @@ static int journal_read_transaction(struct super_block *p_s_sb,
                                     get_desc_trans_len(desc) - i);
                        brelse(c_bh);
                        brelse(d_bh);
-                       reiserfs_kfree(log_blocks,
-                                      get_desc_trans_len(desc) *
-                                      sizeof(struct buffer_head *), p_s_sb);
-                       reiserfs_kfree(real_blocks,
-                                      get_desc_trans_len(desc) *
-                                      sizeof(struct buffer_head *), p_s_sb);
+                       kfree(log_blocks);
+                       kfree(real_blocks);
                        return -1;
                }
                brelse(real_blocks[i]);
@@ -2217,12 +2229,8 @@ static int journal_read_transaction(struct super_block *p_s_sb,
        journal->j_trans_id = trans_id + 1;
        brelse(c_bh);
        brelse(d_bh);
-       reiserfs_kfree(log_blocks,
-                      le32_to_cpu(desc->j_len) * sizeof(struct buffer_head *),
-                      p_s_sb);
-       reiserfs_kfree(real_blocks,
-                      le32_to_cpu(desc->j_len) * sizeof(struct buffer_head *),
-                      p_s_sb);
+       kfree(log_blocks);
+       kfree(real_blocks);
        return 0;
 }
 
@@ -2471,14 +2479,8 @@ static int journal_read(struct super_block *p_s_sb)
 static struct reiserfs_journal_list *alloc_journal_list(struct super_block *s)
 {
        struct reiserfs_journal_list *jl;
-      retry:
-       jl = reiserfs_kmalloc(sizeof(struct reiserfs_journal_list), GFP_NOFS,
-                             s);
-       if (!jl) {
-               yield();
-               goto retry;
-       }
-       memset(jl, 0, sizeof(*jl));
+       jl = kzalloc(sizeof(struct reiserfs_journal_list),
+                    GFP_NOFS | __GFP_NOFAIL);
        INIT_LIST_HEAD(&jl->j_list);
        INIT_LIST_HEAD(&jl->j_working_list);
        INIT_LIST_HEAD(&jl->j_tail_bh_list);
@@ -2821,6 +2823,9 @@ int journal_transaction_should_end(struct reiserfs_transaction_handle *th,
            journal->j_cnode_free < (journal->j_trans_max * 3)) {
                return 1;
        }
+       /* protected by the BKL here */
+       journal->j_len_alloc += new_alloc;
+       th->t_blocks_allocated += new_alloc ;
        return 0;
 }
 
@@ -3042,14 +3047,12 @@ struct reiserfs_transaction_handle *reiserfs_persistent_transaction(struct
                }
                return th;
        }
-       th = reiserfs_kmalloc(sizeof(struct reiserfs_transaction_handle),
-                             GFP_NOFS, s);
+       th = kmalloc(sizeof(struct reiserfs_transaction_handle), GFP_NOFS);
        if (!th)
                return NULL;
        ret = journal_begin(th, s, nblocks);
        if (ret) {
-               reiserfs_kfree(th, sizeof(struct reiserfs_transaction_handle),
-                              s);
+               kfree(th);
                return NULL;
        }
 
@@ -3067,8 +3070,7 @@ int reiserfs_end_persistent_transaction(struct reiserfs_transaction_handle *th)
                ret = -EIO;
        if (th->t_refcount == 0) {
                SB_JOURNAL(s)->j_persistent_trans--;
-               reiserfs_kfree(th, sizeof(struct reiserfs_transaction_handle),
-                              s);
+               kfree(th);
        }
        return ret;
 }
index 8f8d8d01107c880975c4d2d2de465be7a3041018..c8123308e060221d4a8f8d01f0f303cad68acbba 100644 (file)
@@ -456,7 +456,7 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,
        /* get memory for composing the entry */
        buflen = DEH_SIZE + ROUND_UP(namelen);
        if (buflen > sizeof(small_buf)) {
-               buffer = reiserfs_kmalloc(buflen, GFP_NOFS, dir->i_sb);
+               buffer = kmalloc(buflen, GFP_NOFS);
                if (buffer == 0)
                        return -ENOMEM;
        } else
@@ -490,7 +490,7 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,
        retval = reiserfs_find_entry(dir, name, namelen, &path, &de);
        if (retval != NAME_NOT_FOUND) {
                if (buffer != small_buf)
-                       reiserfs_kfree(buffer, buflen, dir->i_sb);
+                       kfree(buffer);
                pathrelse(&path);
 
                if (retval == IO_ERROR) {
@@ -515,7 +515,7 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,
                reiserfs_warning(dir->i_sb,
                                 "reiserfs_add_entry: Congratulations! we have got hash function screwed up");
                if (buffer != small_buf)
-                       reiserfs_kfree(buffer, buflen, dir->i_sb);
+                       kfree(buffer);
                pathrelse(&path);
                return -EBUSY;
        }
@@ -535,7 +535,7 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,
                                         &entry_key);
 
                        if (buffer != small_buf)
-                               reiserfs_kfree(buffer, buflen, dir->i_sb);
+                               kfree(buffer);
                        pathrelse(&path);
                        return -EBUSY;
                }
@@ -546,7 +546,7 @@ static int reiserfs_add_entry(struct reiserfs_transaction_handle *th,
            reiserfs_paste_into_item(th, &path, &entry_key, dir, buffer,
                                     paste_size);
        if (buffer != small_buf)
-               reiserfs_kfree(buffer, buflen, dir->i_sb);
+               kfree(buffer);
        if (retval) {
                reiserfs_check_path(&path);
                return retval;
@@ -1065,7 +1065,7 @@ static int reiserfs_symlink(struct inode *parent_dir,
                goto out_failed;
        }
 
-       name = reiserfs_kmalloc(item_len, GFP_NOFS, parent_dir->i_sb);
+       name = kmalloc(item_len, GFP_NOFS);
        if (!name) {
                drop_new_inode(inode);
                retval = -ENOMEM;
@@ -1079,14 +1079,14 @@ static int reiserfs_symlink(struct inode *parent_dir,
        retval = journal_begin(&th, parent_dir->i_sb, jbegin_count);
        if (retval) {
                drop_new_inode(inode);
-               reiserfs_kfree(name, item_len, parent_dir->i_sb);
+               kfree(name);
                goto out_failed;
        }
 
        retval =
            reiserfs_new_inode(&th, parent_dir, mode, name, strlen(symname),
                               dentry, inode);
-       reiserfs_kfree(name, item_len, parent_dir->i_sb);
+       kfree(name);
        if (retval) {           /* reiserfs_new_inode iputs for us */
                goto out_failed;
        }
index fc2f43c75df411ee4b3037b723023b4a13f5ceef..ef6caed9336b3c36f5c51a1616d866b735e247f7 100644 (file)
@@ -88,7 +88,6 @@ static int show_super(struct seq_file *m, struct super_block *sb)
        seq_printf(m, "state: \t%s\n"
                   "mount options: \t%s%s%s%s%s%s%s%s%s%s%s\n"
                   "gen. counter: \t%i\n"
-                  "s_kmallocs: \t%i\n"
                   "s_disk_reads: \t%i\n"
                   "s_disk_writes: \t%i\n"
                   "s_fix_nodes: \t%i\n"
@@ -128,7 +127,7 @@ static int show_super(struct seq_file *m, struct super_block *sb)
                   "SMALL_TAILS " : "NO_TAILS ",
                   replay_only(sb) ? "REPLAY_ONLY " : "",
                   convert_reiserfs(sb) ? "CONV " : "",
-                  atomic_read(&r->s_generation_counter), SF(s_kmallocs),
+                  atomic_read(&r->s_generation_counter),
                   SF(s_disk_reads), SF(s_disk_writes), SF(s_fix_nodes),
                   SF(s_do_balance), SF(s_unneeded_left_neighbor),
                   SF(s_good_search_by_key_reada), SF(s_bmaps),
index 397d9590c8f2c09ee65f173753f10d011bd9d66f..77891de0e02e7b0f470545b98fc1bb00e075e508 100644 (file)
@@ -472,12 +472,6 @@ static void reiserfs_put_super(struct super_block *s)
 
        print_statistics(s);
 
-       if (REISERFS_SB(s)->s_kmallocs != 0) {
-               reiserfs_warning(s,
-                                "vs-2004: reiserfs_put_super: allocated memory left %d",
-                                REISERFS_SB(s)->s_kmallocs);
-       }
-
        if (REISERFS_SB(s)->reserved_blocks != 0) {
                reiserfs_warning(s,
                                 "green-2005: reiserfs_put_super: reserved blocks left %d",
index cc061bfd437b00b4c3aed01b3e0983fb83dba152..ffb79c48c5bf974fb6953fe6b761e64f16bbe8fa 100644 (file)
@@ -368,15 +368,13 @@ static int __xattr_readdir(struct file *filp, void *dirent, filldir_t filldir)
                if (d_reclen <= 32) {
                        local_buf = small_buf;
                } else {
-                       local_buf =
-                           reiserfs_kmalloc(d_reclen, GFP_NOFS, inode->i_sb);
+                       local_buf = kmalloc(d_reclen, GFP_NOFS);
                        if (!local_buf) {
                                pathrelse(&path_to_entry);
                                return -ENOMEM;
                        }
                        if (item_moved(&tmp_ih, &path_to_entry)) {
-                               reiserfs_kfree(local_buf, d_reclen,
-                                              inode->i_sb);
+                               kfree(local_buf);
 
                                /* sigh, must retry.  Do this same offset again */
                                next_pos = d_off;
@@ -399,13 +397,12 @@ static int __xattr_readdir(struct file *filp, void *dirent, filldir_t filldir)
                if (filldir(dirent, local_buf, d_reclen, d_off, d_ino,
                            DT_UNKNOWN) < 0) {
                        if (local_buf != small_buf) {
-                               reiserfs_kfree(local_buf, d_reclen,
-                                              inode->i_sb);
+                               kfree(local_buf);
                        }
                        goto end;
                }
                if (local_buf != small_buf) {
-                       reiserfs_kfree(local_buf, d_reclen, inode->i_sb);
+                       kfree(local_buf);
                }
        }                       /* while */
 
@@ -1322,109 +1319,44 @@ int reiserfs_xattr_init(struct super_block *s, int mount_flags)
        return err;
 }
 
-static int
-__reiserfs_permission(struct inode *inode, int mask, struct nameidata *nd,
-                     int need_lock)
+static int reiserfs_check_acl(struct inode *inode, int mask)
 {
-       umode_t mode = inode->i_mode;
-
-       if (mask & MAY_WRITE) {
-               /*
-                * Nobody gets write access to a read-only fs.
-                */
-               if (IS_RDONLY(inode) &&
-                   (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)))
-                       return -EROFS;
+       struct posix_acl *acl;
+       int error = -EAGAIN; /* do regular unix permission checks by default */
 
-               /*
-                * Nobody gets write access to an immutable file.
-                */
-               if (IS_IMMUTABLE(inode))
-                       return -EACCES;
-       }
+       reiserfs_read_lock_xattr_i(inode);
+       reiserfs_read_lock_xattrs(inode->i_sb);
 
-       /* We don't do permission checks on the internal objects.
-        * Permissions are determined by the "owning" object. */
-       if (is_reiserfs_priv_object(inode))
-               return 0;
+       acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS);
 
-       if (current->fsuid == inode->i_uid) {
-               mode >>= 6;
-#ifdef CONFIG_REISERFS_FS_POSIX_ACL
-       } else if (reiserfs_posixacl(inode->i_sb) &&
-                  get_inode_sd_version(inode) != STAT_DATA_V1) {
-               struct posix_acl *acl;
-
-               /* ACL can't contain additional permissions if
-                  the ACL_MASK entry is 0 */
-               if (!(mode & S_IRWXG))
-                       goto check_groups;
-
-               if (need_lock) {
-                       reiserfs_read_lock_xattr_i(inode);
-                       reiserfs_read_lock_xattrs(inode->i_sb);
-               }
-               acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS);
-               if (need_lock) {
-                       reiserfs_read_unlock_xattrs(inode->i_sb);
-                       reiserfs_read_unlock_xattr_i(inode);
-               }
-               if (IS_ERR(acl)) {
-                       if (PTR_ERR(acl) == -ENODATA)
-                               goto check_groups;
-                       return PTR_ERR(acl);
-               }
+       reiserfs_read_unlock_xattrs(inode->i_sb);
+       reiserfs_read_unlock_xattr_i(inode);
 
-               if (acl) {
-                       int err = posix_acl_permission(inode, acl, mask);
+       if (acl) {
+               if (!IS_ERR(acl)) {
+                       error = posix_acl_permission(inode, acl, mask);
                        posix_acl_release(acl);
-                       if (err == -EACCES) {
-                               goto check_capabilities;
-                       }
-                       return err;
-               } else {
-                       goto check_groups;
-               }
-#endif
-       } else {
-             check_groups:
-               if (in_group_p(inode->i_gid))
-                       mode >>= 3;
+               } else if (PTR_ERR(acl) != -ENODATA)
+                       error = PTR_ERR(acl);
        }
 
-       /*
-        * If the DACs are ok we don't need any capability check.
-        */
-       if (((mode & mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == mask))
-               return 0;
+       return error;
+}
 
-      check_capabilities:
+int reiserfs_permission(struct inode *inode, int mask, struct nameidata *nd)
+{
        /*
-        * Read/write DACs are always overridable.
-        * Executable DACs are overridable if at least one exec bit is set.
+        * We don't do permission checks on the internal objects.
+        * Permissions are determined by the "owning" object.
         */
-       if (!(mask & MAY_EXEC) ||
-           (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode))
-               if (capable(CAP_DAC_OVERRIDE))
-                       return 0;
+       if (is_reiserfs_priv_object(inode))
+               return 0;
 
        /*
-        * Searching includes executable on directories, else just read.
+        * Stat data v1 doesn't support ACLs.
         */
-       if (mask == MAY_READ || (S_ISDIR(inode->i_mode) && !(mask & MAY_WRITE)))
-               if (capable(CAP_DAC_READ_SEARCH))
-                       return 0;
-
-       return -EACCES;
-}
-
-int reiserfs_permission(struct inode *inode, int mask, struct nameidata *nd)
-{
-       return __reiserfs_permission(inode, mask, nd, 1);
-}
-
-int
-reiserfs_permission_locked(struct inode *inode, int mask, struct nameidata *nd)
-{
-       return __reiserfs_permission(inode, mask, nd, 0);
+       if (get_inode_sd_version(inode) == STAT_DATA_V1)
+               return generic_permission(inode, mask, NULL);
+       else
+               return generic_permission(inode, mask, reiserfs_check_acl);
 }
index c6c33e15143ab68baa8c944f14b108f391d1cad2..0424d06b147e3832273b068f2389b99057c28e0a 100644 (file)
@@ -209,6 +209,8 @@ init_cache:
        ctl.valid  = 1;
 read_really:
        result = server->ops->readdir(filp, dirent, filldir, &ctl);
+       if (result == -ERESTARTSYS && page)
+               ClearPageUptodate(page);
        if (ctl.idx == -1)
                goto invalid_cache;     /* retry */
        ctl.head.end = ctl.fpos - 1;
@@ -217,7 +219,8 @@ finished:
        if (page) {
                cache->head = ctl.head;
                kunmap(page);
-               SetPageUptodate(page);
+               if (result != -ERESTARTSYS)
+                       SetPageUptodate(page);
                unlock_page(page);
                page_cache_release(page);
        }
index 120626789406e836708b5050b6c14cce85341cbe..9892268e30050fdd4a21846160c74a708fe56545 100644 (file)
@@ -1462,4 +1462,5 @@ struct address_space_operations linvfs_aops = {
        .commit_write           = generic_commit_write,
        .bmap                   = linvfs_bmap,
        .direct_IO              = linvfs_direct_IO,
+       .migratepage            = buffer_migrate_page,
 };
index a36a8e3b703fdea9090c9c981cbf21410412f345..bfb4f2917bb69b01c472dc31f7d2eb36d9e1cb28 100644 (file)
@@ -1521,6 +1521,7 @@ xfs_mapping_buftarg(
        struct address_space    *mapping;
        static struct address_space_operations mapping_aops = {
                .sync_page = block_sync_page,
+               .migratepage = fail_migrate_page,
        };
 
        inode = new_inode(bdev->bd_inode->i_sb);
index 427cff1a3f8321ea786c9a104acd21f5e0f67cc1..e27dc8f299722f690d042adf47ae4ea3a54e94ef 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -61,9 +61,9 @@
  *
  */
 
-/* Version string */
+/* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20050902
+#define ACPI_CA_VERSION                 0x20060127
 
 /*
  * OS name, used for the _OS object.  The _OS object is essentially obsolete,
@@ -83,7 +83,7 @@
 #define ACPI_MAX_OBJECT_CACHE_DEPTH     96     /* Interpreter operand objects */
 
 /*
- * Should the subystem abort the loading of an ACPI table if the
+ * Should the subsystem abort the loading of an ACPI table if the
  * table checksum is incorrect?
  */
 #define ACPI_CHECKSUM_ABORT             FALSE
 
 #define ACPI_CA_SUPPORT_LEVEL           3
 
-/* String size constants */
-
-#define ACPI_MAX_STRING_LENGTH          512
-#define ACPI_PATHNAME_MAX               256    /* A full namespace pathname */
-
 /* Maximum count for a semaphore object */
 
 #define ACPI_MAX_SEMAPHORE_COUNT        256
 
 #define ACPI_SYSMEM_REGION_WINDOW_SIZE  4096
 
+/* owner_id tracking. 8 entries allows for 255 owner_ids */
+
+#define ACPI_NUM_OWNERID_MASKS          8
+
 /******************************************************************************
  *
  * ACPI Specification constants (Do not change unless the specification changes)
 #define ACPI_METHOD_NUM_ARGS            7
 #define ACPI_METHOD_MAX_ARG             6
 
-/* Maximum length of resulting string when converting from a buffer */
-
-#define ACPI_MAX_STRING_CONVERSION      200
-
-/* Length of _HID, _UID, and _CID values */
+/* Length of _HID, _UID, _CID, and UUID values */
 
 #define ACPI_DEVICE_ID_LENGTH           0x09
 #define ACPI_MAX_CID_LENGTH             48
+#define ACPI_UUID_LENGTH                16
 
 /*
  * Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG
index 70ce3b4d006edc99a0171372005f262a7284db84..d8167095caf3cf5ea5706f747fa335b471dae35e 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 3d96dcb1bb4bb3725946f76a692a96d34389a0f3..11a8fe39cb044d0d1090d331dd6acfb904bf9628 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,26 +57,11 @@ struct acpi_external_list {
 };
 
 extern struct acpi_external_list *acpi_gbl_external_list;
-extern const char *acpi_gbl_io_decode[2];
+
+/* Strings used for decoding flags to ASL keywords */
+
 extern const char *acpi_gbl_word_decode[4];
-extern const char *acpi_gbl_consume_decode[2];
-extern const char *acpi_gbl_min_decode[2];
-extern const char *acpi_gbl_max_decode[2];
-extern const char *acpi_gbl_DECdecode[2];
-extern const char *acpi_gbl_RNGdecode[4];
-extern const char *acpi_gbl_MEMdecode[4];
-extern const char *acpi_gbl_RWdecode[2];
 extern const char *acpi_gbl_irq_decode[2];
-extern const char *acpi_gbl_HEdecode[2];
-extern const char *acpi_gbl_LLdecode[2];
-extern const char *acpi_gbl_SHRdecode[2];
-extern const char *acpi_gbl_TYPdecode[4];
-extern const char *acpi_gbl_BMdecode[2];
-extern const char *acpi_gbl_SIZdecode[4];
-extern const char *acpi_gbl_TTPdecode[2];
-extern const char *acpi_gbl_MTPdecode[4];
-extern const char *acpi_gbl_TRSdecode[2];
-
 extern const char *acpi_gbl_lock_rule[ACPI_NUM_LOCK_RULES];
 extern const char *acpi_gbl_access_types[ACPI_NUM_ACCESS_TYPES];
 extern 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);
 /*
  * dmresrc
  */
+void acpi_dm_dump_integer8(u8 value, char *name);
+
+void acpi_dm_dump_integer16(u16 value, char *name);
+
+void acpi_dm_dump_integer32(u32 value, char *name);
+
+void acpi_dm_dump_integer64(u64 value, char *name);
+
 void
-acpi_dm_resource_descriptor(struct acpi_op_walk_info *info,
-                           u8 * byte_data, u32 byte_count);
+acpi_dm_resource_template(struct acpi_op_walk_info *info,
+                         u8 * byte_data, u32 byte_count);
 
-u8 acpi_dm_is_resource_descriptor(union acpi_parse_object *op);
+u8 acpi_dm_is_resource_template(union acpi_parse_object *op);
 
 void acpi_dm_indent(u32 level);
 
@@ -187,73 +180,69 @@ void acpi_dm_decode_attribute(u8 attribute);
  * dmresrcl
  */
 void
-acpi_dm_word_descriptor(struct asl_word_address_desc *resource,
-                       u32 length, u32 level);
+acpi_dm_word_descriptor(union aml_resource *resource, u32 length, u32 level);
 
 void
-acpi_dm_dword_descriptor(struct asl_dword_address_desc *resource,
-                        u32 length, u32 level);
+acpi_dm_dword_descriptor(union aml_resource *resource, u32 length, u32 level);
 
 void
-acpi_dm_extended_descriptor(struct asl_extended_address_desc *resource,
+acpi_dm_extended_descriptor(union aml_resource *resource,
                            u32 length, u32 level);
 
 void
-acpi_dm_qword_descriptor(struct asl_qword_address_desc *resource,
-                        u32 length, u32 level);
+acpi_dm_qword_descriptor(union aml_resource *resource, u32 length, u32 level);
 
 void
-acpi_dm_memory24_descriptor(struct asl_memory_24_desc *resource,
+acpi_dm_memory24_descriptor(union aml_resource *resource,
                            u32 length, u32 level);
 
 void
-acpi_dm_memory32_descriptor(struct asl_memory_32_desc *resource,
+acpi_dm_memory32_descriptor(union aml_resource *resource,
                            u32 length, u32 level);
 
 void
-acpi_dm_fixed_mem32_descriptor(struct asl_fixed_memory_32_desc *resource,
-                              u32 length, u32 level);
+acpi_dm_fixed_memory32_descriptor(union aml_resource *resource,
+                                 u32 length, u32 level);
 
 void
-acpi_dm_generic_register_descriptor(struct asl_general_register_desc *resource,
+acpi_dm_generic_register_descriptor(union aml_resource *resource,
                                    u32 length, u32 level);
 
 void
-acpi_dm_interrupt_descriptor(struct asl_extended_xrupt_desc *resource,
+acpi_dm_interrupt_descriptor(union aml_resource *resource,
                             u32 length, u32 level);
 
 void
-acpi_dm_vendor_large_descriptor(struct asl_large_vendor_desc *resource,
+acpi_dm_vendor_large_descriptor(union aml_resource *resource,
                                u32 length, u32 level);
 
+void acpi_dm_vendor_common(char *name, u8 * byte_data, u32 length, u32 level);
+
 /*
  * dmresrcs
  */
 void
-acpi_dm_irq_descriptor(struct asl_irq_format_desc *resource,
-                      u32 length, u32 level);
+acpi_dm_irq_descriptor(union aml_resource *resource, u32 length, u32 level);
 
 void
-acpi_dm_dma_descriptor(struct asl_dma_format_desc *resource,
-                      u32 length, u32 level);
+acpi_dm_dma_descriptor(union aml_resource *resource, u32 length, u32 level);
 
-void
-acpi_dm_io_descriptor(struct asl_io_port_desc *resource, u32 length, u32 level);
+void acpi_dm_io_descriptor(union aml_resource *resource, u32 length, u32 level);
 
 void
-acpi_dm_fixed_io_descriptor(struct asl_fixed_io_port_desc *resource,
+acpi_dm_fixed_io_descriptor(union aml_resource *resource,
                            u32 length, u32 level);
 
 void
-acpi_dm_start_dependent_descriptor(struct asl_start_dependent_desc *resource,
+acpi_dm_start_dependent_descriptor(union aml_resource *resource,
                                   u32 length, u32 level);
 
 void
-acpi_dm_end_dependent_descriptor(struct asl_start_dependent_desc *resource,
+acpi_dm_end_dependent_descriptor(union aml_resource *resource,
                                 u32 length, u32 level);
 
 void
-acpi_dm_vendor_small_descriptor(struct asl_small_vendor_desc *resource,
+acpi_dm_vendor_small_descriptor(union aml_resource *resource,
                                u32 length, u32 level);
 
 /*
index 065f24a77cfcb44010f053127a0dbdc934e2f2bd..c41a926ff3172f7d21af597ef6f4e3fc5f5b77f7 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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,
                               union acpi_operand_object *obj_desc,
                               struct acpi_namespace_node *calling_method_node);
 
+acpi_status
+acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state);
+
 /*
  * dsinit
  */
index bfa54600ecd9748244db27ea8190f95233919085..f2717be4fe0dc46c81d554df326168d07e857db0 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -51,6 +51,8 @@ acpi_status acpi_ev_initialize_events(void);
 
 acpi_status acpi_ev_install_xrupt_handlers(void);
 
+acpi_status acpi_ev_install_fadt_gpes(void);
+
 u32 acpi_ev_fixed_event_detect(void);
 
 /*
@@ -105,6 +107,10 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
                         u32 interrupt_number,
                         struct acpi_gpe_block_info **return_gpe_block);
 
+acpi_status
+acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
+                            struct acpi_gpe_block_info *gpe_block);
+
 acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block);
 
 u32
index 4f005eb659281b0156fbc232633b5f634982e9cb..dc768aa580e461346bcb0c83ab7e2ce5b75658ee 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 4ab2ca18b8df483bb672cc34e6129ad3b516955e..734cc77bf2c7ae885e82209b14c85d40cab6d04d 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -80,6 +80,15 @@ extern u32 acpi_dbg_layer;
 
 extern u32 acpi_gbl_nesting_level;
 
+/* Support for dynamic control method tracing mechanism */
+
+ACPI_EXTERN u32 acpi_gbl_original_dbg_level;
+ACPI_EXTERN u32 acpi_gbl_original_dbg_layer;
+ACPI_EXTERN acpi_name acpi_gbl_trace_method_name;
+ACPI_EXTERN u32 acpi_gbl_trace_dbg_level;
+ACPI_EXTERN u32 acpi_gbl_trace_dbg_layer;
+ACPI_EXTERN u32 acpi_gbl_trace_flags;
+
 /*****************************************************************************
  *
  * Runtime configuration (static defaults that can be overriden at runtime)
@@ -89,11 +98,15 @@ extern u32 acpi_gbl_nesting_level;
 /*
  * Enable "slack" in the AML interpreter?  Default is FALSE, and the
  * interpreter strictly follows the ACPI specification.  Setting to TRUE
- * allows the interpreter to forgive certain bad AML constructs.  Currently:
+ * allows the interpreter to ignore certain errors and/or bad AML constructs.
+ *
+ * Currently, these features are enabled by this flag:
+ *
  * 1) Allow "implicit return" of last value in a control method
- * 2) Allow access beyond end of operation region
+ * 2) Allow access beyond the end of an operation region
  * 3) Allow access to uninitialized locals/args (auto-init to integer 0)
  * 4) Allow ANY object type to be a source operand for the Store() operator
+ * 5) Allow unresolved references (invalid target name) in package objects
  */
 ACPI_EXTERN u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_interpreter_slack, FALSE);
 
@@ -211,9 +224,11 @@ ACPI_EXTERN u32 acpi_gbl_original_mode;
 ACPI_EXTERN u32 acpi_gbl_rsdp_original_location;
 ACPI_EXTERN u32 acpi_gbl_ns_lookup_count;
 ACPI_EXTERN u32 acpi_gbl_ps_find_count;
-ACPI_EXTERN u64 acpi_gbl_owner_id_mask;
+ACPI_EXTERN u32 acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS];
 ACPI_EXTERN u16 acpi_gbl_pm1_enable_register_save;
 ACPI_EXTERN u16 acpi_gbl_global_lock_handle;
+ACPI_EXTERN u8 acpi_gbl_last_owner_id_index;
+ACPI_EXTERN u8 acpi_gbl_next_owner_id_offset;
 ACPI_EXTERN u8 acpi_gbl_debugger_configuration;
 ACPI_EXTERN u8 acpi_gbl_global_lock_acquired;
 ACPI_EXTERN u8 acpi_gbl_step_to_next_call;
index 3644d7248e7e7fd54bf3716b9b2b04736ab5f32e..29b60a8c0593bc3cd57c3122637c6f64d62e8605 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 2c9c1a1d1b7f05c742fb51758e48bbee7f31571a..9f22cfcb624b97ff5bbe168770d53de74d3d1fd7 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef __ACINTERP_H__
 #define __ACINTERP_H__
 
-#define ACPI_WALK_OPERANDS       (&(walk_state->operands [walk_state->num_operands -1]))
+#define ACPI_WALK_OPERANDS          (&(walk_state->operands [walk_state->num_operands -1]))
+
+/* Macros for tables used for debug output */
+
+#define ACPI_EXD_OFFSET(f)          (u8) ACPI_OFFSET (union acpi_operand_object,f)
+#define ACPI_EXD_NSOFFSET(f)        (u8) ACPI_OFFSET (struct acpi_namespace_node,f)
+#define ACPI_EXD_TABLE_SIZE(name)   (sizeof(name) / sizeof (struct acpi_exdump_info))
+
+/*
+ * If possible, pack the following structure to byte alignment, since we
+ * don't care about performance for debug output
+ */
+#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
+#pragma pack(1)
+#endif
+
+typedef const struct acpi_exdump_info {
+       u8 opcode;
+       u8 offset;
+       char *name;
+
+} acpi_exdump_info;
+
+/* Values for the Opcode field above */
+
+#define ACPI_EXD_INIT                   0
+#define ACPI_EXD_TYPE                   1
+#define ACPI_EXD_UINT8                  2
+#define ACPI_EXD_UINT16                 3
+#define ACPI_EXD_UINT32                 4
+#define ACPI_EXD_UINT64                 5
+#define ACPI_EXD_LITERAL                6
+#define ACPI_EXD_POINTER                7
+#define ACPI_EXD_ADDRESS                8
+#define ACPI_EXD_STRING                 9
+#define ACPI_EXD_BUFFER                 10
+#define ACPI_EXD_PACKAGE                11
+#define ACPI_EXD_FIELD                  12
+#define ACPI_EXD_REFERENCE              13
+
+/* restore default alignment */
+
+#pragma pack()
 
 /*
  * exconvrt - object conversion
@@ -327,7 +369,7 @@ acpi_ex_dump_operands(union acpi_operand_object **operands,
 void
 acpi_ex_dump_object_descriptor(union acpi_operand_object *object, u32 flags);
 
-void acpi_ex_dump_node(struct acpi_namespace_node *node, u32 flags);
+void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags);
 #endif                         /* ACPI_FUTURE_USAGE */
 
 /*
index 9fba0fddda909f408509de845f50955aa4c4698f..8361820d297088dbd887bd66278e105b1b445740 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -276,6 +276,37 @@ struct acpi_create_field_info {
        u8 field_type;
 };
 
+/*
+ * Bitmapped ACPI types.  Used internally only
+ */
+#define ACPI_BTYPE_ANY                  0x00000000
+#define ACPI_BTYPE_INTEGER              0x00000001
+#define ACPI_BTYPE_STRING               0x00000002
+#define ACPI_BTYPE_BUFFER               0x00000004
+#define ACPI_BTYPE_PACKAGE              0x00000008
+#define ACPI_BTYPE_FIELD_UNIT           0x00000010
+#define ACPI_BTYPE_DEVICE               0x00000020
+#define ACPI_BTYPE_EVENT                0x00000040
+#define ACPI_BTYPE_METHOD               0x00000080
+#define ACPI_BTYPE_MUTEX                0x00000100
+#define ACPI_BTYPE_REGION               0x00000200
+#define ACPI_BTYPE_POWER                0x00000400
+#define ACPI_BTYPE_PROCESSOR            0x00000800
+#define ACPI_BTYPE_THERMAL              0x00001000
+#define ACPI_BTYPE_BUFFER_FIELD         0x00002000
+#define ACPI_BTYPE_DDB_HANDLE           0x00004000
+#define ACPI_BTYPE_DEBUG_OBJECT         0x00008000
+#define ACPI_BTYPE_REFERENCE            0x00010000
+#define ACPI_BTYPE_RESOURCE             0x00020000
+
+#define ACPI_BTYPE_COMPUTE_DATA         (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER)
+
+#define ACPI_BTYPE_DATA                 (ACPI_BTYPE_COMPUTE_DATA  | ACPI_BTYPE_PACKAGE)
+#define ACPI_BTYPE_DATA_REFERENCE       (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE)
+#define ACPI_BTYPE_DEVICE_OBJECTS       (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR)
+#define ACPI_BTYPE_OBJECTS_AND_REFS     0x0001FFFF     /* ARG or LOCAL */
+#define ACPI_BTYPE_ALL_OBJECTS          0x0000FFFF
+
 /*****************************************************************************
  *
  * Event typedefs and structs
@@ -385,13 +416,13 @@ struct acpi_field_info {
 #define ACPI_CONTROL_PREDICATE_FALSE         0xC3
 #define ACPI_CONTROL_PREDICATE_TRUE          0xC4
 
-#define ACPI_STATE_COMMON                  /* Two 32-bit fields and a pointer */\
-       u8                                  data_type;          /* To differentiate various internal objs */\
+#define ACPI_STATE_COMMON   /* Two 32-bit fields and a pointer */\
+       u8                                  data_type;  /* To differentiate various internal objs */\
        u8                                  flags;      \
        u16                                 value;      \
        u16                                 state;      \
        u16                                 reserved;   \
-       void                                *next;      \
+       void                                *next;
 
 struct acpi_common_state {
 ACPI_STATE_COMMON};
@@ -544,8 +575,7 @@ union acpi_parse_value {
        char                                aml_op_name[16]) /* Op name (debug only) */\
                           /* NON-DEBUG members below: */\
        struct acpi_namespace_node          *node;          /* For use by interpreter */\
-       union acpi_parse_value              value;          /* Value or args associated with the opcode */\
-
+       union acpi_parse_value              value;      /* Value or args associated with the opcode */
 
 #define ACPI_DASM_BUFFER        0x00
 #define ACPI_DASM_RESOURCE      0x01
@@ -573,6 +603,8 @@ struct acpi_parse_obj_named {
 
 /* The parse node is the fundamental element of the parse tree */
 
+#define ACPI_MAX_PARSEOP_NAME   20
+
 struct acpi_parse_obj_asl {
        ACPI_PARSE_COMMON union acpi_parse_object *child;
        union acpi_parse_object *parent_method;
@@ -597,7 +629,7 @@ struct acpi_parse_obj_asl {
        u8 aml_opcode_length;
        u8 aml_pkg_len_bytes;
        u8 extra;
-       char parse_op_name[12];
+       char parse_op_name[ACPI_MAX_PARSEOP_NAME];
 };
 
 union acpi_parse_object {
@@ -735,44 +767,52 @@ struct acpi_bit_register_info {
 
 /* resource_type values */
 
-#define ACPI_RESOURCE_TYPE_MEMORY_RANGE         0
-#define ACPI_RESOURCE_TYPE_IO_RANGE             1
-#define ACPI_RESOURCE_TYPE_BUS_NUMBER_RANGE     2
+#define ACPI_ADDRESS_TYPE_MEMORY_RANGE          0
+#define ACPI_ADDRESS_TYPE_IO_RANGE              1
+#define ACPI_ADDRESS_TYPE_BUS_NUMBER_RANGE      2
 
 /* Resource descriptor types and masks */
 
-#define ACPI_RDESC_TYPE_LARGE                   0x80
-#define ACPI_RDESC_TYPE_SMALL                   0x00
+#define ACPI_RESOURCE_NAME_LARGE                0x80
+#define ACPI_RESOURCE_NAME_SMALL                0x00
 
-#define ACPI_RDESC_TYPE_MASK                    0x80
-#define ACPI_RDESC_SMALL_MASK                   0x78   /* Only bits 6:3 contain the type */
+#define ACPI_RESOURCE_NAME_SMALL_MASK           0x78   /* Bits 6:3 contain the type */
+#define ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK    0x07   /* Bits 2:0 contain the length */
+#define ACPI_RESOURCE_NAME_LARGE_MASK           0x7F   /* Bits 6:0 contain the type */
 
 /*
- * Small resource descriptor types
- * Note: The 3 length bits (2:0) must be zero
+ * Small resource descriptor "names" as defined by the ACPI specification.
+ * Note: Bits 2:0 are used for the descriptor length
  */
-#define ACPI_RDESC_TYPE_IRQ_FORMAT              0x20
-#define ACPI_RDESC_TYPE_DMA_FORMAT              0x28
-#define ACPI_RDESC_TYPE_START_DEPENDENT         0x30
-#define ACPI_RDESC_TYPE_END_DEPENDENT           0x38
-#define ACPI_RDESC_TYPE_IO_PORT                 0x40
-#define ACPI_RDESC_TYPE_FIXED_IO_PORT           0x48
-#define ACPI_RDESC_TYPE_SMALL_VENDOR            0x70
-#define ACPI_RDESC_TYPE_END_TAG                 0x78
+#define ACPI_RESOURCE_NAME_IRQ                  0x20
+#define ACPI_RESOURCE_NAME_DMA                  0x28
+#define ACPI_RESOURCE_NAME_START_DEPENDENT      0x30
+#define ACPI_RESOURCE_NAME_END_DEPENDENT        0x38
+#define ACPI_RESOURCE_NAME_IO                   0x40
+#define ACPI_RESOURCE_NAME_FIXED_IO             0x48
+#define ACPI_RESOURCE_NAME_RESERVED_S1          0x50
+#define ACPI_RESOURCE_NAME_RESERVED_S2          0x58
+#define ACPI_RESOURCE_NAME_RESERVED_S3          0x60
+#define ACPI_RESOURCE_NAME_RESERVED_S4          0x68
+#define ACPI_RESOURCE_NAME_VENDOR_SMALL         0x70
+#define ACPI_RESOURCE_NAME_END_TAG              0x78
 
 /*
- * Large resource descriptor types
+ * Large resource descriptor "names" as defined by the ACPI specification.
+ * Note: includes the Large Descriptor bit in bit[7]
  */
-#define ACPI_RDESC_TYPE_MEMORY_24               0x81
-#define ACPI_RDESC_TYPE_GENERAL_REGISTER        0x82
-#define ACPI_RDESC_TYPE_LARGE_VENDOR            0x84
-#define ACPI_RDESC_TYPE_MEMORY_32               0x85
-#define ACPI_RDESC_TYPE_FIXED_MEMORY_32         0x86
-#define ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE     0x87
-#define ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE      0x88
-#define ACPI_RDESC_TYPE_EXTENDED_XRUPT          0x89
-#define ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE     0x8A
-#define ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE  0x8B
+#define ACPI_RESOURCE_NAME_MEMORY24             0x81
+#define ACPI_RESOURCE_NAME_GENERIC_REGISTER     0x82
+#define ACPI_RESOURCE_NAME_RESERVED_L1          0x83
+#define ACPI_RESOURCE_NAME_VENDOR_LARGE         0x84
+#define ACPI_RESOURCE_NAME_MEMORY32             0x85
+#define ACPI_RESOURCE_NAME_FIXED_MEMORY32       0x86
+#define ACPI_RESOURCE_NAME_ADDRESS32            0x87
+#define ACPI_RESOURCE_NAME_ADDRESS16            0x88
+#define ACPI_RESOURCE_NAME_EXTENDED_IRQ         0x89
+#define ACPI_RESOURCE_NAME_ADDRESS64            0x8A
+#define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64   0x8B
+#define ACPI_RESOURCE_NAME_LARGE_MAX            0x8B
 
 /*****************************************************************************
  *
@@ -780,7 +820,7 @@ struct acpi_bit_register_info {
  *
  ****************************************************************************/
 
-#define ACPI_ASCII_ZERO                      0x30
+#define ACPI_ASCII_ZERO                         0x30
 
 /*****************************************************************************
  *
index 702cc4e57f5f727b431e494a794154aead07f760..f2be2a881730ca349440304d23aff3594101a281 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -60,7 +60,7 @@
 
 /*
  * For 16-bit addresses, we have to assume that the upper 32 bits
- * are zero.
+ * (out of 64) are zero.
  */
 #define ACPI_LODWORD(l)                 ((u32)(l))
 #define ACPI_HIDWORD(l)                 ((u32)(0))
 #define ACPI_FORMAT_UINT64(i)           ACPI_HIDWORD(i),ACPI_LODWORD(i)
 
 /*
- * Extract a byte of data using a pointer.  Any more than a byte and we
- * get into potential aligment issues -- see the STORE macros below
+ * Extract data using a pointer.  Any more than a byte and we
+ * get into potential aligment issues -- see the STORE macros below.
+ * Use with care.
  */
-#define ACPI_GET8(addr)                 (*(u8*)(addr))
+#define ACPI_GET8(ptr)                  *ACPI_CAST_PTR (u8, ptr)
+#define ACPI_GET16(ptr)                 *ACPI_CAST_PTR (u16, ptr)
+#define ACPI_GET32(ptr)                 *ACPI_CAST_PTR (u32, ptr)
+#define ACPI_GET64(ptr)                 *ACPI_CAST_PTR (u64, ptr)
+#define ACPI_SET8(ptr)                  *ACPI_CAST_PTR (u8, ptr)
+#define ACPI_SET16(ptr)                 *ACPI_CAST_PTR (u16, ptr)
+#define ACPI_SET32(ptr)                 *ACPI_CAST_PTR (u32, ptr)
+#define ACPI_SET64(ptr)                 *ACPI_CAST_PTR (u64, ptr)
 
-/* Pointer arithmetic */
-
-#define ACPI_PTR_ADD(t,a,b)             (t *) (void *)((char *)(a) + (acpi_native_uint)(b))
-#define ACPI_PTR_DIFF(a,b)              (acpi_native_uint) ((char *)(a) - (char *)(b))
+/*
+ * Pointer manipulation
+ */
+#define ACPI_CAST_PTR(t, p)             ((t *) (acpi_uintptr_t) (p))
+#define ACPI_CAST_INDIRECT_PTR(t, p)    ((t **) (acpi_uintptr_t) (p))
+#define ACPI_ADD_PTR(t,a,b)             ACPI_CAST_PTR (t, (ACPI_CAST_PTR (u8,(a)) + (acpi_native_uint)(b)))
+#define ACPI_PTR_DIFF(a,b)              (acpi_native_uint) (ACPI_CAST_PTR (u8,(a)) - ACPI_CAST_PTR (u8,(b)))
 
 /* Pointer/Integer type conversions */
 
-#define ACPI_TO_POINTER(i)              ACPI_PTR_ADD (void, (void *) NULL,(acpi_native_uint)i)
+#define ACPI_TO_POINTER(i)              ACPI_ADD_PTR (void,(void *) NULL,(acpi_native_uint) i)
 #define ACPI_TO_INTEGER(p)              ACPI_PTR_DIFF (p,(void *) NULL)
 #define ACPI_OFFSET(d,f)                (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f),(void *) NULL)
 #define ACPI_FADT_OFFSET(f)             ACPI_OFFSET (FADT_DESCRIPTOR, f)
 
-#define ACPI_CAST_PTR(t, p)             ((t *)(void *)(p))
-#define ACPI_CAST_INDIRECT_PTR(t, p)    ((t **)(void *)(p))
-
 #if ACPI_MACHINE_WIDTH == 16
 #define ACPI_STORE_POINTER(d,s)         ACPI_MOVE_32_TO_32(d,s)
 #define ACPI_PHYSADDR_TO_PTR(i)         (void *)(i)
-#define ACPI_PTR_TO_PHYSADDR(i)         (u32) (char *)(i)
+#define ACPI_PTR_TO_PHYSADDR(i)         (u32) ACPI_CAST_PTR (u8,(i))
 #else
 #define ACPI_PHYSADDR_TO_PTR(i)         ACPI_TO_POINTER(i)
 #define ACPI_PTR_TO_PHYSADDR(i)         ACPI_TO_INTEGER(i)
 
 #define ACPI_BUFFER_INDEX(buf_len,buf_offset,byte_gran) (buf_offset)
 
-#ifdef ACPI_MISALIGNED_TRANSFERS
+#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
 
 /* The hardware supports unaligned transfers, just do the little-endian move */
 
 #define ACPI_MUL_16(a)                  _ACPI_MUL(a,4)
 #define ACPI_MOD_16(a)                  _ACPI_MOD(a,16)
 
+#define ACPI_DIV_32(a)                  _ACPI_DIV(a,5)
+#define ACPI_MUL_32(a)                  _ACPI_MUL(a,5)
+#define ACPI_MOD_32(a)                  _ACPI_MOD(a,32)
+
 /*
  * Rounding macros (Power of two boundaries only)
  */
-#define ACPI_ROUND_DOWN(value,boundary)      (((acpi_native_uint)(value)) & (~(((acpi_native_uint) boundary)-1)))
-#define ACPI_ROUND_UP(value,boundary)        ((((acpi_native_uint)(value)) + (((acpi_native_uint) boundary)-1)) & (~(((acpi_native_uint) boundary)-1)))
+#define ACPI_ROUND_DOWN(value,boundary)      (((acpi_native_uint)(value)) & \
+                                                                                               (~(((acpi_native_uint) boundary)-1)))
+
+#define ACPI_ROUND_UP(value,boundary)        ((((acpi_native_uint)(value)) + \
+                                                                                               (((acpi_native_uint) boundary)-1)) & \
+                                                                                               (~(((acpi_native_uint) boundary)-1)))
 
 #define ACPI_ROUND_DOWN_TO_32_BITS(a)        ACPI_ROUND_DOWN(a,4)
 #define ACPI_ROUND_DOWN_TO_64_BITS(a)        ACPI_ROUND_DOWN(a,8)
 #define ACPI_REGISTER_PREPARE_BITS(val, pos, mask)      ((val << pos) & mask)
 #define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val)  reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask)
 
+/* Generate a UUID */
+
+#define ACPI_INIT_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
+       (a) & 0xFF, ((a) >> 8) & 0xFF, ((a) >> 16) & 0xFF, ((a) >> 24) & 0xFF, \
+       (b) & 0xFF, ((b) >> 8) & 0xFF, \
+       (c) & 0xFF, ((c) >> 8) & 0xFF, \
+       (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)
+
 /*
  * An struct acpi_namespace_node * can appear in some contexts,
  * where a pointer to an union acpi_operand_object    can also
 #define GET_CURRENT_ARG_TYPE(list)      (list & ((u32) 0x1F))
 #define INCREMENT_ARG_LIST(list)        (list >>= ((u32) ARG_TYPE_WIDTH))
 
+#if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES)
 /*
- * Reporting macros that are never compiled out
+ * Module name is include in both debug and non-debug versions primarily for
+ * error messages. The __FILE__ macro is not very useful for this, because it
+ * often includes the entire pathname to the module
  */
-#define ACPI_PARAM_LIST(pl)                 pl
+#define ACPI_MODULE_NAME(name)          static char ACPI_UNUSED_VAR *_acpi_module_name = name;
+#else
+#define ACPI_MODULE_NAME(name)
+#endif
 
 /*
- * Error reporting.  These versions add callers module and line#.
- *
- * Since _acpi_module_name gets compiled out when ACPI_DEBUG_OUTPUT
- * isn't defined, only use it in debug mode.
+ * Ascii error messages can be configured out
  */
-#ifdef ACPI_DEBUG_OUTPUT
+#ifndef ACPI_NO_ERROR_MESSAGES
+#define AE_INFO                         _acpi_module_name, __LINE__
 
-#define ACPI_REPORT_INFO(fp)                {acpi_ut_report_info(_acpi_module_name,__LINE__,_COMPONENT); \
-                                                                                               acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define ACPI_REPORT_ERROR(fp)               {acpi_ut_report_error(_acpi_module_name,__LINE__,_COMPONENT); \
-                                                                                               acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define ACPI_REPORT_WARNING(fp)             {acpi_ut_report_warning(_acpi_module_name,__LINE__,_COMPONENT); \
-                                                                                               acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define ACPI_REPORT_NSERROR(s,e)            acpi_ns_report_error(_acpi_module_name,__LINE__,_COMPONENT, s, e);
-
-#define ACPI_REPORT_METHOD_ERROR(s,n,p,e)   acpi_ns_report_method_error(_acpi_module_name,__LINE__,_COMPONENT, s, n, p, e);
+/*
+ * Error reporting. Callers module and line number are inserted by AE_INFO,
+ * the plist contains a set of parens to allow variable-length lists.
+ * These macros are used for both the debug and non-debug versions of the code.
+ */
+#define ACPI_INFO(plist)                acpi_ut_info plist
+#define ACPI_WARNING(plist)             acpi_ut_warning plist
+#define ACPI_EXCEPTION(plist)           acpi_ut_exception plist
+#define ACPI_ERROR(plist)               acpi_ut_error plist
+#define ACPI_ERROR_NAMESPACE(s,e)       acpi_ns_report_error (AE_INFO, s, e);
+#define ACPI_ERROR_METHOD(s,n,p,e)      acpi_ns_report_method_error (AE_INFO, s, n, p, e);
 
 #else
 
-#define ACPI_REPORT_INFO(fp)                {acpi_ut_report_info("ACPI",__LINE__,_COMPONENT); \
-                                                                                               acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define ACPI_REPORT_ERROR(fp)               {acpi_ut_report_error("ACPI",__LINE__,_COMPONENT); \
-                                                                                               acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define ACPI_REPORT_WARNING(fp)             {acpi_ut_report_warning("ACPI",__LINE__,_COMPONENT); \
-                                                                                               acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define ACPI_REPORT_NSERROR(s,e)            acpi_ns_report_error("ACPI",__LINE__,_COMPONENT, s, e);
+/* No error messages */
 
-#define ACPI_REPORT_METHOD_ERROR(s,n,p,e)   acpi_ns_report_method_error("ACPI",__LINE__,_COMPONENT, s, n, p, e);
+#define ACPI_INFO(plist)
+#define ACPI_WARNING(plist)
+#define ACPI_EXCEPTION(plist)
+#define ACPI_ERROR(plist)
+#define ACPI_ERROR_NAMESPACE(s,e)
+#define ACPI_ERROR_METHOD(s,n,p,e)
 
 #endif
 
-/* Error reporting.  These versions pass thru the module and line# */
-
-#define _ACPI_REPORT_INFO(a,b,c,fp)         {acpi_ut_report_info(a,b,c); \
-                                                                                               acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define _ACPI_REPORT_ERROR(a,b,c,fp)        {acpi_ut_report_error(a,b,c); \
-                                                                                               acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define _ACPI_REPORT_WARNING(a,b,c,fp)      {acpi_ut_report_warning(a,b,c); \
-                                                                                               acpi_os_printf ACPI_PARAM_LIST(fp);}
-
 /*
  * Debug macros that are conditionally compiled
  */
 #ifdef ACPI_DEBUG_OUTPUT
-#define ACPI_MODULE_NAME(name)          static char ACPI_UNUSED_VAR *_acpi_module_name = name;
 
 /*
  * Common parameters used for debug output functions:
 #endif
 
 #define ACPI_FUNCTION_TRACE(a)          ACPI_FUNCTION_NAME(a) \
-                                                                                       acpi_ut_trace(ACPI_DEBUG_PARAMETERS)
+                                                                         acpi_ut_trace(ACPI_DEBUG_PARAMETERS)
 #define ACPI_FUNCTION_TRACE_PTR(a,b)    ACPI_FUNCTION_NAME(a) \
                                                                                        acpi_ut_trace_ptr(ACPI_DEBUG_PARAMETERS,(void *)b)
 #define ACPI_FUNCTION_TRACE_U32(a,b)    ACPI_FUNCTION_NAME(a) \
  * bad form, but having a separate exit macro is very ugly and difficult to maintain.
  * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros
  * so that "_acpi_function_name" is defined.
+ *
+ * Note: the DO_WHILE0 macro is used to prevent some compilers from complaining
+ * about these constructs.
  */
 #ifdef ACPI_USE_DO_WHILE_0
 #define ACPI_DO_WHILE0(a)               do a while(0)
 #define ACPI_DO_WHILE0(a)               a
 #endif
 
-#define return_VOID                     ACPI_DO_WHILE0 ({acpi_ut_exit(ACPI_DEBUG_PARAMETERS);return;})
-#define return_ACPI_STATUS(s)           ACPI_DO_WHILE0 ({acpi_ut_status_exit(ACPI_DEBUG_PARAMETERS,(s));return((s));})
-#define return_VALUE(s)                 ACPI_DO_WHILE0 ({acpi_ut_value_exit(ACPI_DEBUG_PARAMETERS,(acpi_integer)(s));return((s));})
-#define return_PTR(s)                   ACPI_DO_WHILE0 ({acpi_ut_ptr_exit(ACPI_DEBUG_PARAMETERS,(u8 *)(s));return((s));})
+#define return_VOID                     ACPI_DO_WHILE0 ({ \
+                                                                                       acpi_ut_exit (ACPI_DEBUG_PARAMETERS); \
+                                                                                       return;})
+/*
+ * There are two versions of most of the return macros. The default version is
+ * safer, since it avoids side-effects by guaranteeing that the argument will
+ * not be evaluated twice.
+ *
+ * A less-safe version of the macros is provided for optional use if the
+ * compiler uses excessive CPU stack (for example, this may happen in the
+ * debug case if code optimzation is disabled.)
+ */
+#ifndef ACPI_SIMPLE_RETURN_MACROS
+
+#define return_ACPI_STATUS(s)           ACPI_DO_WHILE0 ({ \
+                                                                                       register acpi_status _s = (s); \
+                                                                                       acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, _s); \
+                                                                                       return (_s); })
+#define return_PTR(s)                   ACPI_DO_WHILE0 ({ \
+                                                                                       register void *_s = (void *) (s); \
+                                                                                       acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) _s); \
+                                                                                       return (_s); })
+#define return_VALUE(s)                 ACPI_DO_WHILE0 ({ \
+                                                                                       register acpi_integer _s = (s); \
+                                                                                       acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, _s); \
+                                                                                       return (_s); })
+#define return_UINT8(s)                 ACPI_DO_WHILE0 ({ \
+                                                                                       register u8 _s = (u8) (s); \
+                                                                                       acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) _s); \
+                                                                                       return (_s); })
+#define return_UINT32(s)                ACPI_DO_WHILE0 ({ \
+                                                                                       register u32 _s = (u32) (s); \
+                                                                                       acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) _s); \
+                                                                                       return (_s); })
+#else                          /* Use original less-safe macros */
+
+#define return_ACPI_STATUS(s)           ACPI_DO_WHILE0 ({ \
+                                                                                       acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, (s)); \
+                                                                                       return((s)); })
+#define return_PTR(s)                   ACPI_DO_WHILE0 ({ \
+                                                                                       acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) (s)); \
+                                                                                       return((s)); })
+#define return_VALUE(s)                 ACPI_DO_WHILE0 ({ \
+                                                                                       acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) (s)); \
+                                                                                       return((s)); })
+#define return_UINT8(s)                 return_VALUE(s)
+#define return_UINT32(s)                return_VALUE(s)
+
+#endif                         /* ACPI_SIMPLE_RETURN_MACROS */
 
 /* Conditional execution */
 
 #define ACPI_DUMP_PATHNAME(a,b,c,d)     acpi_ns_dump_pathname(a,b,c,d)
 #define ACPI_DUMP_RESOURCE_LIST(a)      acpi_rs_dump_resource_list(a)
 #define ACPI_DUMP_BUFFER(a,b)           acpi_ut_dump_buffer((u8 *)a,b,DB_BYTE_DISPLAY,_COMPONENT)
-#define ACPI_BREAK_MSG(a)               acpi_os_signal (ACPI_SIGNAL_BREAKPOINT,(a))
-
-/*
- * Generate INT3 on ACPI_ERROR (Debug only!)
- */
-#define ACPI_ERROR_BREAK
-#ifdef  ACPI_ERROR_BREAK
-#define ACPI_BREAK_ON_ERROR(lvl)        if ((lvl)&ACPI_ERROR) \
-                                                                                       acpi_os_signal(ACPI_SIGNAL_BREAKPOINT,"Fatal error encountered\n")
-#else
-#define ACPI_BREAK_ON_ERROR(lvl)
-#endif
 
 /*
  * Master debug print macros
  *    1) Debug print for the current component is enabled
  *    2) Debug error level or trace level for the print statement is enabled
  */
-#define ACPI_DEBUG_PRINT(pl)            acpi_ut_debug_print ACPI_PARAM_LIST(pl)
-#define ACPI_DEBUG_PRINT_RAW(pl)        acpi_ut_debug_print_raw ACPI_PARAM_LIST(pl)
+#define ACPI_DEBUG_PRINT(plist)         acpi_ut_debug_print plist
+#define ACPI_DEBUG_PRINT_RAW(plist)     acpi_ut_debug_print_raw plist
 
 #else
 /*
  * This is the non-debug case -- make everything go away,
  * leaving no executable debug code!
  */
-#define ACPI_MODULE_NAME(name)
-#define _acpi_module_name ""
-
 #define ACPI_DEBUG_EXEC(a)
 #define ACPI_NORMAL_EXEC(a)             a;
 
 #define ACPI_DUMP_BUFFER(a,b)
 #define ACPI_DEBUG_PRINT(pl)
 #define ACPI_DEBUG_PRINT_RAW(pl)
-#define ACPI_BREAK_MSG(a)
 
 #define return_VOID                     return
 #define return_ACPI_STATUS(s)           return(s)
 #define return_VALUE(s)                 return(s)
+#define return_UINT8(s)                 return(s)
+#define return_UINT32(s)                return(s)
 #define return_PTR(s)                   return(s)
 
 #endif
index 4f9063f3e951af91b66c6d876acb14b3fb1b0dd6..b67da3636899f6a3b03805be169608e1392166a7 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index dd3501f7e5d683bb47110fd47e5b16f838d88be3..b667a804fc8af143124d0d6f1592b9e90994792e 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -263,13 +263,11 @@ u32 acpi_ns_local(acpi_object_type type);
 void
 acpi_ns_report_error(char *module_name,
                     u32 line_number,
-                    u32 component_id,
                     char *internal_name, acpi_status lookup_status);
 
 void
 acpi_ns_report_method_error(char *module_name,
                            u32 line_number,
-                           u32 component_id,
                            char *message,
                            struct acpi_namespace_node *node,
                            char *path, acpi_status lookup_status);
index 4a326ba6d482c99d84cee3db9b822ea4e7f4bcce..d130cfed8d5553714fc51bcf3a691588903d15dc 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -69,7 +69,7 @@
        u8                                      type;               /* acpi_object_type */\
        u16                                     reference_count;    /* For object deletion management */\
        union acpi_operand_object               *next_object;       /* Objects linked to parent NS node */\
-       u8                                      flags; \
+       u8                                      flags;
 
 /* Values for flag byte above */
 
index 64da42992199f58e826aee308277e31ba3cc3a60..e6d78bd9e90ab29fe778b9cc262d0827cf664384 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 68d7edf0f6979ebe87007ed2d215859d11526e99..7785d481dc3ea43f8a503bf3de8e8a9925d35612 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 
 /* Exception level -- used in the global "debug_level" */
 
-#define ACPI_DB_ERROR               ACPI_DEBUG_LEVEL (ACPI_LV_ERROR)
-#define ACPI_DB_WARN                ACPI_DEBUG_LEVEL (ACPI_LV_WARN)
 #define ACPI_DB_INIT                ACPI_DEBUG_LEVEL (ACPI_LV_INIT)
 #define ACPI_DB_DEBUG_OBJECT        ACPI_DEBUG_LEVEL (ACPI_LV_DEBUG_OBJECT)
 #define ACPI_DB_INFO                ACPI_DEBUG_LEVEL (ACPI_LV_INFO)
 #define ACPI_DB_ALL_EXCEPTIONS      ACPI_DEBUG_LEVEL (ACPI_LV_ALL_EXCEPTIONS)
 
+/*
+ * These two levels are essentially obsolete, all instances in the
+ * ACPICA core code have been replaced by REPORT_ERROR and REPORT_WARNING
+ * (Kept here because some drivers may still use them)
+ */
+#define ACPI_DB_ERROR               ACPI_DEBUG_LEVEL (ACPI_LV_ERROR)
+#define ACPI_DB_WARN                ACPI_DEBUG_LEVEL (ACPI_LV_WARN)
+
 /* Trace level -- also used in the global "debug_level" */
 
 #define ACPI_DB_INIT_NAMES          ACPI_DEBUG_LEVEL (ACPI_LV_INIT_NAMES)
index d352d40de1f3210ae66a1571ec73dd5afa857ed2..5a1ff484af3393c41c0e6d8f58e2d52215a0ab5e 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index ccf34f9dac642c4baf08a102bec003ab3ab4c388..b9a39d1009bd49d2177a13b1888ba907edd85a23 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index c1b4e1f882e4a28c19e25e5c3518fed589c3eb11..b425f9bb6d43962da0c4c0b134e31f76635f4b92 100644 (file)
@@ -52,8 +52,8 @@
 /* ACPI PCI Interrupt Link (pci_link.c) */
 
 int acpi_irq_penalty_init(void);
-int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *edge_level,
-                              int *active_high_low, char **name);
+int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
+                              int *polarity, char **name);
 int acpi_pci_link_free_irq(acpi_handle handle);
 
 /* ACPI PCI Interrupt Routing (pci_irq.c) */
index 98e0b8cd14ed81bc4860b706950b99237976aeac..970e9a6372c390d56b1dc67ed01df14a0508998e 100644 (file)
@@ -8,7 +8,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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);
 
 void acpi_os_delete_lock(acpi_handle handle);
 
-unsigned long acpi_os_acquire_lock(acpi_handle handle);
+acpi_cpu_flags acpi_os_acquire_lock(acpi_handle handle);
 
-void acpi_os_release_lock(acpi_handle handle, unsigned long flags);
+void acpi_os_release_lock(acpi_handle handle, acpi_cpu_flags flags);
 
 /*
  * Memory allocation and mapping
index 2a9dbc13b0f2d41a1cdbb773bf1613cd75964ec5..66cf2ecef57a1264959c09aef7844f8ffed8a68a 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * 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);
 acpi_status
 acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data);
 
+acpi_status
+acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags);
+
 /*
  * Object manipulation and enumeration
  */
@@ -268,6 +271,12 @@ typedef
 acpi_status(*ACPI_WALK_RESOURCE_CALLBACK) (struct acpi_resource * resource,
                                           void *context);
 
+acpi_status
+acpi_get_vendor_resource(acpi_handle device_handle,
+                        char *name,
+                        struct acpi_vendor_uuid *uuid,
+                        struct acpi_buffer *ret_buffer);
+
 acpi_status
 acpi_get_current_resources(acpi_handle device_handle,
                           struct acpi_buffer *ret_buffer);
@@ -280,7 +289,7 @@ acpi_get_possible_resources(acpi_handle device_handle,
 
 acpi_status
 acpi_walk_resources(acpi_handle device_handle,
-                   char *path,
+                   char *name,
                    ACPI_WALK_RESOURCE_CALLBACK user_function, void *context);
 
 acpi_status
index 38e798b05d088f826ca56f1ff67ba91edcb303c5..fa02e8083381b61d9c60b17b6d233b57eb5154da 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef __ACRESRC_H__
 #define __ACRESRC_H__
 
-/*
- *  Function prototypes called from Acpi* APIs
- */
-acpi_status
-acpi_rs_get_prt_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
+/* Need the AML resource descriptor structs */
 
-acpi_status
-acpi_rs_get_crs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
+#include "amlresrc.h"
 
-#ifdef ACPI_FUTURE_USAGE
-acpi_status
-acpi_rs_get_prs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
-#endif                         /* ACPI_FUTURE_USAGE */
-
-acpi_status
-acpi_rs_get_method_data(acpi_handle handle,
-                       char *path, struct acpi_buffer *ret_buffer);
+/*
+ * If possible, pack the following structures to byte alignment, since we
+ * don't care about performance for debug output
+ */
+#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
+#pragma pack(1)
+#endif
 
-acpi_status
-acpi_rs_set_srs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
+/*
+ * Individual entry for the resource conversion tables
+ */
+typedef const struct acpi_rsconvert_info {
+       u8 opcode;
+       u8 resource_offset;
+       u8 aml_offset;
+       u8 value;
+
+} acpi_rsconvert_info;
+
+/* Resource conversion opcodes */
+
+#define ACPI_RSC_INITGET                0
+#define ACPI_RSC_INITSET                1
+#define ACPI_RSC_FLAGINIT               2
+#define ACPI_RSC_1BITFLAG               3
+#define ACPI_RSC_2BITFLAG               4
+#define ACPI_RSC_COUNT                  5
+#define ACPI_RSC_COUNT16                6
+#define ACPI_RSC_LENGTH                 7
+#define ACPI_RSC_MOVE8                  8
+#define ACPI_RSC_MOVE16                 9
+#define ACPI_RSC_MOVE32                 10
+#define ACPI_RSC_MOVE64                 11
+#define ACPI_RSC_SET8                   12
+#define ACPI_RSC_DATA8                  13
+#define ACPI_RSC_ADDRESS                14
+#define ACPI_RSC_SOURCE                 15
+#define ACPI_RSC_SOURCEX                16
+#define ACPI_RSC_BITMASK                17
+#define ACPI_RSC_BITMASK16              18
+#define ACPI_RSC_EXIT_NE                19
+#define ACPI_RSC_EXIT_LE                20
+
+/* Resource Conversion sub-opcodes */
+
+#define ACPI_RSC_COMPARE_AML_LENGTH     0
+#define ACPI_RSC_COMPARE_VALUE          1
+
+#define ACPI_RSC_TABLE_SIZE(d)          (sizeof (d) / sizeof (struct acpi_rsconvert_info))
+
+#define ACPI_RS_OFFSET(f)               (u8) ACPI_OFFSET (struct acpi_resource,f)
+#define AML_OFFSET(f)                   (u8) ACPI_OFFSET (union aml_resource,f)
+
+typedef const struct acpi_rsdump_info {
+       u8 opcode;
+       u8 offset;
+       char *name;
+       const char **pointer;
+
+} acpi_rsdump_info;
+
+/* Values for the Opcode field above */
+
+#define ACPI_RSD_TITLE                  0
+#define ACPI_RSD_LITERAL                1
+#define ACPI_RSD_STRING                 2
+#define ACPI_RSD_UINT8                  3
+#define ACPI_RSD_UINT16                 4
+#define ACPI_RSD_UINT32                 5
+#define ACPI_RSD_UINT64                 6
+#define ACPI_RSD_1BITFLAG               7
+#define ACPI_RSD_2BITFLAG               8
+#define ACPI_RSD_SHORTLIST              9
+#define ACPI_RSD_LONGLIST               10
+#define ACPI_RSD_DWORDLIST              11
+#define ACPI_RSD_ADDRESS                12
+#define ACPI_RSD_SOURCE                 13
+
+/* restore default alignment */
+
+#pragma pack()
+
+/* Resource tables indexed by internal resource type */
+
+extern const u8 acpi_gbl_aml_resource_sizes[];
+extern struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[];
+
+/* Resource tables indexed by raw AML resource descriptor type */
+
+extern const u8 acpi_gbl_resource_struct_sizes[];
+extern struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[];
+
+struct acpi_vendor_walk_info {
+       struct acpi_vendor_uuid *uuid;
+       struct acpi_buffer *buffer;
+       acpi_status status;
+};
 
+/*
+ * rscreate
+ */
 acpi_status
-acpi_rs_create_resource_list(union acpi_operand_object *byte_stream_buffer,
+acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,
                             struct acpi_buffer *output_buffer);
 
 acpi_status
-acpi_rs_create_byte_stream(struct acpi_resource *linked_list_buffer,
-                          struct acpi_buffer *output_buffer);
+acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer,
+                            struct acpi_buffer *output_buffer);
 
 acpi_status
 acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
                                 struct acpi_buffer *output_buffer);
 
 /*
- * rsdump
+ * rsutils
  */
-#ifdef ACPI_FUTURE_USAGE
-void acpi_rs_dump_resource_list(struct acpi_resource *resource);
-
-void acpi_rs_dump_irq_list(u8 * route_table);
-#endif                         /* ACPI_FUTURE_USAGE */
-
-/*
- * rscalc
- */
-acpi_status
-acpi_rs_get_byte_stream_start(u8 * byte_stream_buffer,
-                             u8 ** byte_stream_start, u32 * size);
-
-acpi_status
-acpi_rs_get_list_length(u8 * byte_stream_buffer,
-                       u32 byte_stream_buffer_length, acpi_size * size_needed);
-
-acpi_status
-acpi_rs_get_byte_stream_length(struct acpi_resource *linked_list_buffer,
-                              acpi_size * size_needed);
-
-acpi_status
-acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
-                                    acpi_size * buffer_size_needed);
-
-acpi_status
-acpi_rs_byte_stream_to_list(u8 * byte_stream_buffer,
-                           u32 byte_stream_buffer_length, u8 * output_buffer);
-
-acpi_status
-acpi_rs_list_to_byte_stream(struct acpi_resource *linked_list,
-                           acpi_size byte_stream_size_needed,
-                           u8 * output_buffer);
-
-acpi_status
-acpi_rs_io_resource(u8 * byte_stream_buffer,
-                   acpi_size * bytes_consumed,
-                   u8 ** output_buffer, acpi_size * structure_size);
-
-acpi_status
-acpi_rs_fixed_io_resource(u8 * byte_stream_buffer,
-                         acpi_size * bytes_consumed,
-                         u8 ** output_buffer, acpi_size * structure_size);
-
 acpi_status
-acpi_rs_io_stream(struct acpi_resource *linked_list,
-                 u8 ** output_buffer, acpi_size * bytes_consumed);
-
-acpi_status
-acpi_rs_fixed_io_stream(struct acpi_resource *linked_list,
-                       u8 ** output_buffer, acpi_size * bytes_consumed);
-
-acpi_status
-acpi_rs_irq_resource(u8 * byte_stream_buffer,
-                    acpi_size * bytes_consumed,
-                    u8 ** output_buffer, acpi_size * structure_size);
-
-acpi_status
-acpi_rs_irq_stream(struct acpi_resource *linked_list,
-                  u8 ** output_buffer, acpi_size * bytes_consumed);
-
-acpi_status
-acpi_rs_dma_resource(u8 * byte_stream_buffer,
-                    acpi_size * bytes_consumed,
-                    u8 ** output_buffer, acpi_size * structure_size);
+acpi_rs_get_prt_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
 
 acpi_status
-acpi_rs_dma_stream(struct acpi_resource *linked_list,
-                  u8 ** output_buffer, acpi_size * bytes_consumed);
+acpi_rs_get_crs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
 
+#ifdef ACPI_FUTURE_USAGE
 acpi_status
-acpi_rs_address16_resource(u8 * byte_stream_buffer,
-                          acpi_size * bytes_consumed,
-                          u8 ** output_buffer, acpi_size * structure_size);
+acpi_rs_get_prs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
+#endif                         /* ACPI_FUTURE_USAGE */
 
 acpi_status
-acpi_rs_address16_stream(struct acpi_resource *linked_list,
-                        u8 ** output_buffer, acpi_size * bytes_consumed);
+acpi_rs_get_method_data(acpi_handle handle,
+                       char *path, struct acpi_buffer *ret_buffer);
 
 acpi_status
-acpi_rs_address32_resource(u8 * byte_stream_buffer,
-                          acpi_size * bytes_consumed,
-                          u8 ** output_buffer, acpi_size * structure_size);
+acpi_rs_set_srs_method_data(acpi_handle handle, struct acpi_buffer *ret_buffer);
 
+/*
+ * rscalc
+ */
 acpi_status
-acpi_rs_address32_stream(struct acpi_resource *linked_list,
-                        u8 ** output_buffer, acpi_size * bytes_consumed);
+acpi_rs_get_list_length(u8 * aml_buffer,
+                       u32 aml_buffer_length, acpi_size * size_needed);
 
 acpi_status
-acpi_rs_address64_resource(u8 * byte_stream_buffer,
-                          acpi_size * bytes_consumed,
-                          u8 ** output_buffer, acpi_size * structure_size);
+acpi_rs_get_aml_length(struct acpi_resource *linked_list_buffer,
+                      acpi_size * size_needed);
 
 acpi_status
-acpi_rs_address64_stream(struct acpi_resource *linked_list,
-                        u8 ** output_buffer, acpi_size * bytes_consumed);
+acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
+                                    acpi_size * buffer_size_needed);
 
 acpi_status
-acpi_rs_start_depend_fns_resource(u8 * byte_stream_buffer,
-                                 acpi_size * bytes_consumed,
-                                 u8 ** output_buffer,
-                                 acpi_size * structure_size);
+acpi_rs_convert_aml_to_resources(u8 * aml_buffer,
+                                u32 aml_buffer_length, u8 * output_buffer);
 
 acpi_status
-acpi_rs_end_depend_fns_resource(u8 * byte_stream_buffer,
-                               acpi_size * bytes_consumed,
-                               u8 ** output_buffer,
-                               acpi_size * structure_size);
+acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
+                                acpi_size aml_size_needed, u8 * output_buffer);
 
-acpi_status
-acpi_rs_start_depend_fns_stream(struct acpi_resource *linked_list,
-                               u8 ** output_buffer,
-                               acpi_size * bytes_consumed);
+/*
+ * rsaddr
+ */
+void
+acpi_rs_set_address_common(union aml_resource *aml,
+                          struct acpi_resource *resource);
 
-acpi_status
-acpi_rs_end_depend_fns_stream(struct acpi_resource *linked_list,
-                             u8 ** output_buffer, acpi_size * bytes_consumed);
+u8
+acpi_rs_get_address_common(struct acpi_resource *resource,
+                          union aml_resource *aml);
 
+/*
+ * rsmisc
+ */
 acpi_status
-acpi_rs_memory24_resource(u8 * byte_stream_buffer,
-                         acpi_size * bytes_consumed,
-                         u8 ** output_buffer, acpi_size * structure_size);
+acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
+                               union aml_resource *aml,
+                               struct acpi_rsconvert_info *info);
 
 acpi_status
-acpi_rs_memory24_stream(struct acpi_resource *linked_list,
-                       u8 ** output_buffer, acpi_size * bytes_consumed);
+acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
+                               union aml_resource *aml,
+                               struct acpi_rsconvert_info *info);
 
-acpi_status
-acpi_rs_memory32_range_resource(u8 * byte_stream_buffer,
-                               acpi_size * bytes_consumed,
-                               u8 ** output_buffer,
-                               acpi_size * structure_size);
+/*
+ * rsutils
+ */
+void
+acpi_rs_move_data(void *destination,
+                 void *source, u16 item_count, u8 move_type);
 
-acpi_status
-acpi_rs_fixed_memory32_resource(u8 * byte_stream_buffer,
-                               acpi_size * bytes_consumed,
-                               u8 ** output_buffer,
-                               acpi_size * structure_size);
+u8 acpi_rs_decode_bitmask(u16 mask, u8 * list);
 
-acpi_status
-acpi_rs_memory32_range_stream(struct acpi_resource *linked_list,
-                             u8 ** output_buffer, acpi_size * bytes_consumed);
+u16 acpi_rs_encode_bitmask(u8 * list, u8 count);
 
-acpi_status
-acpi_rs_fixed_memory32_stream(struct acpi_resource *linked_list,
-                             u8 ** output_buffer, acpi_size * bytes_consumed);
+acpi_rs_length
+acpi_rs_get_resource_source(acpi_rs_length resource_length,
+                           acpi_rs_length minimum_length,
+                           struct acpi_resource_source *resource_source,
+                           union aml_resource *aml, char *string_ptr);
 
-acpi_status
-acpi_rs_extended_irq_resource(u8 * byte_stream_buffer,
-                             acpi_size * bytes_consumed,
-                             u8 ** output_buffer, acpi_size * structure_size);
+acpi_rsdesc_size
+acpi_rs_set_resource_source(union aml_resource *aml,
+                           acpi_rs_length minimum_length,
+                           struct acpi_resource_source *resource_source);
 
-acpi_status
-acpi_rs_extended_irq_stream(struct acpi_resource *linked_list,
-                           u8 ** output_buffer, acpi_size * bytes_consumed);
+void
+acpi_rs_set_resource_header(u8 descriptor_type,
+                           acpi_rsdesc_size total_length,
+                           union aml_resource *aml);
 
-acpi_status
-acpi_rs_end_tag_resource(u8 * byte_stream_buffer,
-                        acpi_size * bytes_consumed,
-                        u8 ** output_buffer, acpi_size * structure_size);
+void
+acpi_rs_set_resource_length(acpi_rsdesc_size total_length,
+                           union aml_resource *aml);
 
-acpi_status
-acpi_rs_end_tag_stream(struct acpi_resource *linked_list,
-                      u8 ** output_buffer, acpi_size * bytes_consumed);
+/*
+ * rsdump
+ */
+void acpi_rs_dump_resource_list(struct acpi_resource *resource);
 
-acpi_status
-acpi_rs_vendor_resource(u8 * byte_stream_buffer,
-                       acpi_size * bytes_consumed,
-                       u8 ** output_buffer, acpi_size * structure_size);
+void acpi_rs_dump_irq_list(u8 * route_table);
 
-acpi_status
-acpi_rs_vendor_stream(struct acpi_resource *linked_list,
-                     u8 ** output_buffer, acpi_size * bytes_consumed);
+/*
+ * Resource conversion tables
+ */
+extern struct acpi_rsconvert_info acpi_rs_convert_dma[];
+extern struct acpi_rsconvert_info acpi_rs_convert_end_dpf[];
+extern struct acpi_rsconvert_info acpi_rs_convert_io[];
+extern struct acpi_rsconvert_info acpi_rs_convert_fixed_io[];
+extern struct acpi_rsconvert_info acpi_rs_convert_end_tag[];
+extern struct acpi_rsconvert_info acpi_rs_convert_memory24[];
+extern struct acpi_rsconvert_info acpi_rs_convert_generic_reg[];
+extern struct acpi_rsconvert_info acpi_rs_convert_memory32[];
+extern struct acpi_rsconvert_info acpi_rs_convert_fixed_memory32[];
+extern struct acpi_rsconvert_info acpi_rs_convert_address32[];
+extern struct acpi_rsconvert_info acpi_rs_convert_address16[];
+extern struct acpi_rsconvert_info acpi_rs_convert_ext_irq[];
+extern struct acpi_rsconvert_info acpi_rs_convert_address64[];
+extern struct acpi_rsconvert_info acpi_rs_convert_ext_address64[];
+
+/* These resources require separate get/set tables */
+
+extern struct acpi_rsconvert_info acpi_rs_get_irq[];
+extern struct acpi_rsconvert_info acpi_rs_get_start_dpf[];
+extern struct acpi_rsconvert_info acpi_rs_get_vendor_small[];
+extern struct acpi_rsconvert_info acpi_rs_get_vendor_large[];
+
+extern struct acpi_rsconvert_info acpi_rs_set_irq[];
+extern struct acpi_rsconvert_info acpi_rs_set_start_dpf[];
+extern struct acpi_rsconvert_info acpi_rs_set_vendor[];
+
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+/*
+ * rsinfo
+ */
+extern struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[];
 
-u8 acpi_rs_get_resource_type(u8 resource_start_byte);
+/*
+ * rsdump
+ */
+extern struct acpi_rsdump_info acpi_rs_dump_irq[];
+extern struct acpi_rsdump_info acpi_rs_dump_dma[];
+extern struct acpi_rsdump_info acpi_rs_dump_start_dpf[];
+extern struct acpi_rsdump_info acpi_rs_dump_end_dpf[];
+extern struct acpi_rsdump_info acpi_rs_dump_io[];
+extern struct acpi_rsdump_info acpi_rs_dump_fixed_io[];
+extern struct acpi_rsdump_info acpi_rs_dump_vendor[];
+extern struct acpi_rsdump_info acpi_rs_dump_end_tag[];
+extern struct acpi_rsdump_info acpi_rs_dump_memory24[];
+extern struct acpi_rsdump_info acpi_rs_dump_memory32[];
+extern struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[];
+extern struct acpi_rsdump_info acpi_rs_dump_address16[];
+extern struct acpi_rsdump_info acpi_rs_dump_address32[];
+extern struct acpi_rsdump_info acpi_rs_dump_address64[];
+extern struct acpi_rsdump_info acpi_rs_dump_ext_address64[];
+extern struct acpi_rsdump_info acpi_rs_dump_ext_irq[];
+extern struct acpi_rsdump_info acpi_rs_dump_generic_reg[];
+#endif
 
 #endif                         /* __ACRESRC_H__ */
index 99d2353398016c3bb47df71b892672f0380486e3..d8c1c2cdac0cf6db3dc1b92c3c33840fa9f89540 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index f92c1858b8084f5bca9f455fcf70dc8b81942f70..30a47542e1c8ed109407d4771dd5969a3047f508 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index a46f406e1c94528c79034886dc94c0c130535116..ed53f842dad48fe95785dc700b2d9960d5292667 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef __ACTBL_H__
 #define __ACTBL_H__
 
+/*
+ * Note about bitfields: The u8 type is used for bitfields in ACPI tables.
+ * This is the only type that is even remotely portable. Anything else is not
+ * portable, so do not use any other bitfield types.
+ */
+
 /*
  *  Values for description table header signatures
  */
index 67312c3a915a711b044f209c65bc8571305840dd..cd428d57add0fc3731494759ae94802405155134 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 50305ce2681abf38f8659bed86a44df6f3cf0e8d..dfc7ac1094bbb9b504d9e8af2d9ce0ec228ae1a3 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 6213b27516e8b583dc852475c5cf4f04e9eb26ee..7ca89cde706eaf301f214453d7d01594e0ddecec 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef __ACTYPES_H__
 #define __ACTYPES_H__
 
-/*! [Begin] no source code translation (keep the typedefs) */
+/*
+ * ACPI_MACHINE_WIDTH must be specified in an OS- or compiler-dependent header
+ * and must be either 16, 32, or 64
+ */
+#ifndef ACPI_MACHINE_WIDTH
+#error ACPI_MACHINE_WIDTH not defined
+#endif
+
+/*! [Begin] no source code translation */
 
 /*
  * Data type ranges
 #define ACPI_UINT64_MAX                 (UINT64)(~((UINT64) 0))        /* 0xFFFFFFFFFFFFFFFF */
 #define ACPI_ASCII_MAX                  0x7F
 
-#ifdef DEFINE_ALTERNATE_TYPES
 /*
- * Types used only in translated source, defined here to enable
- * cross-platform compilation only.
+ * Architecture-specific ACPICA Subsystem Data Types
+ *
+ * The goal of these types is to provide source code portability across
+ * 16-bit, 32-bit, and 64-bit targets.
+ *
+ * 1) The following types are of fixed size for all targets (16/32/64):
+ *
+ * BOOLEAN      Logical boolean
+ *
+ * UINT8        8-bit  (1 byte) unsigned value
+ * UINT16       16-bit (2 byte) unsigned value
+ * UINT32       32-bit (4 byte) unsigned value
+ * UINT64       64-bit (8 byte) unsigned value
+ *
+ * INT16        16-bit (2 byte) signed value
+ * INT32        32-bit (4 byte) signed value
+ * INT64        64-bit (8 byte) signed value
+ *
+ * COMPILER_DEPENDENT_UINT64/INT64 - These types are defined in the
+ * compiler-dependent header(s) and were introduced because there is no common
+ * 64-bit integer type across the various compilation models, as shown in
+ * the table below.
+ *
+ * Datatype  LP64 ILP64 LLP64 ILP32 LP32 16bit
+ * char      8    8     8     8     8    8
+ * short     16   16    16    16    16   16
+ * _int32         32
+ * int       32   64    32    32    16   16
+ * long      64   64    32    32    32   32
+ * long long            64    64
+ * pointer   64   64    64    32    32   32
+ *
+ * Note: ILP64 and LP32 are currently not supported.
+ *
+ *
+ * 2) These types represent the native word size of the target mode of the
+ * processor, and may be 16-bit, 32-bit, or 64-bit as required. They are
+ * usually used for memory allocation, efficient loop counters, and array
+ * indexes. The types are similar to the size_t type in the C library and are
+ * required because there is no C type that consistently represents the native
+ * data width.
+ *
+ * ACPI_SIZE        16/32/64-bit unsigned value
+ * ACPI_NATIVE_UINT 16/32/64-bit unsigned value
+ * ACPI_NATIVE_INT  16/32/64-bit signed value
+ *
  */
-typedef int s32;
-typedef unsigned char u8;
-typedef unsigned short u16;
-typedef unsigned int u32;
-typedef COMPILER_DEPENDENT_UINT64 u64;
-
-#endif
 
-/*
- * Data types - Fixed across all compilation models (16/32/64)
+/*******************************************************************************
  *
- * BOOLEAN          Logical Boolean.
- * INT8             8-bit  (1 byte) signed value
- * UINT8            8-bit  (1 byte) unsigned value
- * INT16            16-bit (2 byte) signed value
- * UINT16           16-bit (2 byte) unsigned value
- * INT32            32-bit (4 byte) signed value
- * UINT32           32-bit (4 byte) unsigned value
- * INT64            64-bit (8 byte) signed value
- * UINT64           64-bit (8 byte) unsigned value
- * ACPI_NATIVE_INT  32-bit on IA-32, 64-bit on IA-64 signed value
- * ACPI_NATIVE_UINT 32-bit on IA-32, 64-bit on IA-64 unsigned value
- */
+ * Common types for all compilers, all targets
+ *
+ ******************************************************************************/
 
-#ifndef ACPI_MACHINE_WIDTH
-#error ACPI_MACHINE_WIDTH not defined
-#endif
+typedef unsigned char BOOLEAN;
+typedef unsigned char UINT8;
+typedef unsigned short UINT16;
+typedef COMPILER_DEPENDENT_UINT64 UINT64;
+typedef COMPILER_DEPENDENT_INT64 INT64;
+
+/*! [End] no source code translation !*/
+
+/*******************************************************************************
+ *
+ * Types specific to 64-bit targets
+ *
+ ******************************************************************************/
 
 #if ACPI_MACHINE_WIDTH == 64
 
-/*! [Begin] no source code translation (keep the typedefs) */
+/*! [Begin] no source code translation (keep the typedefs as-is) */
 
-/*
- * 64-bit type definitions
- */
-typedef unsigned char UINT8;
-typedef unsigned char BOOLEAN;
-typedef unsigned short UINT16;
-typedef int INT32;
 typedef unsigned int UINT32;
-typedef COMPILER_DEPENDENT_INT64 INT64;
-typedef COMPILER_DEPENDENT_UINT64 UINT64;
+typedef int INT32;
 
 /*! [End] no source code translation !*/
 
-typedef s64 acpi_native_int;
 typedef u64 acpi_native_uint;
+typedef s64 acpi_native_int;
 
 typedef u64 acpi_table_ptr;
 typedef u64 acpi_io_address;
 typedef u64 acpi_physical_address;
-typedef u64 acpi_size;
 
-#define ALIGNED_ADDRESS_BOUNDARY        0x00000008     /* No hardware alignment support in IA64 */
-#define ACPI_USE_NATIVE_DIVIDE /* Native 64-bit integer support */
 #define ACPI_MAX_PTR                    ACPI_UINT64_MAX
 #define ACPI_SIZE_MAX                   ACPI_UINT64_MAX
 
-#elif ACPI_MACHINE_WIDTH == 16
-
-/*! [Begin] no source code translation (keep the typedefs) */
+#define ALIGNED_ADDRESS_BOUNDARY        0x00000008
+#define ACPI_USE_NATIVE_DIVIDE /* Has native 64-bit integer support */
 
 /*
- * 16-bit type definitions
+ * In the case of the Itanium Processor Family (IPF), the hardware does not
+ * support misaligned memory transfers. Set the MISALIGNMENT_NOT_SUPPORTED flag
+ * to indicate that special precautions must be taken to avoid alignment faults.
+ * (IA64 or ia64 is currently used by existing compilers to indicate IPF.)
+ *
+ * Note: Em64_t and other X86-64 processors support misaligned transfers,
+ * so there is no need to define this flag.
  */
-typedef unsigned char UINT8;
-typedef unsigned char BOOLEAN;
-typedef unsigned int UINT16;
-typedef long INT32;
-typedef int INT16;
-typedef unsigned long UINT32;
+#if defined (__IA64__) || defined (__ia64__)
+#define ACPI_MISALIGNMENT_NOT_SUPPORTED
+#endif
 
-struct {
-       UINT32 Lo;
-       UINT32 Hi;
-};
+/*******************************************************************************
+ *
+ * Types specific to 32-bit targets
+ *
+ ******************************************************************************/
+
+#elif ACPI_MACHINE_WIDTH == 32
+
+/*! [Begin] no source code translation (keep the typedefs as-is) */
+
+typedef unsigned int UINT32;
+typedef int INT32;
+
+/*! [End] no source code translation !*/
+
+typedef u32 acpi_native_uint;
+typedef s32 acpi_native_int;
+
+typedef u64 acpi_table_ptr;
+typedef u32 acpi_io_address;
+typedef u64 acpi_physical_address;
+
+#define ACPI_MAX_PTR                    ACPI_UINT32_MAX
+#define ACPI_SIZE_MAX                   ACPI_UINT32_MAX
+
+#define ALIGNED_ADDRESS_BOUNDARY        0x00000004
+
+/*******************************************************************************
+ *
+ * Types specific to 16-bit targets
+ *
+ ******************************************************************************/
+
+#elif ACPI_MACHINE_WIDTH == 16
+
+/*! [Begin] no source code translation (keep the typedefs as-is) */
+
+typedef unsigned long UINT32;
+typedef short INT16;
+typedef long INT32;
 
 /*! [End] no source code translation !*/
 
@@ -148,61 +219,84 @@ typedef s16 acpi_native_int;
 typedef u32 acpi_table_ptr;
 typedef u32 acpi_io_address;
 typedef char *acpi_physical_address;
-typedef u16 acpi_size;
 
-#define ALIGNED_ADDRESS_BOUNDARY        0x00000002
-#define ACPI_MISALIGNED_TRANSFERS
-#define ACPI_USE_NATIVE_DIVIDE /* No 64-bit integers, ok to use native divide */
 #define ACPI_MAX_PTR                    ACPI_UINT16_MAX
 #define ACPI_SIZE_MAX                   ACPI_UINT16_MAX
 
-/*
- * (16-bit only) internal integers must be 32-bits, so
- * 64-bit integers cannot be supported
- */
+#define ALIGNED_ADDRESS_BOUNDARY        0x00000002
+#define ACPI_USE_NATIVE_DIVIDE /* No 64-bit integers, ok to use native divide */
+
+/* 64-bit integers cannot be supported */
+
 #define ACPI_NO_INTEGER64_SUPPORT
 
-#elif ACPI_MACHINE_WIDTH == 32
+#else
 
-/*! [Begin] no source code translation (keep the typedefs) */
+/* ACPI_MACHINE_WIDTH must be either 64, 32, or 16 */
 
-/*
- * 32-bit type definitions (default)
- */
-typedef unsigned char UINT8;
-typedef unsigned char BOOLEAN;
-typedef unsigned short UINT16;
-typedef int INT32;
-typedef unsigned int UINT32;
-typedef COMPILER_DEPENDENT_INT64 INT64;
-typedef COMPILER_DEPENDENT_UINT64 UINT64;
+#error unknown ACPI_MACHINE_WIDTH
+#endif
 
-/*! [End] no source code translation !*/
+/* Variable-width type, used instead of clib size_t */
 
-typedef s32 acpi_native_int;
-typedef u32 acpi_native_uint;
+typedef acpi_native_uint acpi_size;
 
-typedef u64 acpi_table_ptr;
-typedef u32 acpi_io_address;
-typedef u64 acpi_physical_address;
-typedef u32 acpi_size;
+/*******************************************************************************
+ *
+ * OS- or compiler-dependent types
+ *
+ * If the defaults below are not appropriate for the host system, they can
+ * be defined in the compiler-specific or OS-specific header, and this will
+ * take precedence.
+ *
+ ******************************************************************************/
 
-#define ALIGNED_ADDRESS_BOUNDARY        0x00000004
-#define ACPI_MISALIGNED_TRANSFERS
-#define ACPI_MAX_PTR                    ACPI_UINT32_MAX
-#define ACPI_SIZE_MAX                   ACPI_UINT32_MAX
+/* Use C99 uintptr_t for pointer casting if available, "void *" otherwise */
 
-#else
-#error unknown ACPI_MACHINE_WIDTH
+#ifndef acpi_uintptr_t
+#define acpi_uintptr_t                          void *
 #endif
 
 /*
- * This type is used for bitfields in ACPI tables. The only type that is
- * even remotely portable is u8. Anything else is not portable, so
- * do not add any more bitfield types.
+ * If acpi_cache_t was not defined in the OS-dependent header,
+ * define it now. This is typically the case where the local cache
+ * manager implementation is to be used (ACPI_USE_LOCAL_CACHE)
+ */
+#ifndef acpi_cache_t
+#define acpi_cache_t                            struct acpi_memory_list
+#endif
+
+/*
+ * Allow the CPU flags word to be defined per-OS to simplify the use of the
+ * lock and unlock OSL interfaces.
+ */
+#ifndef acpi_cpu_flags
+#define acpi_cpu_flags                          acpi_native_uint
+#endif
+
+/*
+ * ACPI_PRINTF_LIKE is used to tag functions as "printf-like" because
+ * some compilers can catch printf format string problems
  */
-typedef u8 UINT8_BIT;
-typedef acpi_native_uint ACPI_PTRDIFF;
+#ifndef ACPI_PRINTF_LIKE
+#define ACPI_PRINTF_LIKE(c)
+#endif
+
+/*
+ * Some compilers complain about unused variables. Sometimes we don't want to
+ * use all the variables (for example, _acpi_module_name). This allows us
+ * to to tell the compiler in a per-variable manner that a variable
+ * is unused
+ */
+#ifndef ACPI_UNUSED_VAR
+#define ACPI_UNUSED_VAR
+#endif
+
+/*******************************************************************************
+ *
+ * Independent types
+ *
+ ******************************************************************************/
 
 /*
  * Pointer overlays to avoid lots of typecasting for
@@ -234,18 +328,8 @@ struct acpi_pointer {
 #define ACPI_LOGMODE_PHYSPTR            ACPI_LOGICAL_ADDRESSING  | ACPI_PHYSICAL_POINTER
 #define ACPI_LOGMODE_LOGPTR             ACPI_LOGICAL_ADDRESSING  | ACPI_LOGICAL_POINTER
 
-/*
- * If acpi_cache_t was not defined in the OS-dependent header,
- * define it now. This is typically the case where the local cache
- * manager implementation is to be used (ACPI_USE_LOCAL_CACHE)
- */
-#ifndef acpi_cache_t
-#define acpi_cache_t                            struct acpi_memory_list
-#endif
+/* Logical defines and NULL */
 
-/*
- * Useful defines
- */
 #ifdef FALSE
 #undef FALSE
 #endif
@@ -261,12 +345,12 @@ struct acpi_pointer {
 #endif
 
 /*
- * Local datatypes
+ * Mescellaneous types
  */
 typedef u32 acpi_status;       /* All ACPI Exceptions */
 typedef u32 acpi_name;         /* 4-byte ACPI name */
 typedef char *acpi_string;     /* Null terminated ASCII string */
-typedef void *acpi_handle;     /* Actually a ptr to an Node */
+typedef void *acpi_handle;     /* Actually a ptr to a NS Node */
 
 struct uint64_struct {
        u32 lo;
@@ -323,7 +407,7 @@ typedef u64 acpi_integer;
 /*
  * Constants with special meanings
  */
-#define ACPI_ROOT_OBJECT                (acpi_handle) ACPI_PTR_ADD (char, NULL, ACPI_MAX_PTR)
+#define ACPI_ROOT_OBJECT                ACPI_ADD_PTR (acpi_handle, NULL, ACPI_MAX_PTR)
 
 /*
  * Initialization sequence
@@ -469,37 +553,6 @@ typedef u32 acpi_object_type;
 #define ACPI_TYPE_INVALID               0x1E
 #define ACPI_TYPE_NOT_FOUND             0xFF
 
-/*
- * Bitmapped ACPI types.  Used internally only
- */
-#define ACPI_BTYPE_ANY                  0x00000000
-#define ACPI_BTYPE_INTEGER              0x00000001
-#define ACPI_BTYPE_STRING               0x00000002
-#define ACPI_BTYPE_BUFFER               0x00000004
-#define ACPI_BTYPE_PACKAGE              0x00000008
-#define ACPI_BTYPE_FIELD_UNIT           0x00000010
-#define ACPI_BTYPE_DEVICE               0x00000020
-#define ACPI_BTYPE_EVENT                0x00000040
-#define ACPI_BTYPE_METHOD               0x00000080
-#define ACPI_BTYPE_MUTEX                0x00000100
-#define ACPI_BTYPE_REGION               0x00000200
-#define ACPI_BTYPE_POWER                0x00000400
-#define ACPI_BTYPE_PROCESSOR            0x00000800
-#define ACPI_BTYPE_THERMAL              0x00001000
-#define ACPI_BTYPE_BUFFER_FIELD         0x00002000
-#define ACPI_BTYPE_DDB_HANDLE           0x00004000
-#define ACPI_BTYPE_DEBUG_OBJECT         0x00008000
-#define ACPI_BTYPE_REFERENCE            0x00010000
-#define ACPI_BTYPE_RESOURCE             0x00020000
-
-#define ACPI_BTYPE_COMPUTE_DATA         (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER)
-
-#define ACPI_BTYPE_DATA                 (ACPI_BTYPE_COMPUTE_DATA  | ACPI_BTYPE_PACKAGE)
-#define ACPI_BTYPE_DATA_REFERENCE       (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE)
-#define ACPI_BTYPE_DEVICE_OBJECTS       (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR)
-#define ACPI_BTYPE_OBJECTS_AND_REFS     0x0001FFFF     /* ARG or LOCAL */
-#define ACPI_BTYPE_ALL_OBJECTS          0x0000FFFF
-
 /*
  * All I/O
  */
@@ -853,6 +906,14 @@ struct acpi_compatible_id_list {
 #define ACPI_VALID_CID                  0x0010
 #define ACPI_VALID_SXDS                 0x0020
 
+/* Flags for _STA method */
+
+#define ACPI_STA_DEVICE_PRESENT         0x01
+#define ACPI_STA_DEVICE_ENABLED         0x02
+#define ACPI_STA_DEVICE_UI              0x04
+#define ACPI_STA_DEVICE_OK              0x08
+#define ACPI_STA_BATTERY_PRESENT        0x10
+
 #define ACPI_COMMON_OBJ_INFO \
        acpi_object_type                    type;           /* ACPI object type */ \
        acpi_name                           name        /* ACPI object Name */
@@ -895,6 +956,8 @@ struct acpi_mem_space_context {
 /*
  * Definitions for Resource Attributes
  */
+typedef u16 acpi_rs_length;    /* Resource Length field is fixed at 16 bits */
+typedef u32 acpi_rsdesc_size;  /* Max Resource Descriptor size is (length+3) = (64_k-1)+3 */
 
 /*
  *  Memory Attributes
@@ -916,7 +979,9 @@ struct acpi_mem_space_context {
 #define ACPI_ISA_ONLY_RANGES            (u8) 0x02
 #define ACPI_ENTIRE_RANGE               (ACPI_NON_ISA_ONLY_RANGES | ACPI_ISA_ONLY_RANGES)
 
-#define ACPI_SPARSE_TRANSLATION         (u8) 0x03
+/* Type of translation - 1=Sparse, 0=Dense */
+
+#define ACPI_SPARSE_TRANSLATION         (u8) 0x01
 
 /*
  *  IO Port Descriptor Decode
@@ -927,8 +992,8 @@ struct acpi_mem_space_context {
 /*
  *  IRQ Attributes
  */
-#define ACPI_EDGE_SENSITIVE             (u8) 0x00
-#define ACPI_LEVEL_SENSITIVE            (u8) 0x01
+#define ACPI_LEVEL_SENSITIVE            (u8) 0x00
+#define ACPI_EDGE_SENSITIVE             (u8) 0x01
 
 #define ACPI_ACTIVE_HIGH                (u8) 0x00
 #define ACPI_ACTIVE_LOW                 (u8) 0x01
@@ -974,28 +1039,46 @@ struct acpi_mem_space_context {
 #define ACPI_PRODUCER                   (u8) 0x00
 #define ACPI_CONSUMER                   (u8) 0x01
 
+/*
+ * If possible, pack the following structures to byte alignment
+ */
+#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
+#pragma pack(1)
+#endif
+
+/* UUID data structures for use in vendor-defined resource descriptors */
+
+struct acpi_uuid {
+       u8 data[ACPI_UUID_LENGTH];
+};
+
+struct acpi_vendor_uuid {
+       u8 subtype;
+       u8 data[ACPI_UUID_LENGTH];
+};
+
 /*
  *  Structures used to describe device resources
  */
 struct acpi_resource_irq {
-       u32 edge_level;
-       u32 active_high_low;
-       u32 shared_exclusive;
-       u32 number_of_interrupts;
-       u32 interrupts[1];
+       u8 triggering;
+       u8 polarity;
+       u8 sharable;
+       u8 interrupt_count;
+       u8 interrupts[1];
 };
 
 struct acpi_resource_dma {
-       u32 type;
-       u32 bus_master;
-       u32 transfer;
-       u32 number_of_channels;
-       u32 channels[1];
+       u8 type;
+       u8 bus_master;
+       u8 transfer;
+       u8 channel_count;
+       u8 channels[1];
 };
 
-struct acpi_resource_start_dpf {
-       u32 compatibility_priority;
-       u32 performance_robustness;
+struct acpi_resource_start_dependent {
+       u8 compatibility_priority;
+       u8 performance_robustness;
 };
 
 /*
@@ -1004,179 +1087,217 @@ struct acpi_resource_start_dpf {
  */
 
 struct acpi_resource_io {
-       u32 io_decode;
-       u32 min_base_address;
-       u32 max_base_address;
-       u32 alignment;
-       u32 range_length;
+       u8 io_decode;
+       u8 alignment;
+       u8 address_length;
+       u16 minimum;
+       u16 maximum;
 };
 
 struct acpi_resource_fixed_io {
-       u32 base_address;
-       u32 range_length;
+       u16 address;
+       u8 address_length;
 };
 
 struct acpi_resource_vendor {
-       u32 length;
-       u8 reserved[1];
+       u16 byte_length;
+       u8 byte_data[1];
+};
+
+/* Vendor resource with UUID info (introduced in ACPI 3.0) */
+
+struct acpi_resource_vendor_typed {
+       u16 byte_length;
+       u8 uuid_subtype;
+       u8 uuid[ACPI_UUID_LENGTH];
+       u8 byte_data[1];
 };
 
 struct acpi_resource_end_tag {
        u8 checksum;
 };
 
-struct acpi_resource_mem24 {
-       u32 read_write_attribute;
-       u32 min_base_address;
-       u32 max_base_address;
-       u32 alignment;
-       u32 range_length;
+struct acpi_resource_memory24 {
+       u8 write_protect;
+       u16 minimum;
+       u16 maximum;
+       u16 alignment;
+       u16 address_length;
 };
 
-struct acpi_resource_mem32 {
-       u32 read_write_attribute;
-       u32 min_base_address;
-       u32 max_base_address;
+struct acpi_resource_memory32 {
+       u8 write_protect;
+       u32 minimum;
+       u32 maximum;
        u32 alignment;
-       u32 range_length;
+       u32 address_length;
 };
 
-struct acpi_resource_fixed_mem32 {
-       u32 read_write_attribute;
-       u32 range_base_address;
-       u32 range_length;
+struct acpi_resource_fixed_memory32 {
+       u8 write_protect;
+       u32 address;
+       u32 address_length;
 };
 
 struct acpi_memory_attribute {
-       u16 cache_attribute;
-       u16 read_write_attribute;
+       u8 write_protect;
+       u8 caching;
+       u8 range_type;
+       u8 translation;
 };
 
 struct acpi_io_attribute {
-       u16 range_attribute;
-       u16 translation_attribute;
-};
-
-struct acpi_bus_attribute {
-       u16 reserved1;
-       u16 reserved2;
+       u8 range_type;
+       u8 translation;
+       u8 translation_type;
+       u8 reserved1;
 };
 
 union acpi_resource_attribute {
-       struct acpi_memory_attribute memory;
+       struct acpi_memory_attribute mem;
        struct acpi_io_attribute io;
-       struct acpi_bus_attribute bus;
+
+       /* Used for the *word_space macros */
+
+       u8 type_specific;
 };
 
 struct acpi_resource_source {
-       u32 index;
-       u32 string_length;
+       u8 index;
+       u16 string_length;
        char *string_ptr;
 };
 
 /* Fields common to all address descriptors, 16/32/64 bit */
 
 #define ACPI_RESOURCE_ADDRESS_COMMON \
-       u32                                 resource_type; \
-       u32                                 producer_consumer; \
-       u32                                 decode; \
-       u32                                 min_address_fixed; \
-       u32                                 max_address_fixed; \
-       union acpi_resource_attribute       attribute;
+       u                                 resource_type; \
+       u                                 producer_consumer; \
+       u                                 decode; \
+       u                                 min_address_fixed; \
+       u                                 max_address_fixed; \
+       union acpi_resource_attribute       info;
 
 struct acpi_resource_address {
 ACPI_RESOURCE_ADDRESS_COMMON};
 
 struct acpi_resource_address16 {
-       ACPI_RESOURCE_ADDRESS_COMMON u32 granularity;
-       u32 min_address_range;
-       u32 max_address_range;
-       u32 address_translation_offset;
-       u32 address_length;
+       ACPI_RESOURCE_ADDRESS_COMMON u16 granularity;
+       u16 minimum;
+       u16 maximum;
+       u16 translation_offset;
+       u16 address_length;
        struct acpi_resource_source resource_source;
 };
 
 struct acpi_resource_address32 {
        ACPI_RESOURCE_ADDRESS_COMMON u32 granularity;
-       u32 min_address_range;
-       u32 max_address_range;
-       u32 address_translation_offset;
+       u32 minimum;
+       u32 maximum;
+       u32 translation_offset;
        u32 address_length;
        struct acpi_resource_source resource_source;
 };
 
 struct acpi_resource_address64 {
        ACPI_RESOURCE_ADDRESS_COMMON u64 granularity;
-       u64 min_address_range;
-       u64 max_address_range;
-       u64 address_translation_offset;
+       u64 minimum;
+       u64 maximum;
+       u64 translation_offset;
        u64 address_length;
-       u64 type_specific_attributes;
        struct acpi_resource_source resource_source;
 };
 
-struct acpi_resource_ext_irq {
-       u32 producer_consumer;
-       u32 edge_level;
-       u32 active_high_low;
-       u32 shared_exclusive;
-       u32 number_of_interrupts;
+struct acpi_resource_extended_address64 {
+       ACPI_RESOURCE_ADDRESS_COMMON u8 revision_iD;
+       u64 granularity;
+       u64 minimum;
+       u64 maximum;
+       u64 translation_offset;
+       u64 address_length;
+       u64 type_specific;
+};
+
+struct acpi_resource_extended_irq {
+       u8 producer_consumer;
+       u8 triggering;
+       u8 polarity;
+       u8 sharable;
+       u8 interrupt_count;
        struct acpi_resource_source resource_source;
        u32 interrupts[1];
 };
 
+struct acpi_resource_generic_register {
+       u8 space_id;
+       u8 bit_width;
+       u8 bit_offset;
+       u8 access_size;
+       u64 address;
+};
+
 /* ACPI_RESOURCE_TYPEs */
 
-#define ACPI_RSTYPE_IRQ                 0
-#define ACPI_RSTYPE_DMA                 1
-#define ACPI_RSTYPE_START_DPF           2
-#define ACPI_RSTYPE_END_DPF             3
-#define ACPI_RSTYPE_IO                  4
-#define ACPI_RSTYPE_FIXED_IO            5
-#define ACPI_RSTYPE_VENDOR              6
-#define ACPI_RSTYPE_END_TAG             7
-#define ACPI_RSTYPE_MEM24               8
-#define ACPI_RSTYPE_MEM32               9
-#define ACPI_RSTYPE_FIXED_MEM32         10
-#define ACPI_RSTYPE_ADDRESS16           11
-#define ACPI_RSTYPE_ADDRESS32           12
-#define ACPI_RSTYPE_ADDRESS64           13
-#define ACPI_RSTYPE_EXT_IRQ             14
-
-typedef u32 acpi_resource_type;
+#define ACPI_RESOURCE_TYPE_IRQ                  0
+#define ACPI_RESOURCE_TYPE_DMA                  1
+#define ACPI_RESOURCE_TYPE_START_DEPENDENT      2
+#define ACPI_RESOURCE_TYPE_END_DEPENDENT        3
+#define ACPI_RESOURCE_TYPE_IO                   4
+#define ACPI_RESOURCE_TYPE_FIXED_IO             5
+#define ACPI_RESOURCE_TYPE_VENDOR               6
+#define ACPI_RESOURCE_TYPE_END_TAG              7
+#define ACPI_RESOURCE_TYPE_MEMORY24             8
+#define ACPI_RESOURCE_TYPE_MEMORY32             9
+#define ACPI_RESOURCE_TYPE_FIXED_MEMORY32       10
+#define ACPI_RESOURCE_TYPE_ADDRESS16            11
+#define ACPI_RESOURCE_TYPE_ADDRESS32            12
+#define ACPI_RESOURCE_TYPE_ADDRESS64            13
+#define ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64   14     /* ACPI 3.0 */
+#define ACPI_RESOURCE_TYPE_EXTENDED_IRQ         15
+#define ACPI_RESOURCE_TYPE_GENERIC_REGISTER     16
+#define ACPI_RESOURCE_TYPE_MAX                  16
 
 union acpi_resource_data {
        struct acpi_resource_irq irq;
        struct acpi_resource_dma dma;
-       struct acpi_resource_start_dpf start_dpf;
+       struct acpi_resource_start_dependent start_dpf;
        struct acpi_resource_io io;
        struct acpi_resource_fixed_io fixed_io;
-       struct acpi_resource_vendor vendor_specific;
+       struct acpi_resource_vendor vendor;
+       struct acpi_resource_vendor_typed vendor_typed;
        struct acpi_resource_end_tag end_tag;
-       struct acpi_resource_mem24 memory24;
-       struct acpi_resource_mem32 memory32;
-       struct acpi_resource_fixed_mem32 fixed_memory32;
-       struct acpi_resource_address address;   /* Common 16/32/64 address fields */
+       struct acpi_resource_memory24 memory24;
+       struct acpi_resource_memory32 memory32;
+       struct acpi_resource_fixed_memory32 fixed_memory32;
        struct acpi_resource_address16 address16;
        struct acpi_resource_address32 address32;
        struct acpi_resource_address64 address64;
-       struct acpi_resource_ext_irq extended_irq;
+       struct acpi_resource_extended_address64 ext_address64;
+       struct acpi_resource_extended_irq extended_irq;
+       struct acpi_resource_generic_register generic_reg;
+
+       /* Common fields */
+
+       struct acpi_resource_address address;   /* Common 16/32/64 address fields */
 };
 
 struct acpi_resource {
-       acpi_resource_type id;
+       u32 type;
        u32 length;
        union acpi_resource_data data;
 };
 
-#define ACPI_RESOURCE_LENGTH                12
-#define ACPI_RESOURCE_LENGTH_NO_DATA        8  /* Id + Length fields */
+/* restore default alignment */
+
+#pragma pack()
 
-#define ACPI_SIZEOF_RESOURCE(type)          (ACPI_RESOURCE_LENGTH_NO_DATA + sizeof (type))
+#define ACPI_RS_SIZE_MIN                    12
+#define ACPI_RS_SIZE_NO_DATA                8  /* Id + Length fields */
+#define ACPI_RS_SIZE(type)                  (u32) (ACPI_RS_SIZE_NO_DATA + sizeof (type))
 
 #define ACPI_NEXT_RESOURCE(res)             (struct acpi_resource *)((u8 *) res + res->length)
 
-#ifdef ACPI_MISALIGNED_TRANSFERS
+#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
 #define ACPI_ALIGN_RESOURCE_SIZE(length)    (length)
 #else
 #define ACPI_ALIGN_RESOURCE_SIZE(length)    ACPI_ROUND_UP_TO_NATIVE_WORD(length)
index c1086452696ea63cc0c855a287e0cc11574bf89d..0927765df6aa065d173d7267c3b5ec274396d0c3 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef _ACUTILS_H
 #define _ACUTILS_H
 
+extern const u8 acpi_gbl_resource_aml_sizes[];
+
+/* Strings used by the disassembler and debugger resource dump routines */
+
+#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
+
+extern const char *acpi_gbl_BMdecode[2];
+extern const char *acpi_gbl_config_decode[4];
+extern const char *acpi_gbl_consume_decode[2];
+extern const char *acpi_gbl_DECdecode[2];
+extern const char *acpi_gbl_HEdecode[2];
+extern const char *acpi_gbl_io_decode[2];
+extern const char *acpi_gbl_LLdecode[2];
+extern const char *acpi_gbl_max_decode[2];
+extern const char *acpi_gbl_MEMdecode[4];
+extern const char *acpi_gbl_min_decode[2];
+extern const char *acpi_gbl_MTPdecode[4];
+extern const char *acpi_gbl_RNGdecode[4];
+extern const char *acpi_gbl_RWdecode[2];
+extern const char *acpi_gbl_SHRdecode[2];
+extern const char *acpi_gbl_SIZdecode[4];
+extern const char *acpi_gbl_TRSdecode[2];
+extern const char *acpi_gbl_TTPdecode[2];
+extern const char *acpi_gbl_TYPdecode[4];
+#endif
+
+/* Types for Resource descriptor entries */
+
+#define ACPI_INVALID_RESOURCE           0
+#define ACPI_FIXED_LENGTH               1
+#define ACPI_VARIABLE_LENGTH            2
+#define ACPI_SMALL_VARIABLE_LENGTH      3
+
 typedef
 acpi_status(*acpi_pkg_callback) (u8 object_type,
                                 union acpi_operand_object * source_object,
@@ -159,7 +192,6 @@ extern const u8 _acpi_ctype[];
 #define ACPI_IS_LOWER(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO))
 #define ACPI_IS_PRINT(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_SP | _ACPI_PU))
 #define ACPI_IS_ALPHA(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP))
-#define ACPI_IS_ASCII(c)  ((c) < 0x80)
 
 #endif                         /* ACPI_USE_SYSTEM_CLIBRARY */
 
@@ -243,21 +275,22 @@ acpi_ut_ptr_exit(u32 line_number,
                 const char *function_name,
                 char *module_name, u32 component_id, u8 * ptr);
 
-void acpi_ut_report_info(char *module_name, u32 line_number, u32 component_id);
+void acpi_ut_dump_buffer(u8 * buffer, u32 count, u32 display, u32 component_id);
 
-void acpi_ut_report_error(char *module_name, u32 line_number, u32 component_id);
+void acpi_ut_report_error(char *module_name, u32 line_number);
 
-void
-acpi_ut_report_warning(char *module_name, u32 line_number, u32 component_id);
+void acpi_ut_report_info(char *module_name, u32 line_number);
 
-void acpi_ut_dump_buffer(u8 * buffer, u32 count, u32 display, u32 component_id);
+void acpi_ut_report_warning(char *module_name, u32 line_number);
+
+/* Error and message reporting interfaces */
 
 void ACPI_INTERNAL_VAR_XFACE
 acpi_ut_debug_print(u32 requested_debug_level,
                    u32 line_number,
                    const char *function_name,
                    char *module_name,
-                   u32 component_id, char *format, ...) ACPI_PRINTF_LIKE_FUNC;
+                   u32 component_id, char *format, ...) ACPI_PRINTF_LIKE(6);
 
 void ACPI_INTERNAL_VAR_XFACE
 acpi_ut_debug_print_raw(u32 requested_debug_level,
@@ -265,7 +298,24 @@ acpi_ut_debug_print_raw(u32 requested_debug_level,
                        const char *function_name,
                        char *module_name,
                        u32 component_id,
-                       char *format, ...) ACPI_PRINTF_LIKE_FUNC;
+                       char *format, ...) ACPI_PRINTF_LIKE(6);
+
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_error(char *module_name,
+             u32 line_number, char *format, ...) ACPI_PRINTF_LIKE(3);
+
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_exception(char *module_name,
+                 u32 line_number,
+                 acpi_status status, char *format, ...) ACPI_PRINTF_LIKE(4);
+
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_warning(char *module_name,
+               u32 line_number, char *format, ...) ACPI_PRINTF_LIKE(3);
+
+void ACPI_INTERNAL_VAR_XFACE
+acpi_ut_info(char *module_name,
+            u32 line_number, char *format, ...) ACPI_PRINTF_LIKE(3);
 
 /*
  * utdelete - Object deletion and reference counts
@@ -419,7 +469,19 @@ acpi_ut_strtoul64(char *string, u32 base, acpi_integer * ret_integer);
 
 #define ACPI_ANY_BASE        0
 
-u8 *acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc);
+acpi_status acpi_ut_validate_resource(void *aml, u8 * return_index);
+
+u32 acpi_ut_get_descriptor_length(void *aml);
+
+u16 acpi_ut_get_resource_length(void *aml);
+
+u8 acpi_ut_get_resource_header_length(void *aml);
+
+u8 acpi_ut_get_resource_type(void *aml);
+
+acpi_status
+acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc,
+                            u8 ** end_tag);
 
 u8 acpi_ut_generate_checksum(u8 * buffer, u32 length);
 
index 7fdf5299f501104ce305de61d94da85c4135552e..37964a59aef8796daaebf354e5bd0472860ba7a6 100644 (file)
@@ -7,7 +7,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index 051786e4b210d9cc80d3dd8aa9da0c1d649bb3d5..fb4735315ad3e977ff008fd56f988de2fc8ba7d8 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -92,182 +92,168 @@ struct asl_resource_node {
        struct asl_resource_node *next;
 };
 
+/* Macros used to generate AML resource length fields */
+
+#define ACPI_AML_SIZE_LARGE(r)      (sizeof (r) - sizeof (struct aml_resource_large_header))
+#define ACPI_AML_SIZE_SMALL(r)      (sizeof (r) - sizeof (struct aml_resource_small_header))
+
 /*
  * Resource descriptors defined in the ACPI specification.
  *
  * Packing/alignment must be BYTE because these descriptors
- * are used to overlay the AML byte stream.
+ * are used to overlay the raw AML byte stream.
  */
 #pragma pack(1)
 
-struct asl_irq_format_desc {
-       u8 descriptor_type;
-       u16 irq_mask;
+/*
+ * SMALL descriptors
+ */
+#define AML_RESOURCE_SMALL_HEADER_COMMON \
+       u8                                  descriptor_type;
+
+struct aml_resource_small_header {
+AML_RESOURCE_SMALL_HEADER_COMMON};
+
+struct aml_resource_irq {
+       AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask;
        u8 flags;
 };
 
-struct asl_irq_noflags_desc {
-       u8 descriptor_type;
-       u16 irq_mask;
+struct aml_resource_irq_noflags {
+       AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask;
 };
 
-struct asl_dma_format_desc {
-       u8 descriptor_type;
-       u8 dma_channel_mask;
+struct aml_resource_dma {
+       AML_RESOURCE_SMALL_HEADER_COMMON u8 dma_channel_mask;
        u8 flags;
 };
 
-struct asl_start_dependent_desc {
-       u8 descriptor_type;
-       u8 flags;
+struct aml_resource_start_dependent {
+       AML_RESOURCE_SMALL_HEADER_COMMON u8 flags;
 };
 
-struct asl_start_dependent_noprio_desc {
-       u8 descriptor_type;
-};
+struct aml_resource_start_dependent_noprio {
+AML_RESOURCE_SMALL_HEADER_COMMON};
 
-struct asl_end_dependent_desc {
-       u8 descriptor_type;
-};
+struct aml_resource_end_dependent {
+AML_RESOURCE_SMALL_HEADER_COMMON};
 
-struct asl_io_port_desc {
-       u8 descriptor_type;
-       u8 information;
-       u16 address_min;
-       u16 address_max;
+struct aml_resource_io {
+       AML_RESOURCE_SMALL_HEADER_COMMON u8 flags;
+       u16 minimum;
+       u16 maximum;
        u8 alignment;
-       u8 length;
+       u8 address_length;
 };
 
-struct asl_fixed_io_port_desc {
-       u8 descriptor_type;
-       u16 base_address;
-       u8 length;
+struct aml_resource_fixed_io {
+       AML_RESOURCE_SMALL_HEADER_COMMON u16 address;
+       u8 address_length;
 };
 
-struct asl_small_vendor_desc {
-       u8 descriptor_type;
-       u8 vendor_defined[7];
-};
+struct aml_resource_vendor_small {
+AML_RESOURCE_SMALL_HEADER_COMMON};
 
-struct asl_end_tag_desc {
-       u8 descriptor_type;
-       u8 checksum;
+struct aml_resource_end_tag {
+       AML_RESOURCE_SMALL_HEADER_COMMON u8 checksum;
 };
 
-/* LARGE descriptors */
+/*
+ * LARGE descriptors
+ */
+#define AML_RESOURCE_LARGE_HEADER_COMMON \
+       u8                                  descriptor_type;\
+       u16                                 resource_length;
+
+struct aml_resource_large_header {
+AML_RESOURCE_LARGE_HEADER_COMMON};
 
-struct asl_memory_24_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 information;
-       u16 address_min;
-       u16 address_max;
+struct aml_resource_memory24 {
+       AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
+       u16 minimum;
+       u16 maximum;
        u16 alignment;
-       u16 range_length;
+       u16 address_length;
 };
 
-struct asl_large_vendor_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 vendor_defined[1];
-};
+struct aml_resource_vendor_large {
+AML_RESOURCE_LARGE_HEADER_COMMON};
 
-struct asl_memory_32_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 information;
-       u32 address_min;
-       u32 address_max;
+struct aml_resource_memory32 {
+       AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
+       u32 minimum;
+       u32 maximum;
        u32 alignment;
-       u32 range_length;
+       u32 address_length;
 };
 
-struct asl_fixed_memory_32_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 information;
-       u32 base_address;
-       u32 range_length;
+struct aml_resource_fixed_memory32 {
+       AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
+       u32 address;
+       u32 address_length;
 };
 
-struct asl_extended_address_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 resource_type;
-       u8 flags;
-       u8 specific_flags;
-       u8 revision_iD;
+#define AML_RESOURCE_ADDRESS_COMMON \
+       u8                                  resource_type; \
+       u8                                  flags; \
+       u8                                  specific_flags;
+
+struct aml_resource_address {
+AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_ADDRESS_COMMON};
+
+struct aml_resource_extended_address64 {
+       AML_RESOURCE_LARGE_HEADER_COMMON
+           AML_RESOURCE_ADDRESS_COMMON u8 revision_iD;
        u8 reserved;
        u64 granularity;
-       u64 address_min;
-       u64 address_max;
+       u64 minimum;
+       u64 maximum;
        u64 translation_offset;
        u64 address_length;
-       u64 type_specific_attributes;
-       u8 optional_fields[2];  /* Used for length calculation only */
+       u64 type_specific;
 };
 
-#define ASL_EXTENDED_ADDRESS_DESC_REVISION          1  /* ACPI 3.0 */
+#define AML_RESOURCE_EXTENDED_ADDRESS_REVISION          1      /* ACPI 3.0 */
 
-struct asl_qword_address_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 resource_type;
-       u8 flags;
-       u8 specific_flags;
-       u64 granularity;
-       u64 address_min;
-       u64 address_max;
+struct aml_resource_address64 {
+       AML_RESOURCE_LARGE_HEADER_COMMON
+           AML_RESOURCE_ADDRESS_COMMON u64 granularity;
+       u64 minimum;
+       u64 maximum;
        u64 translation_offset;
        u64 address_length;
-       u8 optional_fields[2];
 };
 
-struct asl_dword_address_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 resource_type;
-       u8 flags;
-       u8 specific_flags;
-       u32 granularity;
-       u32 address_min;
-       u32 address_max;
+struct aml_resource_address32 {
+       AML_RESOURCE_LARGE_HEADER_COMMON
+           AML_RESOURCE_ADDRESS_COMMON u32 granularity;
+       u32 minimum;
+       u32 maximum;
        u32 translation_offset;
        u32 address_length;
-       u8 optional_fields[2];
 };
 
-struct asl_word_address_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 resource_type;
-       u8 flags;
-       u8 specific_flags;
-       u16 granularity;
-       u16 address_min;
-       u16 address_max;
+struct aml_resource_address16 {
+       AML_RESOURCE_LARGE_HEADER_COMMON
+           AML_RESOURCE_ADDRESS_COMMON u16 granularity;
+       u16 minimum;
+       u16 maximum;
        u16 translation_offset;
        u16 address_length;
-       u8 optional_fields[2];
 };
 
-struct asl_extended_xrupt_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 flags;
-       u8 table_length;
-       u32 interrupt_number[1];
+struct aml_resource_extended_irq {
+       AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
+       u8 interrupt_count;
+       u32 interrupts[1];
        /* res_source_index, res_source optional fields follow */
 };
 
-struct asl_general_register_desc {
-       u8 descriptor_type;
-       u16 length;
-       u8 address_space_id;
+struct aml_resource_generic_register {
+       AML_RESOURCE_LARGE_HEADER_COMMON u8 address_space_id;
        u8 bit_width;
        u8 bit_offset;
-       u8 access_size;         /* ACPI 3.0, was Reserved */
+       u8 access_size;         /* ACPI 3.0, was previously Reserved */
        u64 address;
 };
 
@@ -277,26 +263,39 @@ struct asl_general_register_desc {
 
 /* Union of all resource descriptors, so we can allocate the worst case */
 
-union asl_resource_desc {
-       struct asl_irq_format_desc irq;
-       struct asl_dma_format_desc dma;
-       struct asl_start_dependent_desc std;
-       struct asl_end_dependent_desc end;
-       struct asl_io_port_desc iop;
-       struct asl_fixed_io_port_desc fio;
-       struct asl_small_vendor_desc smv;
-       struct asl_end_tag_desc et;
-
-       struct asl_memory_24_desc M24;
-       struct asl_large_vendor_desc lgv;
-       struct asl_memory_32_desc M32;
-       struct asl_fixed_memory_32_desc F32;
-       struct asl_qword_address_desc qas;
-       struct asl_dword_address_desc das;
-       struct asl_word_address_desc was;
-       struct asl_extended_address_desc eas;
-       struct asl_extended_xrupt_desc exx;
-       struct asl_general_register_desc grg;
+union aml_resource {
+       /* Descriptor headers */
+
+       struct aml_resource_small_header small_header;
+       struct aml_resource_large_header large_header;
+
+       /* Small resource descriptors */
+
+       struct aml_resource_irq irq;
+       struct aml_resource_dma dma;
+       struct aml_resource_start_dependent start_dpf;
+       struct aml_resource_end_dependent end_dpf;
+       struct aml_resource_io io;
+       struct aml_resource_fixed_io fixed_io;
+       struct aml_resource_vendor_small vendor_small;
+       struct aml_resource_end_tag end_tag;
+
+       /* Large resource descriptors */
+
+       struct aml_resource_memory24 memory24;
+       struct aml_resource_generic_register generic_reg;
+       struct aml_resource_vendor_large vendor_large;
+       struct aml_resource_memory32 memory32;
+       struct aml_resource_fixed_memory32 fixed_memory32;
+       struct aml_resource_address16 address16;
+       struct aml_resource_address32 address32;
+       struct aml_resource_address64 address64;
+       struct aml_resource_extended_address64 ext_address64;
+       struct aml_resource_extended_irq extended_irq;
+
+       /* Utility overlays */
+
+       struct aml_resource_address address;
        u32 u32_item;
        u16 u16_item;
        u8 U8item;
index 91f4a12a99a1900a70e18b985e0b06a789ee8de4..3fa81d55cd0c5210b46e4f6697e0768049bf94be 100644 (file)
@@ -15,9 +15,7 @@
 #define ACPI_PDC_C_C1_FFH              (0x0100)
 
 #define ACPI_PDC_EST_CAPABILITY_SMP    (ACPI_PDC_SMP_C1PT | \
-                                        ACPI_PDC_C_C1_HALT)
-
-#define ACPI_PDC_EST_CAPABILITY_SMP_MSR        (ACPI_PDC_EST_CAPABILITY_SMP | \
+                                        ACPI_PDC_C_C1_HALT | \
                                         ACPI_PDC_P_FFH)
 
 #define ACPI_PDC_C_CAPABILITY_SMP      (ACPI_PDC_SMP_C2C3 | \
index 16609c1ab2eb8f18f711ae44a26183327155ad5b..223ec6467108f918f4071ac454f1eceb8ece10de 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -68,6 +68,7 @@
 #define ACPI_APPLICATION
 #define ACPI_DEBUGGER
 #define ACPI_DISASSEMBLER
+#define ACPI_MUTEX_DEBUG
 #endif
 
 #ifdef ACPI_ASL_COMPILER
 #elif defined(NETWARE)
 #include "acnetware.h"
 
+#elif defined(__sun)
+#include "acsolaris.h"
+
 #else
 
 /* All other environments */
 #define COMPILER_DEPENDENT_INT64   long long
 #define COMPILER_DEPENDENT_UINT64  unsigned long long
 
-/*
- * This macro is used to tag functions as "printf-like" because
- * some compilers can catch printf format string problems. MSVC
- * doesn't, so this is proprocessed away.
- */
-#define ACPI_PRINTF_LIKE_FUNC
-
 #endif
 
 /*
  *
  *****************************************************************************/
 
+#define ACPI_IS_ASCII(c)  ((c) < 0x80)
+
 #ifdef ACPI_USE_SYSTEM_CLIBRARY
 /*
  * Use the standard C library headers.
 #define ACPI_STRCAT(d,s)        (void) strcat((d), (s))
 #define ACPI_STRNCAT(d,s,n)     strncat((d), (s), (acpi_size)(n))
 #define ACPI_STRTOUL(d,s,n)     strtoul((d), (s), (acpi_size)(n))
-#define ACPI_MEMCMP(s1,s2,n)    memcmp((s1), (s2), (acpi_size)(n))
+#define ACPI_MEMCMP(s1,s2,n)    memcmp((const char *)(s1), (const char *)(s2), (acpi_size)(n))
 #define ACPI_MEMCPY(d,s,n)      (void) memcpy((d), (s), (acpi_size)(n))
 #define ACPI_MEMSET(d,s,n)      (void) memset((d), (s), (acpi_size)(n))
 
 #define ACPI_IS_UPPER(i)        isupper((int) (i))
 #define ACPI_IS_PRINT(i)        isprint((int) (i))
 #define ACPI_IS_ALPHA(i)        isalpha((int) (i))
-#define ACPI_IS_ASCII(i)        isascii((int) (i))
 
 #else
 
@@ -273,8 +271,8 @@ typedef char *va_list;
 /*
  * Storage alignment properties
  */
-#define  _AUPBND                (sizeof (acpi_native_int) - 1)
-#define  _ADNBND                (sizeof (acpi_native_int) - 1)
+#define  _AUPBND                (sizeof (acpi_native_uint) - 1)
+#define  _ADNBND                (sizeof (acpi_native_uint) - 1)
 
 /*
  * Variable argument list macro definitions
@@ -296,7 +294,7 @@ typedef char *va_list;
 #define ACPI_STRCAT(d,s)        (void) acpi_ut_strcat ((d), (s))
 #define ACPI_STRNCAT(d,s,n)     acpi_ut_strncat ((d), (s), (acpi_size)(n))
 #define ACPI_STRTOUL(d,s,n)     acpi_ut_strtoul ((d), (s), (acpi_size)(n))
-#define ACPI_MEMCMP(s1,s2,n)    acpi_ut_memcmp((s1), (s2), (acpi_size)(n))
+#define ACPI_MEMCMP(s1,s2,n)    acpi_ut_memcmp((const char *)(s1), (const char *)(s2), (acpi_size)(n))
 #define ACPI_MEMCPY(d,s,n)      (void) acpi_ut_memcpy ((d), (s), (acpi_size)(n))
 #define ACPI_MEMSET(d,v,n)      (void) acpi_ut_memset ((d), (v), (acpi_size)(n))
 #define ACPI_TOUPPER            acpi_ut_to_upper
index 4c0e0ba09ba0213d4bd83a23314d88282a6f0fea..da80933963db32b4b2bcf3e2867ff42c0d9e3be4 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 
 #define ACPI_GET_FUNCTION_NAME          __FUNCTION__
 
-/* This macro is used to tag functions as "printf-like" because
+/*
+ * This macro is used to tag functions as "printf-like" because
  * some compilers (like GCC) can catch printf format string problems.
  */
-#define ACPI_PRINTF_LIKE_FUNC __attribute__ ((__format__ (__printf__, 6, 7)))
+#define ACPI_PRINTF_LIKE(c) __attribute__ ((__format__ (__printf__, c, c+1)))
 
-/* Some compilers complain about unused variables. Sometimes we don't want to
+/*
+ * Some compilers complain about unused variables. Sometimes we don't want to
  * use all the variables (for example, _acpi_module_name). This allows us
  * to to tell the compiler warning in a per-variable manner that a variable
  * is unused.
index c93e6562f0e1312ef857a715db84c3379de2d138..2e6d54569ee8adcd7296737a8264ca35b9f3a13d 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #define acpi_cache_t   kmem_cache_t
 #endif
 
+/* Full namespace pathname length limit - arbitrary */
+
+#define ACPI_PATHNAME_MAX              256
+
 #else                          /* !__KERNEL__ */
 
 #include <stdarg.h>
 
 #include "acgcc.h"
 
+#define acpi_cpu_flags unsigned long
+
 #endif                         /* __ACLINUX_H__ */
index 7a00d5089de983d0fb91f39f410aa60ee152e2e8..badf0277b1be7314a59f9b6a8c7836e25b14c314 100644 (file)
@@ -62,9 +62,6 @@ struct acpi_processor_power {
        u32 bm_activity;
        int count;
        struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER];
-
-       /* the _PDC objects passed by the driver, if any */
-       struct acpi_object_list *pdc;
 };
 
 /* Performance Management */
@@ -96,8 +93,6 @@ struct acpi_processor_performance {
        unsigned int state_count;
        struct acpi_processor_px *states;
 
-       /* the _PDC objects passed by the driver, if any */
-       struct acpi_object_list *pdc;
 };
 
 /* Throttling Control */
@@ -151,6 +146,9 @@ struct acpi_processor {
        struct acpi_processor_performance *performance;
        struct acpi_processor_throttling throttling;
        struct acpi_processor_limit limit;
+
+       /* the _PDC objects for this processor, if any */
+       struct acpi_object_list *pdc;
 };
 
 struct acpi_processor_errata {
@@ -178,22 +176,12 @@ int acpi_processor_notify_smm(struct module *calling_module);
 extern struct acpi_processor *processors[NR_CPUS];
 extern struct acpi_processor_errata errata;
 
-int acpi_processor_set_pdc(struct acpi_processor *pr,
-                          struct acpi_object_list *pdc_in);
+void arch_acpi_processor_init_pdc(struct acpi_processor *pr);
 
-#ifdef ARCH_HAS_POWER_PDC_INIT
-void acpi_processor_power_init_pdc(struct acpi_processor_power *pow,
-                                  unsigned int cpu);
+#ifdef ARCH_HAS_POWER_INIT
 void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags,
                                        unsigned int cpu);
 #else
-static inline void acpi_processor_power_init_pdc(struct acpi_processor_power
-                                                *pow, unsigned int cpu)
-{
-       pow->pdc = NULL;
-       return;
-}
-
 static inline void acpi_processor_power_init_bm_check(struct
                                                      acpi_processor_flags
                                                      *flags, unsigned int cpu)
@@ -235,9 +223,6 @@ static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr)
 /* in processor_throttling.c */
 int acpi_processor_get_throttling_info(struct acpi_processor *pr);
 int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
-ssize_t acpi_processor_write_throttling(struct file *file,
-                                       const char __user * buffer,
-                                       size_t count, loff_t * data);
 extern struct file_operations acpi_processor_throttling_fops;
 
 /* in processor_idle.c */
@@ -249,9 +234,6 @@ int acpi_processor_power_exit(struct acpi_processor *pr,
 
 /* in processor_thermal.c */
 int acpi_processor_get_limit_info(struct acpi_processor *pr);
-ssize_t acpi_processor_write_limit(struct file *file,
-                                  const char __user * buffer,
-                                  size_t count, loff_t * data);
 extern struct file_operations acpi_processor_limit_fops;
 
 #ifdef CONFIG_CPU_FREQ
index 9dc7256cf9798a39eeb0dbf11202c8c987a80bcb..62d0d6681aa91d587e52b5de824e90a790de9f2f 100644 (file)
@@ -30,6 +30,7 @@
 
 #else  /* no PCI - no IOMMU. */
 
+struct scatterlist;
 void *dma_alloc_coherent(struct device *dev, size_t size,
                         dma_addr_t *dma_handle, gfp_t gfp);
 int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
index 15cc6f2da792dc7dec67d6698b863bb47750b667..d87f8634e62525d1a67bf33014f5a299ab340eb5 100644 (file)
@@ -186,7 +186,7 @@ extern void _change_bit_le(int nr, volatile unsigned long * p);
 extern int _test_and_set_bit_le(int nr, volatile unsigned long * p);
 extern int _test_and_clear_bit_le(int nr, volatile unsigned long * p);
 extern int _test_and_change_bit_le(int nr, volatile unsigned long * p);
-extern int _find_first_zero_bit_le(void * p, unsigned size);
+extern int _find_first_zero_bit_le(const unsigned long * p, unsigned size);
 extern int _find_next_zero_bit_le(void * p, int size, int offset);
 extern int _find_first_bit_le(const unsigned long *p, unsigned size);
 extern int _find_next_bit_le(const unsigned long *p, int size, int offset);
@@ -326,7 +326,7 @@ static inline int sched_find_first_bit(unsigned long *b)
 #define minix_test_and_clear_bit(nr,p)         \
                __test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
 #define minix_find_first_zero_bit(p,sz)                \
-               _find_first_zero_bit_le(p,sz)
+               _find_first_zero_bit_le((unsigned long *)(p),sz)
 
 #endif /* __KERNEL__ */
 
index dc28daab8aa8d7786fa619facc0116480c33858e..87c19d2bb6a8035df4c4f747f8214a76ad47f9b8 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/config.h>
 #include <linux/cache.h>
 #include <linux/threads.h>
+#include <asm/irq.h>
 
 typedef struct {
        unsigned int __softirq_pending;
@@ -26,13 +27,6 @@ typedef struct {
 
 extern asmlinkage void __do_softirq(void);
 
-#define irq_exit()                                                      \
-        do {                                                            \
-                preempt_count() -= IRQ_EXIT_OFFSET;                     \
-                if (!in_interrupt() && local_softirq_pending())         \
-                        __do_softirq();                                 \
-                preempt_enable_no_resched();                            \
-        } while (0)
 #endif
 
 
index b88344ad390c6038e7f3b6f8d07d5b88b55ea5dd..f8d1eb4f4cb17b6d37763ed793e97229a5e0db47 100644 (file)
@@ -44,6 +44,7 @@ typedef unsigned int          __kernel_gid32_t;
 
 typedef unsigned short         __kernel_old_uid_t;
 typedef unsigned short         __kernel_old_gid_t;
+typedef unsigned short         __kernel_old_dev_t;
 
 #ifdef __GNUC__
 typedef long long              __kernel_loff_t;
index ca4ccfc4b578cc44184667aaac94b5b0d9764022..702884926a55931254ad69f3aadd968845054596 100644 (file)
@@ -98,9 +98,8 @@ extern unsigned int user_debug;
  * spin_unlock_irq() and friends are implemented.  This avoids
  * us needlessly decrementing and incrementing the preempt count.
  */
-#define prepare_arch_switch(rq,next)   local_irq_enable()
-#define finish_arch_switch(rq,prev)    spin_unlock(&(rq)->lock)
-#define task_running(rq,p)             ((rq)->curr == (p))
+#define prepare_arch_switch(next)      local_irq_enable()
+#define finish_arch_switch(prev)       spin_unlock(&(rq)->lock)
 
 /*
  * switch_to(prev, next) should switch from task `prev' to `next'
index df4ed323aa4de7be66e707cbdc59c1ff9a37a4cf..55059abf9c95820d2569efa62879fb7bd76d238d 100644 (file)
@@ -179,7 +179,7 @@ extern void acpi_reserve_bootmem(void);
 
 extern u8 x86_acpiid_to_apicid[];
 
-#define ARCH_HAS_POWER_PDC_INIT        1
+#define ARCH_HAS_POWER_INIT    1
 
 #endif /*__KERNEL__*/
 
index 73296d9924fb36ac196937e2d9d63e32f978aa2c..997ca5d17876dc410c6007398d138ebe6ad54545 100644 (file)
@@ -110,10 +110,10 @@ extern int page_is_ram(unsigned long pagenr);
 #endif /* __ASSEMBLY__ */
 
 #ifdef __ASSEMBLY__
-#define __PAGE_OFFSET          (0xC0000000)
+#define __PAGE_OFFSET          CONFIG_PAGE_OFFSET
 #define __PHYSICAL_START       CONFIG_PHYSICAL_START
 #else
-#define __PAGE_OFFSET          (0xC0000000UL)
+#define __PAGE_OFFSET          ((unsigned long)CONFIG_PAGE_OFFSET)
 #define __PHYSICAL_START       ((unsigned long)CONFIG_PHYSICAL_START)
 #endif
 #define __KERNEL_START         (__PAGE_OFFSET + __PHYSICAL_START)
index 640a6459f2f4604017c3fb14a452ecdbf0ba62ac..bda2f217e6fe4a79a05ae8c7d9c291062f1122cd 100644 (file)
@@ -33,6 +33,7 @@
 
 #ifdef CONFIG_KEXEC
 
+#ifndef __ASSEMBLY__
 #ifdef __powerpc64__
 /*
  * This function is responsible for capturing register states if coming
@@ -104,7 +105,6 @@ static inline void crash_setup_regs(struct pt_regs *newregs,
                                        struct pt_regs *oldregs) { }
 #endif /* !__powerpc64 __ */
 
-#ifndef __ASSEMBLY__
 #define MAX_NOTE_BYTES 1024
 
 #ifdef __powerpc64__
@@ -121,6 +121,8 @@ extern void default_machine_kexec(struct kimage *image);
 extern int default_machine_kexec_prepare(struct kimage *image);
 extern void default_machine_crash_shutdown(struct pt_regs *regs);
 
+extern void machine_kexec_simple(struct kimage *image);
+
 #endif /* ! __ASSEMBLY__ */
 #endif /* CONFIG_KEXEC */
 #endif /* __KERNEL__ */
index d9728c80f86de3d4f4a1a3ca61ce6d0598fc089a..cef61304ffc2b9004812cf07ac79db7a879dc2b7 100644 (file)
@@ -167,6 +167,7 @@ struct pmf_irq_client {
        void                    *data;
        struct module           *owner;
        struct list_head        link;
+       struct pmf_function     *func;
 };
 
 
@@ -187,9 +188,7 @@ extern int pmf_register_irq_client(struct device_node *np,
                                   const char *name,
                                   struct pmf_irq_client *client);
 
-extern void pmf_unregister_irq_client(struct device_node *np,
-                                     const char *name,
-                                     struct pmf_irq_client *client);
+extern void pmf_unregister_irq_client(struct pmf_irq_client *client);
 
 /*
  * Called by the handlers when an irq happens
index 77b10d6adabde1d2507fd629ed6499c9dacd22af..1630c26e8f45a5c27eef949454fb4702747fc7f0 100644 (file)
@@ -8,8 +8,6 @@
  * any future changes wrt the API will result in a change of the APIVERSION reported
  * to userspace by the DASDAPIVER-ioctl
  *
- * $Revision: 1.6 $
- *
  */
 
 #ifndef DASD_H
index 7bc15f0231dbeaa52872f2973692e5ddf4339f69..a2f37a9353d393c3ec6fac66b3d1cd94b02a4fb7 100644 (file)
@@ -11,8 +11,6 @@
 #ifndef __QDIO_H__
 #define __QDIO_H__
 
-#define VERSION_QDIO_H "$Revision: 1.57 $"
-
 /* note, that most of the typedef's are from ingo. */
 
 #include <linux/interrupt.h>
index f3797a52c4ea5e06d5bca508c14706123ecd116e..8e0c7ed73d0312a811c5a3f887527747a6c669c3 100644 (file)
@@ -2,7 +2,7 @@
  *  include/asm-s390/thread_info.h
  *
  *  S390 version
- *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Copyright (C) IBM Corp. 2002,2006
  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
  */
 
@@ -88,7 +88,7 @@ static inline struct thread_info *current_thread_info(void)
  * thread information flags bit numbers
  */
 #define TIF_SYSCALL_TRACE      0       /* syscall trace active */
-#define TIF_NOTIFY_RESUME      1       /* resumption notification requested */
+#define TIF_RESTORE_SIGMASK    1       /* restore signal mask in do_signal() */
 #define TIF_SIGPENDING         2       /* signal pending */
 #define TIF_NEED_RESCHED       3       /* rescheduling necessary */
 #define TIF_RESTART_SVC                4       /* restart svc with new svc number */
@@ -102,7 +102,7 @@ static inline struct thread_info *current_thread_info(void)
 #define TIF_MEMDIE             19
 
 #define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
-#define _TIF_NOTIFY_RESUME     (1<<TIF_NOTIFY_RESUME)
+#define _TIF_RESTORE_SIGMASK   (1<<TIF_RESTORE_SIGMASK)
 #define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
 #define _TIF_RESTART_SVC       (1<<TIF_RESTART_SVC)
index 2861cdc243ad5fd2d025c3524fd50d7dcb259a5e..29a9f357eb9ebc394b330738c9934eb44d5ba1d6 100644 (file)
 #define __NR_inotify_init      284
 #define __NR_inotify_add_watch 285
 #define __NR_inotify_rm_watch  286
+/* Number 287 is reserved for new sys_migrate_pages */
+#define __NR_openat            288
+#define __NR_mkdirat           289
+#define __NR_mknodat           290
+#define __NR_fchownat          291
+#define __NR_futimesat         292
+#define __NR_newfstatat                293
+#define __NR_unlinkat          294
+#define __NR_renameat          295
+#define __NR_linkat            296
+#define __NR_symlinkat         297
+#define __NR_readlinkat                298
+#define __NR_fchmodat          299
+#define __NR_faccessat         300
+#define __NR_pselect6          301
+#define __NR_ppoll             302
 
-#define NR_syscalls 287
+#define NR_syscalls 303
 
 /* 
  * There are some system calls that are not present on 64 bit, some
@@ -539,11 +555,15 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
 #define __ARCH_WANT_SYS_RT_SIGACTION
+#define __ARCH_WANT_SYS_RT_SIGSUSPEND
 # ifndef CONFIG_64BIT
 #   define __ARCH_WANT_STAT64
 #   define __ARCH_WANT_SYS_TIME
 # endif
-# define __ARCH_WANT_COMPAT_SYS_TIME
+# ifdef CONFIG_COMPAT
+#   define __ARCH_WANT_COMPAT_SYS_TIME
+#   define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
+# endif
 #endif
 
 #ifdef __KERNEL_SYSCALLS__
diff --git a/include/asm-sh/bus-sh.h b/include/asm-sh/bus-sh.h
deleted file mode 100644 (file)
index e42d63b..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * include/asm-sh/bus-sh.h
- *
- * Copyright (C) 2004 Paul Mundt
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-#ifndef __ASM_SH_BUS_SH_H
-#define __ASM_SH_BUS_SH_H
-
-extern struct bus_type sh_bus_types[];
-
-struct sh_dev {
-       struct device   dev;
-       char            *name;
-       unsigned int    dev_id;
-       unsigned int    bus_id;
-       struct resource res;
-       void            *mapbase;
-       unsigned int    irq[6];
-       u64             *dma_mask;
-       u64             coherent_dma_mask;
-};
-
-#define to_sh_dev(d)   container_of((d), struct sh_dev, dev)
-
-#define sh_get_drvdata(d)      dev_get_drvdata(&(d)->dev)
-#define sh_set_drvdata(d,p)    dev_set_drvdata(&(d)->dev, (p))
-
-struct sh_driver {
-       struct device_driver    drv;
-       unsigned int            dev_id;
-       unsigned int            bus_id;
-       int (*probe)(struct sh_dev *);
-       int (*remove)(struct sh_dev *);
-       int (*suspend)(struct sh_dev *, pm_message_t);
-       int (*resume)(struct sh_dev *);
-};
-
-#define to_sh_driver(d)        container_of((d), struct sh_driver, drv)
-#define sh_name(d)     ((d)->dev.driver->name)
-
-/*
- * Device ID numbers for bus types
- */
-enum {
-       SH_DEV_ID_USB_OHCI,
-};
-
-#define SH_NR_BUSES            1
-#define SH_BUS_NAME_VIRT       "shbus"
-
-enum {
-       SH_BUS_VIRT,
-};
-
-/* arch/sh/kernel/cpu/bus.c */
-extern int sh_device_register(struct sh_dev *dev);
-extern void sh_device_unregister(struct sh_dev *dev);
-extern int sh_driver_register(struct sh_driver *drv);
-extern void sh_driver_unregister(struct sh_driver *drv);
-
-#endif /* __ASM_SH_BUS_SH_H */
-
index 5cfaa6bcf1edebbd0f3591693dccb0bec52c13d2..a844ea0965b6bb10d861e8eff63d045559334532 100644 (file)
 #define MMU_NTLB_WAYS          4
 #define MMU_CONTROL_INIT       0x007   /* SV=0, TF=1, IX=1, AT=1 */
 
+#define TRA    0xffffffd0
+#define EXPEVT 0xffffffd4
+
+#if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \
+    defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705)
+#define INTEVT 0xa4000000      /* INTEVTE2(0xa4000000) */
+#else
+#define INTEVT 0xffffffd8
+#endif
+
 #endif /* __ASM_CPU_SH3_MMU_CONTEXT_H */
 
index 5b64d041f0b9683f60c945d2980693970c97d1a5..ff4c5fbbfaf038206de9b33e93f2c6a27bb5f738 100644 (file)
 #define MMU_PAGE_ASSOC_BIT     0x80
 
 #define MMU_NTLB_ENTRIES       64      /* for 7750 */
+#ifdef CONFIG_SH_STORE_QUEUES
+#define MMU_CONTROL_INIT       0x05    /* SQMD=0, SV=0, TI=1, AT=1 */
+#else
 #define MMU_CONTROL_INIT       0x205   /* SQMD=1, SV=0, TI=1, AT=1 */
+#endif
 
 #define MMU_ITLB_DATA_ARRAY    0xF3000000
 #define MMU_UTLB_DATA_ARRAY    0xF7000000
@@ -35,5 +39,9 @@
 #define MMU_I_ENTRY_SHIFT          8
 #define MMU_ITLB_VALID         0x100
 
+#define TRA    0xff000020
+#define EXPEVT 0xff000024
+#define INTEVT 0xff000028
+
 #endif /* __ASM_CPU_SH4_MMU_CONTEXT_H */
 
index 1866f3f90028204119028e5e4c6f6ce2bd2c8e39..9d84a2d445a269eee10367b265b942ec7c268b11 100644 (file)
@@ -94,6 +94,6 @@
 #define TIOCSERSETMULTI _IOW('T', 91, struct serial_multiport_struct) /* 0x545B */ /* Set multiport config */
 
 #define TIOCMIWAIT     _IO('T', 92) /* 0x545C */       /* wait for a change on serial input line(s) */
-#define TIOCGICOUNT    _IOR('T', 93, struct async_icount) /* 0x545D */ /* read serial port inline interrupt counts */
+#define TIOCGICOUNT    0x545D  /* read serial port inline interrupt counts */
 
 #endif /* __ASM_SH_IOCTLS_H */
index bf2e4310ffac64d417cfa57642aecb5c61b5352d..d705252be260018902a68df8464b1730f7f0cdc9 100644 (file)
 #undef DMA_IPR_POS
 #undef DMA_PRIORITY
 
-#undef NR_IRQS
-
-#undef __irq_demux
-#undef irq_demux
-
 #undef INTC_IMCR0
 #undef INTC_IMCR1
 #undef INTC_IMCR2
 #define SIU_IPR_POS    1
 #define SIU_PRIORITY   3
 
-
-/* ONCHIP_NR_IRQS */
-#define NR_IRQS 109
-
-/* In a generic kernel, NR_IRQS is an upper bound, and we should use
- * ACTUAL_NR_IRQS (which uses the machine vector) to get the correct value.
- */
-#define ACTUAL_NR_IRQS NR_IRQS
-
-
-extern void disable_irq(unsigned int);
-extern void disable_irq_nosync(unsigned int);
-extern void enable_irq(unsigned int);
-
-/*
- * Simple Mask Register Support
- */
-extern void make_maskreg_irq(unsigned int irq);
-extern unsigned short *irq_mask_register;
-
-/*
- * Function for "on chip support modules".
- */
-extern void make_ipr_irq(unsigned int irq, unsigned int addr,
-                        int pos,  int priority);
-extern void make_imask_irq(unsigned int irq);
-
 #define PORT_PACR      0xA4050100UL
 #define PORT_PBCR      0xA4050102UL
 #define PORT_PCCR      0xA4050104UL
@@ -343,8 +311,6 @@ extern void make_imask_irq(unsigned int irq);
 #define IRQ6_PRIORITY  1
 #define IRQ7_PRIORITY  1
 
-extern int shmse_irq_demux(int irq);
-#define __irq_demux(irq) shmse_irq_demux(irq)
-#define irq_demux(irq) __irq_demux(irq)
+int shmse_irq_demux(int irq);
 
 #endif /* __ASM_SH_IRQ_SH73180_H */
index 8c8ca12810842936433261915a33eabfd2e2a319..7f90315cd8304359c9d35653fb9709822c3c8ef1 100644 (file)
 #define        GPIO_IPR_POS    2
 #define        GPIO_PRIORITY   3
 
-/* ONCHIP_NR_IRQS */
-#define NR_IRQS 150    /* 111 + 16 */
-
-/* In a generic kernel, NR_IRQS is an upper bound, and we should use
- * ACTUAL_NR_IRQS (which uses the machine vector) to get the correct value.
- */
-#define ACTUAL_NR_IRQS NR_IRQS
-
-extern void disable_irq(unsigned int);
-extern void disable_irq_nosync(unsigned int);
-extern void enable_irq(unsigned int);
-
-/*
- * Simple Mask Register Support
- */
-extern void make_maskreg_irq(unsigned int irq);
-extern unsigned short *irq_mask_register;
-
-/*
- * Function for "on chip support modules".
- */
-extern void make_imask_irq(unsigned int irq);
-
 #define        INTC_TMU0_MSK   0
 #define        INTC_TMU3_MSK   1
 #define        INTC_RTC_MSK    2
index 060ec3c272072a19e98d391d3c295afa75b21a08..42b8394c04ed6de00474532297b18c1d8ce84fd4 100644 (file)
 #endif /* ST40STB1 */
 
 #endif /* 775x / SH4-202 / ST40STB1 */
+#endif /* 7780 */
 
 /* NR_IRQS is made from three components:
  *   1. ONCHIP_NR_IRQS - number of IRLS + on-chip peripherial modules
 # define ONCHIP_NR_IRQS 72
 #elif defined(CONFIG_CPU_SUBTYPE_ST40STB1)
 # define ONCHIP_NR_IRQS 144
-#elif defined(CONFIG_CPU_SUBTYPE_SH7300)
+#elif defined(CONFIG_CPU_SUBTYPE_SH7300) || \
+      defined(CONFIG_CPU_SUBTYPE_SH73180)
 # define ONCHIP_NR_IRQS 109
+#elif defined(CONFIG_CPU_SUBTYPE_SH7780)
+# define ONCHIP_NR_IRQS 111
 #elif defined(CONFIG_SH_UNKNOWN)       /* Most be last */
 # define ONCHIP_NR_IRQS 144
 #endif
 # define OFFCHIP_NR_IRQS 96
 #elif defined (CONFIG_SH_TITAN)
 # define OFFCHIP_NR_IRQS 4
+#elif defined(CONFIG_SH_R7780RP)
+# define OFFCHIP_NR_IRQS 16
 #elif defined(CONFIG_SH_UNKNOWN)
 # define OFFCHIP_NR_IRQS 16    /* Must also be last */
 #else
@@ -550,7 +556,7 @@ extern int ipr_irq_demux(int irq);
 #define INTC_ICR_IRLM  (1<<7)
 #endif
 
-#else
+#ifdef CONFIG_CPU_SUBTYPE_SH7780
 #include <asm/irq-sh7780.h>
 #endif
 
similarity index 65%
rename from include/asm-sh/microdev/irq.h
rename to include/asm-sh/microdev.h
index 47f6f77a65f0fbee7c705bd7930d9a66acb4c6b3..018332a9e59074367539a19a1f34cc367445b382 100644 (file)
@@ -1,32 +1,27 @@
 /*
- * linux/include/asm-sh/irq_microdev.h
+ * linux/include/asm-sh/microdev.h
  *
  * Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com)
  *
- * IRQ functions for the SuperH SH4-202 MicroDev board.
+ * Definitions for the SuperH SH4-202 MicroDev board.
  *
  * May be copied or modified under the terms of the GNU General Public
  * License.  See linux/COPYING for more information.
- *
  */
-
-
-#ifndef _ASM_SH_IRQ_MICRODEV_H
-#define _ASM_SH_IRQ_MICRODEV_H
+#ifndef __ASM_SH_MICRODEV_H
+#define __ASM_SH_MICRODEV_H
 
 extern void init_microdev_irq(void);
 extern void microdev_print_fpga_intc_status(void);
 
-
-       /*
-        *      The following are useful macros for manipulating the
-        *      interrupt controller (INTC) on the CPU-board FPGA.
-        *      It should be noted that there is an INTC on the FPGA,
-        *      and a seperate INTC on the SH4-202 core - these are
-        *      two different things, both of which need to be prorammed
-        *      to correctly route - unfortunately, they have the
-        *      same name and abbreviations!
-        */
+/*
+ * The following are useful macros for manipulating the interrupt
+ * controller (INTC) on the CPU-board FPGA.  should be noted that there
+ * is an INTC on the FPGA, and a seperate INTC on the SH4-202 core -
+ * these are two different things, both of which need to be prorammed to
+ * correctly route - unfortunately, they have the same name and
+ * abbreviations!
+ */
 #define        MICRODEV_FPGA_INTC_BASE         0xa6110000ul                            /* INTC base address on CPU-board FPGA */
 #define        MICRODEV_FPGA_INTENB_REG        (MICRODEV_FPGA_INTC_BASE+0ul)           /* Interrupt Enable Register on INTC on CPU-board FPGA */
 #define        MICRODEV_FPGA_INTDSB_REG        (MICRODEV_FPGA_INTC_BASE+8ul)           /* Interrupt Disable Register on INTC on CPU-board FPGA */
@@ -38,10 +33,10 @@ extern void microdev_print_fpga_intc_status(void);
 #define        MICRODEV_FPGA_INTREQ_REG        (MICRODEV_FPGA_INTC_BASE+0x38ul)        /* Interrupt Request Register on INTC on CPU-board FPGA */
 
 
-       /*
-        *      The following are the IRQ numbers for the Linux Kernel for external interrupts.
       *      i.e. the numbers seen by 'cat /proc/interrupt'.
       */
+/*
+ * The following are the IRQ numbers for the Linux Kernel for external
* interrupts.  i.e. the numbers seen by 'cat /proc/interrupt'.
+ */
 #define MICRODEV_LINUX_IRQ_KEYBOARD     1      /* SuperIO Keyboard */
 #define MICRODEV_LINUX_IRQ_SERIAL1      2      /* SuperIO Serial #1 */
 #define MICRODEV_LINUX_IRQ_ETHERNET     3      /* on-board Ethnernet */
@@ -51,10 +46,11 @@ extern void microdev_print_fpga_intc_status(void);
 #define MICRODEV_LINUX_IRQ_IDE2                13      /* SuperIO IDE #2 */
 #define MICRODEV_LINUX_IRQ_IDE1                14      /* SuperIO IDE #1 */
 
-       /*
-        *      The following are the IRQ numbers for the INTC on the FPGA for external interrupts.
-        *      i.e. the bits in the INTC registers in the FPGA.
-        */
+/*
+ * The following are the IRQ numbers for the INTC on the FPGA for
+ * external interrupts.  i.e. the bits in the INTC registers in the
+ * FPGA.
+ */
 #define MICRODEV_FPGA_IRQ_KEYBOARD      1      /* SuperIO Keyboard */
 #define MICRODEV_FPGA_IRQ_SERIAL1       3      /* SuperIO Serial #1 */
 #define MICRODEV_FPGA_IRQ_SERIAL2       4      /* SuperIO Serial #2 */
@@ -69,4 +65,16 @@ extern void microdev_print_fpga_intc_status(void);
 #define MICRODEV_IRQ_PCI_INTC          10
 #define MICRODEV_IRQ_PCI_INTD          11
 
-#endif /* _ASM_SH_IRQ_MICRODEV_H */
+#define __IO_PREFIX microdev
+#include <asm/io_generic.h>
+
+#if defined(CONFIG_PCI)
+unsigned char  microdev_pci_inb(unsigned long port);
+unsigned short microdev_pci_inw(unsigned long port);
+unsigned long  microdev_pci_inl(unsigned long port);
+void           microdev_pci_outb(unsigned char  data, unsigned long port);
+void           microdev_pci_outw(unsigned short data, unsigned long port);
+void           microdev_pci_outl(unsigned long  data, unsigned long port);
+#endif
+
+#endif /* __ASM_SH_MICRODEV_H */
diff --git a/include/asm-sh/microdev/io.h b/include/asm-sh/microdev/io.h
deleted file mode 100644 (file)
index f2ca4ac..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * linux/include/asm-sh/io_microdev.h
- *
- * Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com)
- *
- * IO functions for the SuperH SH4-202 MicroDev board.
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- */
-
-
-#ifndef _ASM_SH_IO_MICRODEV_H
-#define _ASM_SH_IO_MICRODEV_H
-
-extern unsigned long microdev_isa_port2addr(unsigned long offset);
-
-extern unsigned char microdev_inb(unsigned long port);
-extern unsigned short microdev_inw(unsigned long port);
-extern unsigned int microdev_inl(unsigned long port);
-
-extern void microdev_outb(unsigned char value, unsigned long port);
-extern void microdev_outw(unsigned short value, unsigned long port);
-extern void microdev_outl(unsigned int value, unsigned long port);
-
-extern unsigned char microdev_inb_p(unsigned long port);
-extern unsigned short microdev_inw_p(unsigned long port);
-extern unsigned int microdev_inl_p(unsigned long port);
-
-extern void microdev_outb_p(unsigned char value, unsigned long port);
-extern void microdev_outw_p(unsigned short value, unsigned long port);
-extern void microdev_outl_p(unsigned int value, unsigned long port);
-
-extern void microdev_insb(unsigned long port, void *addr, unsigned long count);
-extern void microdev_insw(unsigned long port, void *addr, unsigned long count);
-extern void microdev_insl(unsigned long port, void *addr, unsigned long count);
-
-extern void microdev_outsb(unsigned long port, const void *addr, unsigned long count);
-extern void microdev_outsw(unsigned long port, const void *addr, unsigned long count);
-extern void microdev_outsl(unsigned long port, const void *addr, unsigned long count);
-
-#if defined(CONFIG_PCI)
-extern unsigned char  microdev_pci_inb(unsigned long port);
-extern unsigned short microdev_pci_inw(unsigned long port);
-extern unsigned long  microdev_pci_inl(unsigned long port);
-extern void           microdev_pci_outb(unsigned char  data, unsigned long port);
-extern void           microdev_pci_outw(unsigned short data, unsigned long port);
-extern void           microdev_pci_outl(unsigned long  data, unsigned long port);
-#endif
-
-#endif /* _ASM_SH_IO_MICRODEV_H */
-
index c4904797d6dfe19bbb0a524384fbccece72d2bc1..fa5bd2d8803e4d612abe73ba0c0de9011aa895cc 100644 (file)
@@ -12,7 +12,6 @@
 #include <asm/page.h>
 #include <asm/types.h>
 #include <asm/cache.h>
-#include <linux/threads.h>
 #include <asm/ptrace.h>
 
 /*
@@ -30,7 +29,7 @@
  *  CPU type and hardware bug flags. Kept separately for each CPU.
  *
  *  Each one of these also needs a CONFIG_CPU_SUBTYPE_xxx entry
- *  in arch/sh/Kconfig, as well as an entry in arch/sh/kernel/setup.c
+ *  in arch/sh/mm/Kconfig, as well as an entry in arch/sh/kernel/setup.c
  *  for parsing the subtype in get_cpu_subtype().
  */
 enum cpu_type {
@@ -44,7 +43,7 @@ enum cpu_type {
        /* SH-4 types */
        CPU_SH7750, CPU_SH7750S, CPU_SH7750R, CPU_SH7751, CPU_SH7751R,
        CPU_SH7760, CPU_ST40RA, CPU_ST40GX1, CPU_SH4_202, CPU_SH4_501,
-       CPU_SH73180,
+       CPU_SH73180, CPU_SH7770, CPU_SH7780, CPU_SH7781,
 
        /* Unknown subtype */
        CPU_SH_NONE
@@ -52,14 +51,8 @@ enum cpu_type {
 
 struct sh_cpuinfo {
        enum cpu_type type;
-       char    hard_math;
        unsigned long loops_per_jiffy;
 
-       unsigned int cpu_clock, master_clock, bus_clock, module_clock;
-#ifdef CONFIG_CPU_SUBTYPE_ST40STB1
-       unsigned int memory_clock;
-#endif
-
        struct cache_info icache;
        struct cache_info dcache;
 
@@ -131,7 +124,7 @@ union sh_fpu_union {
        struct sh_fpu_soft_struct soft;
 };
 
-/* 
+/*
  * Processor flags
  */
 
@@ -140,6 +133,7 @@ union sh_fpu_union {
 #define CPU_HAS_MMU_PAGE_ASSOC 0x0004  /* SH3: TLB way selection bit support */
 #define CPU_HAS_DSP            0x0008  /* SH-DSP: DSP support */
 #define CPU_HAS_PERF_COUNTER   0x0010  /* Hardware performance counters */
+#define CPU_HAS_PTEA           0x0020  /* PTEA register */
 
 struct thread_struct {
        unsigned long sp;
@@ -160,10 +154,10 @@ extern int ubc_usercnt;
 #define INIT_THREAD  {                                         \
        sizeof(init_stack) + (long) &init_stack, /* sp */       \
        0,                                       /* pc */       \
-       0, 0,                                                   \
-       0,                                                      \
-       0,                                                      \
-       {{{0,}},}                               /* fpu state */ \
+       0, 0,                                                   \
+       0,                                                      \
+       0,                                                      \
+       {{{0,}},}                               /* fpu state */ \
 }
 
 /*
@@ -171,7 +165,7 @@ extern int ubc_usercnt;
  */
 #define start_thread(regs, new_pc, new_sp)      \
        set_fs(USER_DS);                         \
-       regs->pr = 0;                            \
+       regs->pr = 0;                            \
        regs->sr = SR_FD;       /* User mode. */ \
        regs->pc = new_pc;                       \
        regs->regs[15] = new_sp
@@ -239,16 +233,16 @@ extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
 #define save_fpu(tsk)  do { } while (0)
 #endif
 
-#define unlazy_fpu(tsk, regs) do {                             \
+#define unlazy_fpu(tsk, regs) do {                     \
        if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {   \
-               save_fpu(tsk, regs);                            \
+               save_fpu(tsk, regs);                    \
        }                                               \
 } while (0)
 
-#define clear_fpu(tsk, regs) do {                                      \
-       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {           \
-               clear_tsk_thread_flag(tsk, TIF_USEDFPU);        \
-               release_fpu(regs);                                      \
+#define clear_fpu(tsk, regs) do {                              \
+       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {           \
+               clear_tsk_thread_flag(tsk, TIF_USEDFPU);        \
+               release_fpu(regs);                              \
        }                                                       \
 } while (0)
 
index 08f3c1f2e41903309eb7182afad88b2065c26ac8..6b0c04f63c576fb61a46bf6dd64720849601502a 100644 (file)
 #define TIOCSERSETMULTI 0x40a8545b     /* _IOW('T', 91, struct serial_multiport_struct) 0x545B */ /* Set multiport config */
 
 #define TIOCMIWAIT     0x545c          /* _IO('T', 92) wait for a change on serial input line(s) */
-#define TIOCGICOUNT    0x802c545d      /* _IOR('T', 93, struct async_icount) 0x545D */ /* read serial port inline interrupt counts */
+#define TIOCGICOUNT    0x545d          /* read serial port inline interrupt counts */
 
 #endif /* __ASM_SH64_IOCTLS_H */
index 175722a9116478545c8d8c90da1b8f92fe0fe9f5..96b35aada79a4480d881239cae02d8a5e74f8056 100644 (file)
@@ -5,8 +5,8 @@
  * Author: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
  */
 
-#ifndef __ASM_LDT_I386_H
-#define __ASM_LDT_I386_H
+#ifndef __ASM_LDT_X86_64_H
+#define __ASM_LDT_X86_64_H
 
 #include "asm/semaphore.h"
 #include "asm/arch/ldt.h"
@@ -39,11 +39,13 @@ typedef struct uml_ldt {
 } uml_ldt_t;
 
 /*
- * macros stolen from include/asm-i386/desc.h
+ * macros stolen from include/asm-x86_64/desc.h
  */
 #define LDT_entry_a(info) \
        ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
 
+/* Don't allow setting of the lm bit. It is useless anyways because
+ * 64bit system calls require __USER_CS. */
 #define LDT_entry_b(info) \
        (((info)->base_addr & 0xff000000) | \
        (((info)->base_addr & 0x00ff0000) >> 16) | \
@@ -54,6 +56,7 @@ typedef struct uml_ldt {
        ((info)->seg_32bit << 22) | \
        ((info)->limit_in_pages << 23) | \
        ((info)->useable << 20) | \
+       /* ((info)->lm << 21) | */ \
        0x7000)
 
 #define LDT_empty(info) (\
@@ -64,6 +67,7 @@ typedef struct uml_ldt {
        (info)->seg_32bit       == 0    && \
        (info)->limit_in_pages  == 0    && \
        (info)->seg_not_present == 1    && \
-       (info)->useable         == 0    )
+       (info)->useable         == 0    && \
+       (info)->lm              == 0)
 
 #endif
index d879eba2b52c7d74e646a3213911304f877279c5..aeda6657f366e156ff8e6997f06a6726f19098ea 100644 (file)
@@ -23,6 +23,8 @@ extern inline void smp_cpus_done(unsigned int maxcpus)
 {
 }
 
+extern struct task_struct *idle_threads[NR_CPUS];
+
 #endif
 
 #endif
index e87cd83a0e86dbbce4e9eb21fa09787400b6d6fb..9afc0c7d3661931fbb52efa6c4a4be09c1ddc6d2 100644 (file)
 #define __NR_ia32_inotify_add_watch    292
 #define __NR_ia32_inotify_rm_watch     293
 #define __NR_ia32_migrate_pages                294
-#define __NR_ia32_opanat               295
+#define __NR_ia32_openat               295
 #define __NR_ia32_mkdirat              296
 #define __NR_ia32_mknodat              297
 #define __NR_ia32_fchownat             298
index 10248a9a0582e1136624fc987355dae317ce725f..14fc3ddd90310044019cbc707bda621fad3c87ad 100644 (file)
@@ -188,7 +188,7 @@ extern void mp_register_lapic_address (u64 address);
 extern void mp_register_ioapic (u8 id, u32 address, u32 gsi_base);
 extern void mp_override_legacy_irq (u8 bus_irq, u8 polarity, u8 trigger, u32 gsi);
 extern void mp_config_acpi_legacy_irqs (void);
-extern int mp_register_gsi (u32 gsi, int edge_level, int active_high_low);
+extern int mp_register_gsi (u32 gsi, int triggering, int polarity);
 #endif /*CONFIG_X86_IO_APIC*/
 #endif
 
diff --git a/include/asm-xtensa/futex.h b/include/asm-xtensa/futex.h
new file mode 100644 (file)
index 0000000..0b74582
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/futex.h>
index 026c3c011dc0c8fed9ab441e3374fdefe7f61bcf..84d3d9f034ceb23e380d98380af97800cea57f53 100644 (file)
@@ -435,7 +435,7 @@ extern int sbf_port ;
 
 #endif         /* !CONFIG_ACPI */
 
-int acpi_register_gsi (u32 gsi, int edge_level, int active_high_low);
+int acpi_register_gsi (u32 gsi, int triggering, int polarity);
 int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
 
 /*
index 83c7d207b80e7e8416e68813cf20dc38c9545e9e..51e0e95a421a1a19ed3bfbc30e6e530b112dee55 100644 (file)
@@ -91,7 +91,7 @@ struct target_type {
 };
 
 struct io_restrictions {
-       unsigned short          max_sectors;
+       unsigned int            max_sectors;
        unsigned short          max_phys_segments;
        unsigned short          max_hw_segments;
        unsigned short          hardsect_size;
index 84bb449b9b01734dd864df59008724805de550af..e059da9470076a7af7a2a68e76bd29605369e75a 100644 (file)
@@ -363,6 +363,8 @@ struct address_space_operations {
                        loff_t offset, unsigned long nr_segs);
        struct page* (*get_xip_page)(struct address_space *, sector_t,
                        int);
+       /* migrate the contents of a page to the specified target */
+       int (*migratepage) (struct page *, struct page *);
 };
 
 struct backing_dev_info;
@@ -1719,6 +1721,12 @@ extern void simple_release_fs(struct vfsmount **mount, int *count);
 
 extern ssize_t simple_read_from_buffer(void __user *, size_t, loff_t *, const void *, size_t);
 
+#ifdef CONFIG_MIGRATION
+extern int buffer_migrate_page(struct page *, struct page *);
+#else
+#define buffer_migrate_page NULL
+#endif
+
 extern int inode_change_ok(struct inode *, struct iattr *);
 extern int __must_check inode_setattr(struct inode *, struct iattr *);
 
index 528959c52f1b6fd5f9f3f9722f22cfe6616876e1..5425b60021e36193877aac02e6911db800808c4b 100644 (file)
@@ -14,7 +14,7 @@
 #define FUSE_KERNEL_VERSION 7
 
 /** Minor version number of this interface */
-#define FUSE_KERNEL_MINOR_VERSION 5
+#define FUSE_KERNEL_MINOR_VERSION 6
 
 /** The node ID of the root inode */
 #define FUSE_ROOT_ID 1
@@ -58,6 +58,9 @@ struct fuse_kstatfs {
        __u32   spare[6];
 };
 
+/**
+ * Bitmasks for fuse_setattr_in.valid
+ */
 #define FATTR_MODE     (1 << 0)
 #define FATTR_UID      (1 << 1)
 #define FATTR_GID      (1 << 2)
@@ -75,6 +78,11 @@ struct fuse_kstatfs {
 #define FOPEN_DIRECT_IO                (1 << 0)
 #define FOPEN_KEEP_CACHE       (1 << 1)
 
+/**
+ * INIT request/reply flags
+ */
+#define FUSE_ASYNC_READ                (1 << 0)
+
 enum fuse_opcode {
        FUSE_LOOKUP        = 1,
        FUSE_FORGET        = 2,  /* no reply */
@@ -247,12 +255,16 @@ struct fuse_access_in {
 struct fuse_init_in {
        __u32   major;
        __u32   minor;
+       __u32   max_readahead;
+       __u32   flags;
 };
 
 struct fuse_init_out {
        __u32   major;
        __u32   minor;
-       __u32   unused[3];
+       __u32   max_readahead;
+       __u32   flags;
+       __u32   unused;
        __u32   max_write;
 };
 
index 089bfb1fa01a771d7c11ee7de4227deb88d29b00..6361544bb6ae5fef3ee1dcd84dc8788262bd7917 100644 (file)
@@ -40,6 +40,7 @@ enum hrtimer_restart {
 enum hrtimer_state {
        HRTIMER_INACTIVE,       /* Timer is inactive */
        HRTIMER_EXPIRED,                /* Timer is expired */
+       HRTIMER_RUNNING,                /* Timer is running the callback function */
        HRTIMER_PENDING,                /* Timer is pending */
 };
 
@@ -100,9 +101,8 @@ struct hrtimer_base {
 /* Exported timer functions: */
 
 /* Initialize timers: */
-extern void hrtimer_init(struct hrtimer *timer, const clockid_t which_clock);
-extern void hrtimer_rebase(struct hrtimer *timer, const clockid_t which_clock);
-
+extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
+                        enum hrtimer_mode mode);
 
 /* Basic timer operations: */
 extern int hrtimer_start(struct hrtimer *timer, ktime_t tim,
diff --git a/include/linux/io.h b/include/linux/io.h
new file mode 100644 (file)
index 0000000..85533ec
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2006 PathScale, Inc.  All Rights Reserved.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _LINUX_IO_H
+#define _LINUX_IO_H
+
+#include <asm/io.h>
+
+void __iowrite32_copy(void __iomem *to, const void *from, size_t count);
+
+#endif /* _LINUX_IO_H */
index a5363324cf959bcdf8ff21188aee90040e29622a..b49affa0ac5a4d4b779d2e0b9a8967fec7640bec 100644 (file)
@@ -185,6 +185,7 @@ extern enum system_states {
        SYSTEM_HALT,
        SYSTEM_POWER_OFF,
        SYSTEM_RESTART,
+       SYSTEM_SUSPEND_DISK,
 } system_state;
 
 #define TAINT_PROPRIETARY_MODULE       (1<<0)
index 1bd6552cc34134c4e19d5565e992fc91b9785910..6aca67a569a2ff907830ef64e6b69dafc154996c 100644 (file)
  *
  *  Started by: Thomas Gleixner and Ingo Molnar
  *
+ *  Credits:
+ *
+ *     Roman Zippel provided the ideas and primary code snippets of
+ *     the ktime_t union and further simplifications of the original
+ *     code.
+ *
  *  For licencing details see kernel-base/COPYING
  */
 #ifndef _LINUX_KTIME_H
index 93a849f742dbbb47ae5ee00464f328b757d597fe..ebfc238cc243482d9baa9b7bb3bd92391d4f6479 100644 (file)
@@ -91,10 +91,21 @@ struct per_cpu_pageset {
  * be 8 (2 ** 3) zonelists.  GFP_ZONETYPES defines the number of possible
  * combinations of zone modifiers in "zone modifier space".
  *
+ * As an optimisation any zone modifier bits which are only valid when
+ * no other zone modifier bits are set (loners) should be placed in
+ * the highest order bits of this field.  This allows us to reduce the
+ * extent of the zonelists thus saving space.  For example in the case
+ * of three zone modifier bits, we could require up to eight zonelists.
+ * If the left most zone modifier is a "loner" then the highest valid
+ * zonelist would be four allowing us to allocate only five zonelists.
+ * Use the first form for GFP_ZONETYPES when the left most bit is not
+ * a "loner", otherwise use the second.
+ *
  * NOTE! Make sure this matches the zones in <linux/gfp.h>
  */
 #define GFP_ZONEMASK   0x07
-#define GFP_ZONETYPES  5
+/* #define GFP_ZONETYPES       (GFP_ZONEMASK + 1) */           /* Non-loner */
+#define GFP_ZONETYPES  ((GFP_ZONEMASK + 1) / 2 + 1)            /* Loner */
 
 /*
  * On machines where it is needed (eg PCs) we divide physical memory
index 54faf5236da01370e7dc2f366dade682fec05de8..95572c434bc991dc23dd5b9074d3bb36bd69b192 100644 (file)
@@ -84,7 +84,6 @@ struct k_clock {
 void register_posix_clock(const clockid_t clock_id, struct k_clock *new_clock);
 
 /* error handlers for timer_create, nanosleep and settime */
-int do_posix_clock_notimer_create(struct k_itimer *timer);
 int do_posix_clock_nonanosleep(const clockid_t, int flags, struct timespec *,
                               struct timespec __user *);
 int do_posix_clock_nosettime(const clockid_t, struct timespec *tp);
index 7ab2cdb83ef06ecd1809911ae1fde217a78d3c69..015297ff73fa0f590bdf2c5a55c3f4132cd4d727 100644 (file)
@@ -60,8 +60,7 @@ extern void machine_crash_shutdown(struct pt_regs *);
  */
 
 extern void kernel_restart_prepare(char *cmd);
-extern void kernel_halt_prepare(void);
-extern void kernel_power_off_prepare(void);
+extern void kernel_shutdown_prepare(enum system_states state);
 
 extern void kernel_restart(char *cmd);
 extern void kernel_halt(void);
index e276c5ba2bb79c6cddcc99869744fa5fc2efcbac..7d51149bd79393c797a6ea73886d169dd08249b5 100644 (file)
@@ -1971,22 +1971,6 @@ extern struct file_operations reiserfs_file_operations;
 extern struct address_space_operations reiserfs_address_space_operations;
 
 /* fix_nodes.c */
-#ifdef CONFIG_REISERFS_CHECK
-void *reiserfs_kmalloc(size_t size, gfp_t flags, struct super_block *s);
-void reiserfs_kfree(const void *vp, size_t size, struct super_block *s);
-#else
-static inline void *reiserfs_kmalloc(size_t size, int flags,
-                                    struct super_block *s)
-{
-       return kmalloc(size, flags);
-}
-
-static inline void reiserfs_kfree(const void *vp, size_t size,
-                                 struct super_block *s)
-{
-       kfree(vp);
-}
-#endif
 
 int fix_nodes(int n_op_mode, struct tree_balance *p_s_tb,
              struct item_head *p_s_ins_ih, const void *);
index 3e68592e52e9c3351f80294f4d2ef19230b67eb4..31b4c0bd4fa000e94a32f5b8b5f99c9211f68f4e 100644 (file)
@@ -382,7 +382,6 @@ struct reiserfs_sb_info {
                                           on-disk FS format */
 
        /* session statistics */
-       int s_kmallocs;
        int s_disk_reads;
        int s_disk_writes;
        int s_fix_nodes;
index c84354e8374c9978dc4e6e00938be792521aedc7..87280eb6083d44b94133c635b4916255e60b93cb 100644 (file)
@@ -43,8 +43,6 @@ int reiserfs_delete_xattrs(struct inode *inode);
 int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs);
 int reiserfs_xattr_init(struct super_block *sb, int mount_flags);
 int reiserfs_permission(struct inode *inode, int mask, struct nameidata *nd);
-int reiserfs_permission_locked(struct inode *inode, int mask,
-                              struct nameidata *nd);
 
 int reiserfs_xattr_del(struct inode *, const char *);
 int reiserfs_xattr_get(const struct inode *, const char *, void *, size_t);
index 9d6fbeef210472b21a7a974677303183747bc06e..d6b9bcd1384c2767fcef3c2a024ff2c780b65d47 100644 (file)
@@ -91,7 +91,8 @@ static inline void page_dup_rmap(struct page *page)
  * Called from mm/vmscan.c to handle paging out
  */
 int page_referenced(struct page *, int is_locked);
-int try_to_unmap(struct page *);
+int try_to_unmap(struct page *, int ignore_refs);
+void remove_from_swap(struct page *page);
 
 /*
  * Called from mm/filemap_xip.c to unmap empty zero page
@@ -111,7 +112,7 @@ unsigned long page_address_in_vma(struct page *, struct vm_area_struct *);
 #define anon_vma_link(vma)     do {} while (0)
 
 #define page_referenced(page,l) TestClearPageReferenced(page)
-#define try_to_unmap(page)     SWAP_FAIL
+#define try_to_unmap(page, refs) SWAP_FAIL
 
 #endif /* CONFIG_MMU */
 
index ef753654daa56810568aa73bca8b952c533fd588..bb1da86747c701f410d7222e4c09f8a7e7bc9670 100644 (file)
@@ -2617,6 +2617,25 @@ static inline int security_netlink_recv (struct sk_buff *skb)
        return cap_netlink_recv (skb);
 }
 
+static inline struct dentry *securityfs_create_dir(const char *name,
+                                       struct dentry *parent)
+{
+       return ERR_PTR(-ENODEV);
+}
+
+static inline struct dentry *securityfs_create_file(const char *name,
+                                               mode_t mode,
+                                               struct dentry *parent,
+                                               void *data,
+                                               struct file_operations *fops)
+{
+       return ERR_PTR(-ENODEV);
+}
+
+static inline void securityfs_remove(struct dentry *dentry)
+{
+}
+
 #endif /* CONFIG_SECURITY */
 
 #ifdef CONFIG_SECURITY_NETWORK
index 1fb77a9cc148d2a61e3e2f1d1b0b469b01620703..8cf52939d0ab676698083140e8cb80384ee6b263 100644 (file)
@@ -76,7 +76,14 @@ struct cache_sizes {
        kmem_cache_t    *cs_dmacachep;
 };
 extern struct cache_sizes malloc_sizes[];
+
+#ifndef CONFIG_DEBUG_SLAB
 extern void *__kmalloc(size_t, gfp_t);
+#else
+extern void *__kmalloc_track_caller(size_t, gfp_t, void*);
+#define __kmalloc(size, flags) \
+    __kmalloc_track_caller(size, flags, __builtin_return_address(0))
+#endif
 
 static inline void *kmalloc(size_t size, gfp_t flags)
 {
index 4a99e4a7fbf31edf83a86c5c35bfd0b4adbe9baa..f3e17d5963c38cf6697e2c0093fe3b3d80826e57 100644 (file)
@@ -178,6 +178,7 @@ extern int vm_swappiness;
 
 #ifdef CONFIG_NUMA
 extern int zone_reclaim_mode;
+extern int zone_reclaim_interval;
 extern int zone_reclaim(struct zone *, gfp_t, unsigned int);
 #else
 #define zone_reclaim_mode 0
@@ -190,13 +191,20 @@ static inline int zone_reclaim(struct zone *z, gfp_t mask, unsigned int order)
 #ifdef CONFIG_MIGRATION
 extern int isolate_lru_page(struct page *p);
 extern int putback_lru_pages(struct list_head *l);
+extern int migrate_page(struct page *, struct page *);
+extern void migrate_page_copy(struct page *, struct page *);
+extern int migrate_page_remove_references(struct page *, struct page *, int);
 extern int migrate_pages(struct list_head *l, struct list_head *t,
                struct list_head *moved, struct list_head *failed);
+extern int fail_migrate_page(struct page *, struct page *);
 #else
 static inline int isolate_lru_page(struct page *p) { return -ENOSYS; }
 static inline int putback_lru_pages(struct list_head *l) { return 0; }
 static inline int migrate_pages(struct list_head *l, struct list_head *t,
        struct list_head *moved, struct list_head *failed) { return -ENOSYS; }
+/* Possible settings for the migrate_page() method in address_operations */
+#define migrate_page NULL
+#define fail_migrate_page NULL
 #endif
 
 #ifdef CONFIG_MMU
@@ -245,6 +253,7 @@ extern int remove_exclusive_swap_page(struct page *);
 struct backing_dev_info;
 
 extern spinlock_t swap_lock;
+extern int remove_vma_swap(struct vm_area_struct *vma, struct page *page);
 
 /* linux/mm/thrash.c */
 extern struct mm_struct * swap_token_mm;
index e666d6070569021b62fb6e22e1d15e08fbe0419e..3877209d23c35e27cd9e07355edf71b1bf1670c4 100644 (file)
@@ -50,6 +50,8 @@ struct timezone;
 struct tms;
 struct utimbuf;
 struct mq_attr;
+struct compat_stat;
+struct compat_timeval;
 
 #include <linux/config.h>
 #include <linux/types.h>
@@ -534,4 +536,35 @@ asmlinkage long sys_spu_run(int fd, __u32 __user *unpc,
 asmlinkage long sys_spu_create(const char __user *name,
                unsigned int flags, mode_t mode);
 
+asmlinkage long sys_mknodat(int dfd, const char __user * filename, int mode,
+                           unsigned dev);
+asmlinkage long sys_mkdirat(int dfd, const char __user * pathname, int mode);
+asmlinkage long sys_unlinkat(int dfd, const char __user * pathname, int flag);
+asmlinkage long sys_symlinkat(const char __user * oldname,
+                             int newdfd, const char __user * newname);
+asmlinkage long sys_linkat(int olddfd, const char __user *oldname,
+                          int newdfd, const char __user *newname);
+asmlinkage long sys_renameat(int olddfd, const char __user * oldname,
+                            int newdfd, const char __user * newname);
+asmlinkage long sys_futimesat(int dfd, char __user *filename,
+                             struct timeval __user *utimes);
+asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode);
+asmlinkage long sys_fchmodat(int dfd, const char __user * filename,
+                            mode_t mode);
+asmlinkage long sys_fchownat(int dfd, const char __user *filename, uid_t user,
+                            gid_t group, int flag);
+asmlinkage long sys_openat(int dfd, const char __user *filename, int flags,
+                          int mode);
+asmlinkage long sys_newfstatat(int dfd, char __user *filename,
+                              struct stat __user *statbuf, int flag);
+asmlinkage long sys_readlinkat(int dfd, const char __user *path, char __user *buf,
+                              int bufsiz);
+asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename,
+                                    struct compat_timeval __user *t);
+asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename,
+                                     struct compat_stat __user *statbuf,
+                                     int flag);
+asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,
+                                  int flags, int mode);
+
 #endif
index 8352a7ce58951673caff4da3f1a7468d77445fc2..32a4139c4ad8f9277991be3173968d54942b6298 100644 (file)
@@ -182,7 +182,8 @@ enum
        VM_SWAP_TOKEN_TIMEOUT=28, /* default time for token time out */
        VM_DROP_PAGECACHE=29,   /* int: nuke lots of pagecache */
        VM_PERCPU_PAGELIST_FRACTION=30,/* int: fraction of pages in each percpu_pagelist */
-       VM_ZONE_RECLAIM_MODE=31,/* reclaim local zone memory before going off node */
+       VM_ZONE_RECLAIM_MODE=31, /* reclaim local zone memory before going off node */
+       VM_ZONE_RECLAIM_INTERVAL=32, /* time period to wait after reclaim failure */
 };
 
 
index 21b9ce80364429abd04e9ef718834d0a6427eb15..54ae2d59e71bcd2b34c54a099dcb6773736b2bcb 100644 (file)
@@ -8,6 +8,8 @@
        (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
 #define DECLARE_BITMAP(name,bits) \
        unsigned long name[BITS_TO_LONGS(bits)]
+
+#define BITS_PER_BYTE 8
 #endif
 
 #include <linux/posix_types.h>
index 4ae8cfc1c89cffdee486c2a3b28316e583a40747..7f0ab5ee948c633a8065e685a5147e0df3d439ad 100644 (file)
@@ -802,7 +802,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
        init_sigpending(&sig->shared_pending);
        INIT_LIST_HEAD(&sig->posix_timers);
 
-       hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC);
+       hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC, HRTIMER_REL);
        sig->it_real_incr.tv64 = 0;
        sig->real_timer.function = it_real_fn;
        sig->real_timer.data = tsk;
index f1c4155b49ac140051538f12046cb553674657f9..2b6e1757aeddf118f43c31111f46224b00f5d25e 100644 (file)
  *  Credits:
  *     based on kernel/timer.c
  *
+ *     Help, testing, suggestions, bugfixes, improvements were
+ *     provided by:
+ *
+ *     George Anzinger, Andrew Morton, Steven Rostedt, Roman Zippel
+ *     et. al.
+ *
  *  For licencing details see kernel-base/COPYING
  */
 
@@ -66,6 +72,12 @@ EXPORT_SYMBOL_GPL(ktime_get_real);
 
 /*
  * The timer bases:
+ *
+ * Note: If we want to add new timer bases, we have to skip the two
+ * clock ids captured by the cpu-timers. We do this by holding empty
+ * entries rather than doing math adjustment of the clock ids.
+ * This ensures that we capture erroneous accesses to these clock ids
+ * rather than moving them into the range of valid clock id's.
  */
 
 #define MAX_HRTIMER_BASES 2
@@ -483,29 +495,25 @@ ktime_t hrtimer_get_remaining(const struct hrtimer *timer)
 }
 
 /**
- * hrtimer_rebase - rebase an initialized hrtimer to a different base
+ * hrtimer_init - initialize a timer to the given clock
  *
- * @timer:     the timer to be rebased
+ * @timer:     the timer to be initialized
  * @clock_id:  the clock to be used
+ * @mode:      timer mode abs/rel
  */
-void hrtimer_rebase(struct hrtimer *timer, const clockid_t clock_id)
+void hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
+                 enum hrtimer_mode mode)
 {
        struct hrtimer_base *bases;
 
+       memset(timer, 0, sizeof(struct hrtimer));
+
        bases = per_cpu(hrtimer_bases, raw_smp_processor_id());
-       timer->base = &bases[clock_id];
-}
 
-/**
- * hrtimer_init - initialize a timer to the given clock
- *
- * @timer:     the timer to be initialized
- * @clock_id:  the clock to be used
- */
-void hrtimer_init(struct hrtimer *timer, const clockid_t clock_id)
-{
-       memset(timer, 0, sizeof(struct hrtimer));
-       hrtimer_rebase(timer, clock_id);
+       if (clock_id == CLOCK_REALTIME && mode != HRTIMER_ABS)
+               clock_id = CLOCK_MONOTONIC;
+
+       timer->base = &bases[clock_id];
 }
 
 /**
@@ -550,6 +558,7 @@ static inline void run_hrtimer_queue(struct hrtimer_base *base)
                fn = timer->function;
                data = timer->data;
                set_curr_timer(base, timer);
+               timer->state = HRTIMER_RUNNING;
                __remove_hrtimer(timer, base);
                spin_unlock_irq(&base->lock);
 
@@ -565,6 +574,10 @@ static inline void run_hrtimer_queue(struct hrtimer_base *base)
 
                spin_lock_irq(&base->lock);
 
+               /* Another CPU has added back the timer */
+               if (timer->state != HRTIMER_RUNNING)
+                       continue;
+
                if (restart == HRTIMER_RESTART)
                        enqueue_hrtimer(timer, base);
                else
@@ -638,8 +651,7 @@ schedule_hrtimer_interruptible(struct hrtimer *timer,
        return schedule_hrtimer(timer, mode);
 }
 
-static long __sched
-nanosleep_restart(struct restart_block *restart, clockid_t clockid)
+static long __sched nanosleep_restart(struct restart_block *restart)
 {
        struct timespec __user *rmtp;
        struct timespec tu;
@@ -649,7 +661,7 @@ nanosleep_restart(struct restart_block *restart, clockid_t clockid)
 
        restart->fn = do_no_restart_syscall;
 
-       hrtimer_init(&timer, clockid);
+       hrtimer_init(&timer, (clockid_t) restart->arg3, HRTIMER_ABS);
 
        timer.expires.tv64 = ((u64)restart->arg1 << 32) | (u64) restart->arg0;
 
@@ -669,16 +681,6 @@ nanosleep_restart(struct restart_block *restart, clockid_t clockid)
        return -ERESTART_RESTARTBLOCK;
 }
 
-static long __sched nanosleep_restart_mono(struct restart_block *restart)
-{
-       return nanosleep_restart(restart, CLOCK_MONOTONIC);
-}
-
-static long __sched nanosleep_restart_real(struct restart_block *restart)
-{
-       return nanosleep_restart(restart, CLOCK_REALTIME);
-}
-
 long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
                       const enum hrtimer_mode mode, const clockid_t clockid)
 {
@@ -687,7 +689,7 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
        struct timespec tu;
        ktime_t rem;
 
-       hrtimer_init(&timer, clockid);
+       hrtimer_init(&timer, clockid, mode);
 
        timer.expires = timespec_to_ktime(*rqtp);
 
@@ -695,7 +697,7 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
        if (rem.tv64 <= 0)
                return 0;
 
-       /* Absolute timers do not update the rmtp value: */
+       /* Absolute timers do not update the rmtp value and restart: */
        if (mode == HRTIMER_ABS)
                return -ERESTARTNOHAND;
 
@@ -705,11 +707,11 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
                return -EFAULT;
 
        restart = &current_thread_info()->restart_block;
-       restart->fn = (clockid == CLOCK_MONOTONIC) ?
-               nanosleep_restart_mono : nanosleep_restart_real;
+       restart->fn = nanosleep_restart;
        restart->arg0 = timer.expires.tv64 & 0xFFFFFFFF;
        restart->arg1 = timer.expires.tv64 >> 32;
        restart->arg2 = (unsigned long) rmtp;
+       restart->arg3 = (unsigned long) timer.base->index;
 
        return -ERESTART_RESTARTBLOCK;
 }
@@ -736,10 +738,8 @@ static void __devinit init_hrtimers_cpu(int cpu)
        struct hrtimer_base *base = per_cpu(hrtimer_bases, cpu);
        int i;
 
-       for (i = 0; i < MAX_HRTIMER_BASES; i++) {
+       for (i = 0; i < MAX_HRTIMER_BASES; i++, base++)
                spin_lock_init(&base->lock);
-               base++;
-       }
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
index c2c05c4ff28d5bd7bd32cf8ca1eea1dc768b71c2..379be2f8c84c33445b9cea549fe2c7215d3d6cc4 100644 (file)
@@ -49,9 +49,11 @@ int do_getitimer(int which, struct itimerval *value)
 
        switch (which) {
        case ITIMER_REAL:
+               spin_lock_irq(&tsk->sighand->siglock);
                value->it_value = itimer_get_remtime(&tsk->signal->real_timer);
                value->it_interval =
                        ktime_to_timeval(tsk->signal->it_real_incr);
+               spin_unlock_irq(&tsk->sighand->siglock);
                break;
        case ITIMER_VIRTUAL:
                read_lock(&tasklist_lock);
@@ -150,18 +152,25 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
 
        switch (which) {
        case ITIMER_REAL:
+again:
+               spin_lock_irq(&tsk->sighand->siglock);
                timer = &tsk->signal->real_timer;
-               hrtimer_cancel(timer);
                if (ovalue) {
                        ovalue->it_value = itimer_get_remtime(timer);
                        ovalue->it_interval
                                = ktime_to_timeval(tsk->signal->it_real_incr);
                }
+               /* We are sharing ->siglock with it_real_fn() */
+               if (hrtimer_try_to_cancel(timer) < 0) {
+                       spin_unlock_irq(&tsk->sighand->siglock);
+                       goto again;
+               }
                tsk->signal->it_real_incr =
                        timeval_to_ktime(value->it_interval);
                expires = timeval_to_ktime(value->it_value);
                if (expires.tv64 != 0)
                        hrtimer_start(timer, expires, HRTIMER_REL);
+               spin_unlock_irq(&tsk->sighand->siglock);
                break;
        case ITIMER_VIRTUAL:
                nval = timeval_to_cputime(&value->it_value);
index 197208b3aa2ad837517d27662e5bacaafd75258b..216f574b5ffb758ca0630868bca07f03a3d9a116 100644 (file)
@@ -194,9 +194,7 @@ static inline int common_clock_set(const clockid_t which_clock,
 
 static int common_timer_create(struct k_itimer *new_timer)
 {
-       hrtimer_init(&new_timer->it.real.timer, new_timer->it_clock);
-       new_timer->it.real.timer.data = new_timer;
-       new_timer->it.real.timer.function = posix_timer_fn;
+       hrtimer_init(&new_timer->it.real.timer, new_timer->it_clock, 0);
        return 0;
 }
 
@@ -290,7 +288,8 @@ void do_schedule_next_timer(struct siginfo *info)
                info->si_overrun = timr->it_overrun_last;
        }
 
-       unlock_timer(timr, flags);
+       if (timr)
+               unlock_timer(timr, flags);
 }
 
 int posix_timer_event(struct k_itimer *timr,int si_private)
@@ -692,6 +691,7 @@ common_timer_set(struct k_itimer *timr, int flags,
                 struct itimerspec *new_setting, struct itimerspec *old_setting)
 {
        struct hrtimer *timer = &timr->it.real.timer;
+       enum hrtimer_mode mode;
 
        if (old_setting)
                common_timer_get(timr, old_setting);
@@ -713,14 +713,10 @@ common_timer_set(struct k_itimer *timr, int flags,
        if (!new_setting->it_value.tv_sec && !new_setting->it_value.tv_nsec)
                return 0;
 
-       /* Posix madness. Only absolute CLOCK_REALTIME timers
-        * are affected by clock sets. So we must reiniatilize
-        * the timer.
-        */
-       if (timr->it_clock == CLOCK_REALTIME && (flags & TIMER_ABSTIME))
-               hrtimer_rebase(timer, CLOCK_REALTIME);
-       else
-               hrtimer_rebase(timer, CLOCK_MONOTONIC);
+       mode = flags & TIMER_ABSTIME ? HRTIMER_ABS : HRTIMER_REL;
+       hrtimer_init(&timr->it.real.timer, timr->it_clock, mode);
+       timr->it.real.timer.data = timr;
+       timr->it.real.timer.function = posix_timer_fn;
 
        timer->expires = timespec_to_ktime(new_setting->it_value);
 
@@ -728,11 +724,15 @@ common_timer_set(struct k_itimer *timr, int flags,
        timr->it.real.interval = timespec_to_ktime(new_setting->it_interval);
 
        /* SIGEV_NONE timers are not queued ! See common_timer_get */
-       if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE))
+       if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE)) {
+               /* Setup correct expiry time for relative timers */
+               if (mode == HRTIMER_REL)
+                       timer->expires = ktime_add(timer->expires,
+                                                  timer->base->get_time());
                return 0;
+       }
 
-       hrtimer_start(timer, timer->expires, (flags & TIMER_ABSTIME) ?
-                     HRTIMER_ABS : HRTIMER_REL);
+       hrtimer_start(timer, timer->expires, mode);
        return 0;
 }
 
@@ -875,12 +875,6 @@ int do_posix_clock_nosettime(const clockid_t clockid, struct timespec *tp)
 }
 EXPORT_SYMBOL_GPL(do_posix_clock_nosettime);
 
-int do_posix_clock_notimer_create(struct k_itimer *timer)
-{
-       return -EINVAL;
-}
-EXPORT_SYMBOL_GPL(do_posix_clock_notimer_create);
-
 int do_posix_clock_nonanosleep(const clockid_t clock, int flags,
                               struct timespec *t, struct timespec __user *r)
 {
@@ -947,21 +941,8 @@ sys_clock_getres(const clockid_t which_clock, struct timespec __user *tp)
 static int common_nsleep(const clockid_t which_clock, int flags,
                         struct timespec *tsave, struct timespec __user *rmtp)
 {
-       int mode = flags & TIMER_ABSTIME ? HRTIMER_ABS : HRTIMER_REL;
-       int clockid = which_clock;
-
-       switch (which_clock) {
-       case CLOCK_REALTIME:
-               /* Posix madness. Only absolute timers on clock realtime
-                  are affected by clock set. */
-               if (mode != HRTIMER_ABS)
-                       clockid = CLOCK_MONOTONIC;
-       case CLOCK_MONOTONIC:
-               break;
-       default:
-               return -EINVAL;
-       }
-       return hrtimer_nanosleep(tsave, rmtp, mode, clockid);
+       return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ?
+                                HRTIMER_ABS : HRTIMER_REL, which_clock);
 }
 
 asmlinkage long
index 7ff375e7c95f3cf24ab52adf62a688849684e05f..579d239d129fd5dd03458f8889577400b3b56aa1 100644 (file)
@@ -9,18 +9,11 @@
 #include <linux/console.h>
 #include "power.h"
 
-static int new_loglevel = 10;
-static int orig_loglevel;
 #ifdef SUSPEND_CONSOLE
 static int orig_fgconsole, orig_kmsg;
-#endif
 
 int pm_prepare_console(void)
 {
-       orig_loglevel = console_loglevel;
-       console_loglevel = new_loglevel;
-
-#ifdef SUSPEND_CONSOLE
        acquire_console_sem();
 
        orig_fgconsole = fg_console;
@@ -41,18 +34,15 @@ int pm_prepare_console(void)
        }
        orig_kmsg = kmsg_redirect;
        kmsg_redirect = SUSPEND_CONSOLE;
-#endif
        return 0;
 }
 
 void pm_restore_console(void)
 {
-       console_loglevel = orig_loglevel;
-#ifdef SUSPEND_CONSOLE
        acquire_console_sem();
        set_console(orig_fgconsole);
        release_console_sem();
        kmsg_redirect = orig_kmsg;
-#endif
        return;
 }
+#endif
index e24446f8d8cde234357837f7bbf9b740b3a88b34..0b43847dc9801950608f0943d3d6b7ea45776e54 100644 (file)
@@ -53,7 +53,7 @@ static void power_down(suspend_disk_method_t mode)
 
        switch(mode) {
        case PM_DISK_PLATFORM:
-               kernel_power_off_prepare();
+               kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK);
                error = pm_ops->enter(PM_SUSPEND_DISK);
                break;
        case PM_DISK_SHUTDOWN:
@@ -95,13 +95,6 @@ static int prepare_processes(void)
                goto thaw;
        }
 
-       if (pm_disk_mode == PM_DISK_PLATFORM) {
-               if (pm_ops && pm_ops->prepare) {
-                       if ((error = pm_ops->prepare(PM_SUSPEND_DISK)))
-                               goto thaw;
-               }
-       }
-
        /* Free memory before shutting down devices. */
        if (!(error = swsusp_shrink_memory()))
                return 0;
@@ -367,14 +360,14 @@ power_attr(resume);
 
 static ssize_t image_size_show(struct subsystem * subsys, char *buf)
 {
-       return sprintf(buf, "%u\n", image_size);
+       return sprintf(buf, "%lu\n", image_size);
 }
 
 static ssize_t image_size_store(struct subsystem * subsys, const char * buf, size_t n)
 {
-       unsigned int size;
+       unsigned long size;
 
-       if (sscanf(buf, "%u", &size) == 1) {
+       if (sscanf(buf, "%lu", &size) == 1) {
                image_size = size;
                return n;
        }
index d253f3ae2fa5743d9c003c38468f1c4c823193e0..9cb235cba4a9c8136670a74b034fd1738bb615dc 100644 (file)
@@ -133,10 +133,10 @@ static int suspend_enter(suspend_state_t state)
 static void suspend_finish(suspend_state_t state)
 {
        device_resume();
-       if (pm_ops && pm_ops->finish)
-               pm_ops->finish(state);
        thaw_processes();
        enable_nonboot_cpus();
+       if (pm_ops && pm_ops->finish)
+               pm_ops->finish(state);
        pm_restore_console();
 }
 
index 7e8492fd142313ba4cac756274a76c8df4a66975..d8f0d1a76bae9fbf18a8c1d20326d9dc20dd232d 100644 (file)
@@ -42,8 +42,13 @@ static struct subsys_attribute _name##_attr = {      \
 
 extern struct subsystem power_subsys;
 
+#ifdef SUSPEND_CONSOLE
 extern int pm_prepare_console(void);
 extern void pm_restore_console(void);
+#else
+static int pm_prepare_console(void) { return 0; }
+static void pm_restore_console(void) {}
+#endif
 
 /* References to section boundaries */
 extern const void __nosave_begin, __nosave_end;
@@ -51,8 +56,8 @@ extern const void __nosave_begin, __nosave_end;
 extern unsigned int nr_copy_pages;
 extern struct pbe *pagedir_nosave;
 
-/* Preferred image size in MB (default 500) */
-extern unsigned int image_size;
+/* Preferred image size in bytes (default 500 MB) */
+extern unsigned long image_size;
 
 extern asmlinkage int swsusp_arch_suspend(void);
 extern asmlinkage int swsusp_arch_resume(void);
index 55a18d26abeda6a2df3641cdca9de0da2f201ef9..59c91c148e82d0f3ddbbea3a0cdf8260702cd9eb 100644 (file)
 #include "power.h"
 
 /*
- * Preferred image size in MB (tunable via /sys/power/image_size).
+ * Preferred image size in bytes (tunable via /sys/power/image_size).
  * When it is set to N, swsusp will do its best to ensure the image
- * size will not exceed N MB, but if that is impossible, it will
+ * size will not exceed N bytes, but if that is impossible, it will
  * try to create the smallest image possible.
  */
-unsigned int image_size = 500;
+unsigned long image_size = 500 * 1024 * 1024;
 
 #ifdef CONFIG_HIGHMEM
 unsigned int count_highmem_pages(void);
@@ -590,7 +590,7 @@ int swsusp_shrink_memory(void)
                        if (!tmp)
                                return -ENOMEM;
                        pages += tmp;
-               } else if (size > (image_size * 1024 * 1024) / PAGE_SIZE) {
+               } else if (size > image_size / PAGE_SIZE) {
                        tmp = shrink_all_memory(SHRINK_BITE);
                        pages += tmp;
                }
index ec7fd9cee30665e7626ec7d3fb92f9ee6bd57731..f77f23f8f479c898666082f3c9da0d52bb5a5bab 100644 (file)
@@ -4031,7 +4031,7 @@ long sched_getaffinity(pid_t pid, cpumask_t *mask)
                goto out_unlock;
 
        retval = 0;
-       cpus_and(*mask, p->cpus_allowed, cpu_possible_map);
+       cpus_and(*mask, p->cpus_allowed, cpu_online_map);
 
 out_unlock:
        read_unlock(&tasklist_lock);
index d09cac23fdfd6460daa501f6f549e69f762f2391..0929c698affce76e1d48e52ca456b6c82298f928 100644 (file)
@@ -440,23 +440,25 @@ void kernel_kexec(void)
 }
 EXPORT_SYMBOL_GPL(kernel_kexec);
 
+void kernel_shutdown_prepare(enum system_states state)
+{
+       notifier_call_chain(&reboot_notifier_list,
+               (state == SYSTEM_HALT)?SYS_HALT:SYS_POWER_OFF, NULL);
+       system_state = state;
+       device_shutdown();
+}
 /**
  *     kernel_halt - halt the system
  *
  *     Shutdown everything and perform a clean system halt.
  */
-void kernel_halt_prepare(void)
-{
-       notifier_call_chain(&reboot_notifier_list, SYS_HALT, NULL);
-       system_state = SYSTEM_HALT;
-       device_shutdown();
-}
 void kernel_halt(void)
 {
-       kernel_halt_prepare();
+       kernel_shutdown_prepare(SYSTEM_HALT);
        printk(KERN_EMERG "System halted.\n");
        machine_halt();
 }
+
 EXPORT_SYMBOL_GPL(kernel_halt);
 
 /**
@@ -464,20 +466,13 @@ EXPORT_SYMBOL_GPL(kernel_halt);
  *
  *     Shutdown everything and perform a clean system power_off.
  */
-void kernel_power_off_prepare(void)
-{
-       notifier_call_chain(&reboot_notifier_list, SYS_POWER_OFF, NULL);
-       system_state = SYSTEM_POWER_OFF;
-       device_shutdown();
-}
 void kernel_power_off(void)
 {
-       kernel_power_off_prepare();
+       kernel_shutdown_prepare(SYSTEM_POWER_OFF);
        printk(KERN_EMERG "Power down.\n");
        machine_power_off();
 }
 EXPORT_SYMBOL_GPL(kernel_power_off);
-
 /*
  * Reboot system call: for obvious reasons only root may call it,
  * and even root needs to set up some magic numbers in the registers
index cb99a42f8b37c60e991332ce33b4fba1dacb9dc6..71dd6f62efec11ce623d64ef31ec565a78084763 100644 (file)
@@ -878,7 +878,17 @@ static ctl_table vm_table[] = {
                .maxlen         = sizeof(zone_reclaim_mode),
                .mode           = 0644,
                .proc_handler   = &proc_dointvec,
-               .strategy       = &zero,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &zero,
+       },
+       {
+               .ctl_name       = VM_ZONE_RECLAIM_INTERVAL,
+               .procname       = "zone_reclaim_interval",
+               .data           = &zone_reclaim_interval,
+               .maxlen         = sizeof(zone_reclaim_interval),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_jiffies,
+               .strategy       = &sysctl_jiffies,
        },
 #endif
        { .ctl_name = 0 }
index 8535f4d7d1c38420da8d8e7785a932d8ba5b7aa3..648b2c1242fd9066aae0aa966914ee0f47fbce04 100644 (file)
@@ -9,7 +9,7 @@ lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \
 
 lib-y  += kobject.o kref.o kobject_uevent.o klist.o
 
-obj-y += sort.o parser.o halfmd4.o
+obj-y += sort.o parser.o halfmd4.o iomap_copy.o
 
 ifeq ($(CONFIG_DEBUG_KOBJECT),y)
 CFLAGS_kobject.o += -DDEBUG
diff --git a/lib/iomap_copy.c b/lib/iomap_copy.c
new file mode 100644 (file)
index 0000000..a6b1e27
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2006 PathScale, Inc.  All Rights Reserved.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <linux/io.h>
+#include <linux/module.h>
+
+/**
+ * __iowrite32_copy - copy data to MMIO space, in 32-bit units
+ * @to: destination, in MMIO space (must be 32-bit aligned)
+ * @from: source (must be 32-bit aligned)
+ * @count: number of 32-bit quantities to copy
+ *
+ * Copy data from kernel space to MMIO space, in units of 32 bits at a
+ * time.  Order of access is not guaranteed, nor is a memory barrier
+ * performed afterwards.
+ */
+void __attribute__((weak)) __iowrite32_copy(void __iomem *to,
+                                           const void *from,
+                                           size_t count)
+{
+       u32 __iomem *dst = to;
+       const u32 *src = from;
+       const u32 *end = src + count;
+
+       while (src < end)
+               __raw_writel(*src++, dst++);
+}
+EXPORT_SYMBOL_GPL(__iowrite32_copy);
index 7a11ddd5060ff51067523c7872b85e0539537385..2bee1f21aa8aa92294ef481778b3c370063413fb 100644 (file)
@@ -1871,6 +1871,7 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
                goto out;
 
        entry = pte_to_swp_entry(orig_pte);
+again:
        page = lookup_swap_cache(entry);
        if (!page) {
                swapin_readahead(entry, address, vma);
@@ -1894,6 +1895,12 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma,
 
        mark_page_accessed(page);
        lock_page(page);
+       if (!PageSwapCache(page)) {
+               /* Page migration has occured */
+               unlock_page(page);
+               page_cache_release(page);
+               goto again;
+       }
 
        /*
         * Back out if somebody else already faulted in this pte.
index 73790188b0eb27a91edd4d0d8efba6c90d4b28be..27da6d5c77bade350dd88f15eed6424923d91de7 100644 (file)
@@ -95,6 +95,9 @@
 #define MPOL_MF_INVERT (MPOL_MF_INTERNAL << 1)         /* Invert check for nodemask */
 #define MPOL_MF_STATS (MPOL_MF_INTERNAL << 2)          /* Gather statistics */
 
+/* The number of pages to migrate per call to migrate_pages() */
+#define MIGRATE_CHUNK_SIZE 256
+
 static kmem_cache_t *policy_cache;
 static kmem_cache_t *sn_cache;
 
@@ -543,24 +546,91 @@ static void migrate_page_add(struct page *page, struct list_head *pagelist,
        }
 }
 
-static int swap_pages(struct list_head *pagelist)
+/*
+ * Migrate the list 'pagelist' of pages to a certain destination.
+ *
+ * Specify destination with either non-NULL vma or dest_node >= 0
+ * Return the number of pages not migrated or error code
+ */
+static int migrate_pages_to(struct list_head *pagelist,
+                       struct vm_area_struct *vma, int dest)
 {
+       LIST_HEAD(newlist);
        LIST_HEAD(moved);
        LIST_HEAD(failed);
-       int n;
+       int err = 0;
+       int nr_pages;
+       struct page *page;
+       struct list_head *p;
 
-       n = migrate_pages(pagelist, NULL, &moved, &failed);
-       putback_lru_pages(&failed);
-       putback_lru_pages(&moved);
+redo:
+       nr_pages = 0;
+       list_for_each(p, pagelist) {
+               if (vma)
+                       page = alloc_page_vma(GFP_HIGHUSER, vma, vma->vm_start);
+               else
+                       page = alloc_pages_node(dest, GFP_HIGHUSER, 0);
 
-       return n;
+               if (!page) {
+                       err = -ENOMEM;
+                       goto out;
+               }
+               list_add(&page->lru, &newlist);
+               nr_pages++;
+               if (nr_pages > MIGRATE_CHUNK_SIZE);
+                       break;
+       }
+       err = migrate_pages(pagelist, &newlist, &moved, &failed);
+
+       putback_lru_pages(&moved);      /* Call release pages instead ?? */
+
+       if (err >= 0 && list_empty(&newlist) && !list_empty(pagelist))
+               goto redo;
+out:
+       /* Return leftover allocated pages */
+       while (!list_empty(&newlist)) {
+               page = list_entry(newlist.next, struct page, lru);
+               list_del(&page->lru);
+               __free_page(page);
+       }
+       list_splice(&failed, pagelist);
+       if (err < 0)
+               return err;
+
+       /* Calculate number of leftover pages */
+       nr_pages = 0;
+       list_for_each(p, pagelist)
+               nr_pages++;
+       return nr_pages;
+}
+
+/*
+ * Migrate pages from one node to a target node.
+ * Returns error or the number of pages not migrated.
+ */
+int migrate_to_node(struct mm_struct *mm, int source, int dest, int flags)
+{
+       nodemask_t nmask;
+       LIST_HEAD(pagelist);
+       int err = 0;
+
+       nodes_clear(nmask);
+       node_set(source, nmask);
+
+       check_range(mm, mm->mmap->vm_start, TASK_SIZE, &nmask,
+                       flags | MPOL_MF_DISCONTIG_OK, &pagelist);
+
+       if (!list_empty(&pagelist)) {
+               err = migrate_pages_to(&pagelist, NULL, dest);
+               if (!list_empty(&pagelist))
+                       putback_lru_pages(&pagelist);
+       }
+       return err;
 }
 
 /*
- * For now migrate_pages simply swaps out the pages from nodes that are in
- * the source set but not in the target set. In the future, we would
- * want a function that moves pages between the two nodesets in such
- * a way as to preserve the physical layout as much as possible.
+ * Move pages between the two nodesets so as to preserve the physical
+ * layout as much as possible.
  *
  * Returns the number of page that could not be moved.
  */
@@ -568,22 +638,76 @@ int do_migrate_pages(struct mm_struct *mm,
        const nodemask_t *from_nodes, const nodemask_t *to_nodes, int flags)
 {
        LIST_HEAD(pagelist);
-       int count = 0;
-       nodemask_t nodes;
+       int busy = 0;
+       int err = 0;
+       nodemask_t tmp;
 
-       nodes_andnot(nodes, *from_nodes, *to_nodes);
+       down_read(&mm->mmap_sem);
 
-       down_read(&mm->mmap_sem);
-       check_range(mm, mm->mmap->vm_start, TASK_SIZE, &nodes,
-                       flags | MPOL_MF_DISCONTIG_OK, &pagelist);
+/*
+ * Find a 'source' bit set in 'tmp' whose corresponding 'dest'
+ * bit in 'to' is not also set in 'tmp'.  Clear the found 'source'
+ * bit in 'tmp', and return that <source, dest> pair for migration.
+ * The pair of nodemasks 'to' and 'from' define the map.
+ *
+ * If no pair of bits is found that way, fallback to picking some
+ * pair of 'source' and 'dest' bits that are not the same.  If the
+ * 'source' and 'dest' bits are the same, this represents a node
+ * that will be migrating to itself, so no pages need move.
+ *
+ * If no bits are left in 'tmp', or if all remaining bits left
+ * in 'tmp' correspond to the same bit in 'to', return false
+ * (nothing left to migrate).
+ *
+ * This lets us pick a pair of nodes to migrate between, such that
+ * if possible the dest node is not already occupied by some other
+ * source node, minimizing the risk of overloading the memory on a
+ * node that would happen if we migrated incoming memory to a node
+ * before migrating outgoing memory source that same node.
+ *
+ * A single scan of tmp is sufficient.  As we go, we remember the
+ * most recent <s, d> pair that moved (s != d).  If we find a pair
+ * that not only moved, but what's better, moved to an empty slot
+ * (d is not set in tmp), then we break out then, with that pair.
+ * Otherwise when we finish scannng from_tmp, we at least have the
+ * most recent <s, d> pair that moved.  If we get all the way through
+ * the scan of tmp without finding any node that moved, much less
+ * moved to an empty node, then there is nothing left worth migrating.
+ */
 
-       if (!list_empty(&pagelist)) {
-               count = swap_pages(&pagelist);
-               putback_lru_pages(&pagelist);
+       tmp = *from_nodes;
+       while (!nodes_empty(tmp)) {
+               int s,d;
+               int source = -1;
+               int dest = 0;
+
+               for_each_node_mask(s, tmp) {
+                       d = node_remap(s, *from_nodes, *to_nodes);
+                       if (s == d)
+                               continue;
+
+                       source = s;     /* Node moved. Memorize */
+                       dest = d;
+
+                       /* dest not in remaining from nodes? */
+                       if (!node_isset(dest, tmp))
+                               break;
+               }
+               if (source == -1)
+                       break;
+
+               node_clear(source, tmp);
+               err = migrate_to_node(mm, source, dest, flags);
+               if (err > 0)
+                       busy += err;
+               if (err < 0)
+                       break;
        }
 
        up_read(&mm->mmap_sem);
-       return count;
+       if (err < 0)
+               return err;
+       return busy;
 }
 
 long do_mbind(unsigned long start, unsigned long len,
@@ -643,8 +767,9 @@ long do_mbind(unsigned long start, unsigned long len,
                int nr_failed = 0;
 
                err = mbind_range(vma, start, end, new);
+
                if (!list_empty(&pagelist))
-                       nr_failed = swap_pages(&pagelist);
+                       nr_failed = migrate_pages_to(&pagelist, vma, -1);
 
                if (!err && nr_failed && (flags & MPOL_MF_STRICT))
                        err = -EIO;
index 14bd4ec7959736106b1d2574e1fdd82f999242bf..b05ab8f2a562292277bca720ca40a7c14834f520 100644 (file)
@@ -271,6 +271,7 @@ void out_of_memory(gfp_t gfp_mask, int order)
        if (printk_ratelimit()) {
                printk("oom-killer: gfp_mask=0x%x, order=%d\n",
                        gfp_mask, order);
+               dump_stack();
                show_mem();
        }
 
index df54e2fc8ee09760c67d2dd4e6bd496e07286124..44b4eb4202d91e33acc45384f1468a4823ff5442 100644 (file)
@@ -1799,7 +1799,7 @@ void zonetable_add(struct zone *zone, int nid, int zid, unsigned long pfn,
        memmap_init_zone((size), (nid), (zone), (start_pfn))
 #endif
 
-static int __meminit zone_batchsize(struct zone *zone)
+static int __cpuinit zone_batchsize(struct zone *zone)
 {
        int batch;
 
@@ -1893,7 +1893,7 @@ static struct per_cpu_pageset
  * Dynamically allocate memory for the
  * per cpu pageset array in struct zone.
  */
-static int __meminit process_zones(int cpu)
+static int __cpuinit process_zones(int cpu)
 {
        struct zone *zone, *dzone;
 
@@ -1934,7 +1934,7 @@ static inline void free_zone_pagesets(int cpu)
        }
 }
 
-static int __meminit pageset_cpuup_callback(struct notifier_block *nfb,
+static int __cpuinit pageset_cpuup_callback(struct notifier_block *nfb,
                unsigned long action,
                void *hcpu)
 {
index d85a99d28c0387a28d92538a88b92ddfef0efbb2..df2c41c2a9a2c1ac4d46b67c424a0001122a57ea 100644 (file)
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -52,6 +52,7 @@
 #include <linux/init.h>
 #include <linux/rmap.h>
 #include <linux/rcupdate.h>
+#include <linux/module.h>
 
 #include <asm/tlbflush.h>
 
@@ -205,6 +206,36 @@ out:
        return anon_vma;
 }
 
+#ifdef CONFIG_MIGRATION
+/*
+ * Remove an anonymous page from swap replacing the swap pte's
+ * through real pte's pointing to valid pages and then releasing
+ * the page from the swap cache.
+ *
+ * Must hold page lock on page.
+ */
+void remove_from_swap(struct page *page)
+{
+       struct anon_vma *anon_vma;
+       struct vm_area_struct *vma;
+
+       if (!PageAnon(page) || !PageSwapCache(page))
+               return;
+
+       anon_vma = page_lock_anon_vma(page);
+       if (!anon_vma)
+               return;
+
+       list_for_each_entry(vma, &anon_vma->head, anon_vma_node)
+               remove_vma_swap(vma, page);
+
+       spin_unlock(&anon_vma->lock);
+
+       delete_from_swap_cache(page);
+}
+EXPORT_SYMBOL(remove_from_swap);
+#endif
+
 /*
  * At what user virtual address is page expected in vma?
  */
@@ -541,7 +572,8 @@ void page_remove_rmap(struct page *page)
  * Subfunctions of try_to_unmap: try_to_unmap_one called
  * repeatedly from either try_to_unmap_anon or try_to_unmap_file.
  */
-static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma)
+static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
+                               int ignore_refs)
 {
        struct mm_struct *mm = vma->vm_mm;
        unsigned long address;
@@ -564,7 +596,8 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma)
         * skipped over this mm) then we should reactivate it.
         */
        if ((vma->vm_flags & VM_LOCKED) ||
-                       ptep_clear_flush_young(vma, address, pte)) {
+                       (ptep_clear_flush_young(vma, address, pte)
+                               && !ignore_refs)) {
                ret = SWAP_FAIL;
                goto out_unmap;
        }
@@ -698,7 +731,7 @@ static void try_to_unmap_cluster(unsigned long cursor,
        pte_unmap_unlock(pte - 1, ptl);
 }
 
-static int try_to_unmap_anon(struct page *page)
+static int try_to_unmap_anon(struct page *page, int ignore_refs)
 {
        struct anon_vma *anon_vma;
        struct vm_area_struct *vma;
@@ -709,7 +742,7 @@ static int try_to_unmap_anon(struct page *page)
                return ret;
 
        list_for_each_entry(vma, &anon_vma->head, anon_vma_node) {
-               ret = try_to_unmap_one(page, vma);
+               ret = try_to_unmap_one(page, vma, ignore_refs);
                if (ret == SWAP_FAIL || !page_mapped(page))
                        break;
        }
@@ -726,7 +759,7 @@ static int try_to_unmap_anon(struct page *page)
  *
  * This function is only called from try_to_unmap for object-based pages.
  */
-static int try_to_unmap_file(struct page *page)
+static int try_to_unmap_file(struct page *page, int ignore_refs)
 {
        struct address_space *mapping = page->mapping;
        pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT);
@@ -740,7 +773,7 @@ static int try_to_unmap_file(struct page *page)
 
        spin_lock(&mapping->i_mmap_lock);
        vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) {
-               ret = try_to_unmap_one(page, vma);
+               ret = try_to_unmap_one(page, vma, ignore_refs);
                if (ret == SWAP_FAIL || !page_mapped(page))
                        goto out;
        }
@@ -825,16 +858,16 @@ out:
  * SWAP_AGAIN  - we missed a mapping, try again later
  * SWAP_FAIL   - the page is unswappable
  */
-int try_to_unmap(struct page *page)
+int try_to_unmap(struct page *page, int ignore_refs)
 {
        int ret;
 
        BUG_ON(!PageLocked(page));
 
        if (PageAnon(page))
-               ret = try_to_unmap_anon(page);
+               ret = try_to_unmap_anon(page, ignore_refs);
        else
-               ret = try_to_unmap_file(page);
+               ret = try_to_unmap_file(page, ignore_refs);
 
        if (!page_mapped(page))
                ret = SWAP_SUCCESS;
index ce501bce1c2e2369959666de3923e0085112bb73..f7ac7b812f926a24b3ba71bb4757318ab75b357b 100644 (file)
@@ -1028,6 +1028,14 @@ repeat:
                        page_cache_release(swappage);
                        goto repeat;
                }
+               if (!PageSwapCache(swappage)) {
+                       /* Page migration has occured */
+                       shmem_swp_unmap(entry);
+                       spin_unlock(&info->lock);
+                       unlock_page(swappage);
+                       page_cache_release(swappage);
+                       goto repeat;
+               }
                if (PageWriteback(swappage)) {
                        shmem_swp_unmap(entry);
                        spin_unlock(&info->lock);
index 6f8495e2185b36c4d4e08402a111a59a3deeb01b..71370256a7eb11e8b6eeb0c88cbd0e23955ab163 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -55,7 +55,7 @@
  *
  * SMP synchronization:
  *  constructors and destructors are called without any locking.
- *  Several members in kmem_cache_t and struct slab never change, they
+ *  Several members in struct kmem_cache and struct slab never change, they
  *     are accessed without any locking.
  *  The per-cpu arrays are never accessed from the wrong cpu, no locking,
  *     and local interrupts are disabled so slab code is preempt-safe.
@@ -244,7 +244,7 @@ struct slab {
  */
 struct slab_rcu {
        struct rcu_head head;
-       kmem_cache_t *cachep;
+       struct kmem_cache *cachep;
        void *addr;
 };
 
@@ -316,6 +316,8 @@ struct kmem_list3 __initdata initkmem_list3[NUM_INIT_LISTS];
  */
 static __always_inline int index_of(const size_t size)
 {
+       extern void __bad_size(void);
+
        if (__builtin_constant_p(size)) {
                int i = 0;
 
@@ -326,19 +328,16 @@ static __always_inline int index_of(const size_t size)
                i++;
 #include "linux/kmalloc_sizes.h"
 #undef CACHE
-               {
-                       extern void __bad_size(void);
-                       __bad_size();
-               }
+               __bad_size();
        } else
-               BUG();
+               __bad_size();
        return 0;
 }
 
 #define INDEX_AC index_of(sizeof(struct arraycache_init))
 #define INDEX_L3 index_of(sizeof(struct kmem_list3))
 
-static inline void kmem_list3_init(struct kmem_list3 *parent)
+static void kmem_list3_init(struct kmem_list3 *parent)
 {
        INIT_LIST_HEAD(&parent->slabs_full);
        INIT_LIST_HEAD(&parent->slabs_partial);
@@ -364,7 +363,7 @@ static inline void kmem_list3_init(struct kmem_list3 *parent)
        } while (0)
 
 /*
- * kmem_cache_t
+ * struct kmem_cache
  *
  * manages a cache.
  */
@@ -375,7 +374,7 @@ struct kmem_cache {
        unsigned int batchcount;
        unsigned int limit;
        unsigned int shared;
-       unsigned int objsize;
+       unsigned int buffer_size;
 /* 2) touched by every alloc & free from the backend */
        struct kmem_list3 *nodelists[MAX_NUMNODES];
        unsigned int flags;     /* constant flags */
@@ -392,15 +391,15 @@ struct kmem_cache {
        size_t colour;          /* cache colouring range */
        unsigned int colour_off;        /* colour offset */
        unsigned int colour_next;       /* cache colouring */
-       kmem_cache_t *slabp_cache;
+       struct kmem_cache *slabp_cache;
        unsigned int slab_size;
        unsigned int dflags;    /* dynamic flags */
 
        /* constructor func */
-       void (*ctor) (void *, kmem_cache_t *, unsigned long);
+       void (*ctor) (void *, struct kmem_cache *, unsigned long);
 
        /* de-constructor func */
-       void (*dtor) (void *, kmem_cache_t *, unsigned long);
+       void (*dtor) (void *, struct kmem_cache *, unsigned long);
 
 /* 4) cache creation/removal */
        const char *name;
@@ -423,8 +422,14 @@ struct kmem_cache {
        atomic_t freemiss;
 #endif
 #if DEBUG
-       int dbghead;
-       int reallen;
+       /*
+        * If debugging is enabled, then the allocator can add additional
+        * fields and/or padding to every object. buffer_size contains the total
+        * object size including these internal fields, the following two
+        * variables contain the offset to the user object and its size.
+        */
+       int obj_offset;
+       int obj_size;
 #endif
 };
 
@@ -495,50 +500,50 @@ struct kmem_cache {
 
 /* memory layout of objects:
  * 0           : objp
- * 0 .. cachep->dbghead - BYTES_PER_WORD - 1: padding. This ensures that
+ * 0 .. cachep->obj_offset - BYTES_PER_WORD - 1: padding. This ensures that
  *             the end of an object is aligned with the end of the real
  *             allocation. Catches writes behind the end of the allocation.
- * cachep->dbghead - BYTES_PER_WORD .. cachep->dbghead - 1:
+ * cachep->obj_offset - BYTES_PER_WORD .. cachep->obj_offset - 1:
  *             redzone word.
- * cachep->dbghead: The real object.
- * cachep->objsize - 2* BYTES_PER_WORD: redzone word [BYTES_PER_WORD long]
- * cachep->objsize - 1* BYTES_PER_WORD: last caller address [BYTES_PER_WORD long]
+ * cachep->obj_offset: The real object.
+ * cachep->buffer_size - 2* BYTES_PER_WORD: redzone word [BYTES_PER_WORD long]
+ * cachep->buffer_size - 1* BYTES_PER_WORD: last caller address [BYTES_PER_WORD long]
  */
-static int obj_dbghead(kmem_cache_t *cachep)
+static int obj_offset(struct kmem_cache *cachep)
 {
-       return cachep->dbghead;
+       return cachep->obj_offset;
 }
 
-static int obj_reallen(kmem_cache_t *cachep)
+static int obj_size(struct kmem_cache *cachep)
 {
-       return cachep->reallen;
+       return cachep->obj_size;
 }
 
-static unsigned long *dbg_redzone1(kmem_cache_t *cachep, void *objp)
+static unsigned long *dbg_redzone1(struct kmem_cache *cachep, void *objp)
 {
        BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
-       return (unsigned long*) (objp+obj_dbghead(cachep)-BYTES_PER_WORD);
+       return (unsigned long*) (objp+obj_offset(cachep)-BYTES_PER_WORD);
 }
 
-static unsigned long *dbg_redzone2(kmem_cache_t *cachep, void *objp)
+static unsigned long *dbg_redzone2(struct kmem_cache *cachep, void *objp)
 {
        BUG_ON(!(cachep->flags & SLAB_RED_ZONE));
        if (cachep->flags & SLAB_STORE_USER)
-               return (unsigned long *)(objp + cachep->objsize -
+               return (unsigned long *)(objp + cachep->buffer_size -
                                         2 * BYTES_PER_WORD);
-       return (unsigned long *)(objp + cachep->objsize - BYTES_PER_WORD);
+       return (unsigned long *)(objp + cachep->buffer_size - BYTES_PER_WORD);
 }
 
-static void **dbg_userword(kmem_cache_t *cachep, void *objp)
+static void **dbg_userword(struct kmem_cache *cachep, void *objp)
 {
        BUG_ON(!(cachep->flags & SLAB_STORE_USER));
-       return (void **)(objp + cachep->objsize - BYTES_PER_WORD);
+       return (void **)(objp + cachep->buffer_size - BYTES_PER_WORD);
 }
 
 #else
 
-#define obj_dbghead(x)                 0
-#define obj_reallen(cachep)            (cachep->objsize)
+#define obj_offset(x)                  0
+#define obj_size(cachep)               (cachep->buffer_size)
 #define dbg_redzone1(cachep, objp)     ({BUG(); (unsigned long *)NULL;})
 #define dbg_redzone2(cachep, objp)     ({BUG(); (unsigned long *)NULL;})
 #define dbg_userword(cachep, objp)     ({BUG(); (void **)NULL;})
@@ -591,6 +596,18 @@ static inline struct slab *page_get_slab(struct page *page)
        return (struct slab *)page->lru.prev;
 }
 
+static inline struct kmem_cache *virt_to_cache(const void *obj)
+{
+       struct page *page = virt_to_page(obj);
+       return page_get_cache(page);
+}
+
+static inline struct slab *virt_to_slab(const void *obj)
+{
+       struct page *page = virt_to_page(obj);
+       return page_get_slab(page);
+}
+
 /* These are the default caches for kmalloc. Custom caches can have other sizes. */
 struct cache_sizes malloc_sizes[] = {
 #define CACHE(x) { .cs_size = (x) },
@@ -619,16 +636,16 @@ static struct arraycache_init initarray_generic =
     { {0, BOOT_CPUCACHE_ENTRIES, 1, 0} };
 
 /* internal cache of cache description objs */
-static kmem_cache_t cache_cache = {
+static struct kmem_cache cache_cache = {
        .batchcount = 1,
        .limit = BOOT_CPUCACHE_ENTRIES,
        .shared = 1,
-       .objsize = sizeof(kmem_cache_t),
+       .buffer_size = sizeof(struct kmem_cache),
        .flags = SLAB_NO_REAP,
        .spinlock = SPIN_LOCK_UNLOCKED,
        .name = "kmem_cache",
 #if DEBUG
-       .reallen = sizeof(kmem_cache_t),
+       .obj_size = sizeof(struct kmem_cache),
 #endif
 };
 
@@ -657,17 +674,17 @@ static enum {
 
 static DEFINE_PER_CPU(struct work_struct, reap_work);
 
-static void free_block(kmem_cache_t *cachep, void **objpp, int len, int node);
-static void enable_cpucache(kmem_cache_t *cachep);
+static void free_block(struct kmem_cache *cachep, void **objpp, int len, int node);
+static void enable_cpucache(struct kmem_cache *cachep);
 static void cache_reap(void *unused);
-static int __node_shrink(kmem_cache_t *cachep, int node);
+static int __node_shrink(struct kmem_cache *cachep, int node);
 
-static inline struct array_cache *ac_data(kmem_cache_t *cachep)
+static inline struct array_cache *cpu_cache_get(struct kmem_cache *cachep)
 {
        return cachep->array[smp_processor_id()];
 }
 
-static inline kmem_cache_t *__find_general_cachep(size_t size, gfp_t gfpflags)
+static inline struct kmem_cache *__find_general_cachep(size_t size, gfp_t gfpflags)
 {
        struct cache_sizes *csizep = malloc_sizes;
 
@@ -691,43 +708,80 @@ static inline kmem_cache_t *__find_general_cachep(size_t size, gfp_t gfpflags)
        return csizep->cs_cachep;
 }
 
-kmem_cache_t *kmem_find_general_cachep(size_t size, gfp_t gfpflags)
+struct kmem_cache *kmem_find_general_cachep(size_t size, gfp_t gfpflags)
 {
        return __find_general_cachep(size, gfpflags);
 }
 EXPORT_SYMBOL(kmem_find_general_cachep);
 
-/* Cal the num objs, wastage, and bytes left over for a given slab size. */
-static void cache_estimate(unsigned long gfporder, size_t size, size_t align,
-                          int flags, size_t *left_over, unsigned int *num)
+static size_t slab_mgmt_size(size_t nr_objs, size_t align)
 {
-       int i;
-       size_t wastage = PAGE_SIZE << gfporder;
-       size_t extra = 0;
-       size_t base = 0;
+       return ALIGN(sizeof(struct slab)+nr_objs*sizeof(kmem_bufctl_t), align);
+}
 
-       if (!(flags & CFLGS_OFF_SLAB)) {
-               base = sizeof(struct slab);
-               extra = sizeof(kmem_bufctl_t);
-       }
-       i = 0;
-       while (i * size + ALIGN(base + i * extra, align) <= wastage)
-               i++;
-       if (i > 0)
-               i--;
+/* Calculate the number of objects and left-over bytes for a given
+   buffer size. */
+static void cache_estimate(unsigned long gfporder, size_t buffer_size,
+                          size_t align, int flags, size_t *left_over,
+                          unsigned int *num)
+{
+       int nr_objs;
+       size_t mgmt_size;
+       size_t slab_size = PAGE_SIZE << gfporder;
+
+       /*
+        * The slab management structure can be either off the slab or
+        * on it. For the latter case, the memory allocated for a
+        * slab is used for:
+        *
+        * - The struct slab
+        * - One kmem_bufctl_t for each object
+        * - Padding to respect alignment of @align
+        * - @buffer_size bytes for each object
+        *
+        * If the slab management structure is off the slab, then the
+        * alignment will already be calculated into the size. Because
+        * the slabs are all pages aligned, the objects will be at the
+        * correct alignment when allocated.
+        */
+       if (flags & CFLGS_OFF_SLAB) {
+               mgmt_size = 0;
+               nr_objs = slab_size / buffer_size;
 
-       if (i > SLAB_LIMIT)
-               i = SLAB_LIMIT;
+               if (nr_objs > SLAB_LIMIT)
+                       nr_objs = SLAB_LIMIT;
+       } else {
+               /*
+                * Ignore padding for the initial guess. The padding
+                * is at most @align-1 bytes, and @buffer_size is at
+                * least @align. In the worst case, this result will
+                * be one greater than the number of objects that fit
+                * into the memory allocation when taking the padding
+                * into account.
+                */
+               nr_objs = (slab_size - sizeof(struct slab)) /
+                         (buffer_size + sizeof(kmem_bufctl_t));
+
+               /*
+                * This calculated number will be either the right
+                * amount, or one greater than what we want.
+                */
+               if (slab_mgmt_size(nr_objs, align) + nr_objs*buffer_size
+                      > slab_size)
+                       nr_objs--;
 
-       *num = i;
-       wastage -= i * size;
-       wastage -= ALIGN(base + i * extra, align);
-       *left_over = wastage;
+               if (nr_objs > SLAB_LIMIT)
+                       nr_objs = SLAB_LIMIT;
+
+               mgmt_size = slab_mgmt_size(nr_objs, align);
+       }
+       *num = nr_objs;
+       *left_over = slab_size - nr_objs*buffer_size - mgmt_size;
 }
 
 #define slab_error(cachep, msg) __slab_error(__FUNCTION__, cachep, msg)
 
-static void __slab_error(const char *function, kmem_cache_t *cachep, char *msg)
+static void __slab_error(const char *function, struct kmem_cache *cachep, char *msg)
 {
        printk(KERN_ERR "slab error in %s(): cache `%s': %s\n",
               function, cachep->name, msg);
@@ -774,9 +828,9 @@ static struct array_cache *alloc_arraycache(int node, int entries,
 }
 
 #ifdef CONFIG_NUMA
-static void *__cache_alloc_node(kmem_cache_t *, gfp_t, int);
+static void *__cache_alloc_node(struct kmem_cache *, gfp_t, int);
 
-static inline struct array_cache **alloc_alien_cache(int node, int limit)
+static struct array_cache **alloc_alien_cache(int node, int limit)
 {
        struct array_cache **ac_ptr;
        int memsize = sizeof(void *) * MAX_NUMNODES;
@@ -803,7 +857,7 @@ static inline struct array_cache **alloc_alien_cache(int node, int limit)
        return ac_ptr;
 }
 
-static inline void free_alien_cache(struct array_cache **ac_ptr)
+static void free_alien_cache(struct array_cache **ac_ptr)
 {
        int i;
 
@@ -816,8 +870,8 @@ static inline void free_alien_cache(struct array_cache **ac_ptr)
        kfree(ac_ptr);
 }
 
-static inline void __drain_alien_cache(kmem_cache_t *cachep,
-                                      struct array_cache *ac, int node)
+static void __drain_alien_cache(struct kmem_cache *cachep,
+                               struct array_cache *ac, int node)
 {
        struct kmem_list3 *rl3 = cachep->nodelists[node];
 
@@ -829,7 +883,7 @@ static inline void __drain_alien_cache(kmem_cache_t *cachep,
        }
 }
 
-static void drain_alien_cache(kmem_cache_t *cachep, struct kmem_list3 *l3)
+static void drain_alien_cache(struct kmem_cache *cachep, struct kmem_list3 *l3)
 {
        int i = 0;
        struct array_cache *ac;
@@ -854,7 +908,7 @@ static int __devinit cpuup_callback(struct notifier_block *nfb,
                                    unsigned long action, void *hcpu)
 {
        long cpu = (long)hcpu;
-       kmem_cache_t *cachep;
+       struct kmem_cache *cachep;
        struct kmem_list3 *l3 = NULL;
        int node = cpu_to_node(cpu);
        int memsize = sizeof(struct kmem_list3);
@@ -992,7 +1046,7 @@ static struct notifier_block cpucache_notifier = { &cpuup_callback, NULL, 0 };
 /*
  * swap the static kmem_list3 with kmalloced memory
  */
-static void init_list(kmem_cache_t *cachep, struct kmem_list3 *list, int nodeid)
+static void init_list(struct kmem_cache *cachep, struct kmem_list3 *list, int nodeid)
 {
        struct kmem_list3 *ptr;
 
@@ -1032,14 +1086,14 @@ void __init kmem_cache_init(void)
 
        /* Bootstrap is tricky, because several objects are allocated
         * from caches that do not exist yet:
-        * 1) initialize the cache_cache cache: it contains the kmem_cache_t
+        * 1) initialize the cache_cache cache: it contains the struct kmem_cache
         *    structures of all caches, except cache_cache itself: cache_cache
         *    is statically allocated.
         *    Initially an __init data area is used for the head array and the
         *    kmem_list3 structures, it's replaced with a kmalloc allocated
         *    array at the end of the bootstrap.
         * 2) Create the first kmalloc cache.
-        *    The kmem_cache_t for the new cache is allocated normally.
+        *    The struct kmem_cache for the new cache is allocated normally.
         *    An __init data area is used for the head array.
         * 3) Create the remaining kmalloc caches, with minimally sized
         *    head arrays.
@@ -1057,9 +1111,9 @@ void __init kmem_cache_init(void)
        cache_cache.array[smp_processor_id()] = &initarray_cache.cache;
        cache_cache.nodelists[numa_node_id()] = &initkmem_list3[CACHE_CACHE];
 
-       cache_cache.objsize = ALIGN(cache_cache.objsize, cache_line_size());
+       cache_cache.buffer_size = ALIGN(cache_cache.buffer_size, cache_line_size());
 
-       cache_estimate(0, cache_cache.objsize, cache_line_size(), 0,
+       cache_estimate(0, cache_cache.buffer_size, cache_line_size(), 0,
                       &left_over, &cache_cache.num);
        if (!cache_cache.num)
                BUG();
@@ -1132,8 +1186,8 @@ void __init kmem_cache_init(void)
                ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL);
 
                local_irq_disable();
-               BUG_ON(ac_data(&cache_cache) != &initarray_cache.cache);
-               memcpy(ptr, ac_data(&cache_cache),
+               BUG_ON(cpu_cache_get(&cache_cache) != &initarray_cache.cache);
+               memcpy(ptr, cpu_cache_get(&cache_cache),
                       sizeof(struct arraycache_init));
                cache_cache.array[smp_processor_id()] = ptr;
                local_irq_enable();
@@ -1141,9 +1195,9 @@ void __init kmem_cache_init(void)
                ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL);
 
                local_irq_disable();
-               BUG_ON(ac_data(malloc_sizes[INDEX_AC].cs_cachep)
+               BUG_ON(cpu_cache_get(malloc_sizes[INDEX_AC].cs_cachep)
                       != &initarray_generic.cache);
-               memcpy(ptr, ac_data(malloc_sizes[INDEX_AC].cs_cachep),
+               memcpy(ptr, cpu_cache_get(malloc_sizes[INDEX_AC].cs_cachep),
                       sizeof(struct arraycache_init));
                malloc_sizes[INDEX_AC].cs_cachep->array[smp_processor_id()] =
                    ptr;
@@ -1170,7 +1224,7 @@ void __init kmem_cache_init(void)
 
        /* 6) resize the head arrays to their final sizes */
        {
-               kmem_cache_t *cachep;
+               struct kmem_cache *cachep;
                mutex_lock(&cache_chain_mutex);
                list_for_each_entry(cachep, &cache_chain, next)
                    enable_cpucache(cachep);
@@ -1181,7 +1235,7 @@ void __init kmem_cache_init(void)
        g_cpucache_up = FULL;
 
        /* Register a cpu startup notifier callback
-        * that initializes ac_data for all new cpus
+        * that initializes cpu_cache_get for all new cpus
         */
        register_cpu_notifier(&cpucache_notifier);
 
@@ -1213,7 +1267,7 @@ __initcall(cpucache_init);
  * did not request dmaable memory, we might get it, but that
  * would be relatively rare and ignorable.
  */
-static void *kmem_getpages(kmem_cache_t *cachep, gfp_t flags, int nodeid)
+static void *kmem_getpages(struct kmem_cache *cachep, gfp_t flags, int nodeid)
 {
        struct page *page;
        void *addr;
@@ -1239,7 +1293,7 @@ static void *kmem_getpages(kmem_cache_t *cachep, gfp_t flags, int nodeid)
 /*
  * Interface to system's page release.
  */
-static void kmem_freepages(kmem_cache_t *cachep, void *addr)
+static void kmem_freepages(struct kmem_cache *cachep, void *addr)
 {
        unsigned long i = (1 << cachep->gfporder);
        struct page *page = virt_to_page(addr);
@@ -1261,7 +1315,7 @@ static void kmem_freepages(kmem_cache_t *cachep, void *addr)
 static void kmem_rcu_free(struct rcu_head *head)
 {
        struct slab_rcu *slab_rcu = (struct slab_rcu *)head;
-       kmem_cache_t *cachep = slab_rcu->cachep;
+       struct kmem_cache *cachep = slab_rcu->cachep;
 
        kmem_freepages(cachep, slab_rcu->addr);
        if (OFF_SLAB(cachep))
@@ -1271,12 +1325,12 @@ static void kmem_rcu_free(struct rcu_head *head)
 #if DEBUG
 
 #ifdef CONFIG_DEBUG_PAGEALLOC
-static void store_stackinfo(kmem_cache_t *cachep, unsigned long *addr,
+static void store_stackinfo(struct kmem_cache *cachep, unsigned long *addr,
                            unsigned long caller)
 {
-       int size = obj_reallen(cachep);
+       int size = obj_size(cachep);
 
-       addr = (unsigned long *)&((char *)addr)[obj_dbghead(cachep)];
+       addr = (unsigned long *)&((char *)addr)[obj_offset(cachep)];
 
        if (size < 5 * sizeof(unsigned long))
                return;
@@ -1304,10 +1358,10 @@ static void store_stackinfo(kmem_cache_t *cachep, unsigned long *addr,
 }
 #endif
 
-static void poison_obj(kmem_cache_t *cachep, void *addr, unsigned char val)
+static void poison_obj(struct kmem_cache *cachep, void *addr, unsigned char val)
 {
-       int size = obj_reallen(cachep);
-       addr = &((char *)addr)[obj_dbghead(cachep)];
+       int size = obj_size(cachep);
+       addr = &((char *)addr)[obj_offset(cachep)];
 
        memset(addr, val, size);
        *(unsigned char *)(addr + size - 1) = POISON_END;
@@ -1326,7 +1380,7 @@ static void dump_line(char *data, int offset, int limit)
 
 #if DEBUG
 
-static void print_objinfo(kmem_cache_t *cachep, void *objp, int lines)
+static void print_objinfo(struct kmem_cache *cachep, void *objp, int lines)
 {
        int i, size;
        char *realobj;
@@ -1344,8 +1398,8 @@ static void print_objinfo(kmem_cache_t *cachep, void *objp, int lines)
                             (unsigned long)*dbg_userword(cachep, objp));
                printk("\n");
        }
-       realobj = (char *)objp + obj_dbghead(cachep);
-       size = obj_reallen(cachep);
+       realobj = (char *)objp + obj_offset(cachep);
+       size = obj_size(cachep);
        for (i = 0; i < size && lines; i += 16, lines--) {
                int limit;
                limit = 16;
@@ -1355,14 +1409,14 @@ static void print_objinfo(kmem_cache_t *cachep, void *objp, int lines)
        }
 }
 
-static void check_poison_obj(kmem_cache_t *cachep, void *objp)
+static void check_poison_obj(struct kmem_cache *cachep, void *objp)
 {
        char *realobj;
        int size, i;
        int lines = 0;
 
-       realobj = (char *)objp + obj_dbghead(cachep);
-       size = obj_reallen(cachep);
+       realobj = (char *)objp + obj_offset(cachep);
+       size = obj_size(cachep);
 
        for (i = 0; i < size; i++) {
                char exp = POISON_FREE;
@@ -1395,20 +1449,20 @@ static void check_poison_obj(kmem_cache_t *cachep, void *objp)
                /* Print some data about the neighboring objects, if they
                 * exist:
                 */
-               struct slab *slabp = page_get_slab(virt_to_page(objp));
+               struct slab *slabp = virt_to_slab(objp);
                int objnr;
 
-               objnr = (objp - slabp->s_mem) / cachep->objsize;
+               objnr = (unsigned)(objp - slabp->s_mem) / cachep->buffer_size;
                if (objnr) {
-                       objp = slabp->s_mem + (objnr - 1) * cachep->objsize;
-                       realobj = (char *)objp + obj_dbghead(cachep);
+                       objp = slabp->s_mem + (objnr - 1) * cachep->buffer_size;
+                       realobj = (char *)objp + obj_offset(cachep);
                        printk(KERN_ERR "Prev obj: start=%p, len=%d\n",
                               realobj, size);
                        print_objinfo(cachep, objp, 2);
                }
                if (objnr + 1 < cachep->num) {
-                       objp = slabp->s_mem + (objnr + 1) * cachep->objsize;
-                       realobj = (char *)objp + obj_dbghead(cachep);
+                       objp = slabp->s_mem + (objnr + 1) * cachep->buffer_size;
+                       realobj = (char *)objp + obj_offset(cachep);
                        printk(KERN_ERR "Next obj: start=%p, len=%d\n",
                               realobj, size);
                        print_objinfo(cachep, objp, 2);
@@ -1417,25 +1471,23 @@ static void check_poison_obj(kmem_cache_t *cachep, void *objp)
 }
 #endif
 
-/* Destroy all the objs in a slab, and release the mem back to the system.
- * Before calling the slab must have been unlinked from the cache.
- * The cache-lock is not held/needed.
+#if DEBUG
+/**
+ * slab_destroy_objs - call the registered destructor for each object in
+ *      a slab that is to be destroyed.
  */
-static void slab_destroy(kmem_cache_t *cachep, struct slab *slabp)
+static void slab_destroy_objs(struct kmem_cache *cachep, struct slab *slabp)
 {
-       void *addr = slabp->s_mem - slabp->colouroff;
-
-#if DEBUG
        int i;
        for (i = 0; i < cachep->num; i++) {
-               void *objp = slabp->s_mem + cachep->objsize * i;
+               void *objp = slabp->s_mem + cachep->buffer_size * i;
 
                if (cachep->flags & SLAB_POISON) {
 #ifdef CONFIG_DEBUG_PAGEALLOC
-                       if ((cachep->objsize % PAGE_SIZE) == 0
+                       if ((cachep->buffer_size % PAGE_SIZE) == 0
                            && OFF_SLAB(cachep))
                                kernel_map_pages(virt_to_page(objp),
-                                                cachep->objsize / PAGE_SIZE,
+                                                cachep->buffer_size / PAGE_SIZE,
                                                 1);
                        else
                                check_poison_obj(cachep, objp);
@@ -1452,18 +1504,32 @@ static void slab_destroy(kmem_cache_t *cachep, struct slab *slabp)
                                           "was overwritten");
                }
                if (cachep->dtor && !(cachep->flags & SLAB_POISON))
-                       (cachep->dtor) (objp + obj_dbghead(cachep), cachep, 0);
+                       (cachep->dtor) (objp + obj_offset(cachep), cachep, 0);
        }
+}
 #else
+static void slab_destroy_objs(struct kmem_cache *cachep, struct slab *slabp)
+{
        if (cachep->dtor) {
                int i;
                for (i = 0; i < cachep->num; i++) {
-                       void *objp = slabp->s_mem + cachep->objsize * i;
+                       void *objp = slabp->s_mem + cachep->buffer_size * i;
                        (cachep->dtor) (objp, cachep, 0);
                }
        }
+}
 #endif
 
+/**
+ * Destroy all the objs in a slab, and release the mem back to the system.
+ * Before calling the slab must have been unlinked from the cache.
+ * The cache-lock is not held/needed.
+ */
+static void slab_destroy(struct kmem_cache *cachep, struct slab *slabp)
+{
+       void *addr = slabp->s_mem - slabp->colouroff;
+
+       slab_destroy_objs(cachep, slabp);
        if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU)) {
                struct slab_rcu *slab_rcu;
 
@@ -1478,9 +1544,9 @@ static void slab_destroy(kmem_cache_t *cachep, struct slab *slabp)
        }
 }
 
-/* For setting up all the kmem_list3s for cache whose objsize is same
+/* For setting up all the kmem_list3s for cache whose buffer_size is same
    as size of kmem_list3. */
-static inline void set_up_list3s(kmem_cache_t *cachep, int index)
+static void set_up_list3s(struct kmem_cache *cachep, int index)
 {
        int node;
 
@@ -1493,15 +1559,20 @@ static inline void set_up_list3s(kmem_cache_t *cachep, int index)
 }
 
 /**
- * calculate_slab_order - calculate size (page order) of slabs and the number
- *                        of objects per slab.
+ * calculate_slab_order - calculate size (page order) of slabs
+ * @cachep: pointer to the cache that is being created
+ * @size: size of objects to be created in this cache.
+ * @align: required alignment for the objects.
+ * @flags: slab allocation flags
+ *
+ * Also calculates the number of objects per slab.
  *
  * This could be made much more intelligent.  For now, try to avoid using
  * high order pages for slabs.  When the gfp() functions are more friendly
  * towards high-order requests, this should be changed.
  */
-static inline size_t calculate_slab_order(kmem_cache_t *cachep, size_t size,
-                                         size_t align, gfp_t flags)
+static inline size_t calculate_slab_order(struct kmem_cache *cachep,
+                       size_t size, size_t align, unsigned long flags)
 {
        size_t left_over = 0;
 
@@ -1572,13 +1643,13 @@ static inline size_t calculate_slab_order(kmem_cache_t *cachep, size_t size,
  * cacheline.  This can be beneficial if you're counting cycles as closely
  * as davem.
  */
-kmem_cache_t *
+struct kmem_cache *
 kmem_cache_create (const char *name, size_t size, size_t align,
-       unsigned long flags, void (*ctor)(void*, kmem_cache_t *, unsigned long),
-       void (*dtor)(void*, kmem_cache_t *, unsigned long))
+       unsigned long flags, void (*ctor)(void*, struct kmem_cache *, unsigned long),
+       void (*dtor)(void*, struct kmem_cache *, unsigned long))
 {
        size_t left_over, slab_size, ralign;
-       kmem_cache_t *cachep = NULL;
+       struct kmem_cache *cachep = NULL;
        struct list_head *p;
 
        /*
@@ -1596,7 +1667,7 @@ kmem_cache_create (const char *name, size_t size, size_t align,
        mutex_lock(&cache_chain_mutex);
 
        list_for_each(p, &cache_chain) {
-               kmem_cache_t *pc = list_entry(p, kmem_cache_t, next);
+               struct kmem_cache *pc = list_entry(p, struct kmem_cache, next);
                mm_segment_t old_fs = get_fs();
                char tmp;
                int res;
@@ -1611,7 +1682,7 @@ kmem_cache_create (const char *name, size_t size, size_t align,
                set_fs(old_fs);
                if (res) {
                        printk("SLAB: cache with size %d has lost its name\n",
-                              pc->objsize);
+                              pc->buffer_size);
                        continue;
                }
 
@@ -1696,20 +1767,20 @@ kmem_cache_create (const char *name, size_t size, size_t align,
        align = ralign;
 
        /* Get cache's description obj. */
-       cachep = (kmem_cache_t *) kmem_cache_alloc(&cache_cache, SLAB_KERNEL);
+       cachep = kmem_cache_alloc(&cache_cache, SLAB_KERNEL);
        if (!cachep)
                goto oops;
-       memset(cachep, 0, sizeof(kmem_cache_t));
+       memset(cachep, 0, sizeof(struct kmem_cache));
 
 #if DEBUG
-       cachep->reallen = size;
+       cachep->obj_size = size;
 
        if (flags & SLAB_RED_ZONE) {
                /* redzoning only works with word aligned caches */
                align = BYTES_PER_WORD;
 
                /* add space for red zone words */
-               cachep->dbghead += BYTES_PER_WORD;
+               cachep->obj_offset += BYTES_PER_WORD;
                size += 2 * BYTES_PER_WORD;
        }
        if (flags & SLAB_STORE_USER) {
@@ -1722,8 +1793,8 @@ kmem_cache_create (const char *name, size_t size, size_t align,
        }
 #if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC)
        if (size >= malloc_sizes[INDEX_L3 + 1].cs_size
-           && cachep->reallen > cache_line_size() && size < PAGE_SIZE) {
-               cachep->dbghead += PAGE_SIZE - size;
+           && cachep->obj_size > cache_line_size() && size < PAGE_SIZE) {
+               cachep->obj_offset += PAGE_SIZE - size;
                size = PAGE_SIZE;
        }
 #endif
@@ -1786,7 +1857,7 @@ kmem_cache_create (const char *name, size_t size, size_t align,
        if (flags & SLAB_CACHE_DMA)
                cachep->gfpflags |= GFP_DMA;
        spin_lock_init(&cachep->spinlock);
-       cachep->objsize = size;
+       cachep->buffer_size = size;
 
        if (flags & CFLGS_OFF_SLAB)
                cachep->slabp_cache = kmem_find_general_cachep(slab_size, 0u);
@@ -1843,11 +1914,11 @@ kmem_cache_create (const char *name, size_t size, size_t align,
                    jiffies + REAPTIMEOUT_LIST3 +
                    ((unsigned long)cachep) % REAPTIMEOUT_LIST3;
 
-               BUG_ON(!ac_data(cachep));
-               ac_data(cachep)->avail = 0;
-               ac_data(cachep)->limit = BOOT_CPUCACHE_ENTRIES;
-               ac_data(cachep)->batchcount = 1;
-               ac_data(cachep)->touched = 0;
+               BUG_ON(!cpu_cache_get(cachep));
+               cpu_cache_get(cachep)->avail = 0;
+               cpu_cache_get(cachep)->limit = BOOT_CPUCACHE_ENTRIES;
+               cpu_cache_get(cachep)->batchcount = 1;
+               cpu_cache_get(cachep)->touched = 0;
                cachep->batchcount = 1;
                cachep->limit = BOOT_CPUCACHE_ENTRIES;
        }
@@ -1875,7 +1946,7 @@ static void check_irq_on(void)
        BUG_ON(irqs_disabled());
 }
 
-static void check_spinlock_acquired(kmem_cache_t *cachep)
+static void check_spinlock_acquired(struct kmem_cache *cachep)
 {
 #ifdef CONFIG_SMP
        check_irq_off();
@@ -1883,7 +1954,7 @@ static void check_spinlock_acquired(kmem_cache_t *cachep)
 #endif
 }
 
-static inline void check_spinlock_acquired_node(kmem_cache_t *cachep, int node)
+static void check_spinlock_acquired_node(struct kmem_cache *cachep, int node)
 {
 #ifdef CONFIG_SMP
        check_irq_off();
@@ -1916,24 +1987,24 @@ static void smp_call_function_all_cpus(void (*func)(void *arg), void *arg)
        preempt_enable();
 }
 
-static void drain_array_locked(kmem_cache_t *cachep, struct array_cache *ac,
+static void drain_array_locked(struct kmem_cache *cachep, struct array_cache *ac,
                                int force, int node);
 
 static void do_drain(void *arg)
 {
-       kmem_cache_t *cachep = (kmem_cache_t *) arg;
+       struct kmem_cache *cachep = (struct kmem_cache *) arg;
        struct array_cache *ac;
        int node = numa_node_id();
 
        check_irq_off();
-       ac = ac_data(cachep);
+       ac = cpu_cache_get(cachep);
        spin_lock(&cachep->nodelists[node]->list_lock);
        free_block(cachep, ac->entry, ac->avail, node);
        spin_unlock(&cachep->nodelists[node]->list_lock);
        ac->avail = 0;
 }
 
-static void drain_cpu_caches(kmem_cache_t *cachep)
+static void drain_cpu_caches(struct kmem_cache *cachep)
 {
        struct kmem_list3 *l3;
        int node;
@@ -1954,7 +2025,7 @@ static void drain_cpu_caches(kmem_cache_t *cachep)
        spin_unlock_irq(&cachep->spinlock);
 }
 
-static int __node_shrink(kmem_cache_t *cachep, int node)
+static int __node_shrink(struct kmem_cache *cachep, int node)
 {
        struct slab *slabp;
        struct kmem_list3 *l3 = cachep->nodelists[node];
@@ -1983,7 +2054,7 @@ static int __node_shrink(kmem_cache_t *cachep, int node)
        return ret;
 }
 
-static int __cache_shrink(kmem_cache_t *cachep)
+static int __cache_shrink(struct kmem_cache *cachep)
 {
        int ret = 0, i = 0;
        struct kmem_list3 *l3;
@@ -2009,7 +2080,7 @@ static int __cache_shrink(kmem_cache_t *cachep)
  * Releases as many slabs as possible for a cache.
  * To help debugging, a zero exit status indicates all slabs were released.
  */
-int kmem_cache_shrink(kmem_cache_t *cachep)
+int kmem_cache_shrink(struct kmem_cache *cachep)
 {
        if (!cachep || in_interrupt())
                BUG();
@@ -2022,7 +2093,7 @@ EXPORT_SYMBOL(kmem_cache_shrink);
  * kmem_cache_destroy - delete a cache
  * @cachep: the cache to destroy
  *
- * Remove a kmem_cache_t object from the slab cache.
+ * Remove a struct kmem_cache object from the slab cache.
  * Returns 0 on success.
  *
  * It is expected this function will be called by a module when it is
@@ -2035,7 +2106,7 @@ EXPORT_SYMBOL(kmem_cache_shrink);
  * The caller must guarantee that noone will allocate memory from the cache
  * during the kmem_cache_destroy().
  */
-int kmem_cache_destroy(kmem_cache_t *cachep)
+int kmem_cache_destroy(struct kmem_cache *cachep)
 {
        int i;
        struct kmem_list3 *l3;
@@ -2086,7 +2157,7 @@ int kmem_cache_destroy(kmem_cache_t *cachep)
 EXPORT_SYMBOL(kmem_cache_destroy);
 
 /* Get the memory for a slab management obj. */
-static struct slab *alloc_slabmgmt(kmem_cache_t *cachep, void *objp,
+static struct slab *alloc_slabmgmt(struct kmem_cache *cachep, void *objp,
                                   int colour_off, gfp_t local_flags)
 {
        struct slab *slabp;
@@ -2112,13 +2183,13 @@ static inline kmem_bufctl_t *slab_bufctl(struct slab *slabp)
        return (kmem_bufctl_t *) (slabp + 1);
 }
 
-static void cache_init_objs(kmem_cache_t *cachep,
+static void cache_init_objs(struct kmem_cache *cachep,
                            struct slab *slabp, unsigned long ctor_flags)
 {
        int i;
 
        for (i = 0; i < cachep->num; i++) {
-               void *objp = slabp->s_mem + cachep->objsize * i;
+               void *objp = slabp->s_mem + cachep->buffer_size * i;
 #if DEBUG
                /* need to poison the objs? */
                if (cachep->flags & SLAB_POISON)
@@ -2136,7 +2207,7 @@ static void cache_init_objs(kmem_cache_t *cachep,
                 * Otherwise, deadlock. They must also be threaded.
                 */
                if (cachep->ctor && !(cachep->flags & SLAB_POISON))
-                       cachep->ctor(objp + obj_dbghead(cachep), cachep,
+                       cachep->ctor(objp + obj_offset(cachep), cachep,
                                     ctor_flags);
 
                if (cachep->flags & SLAB_RED_ZONE) {
@@ -2147,10 +2218,10 @@ static void cache_init_objs(kmem_cache_t *cachep,
                                slab_error(cachep, "constructor overwrote the"
                                           " start of an object");
                }
-               if ((cachep->objsize % PAGE_SIZE) == 0 && OFF_SLAB(cachep)
+               if ((cachep->buffer_size % PAGE_SIZE) == 0 && OFF_SLAB(cachep)
                    && cachep->flags & SLAB_POISON)
                        kernel_map_pages(virt_to_page(objp),
-                                        cachep->objsize / PAGE_SIZE, 0);
+                                        cachep->buffer_size / PAGE_SIZE, 0);
 #else
                if (cachep->ctor)
                        cachep->ctor(objp, cachep, ctor_flags);
@@ -2161,7 +2232,7 @@ static void cache_init_objs(kmem_cache_t *cachep,
        slabp->free = 0;
 }
 
-static void kmem_flagcheck(kmem_cache_t *cachep, gfp_t flags)
+static void kmem_flagcheck(struct kmem_cache *cachep, gfp_t flags)
 {
        if (flags & SLAB_DMA) {
                if (!(cachep->gfpflags & GFP_DMA))
@@ -2172,7 +2243,43 @@ static void kmem_flagcheck(kmem_cache_t *cachep, gfp_t flags)
        }
 }
 
-static void set_slab_attr(kmem_cache_t *cachep, struct slab *slabp, void *objp)
+static void *slab_get_obj(struct kmem_cache *cachep, struct slab *slabp, int nodeid)
+{
+       void *objp = slabp->s_mem + (slabp->free * cachep->buffer_size);
+       kmem_bufctl_t next;
+
+       slabp->inuse++;
+       next = slab_bufctl(slabp)[slabp->free];
+#if DEBUG
+       slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE;
+       WARN_ON(slabp->nodeid != nodeid);
+#endif
+       slabp->free = next;
+
+       return objp;
+}
+
+static void slab_put_obj(struct kmem_cache *cachep, struct slab *slabp, void *objp,
+                         int nodeid)
+{
+       unsigned int objnr = (unsigned)(objp-slabp->s_mem) / cachep->buffer_size;
+
+#if DEBUG
+       /* Verify that the slab belongs to the intended node */
+       WARN_ON(slabp->nodeid != nodeid);
+
+       if (slab_bufctl(slabp)[objnr] != BUFCTL_FREE) {
+               printk(KERN_ERR "slab: double free detected in cache "
+                      "'%s', objp %p\n", cachep->name, objp);
+               BUG();
+       }
+#endif
+       slab_bufctl(slabp)[objnr] = slabp->free;
+       slabp->free = objnr;
+       slabp->inuse--;
+}
+
+static void set_slab_attr(struct kmem_cache *cachep, struct slab *slabp, void *objp)
 {
        int i;
        struct page *page;
@@ -2191,7 +2298,7 @@ static void set_slab_attr(kmem_cache_t *cachep, struct slab *slabp, void *objp)
  * Grow (by 1) the number of slabs within a cache.  This is called by
  * kmem_cache_alloc() when there are no active objs left in a cache.
  */
-static int cache_grow(kmem_cache_t *cachep, gfp_t flags, int nodeid)
+static int cache_grow(struct kmem_cache *cachep, gfp_t flags, int nodeid)
 {
        struct slab *slabp;
        void *objp;
@@ -2302,14 +2409,14 @@ static void kfree_debugcheck(const void *objp)
        }
 }
 
-static void *cache_free_debugcheck(kmem_cache_t *cachep, void *objp,
+static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp,
                                   void *caller)
 {
        struct page *page;
        unsigned int objnr;
        struct slab *slabp;
 
-       objp -= obj_dbghead(cachep);
+       objp -= obj_offset(cachep);
        kfree_debugcheck(objp);
        page = virt_to_page(objp);
 
@@ -2341,31 +2448,31 @@ static void *cache_free_debugcheck(kmem_cache_t *cachep, void *objp,
        if (cachep->flags & SLAB_STORE_USER)
                *dbg_userword(cachep, objp) = caller;
 
-       objnr = (objp - slabp->s_mem) / cachep->objsize;
+       objnr = (unsigned)(objp - slabp->s_mem) / cachep->buffer_size;
 
        BUG_ON(objnr >= cachep->num);
-       BUG_ON(objp != slabp->s_mem + objnr * cachep->objsize);
+       BUG_ON(objp != slabp->s_mem + objnr * cachep->buffer_size);
 
        if (cachep->flags & SLAB_DEBUG_INITIAL) {
                /* Need to call the slab's constructor so the
                 * caller can perform a verify of its state (debugging).
                 * Called without the cache-lock held.
                 */
-               cachep->ctor(objp + obj_dbghead(cachep),
+               cachep->ctor(objp + obj_offset(cachep),
                             cachep, SLAB_CTOR_CONSTRUCTOR | SLAB_CTOR_VERIFY);
        }
        if (cachep->flags & SLAB_POISON && cachep->dtor) {
                /* we want to cache poison the object,
                 * call the destruction callback
                 */
-               cachep->dtor(objp + obj_dbghead(cachep), cachep, 0);
+               cachep->dtor(objp + obj_offset(cachep), cachep, 0);
        }
        if (cachep->flags & SLAB_POISON) {
 #ifdef CONFIG_DEBUG_PAGEALLOC
-               if ((cachep->objsize % PAGE_SIZE) == 0 && OFF_SLAB(cachep)) {
+               if ((cachep->buffer_size % PAGE_SIZE) == 0 && OFF_SLAB(cachep)) {
                        store_stackinfo(cachep, objp, (unsigned long)caller);
                        kernel_map_pages(virt_to_page(objp),
-                                        cachep->objsize / PAGE_SIZE, 0);
+                                        cachep->buffer_size / PAGE_SIZE, 0);
                } else {
                        poison_obj(cachep, objp, POISON_FREE);
                }
@@ -2376,7 +2483,7 @@ static void *cache_free_debugcheck(kmem_cache_t *cachep, void *objp,
        return objp;
 }
 
-static void check_slabp(kmem_cache_t *cachep, struct slab *slabp)
+static void check_slabp(struct kmem_cache *cachep, struct slab *slabp)
 {
        kmem_bufctl_t i;
        int entries = 0;
@@ -2409,14 +2516,14 @@ static void check_slabp(kmem_cache_t *cachep, struct slab *slabp)
 #define check_slabp(x,y) do { } while(0)
 #endif
 
-static void *cache_alloc_refill(kmem_cache_t *cachep, gfp_t flags)
+static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags)
 {
        int batchcount;
        struct kmem_list3 *l3;
        struct array_cache *ac;
 
        check_irq_off();
-       ac = ac_data(cachep);
+       ac = cpu_cache_get(cachep);
       retry:
        batchcount = ac->batchcount;
        if (!ac->touched && batchcount > BATCHREFILL_LIMIT) {
@@ -2461,22 +2568,12 @@ static void *cache_alloc_refill(kmem_cache_t *cachep, gfp_t flags)
                check_slabp(cachep, slabp);
                check_spinlock_acquired(cachep);
                while (slabp->inuse < cachep->num && batchcount--) {
-                       kmem_bufctl_t next;
                        STATS_INC_ALLOCED(cachep);
                        STATS_INC_ACTIVE(cachep);
                        STATS_SET_HIGH(cachep);
 
-                       /* get obj pointer */
-                       ac->entry[ac->avail++] = slabp->s_mem +
-                           slabp->free * cachep->objsize;
-
-                       slabp->inuse++;
-                       next = slab_bufctl(slabp)[slabp->free];
-#if DEBUG
-                       slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE;
-                       WARN_ON(numa_node_id() != slabp->nodeid);
-#endif
-                       slabp->free = next;
+                       ac->entry[ac->avail++] = slab_get_obj(cachep, slabp,
+                                                           numa_node_id());
                }
                check_slabp(cachep, slabp);
 
@@ -2498,7 +2595,7 @@ static void *cache_alloc_refill(kmem_cache_t *cachep, gfp_t flags)
                x = cache_grow(cachep, flags, numa_node_id());
 
                // cache_grow can reenable interrupts, then ac could change.
-               ac = ac_data(cachep);
+               ac = cpu_cache_get(cachep);
                if (!x && ac->avail == 0)       // no objects in sight? abort
                        return NULL;
 
@@ -2510,7 +2607,7 @@ static void *cache_alloc_refill(kmem_cache_t *cachep, gfp_t flags)
 }
 
 static inline void
-cache_alloc_debugcheck_before(kmem_cache_t *cachep, gfp_t flags)
+cache_alloc_debugcheck_before(struct kmem_cache *cachep, gfp_t flags)
 {
        might_sleep_if(flags & __GFP_WAIT);
 #if DEBUG
@@ -2519,16 +2616,16 @@ cache_alloc_debugcheck_before(kmem_cache_t *cachep, gfp_t flags)
 }
 
 #if DEBUG
-static void *cache_alloc_debugcheck_after(kmem_cache_t *cachep, gfp_t flags,
+static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep, gfp_t flags,
                                        void *objp, void *caller)
 {
        if (!objp)
                return objp;
        if (cachep->flags & SLAB_POISON) {
 #ifdef CONFIG_DEBUG_PAGEALLOC
-               if ((cachep->objsize % PAGE_SIZE) == 0 && OFF_SLAB(cachep))
+               if ((cachep->buffer_size % PAGE_SIZE) == 0 && OFF_SLAB(cachep))
                        kernel_map_pages(virt_to_page(objp),
-                                        cachep->objsize / PAGE_SIZE, 1);
+                                        cachep->buffer_size / PAGE_SIZE, 1);
                else
                        check_poison_obj(cachep, objp);
 #else
@@ -2553,7 +2650,7 @@ static void *cache_alloc_debugcheck_after(kmem_cache_t *cachep, gfp_t flags,
                *dbg_redzone1(cachep, objp) = RED_ACTIVE;
                *dbg_redzone2(cachep, objp) = RED_ACTIVE;
        }
-       objp += obj_dbghead(cachep);
+       objp += obj_offset(cachep);
        if (cachep->ctor && cachep->flags & SLAB_POISON) {
                unsigned long ctor_flags = SLAB_CTOR_CONSTRUCTOR;
 
@@ -2568,7 +2665,7 @@ static void *cache_alloc_debugcheck_after(kmem_cache_t *cachep, gfp_t flags,
 #define cache_alloc_debugcheck_after(a,b,objp,d) (objp)
 #endif
 
-static inline void *____cache_alloc(kmem_cache_t *cachep, gfp_t flags)
+static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags)
 {
        void *objp;
        struct array_cache *ac;
@@ -2583,7 +2680,7 @@ static inline void *____cache_alloc(kmem_cache_t *cachep, gfp_t flags)
 #endif
 
        check_irq_off();
-       ac = ac_data(cachep);
+       ac = cpu_cache_get(cachep);
        if (likely(ac->avail)) {
                STATS_INC_ALLOCHIT(cachep);
                ac->touched = 1;
@@ -2595,7 +2692,8 @@ static inline void *____cache_alloc(kmem_cache_t *cachep, gfp_t flags)
        return objp;
 }
 
-static inline void *__cache_alloc(kmem_cache_t *cachep, gfp_t flags)
+static __always_inline void *
+__cache_alloc(struct kmem_cache *cachep, gfp_t flags, void *caller)
 {
        unsigned long save_flags;
        void *objp;
@@ -2606,7 +2704,7 @@ static inline void *__cache_alloc(kmem_cache_t *cachep, gfp_t flags)
        objp = ____cache_alloc(cachep, flags);
        local_irq_restore(save_flags);
        objp = cache_alloc_debugcheck_after(cachep, flags, objp,
-                                           __builtin_return_address(0));
+                                           caller);
        prefetchw(objp);
        return objp;
 }
@@ -2615,13 +2713,12 @@ static inline void *__cache_alloc(kmem_cache_t *cachep, gfp_t flags)
 /*
  * A interface to enable slab creation on nodeid
  */
-static void *__cache_alloc_node(kmem_cache_t *cachep, gfp_t flags, int nodeid)
+static void *__cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
 {
        struct list_head *entry;
        struct slab *slabp;
        struct kmem_list3 *l3;
        void *obj;
-       kmem_bufctl_t next;
        int x;
 
        l3 = cachep->nodelists[nodeid];
@@ -2647,14 +2744,7 @@ static void *__cache_alloc_node(kmem_cache_t *cachep, gfp_t flags, int nodeid)
 
        BUG_ON(slabp->inuse == cachep->num);
 
-       /* get obj pointer */
-       obj = slabp->s_mem + slabp->free * cachep->objsize;
-       slabp->inuse++;
-       next = slab_bufctl(slabp)[slabp->free];
-#if DEBUG
-       slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE;
-#endif
-       slabp->free = next;
+       obj = slab_get_obj(cachep, slabp, nodeid);
        check_slabp(cachep, slabp);
        l3->free_objects--;
        /* move slabp to correct slabp list: */
@@ -2685,7 +2775,7 @@ static void *__cache_alloc_node(kmem_cache_t *cachep, gfp_t flags, int nodeid)
 /*
  * Caller needs to acquire correct kmem_list's list_lock
  */
-static void free_block(kmem_cache_t *cachep, void **objpp, int nr_objects,
+static void free_block(struct kmem_cache *cachep, void **objpp, int nr_objects,
                       int node)
 {
        int i;
@@ -2694,29 +2784,14 @@ static void free_block(kmem_cache_t *cachep, void **objpp, int nr_objects,
        for (i = 0; i < nr_objects; i++) {
                void *objp = objpp[i];
                struct slab *slabp;
-               unsigned int objnr;
 
-               slabp = page_get_slab(virt_to_page(objp));
+               slabp = virt_to_slab(objp);
                l3 = cachep->nodelists[node];
                list_del(&slabp->list);
-               objnr = (objp - slabp->s_mem) / cachep->objsize;
                check_spinlock_acquired_node(cachep, node);
                check_slabp(cachep, slabp);
-
-#if DEBUG
-               /* Verify that the slab belongs to the intended node */
-               WARN_ON(slabp->nodeid != node);
-
-               if (slab_bufctl(slabp)[objnr] != BUFCTL_FREE) {
-                       printk(KERN_ERR "slab: double free detected in cache "
-                              "'%s', objp %p\n", cachep->name, objp);
-                       BUG();
-               }
-#endif
-               slab_bufctl(slabp)[objnr] = slabp->free;
-               slabp->free = objnr;
+               slab_put_obj(cachep, slabp, objp, node);
                STATS_DEC_ACTIVE(cachep);
-               slabp->inuse--;
                l3->free_objects++;
                check_slabp(cachep, slabp);
 
@@ -2738,7 +2813,7 @@ static void free_block(kmem_cache_t *cachep, void **objpp, int nr_objects,
        }
 }
 
-static void cache_flusharray(kmem_cache_t *cachep, struct array_cache *ac)
+static void cache_flusharray(struct kmem_cache *cachep, struct array_cache *ac)
 {
        int batchcount;
        struct kmem_list3 *l3;
@@ -2797,9 +2872,9 @@ static void cache_flusharray(kmem_cache_t *cachep, struct array_cache *ac)
  *
  * Called with disabled ints.
  */
-static inline void __cache_free(kmem_cache_t *cachep, void *objp)
+static inline void __cache_free(struct kmem_cache *cachep, void *objp)
 {
-       struct array_cache *ac = ac_data(cachep);
+       struct array_cache *ac = cpu_cache_get(cachep);
 
        check_irq_off();
        objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0));
@@ -2810,7 +2885,7 @@ static inline void __cache_free(kmem_cache_t *cachep, void *objp)
 #ifdef CONFIG_NUMA
        {
                struct slab *slabp;
-               slabp = page_get_slab(virt_to_page(objp));
+               slabp = virt_to_slab(objp);
                if (unlikely(slabp->nodeid != numa_node_id())) {
                        struct array_cache *alien = NULL;
                        int nodeid = slabp->nodeid;
@@ -2856,9 +2931,9 @@ static inline void __cache_free(kmem_cache_t *cachep, void *objp)
  * Allocate an object from this cache.  The flags are only relevant
  * if the cache has no available objects.
  */
-void *kmem_cache_alloc(kmem_cache_t *cachep, gfp_t flags)
+void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
 {
-       return __cache_alloc(cachep, flags);
+       return __cache_alloc(cachep, flags, __builtin_return_address(0));
 }
 EXPORT_SYMBOL(kmem_cache_alloc);
 
@@ -2876,12 +2951,12 @@ EXPORT_SYMBOL(kmem_cache_alloc);
  *
  * Currently only used for dentry validation.
  */
-int fastcall kmem_ptr_validate(kmem_cache_t *cachep, void *ptr)
+int fastcall kmem_ptr_validate(struct kmem_cache *cachep, void *ptr)
 {
        unsigned long addr = (unsigned long)ptr;
        unsigned long min_addr = PAGE_OFFSET;
        unsigned long align_mask = BYTES_PER_WORD - 1;
-       unsigned long size = cachep->objsize;
+       unsigned long size = cachep->buffer_size;
        struct page *page;
 
        if (unlikely(addr < min_addr))
@@ -2917,32 +2992,23 @@ int fastcall kmem_ptr_validate(kmem_cache_t *cachep, void *ptr)
  * New and improved: it will now make sure that the object gets
  * put on the correct node list so that there is no false sharing.
  */
-void *kmem_cache_alloc_node(kmem_cache_t *cachep, gfp_t flags, int nodeid)
+void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
 {
        unsigned long save_flags;
        void *ptr;
 
-       if (nodeid == -1)
-               return __cache_alloc(cachep, flags);
-
-       if (unlikely(!cachep->nodelists[nodeid])) {
-               /* Fall back to __cache_alloc if we run into trouble */
-               printk(KERN_WARNING
-                      "slab: not allocating in inactive node %d for cache %s\n",
-                      nodeid, cachep->name);
-               return __cache_alloc(cachep, flags);
-       }
-
        cache_alloc_debugcheck_before(cachep, flags);
        local_irq_save(save_flags);
-       if (nodeid == numa_node_id())
+
+       if (nodeid == -1 || nodeid == numa_node_id() ||
+           !cachep->nodelists[nodeid])
                ptr = ____cache_alloc(cachep, flags);
        else
                ptr = __cache_alloc_node(cachep, flags, nodeid);
        local_irq_restore(save_flags);
-       ptr =
-           cache_alloc_debugcheck_after(cachep, flags, ptr,
-                                        __builtin_return_address(0));
+
+       ptr = cache_alloc_debugcheck_after(cachep, flags, ptr,
+                                          __builtin_return_address(0));
 
        return ptr;
 }
@@ -2950,7 +3016,7 @@ EXPORT_SYMBOL(kmem_cache_alloc_node);
 
 void *kmalloc_node(size_t size, gfp_t flags, int node)
 {
-       kmem_cache_t *cachep;
+       struct kmem_cache *cachep;
 
        cachep = kmem_find_general_cachep(size, flags);
        if (unlikely(cachep == NULL))
@@ -2981,9 +3047,10 @@ EXPORT_SYMBOL(kmalloc_node);
  * platforms.  For example, on i386, it means that the memory must come
  * from the first 16MB.
  */
-void *__kmalloc(size_t size, gfp_t flags)
+static __always_inline void *__do_kmalloc(size_t size, gfp_t flags,
+                                         void *caller)
 {
-       kmem_cache_t *cachep;
+       struct kmem_cache *cachep;
 
        /* If you want to save a few bytes .text space: replace
         * __ with kmem_.
@@ -2993,10 +3060,27 @@ void *__kmalloc(size_t size, gfp_t flags)
        cachep = __find_general_cachep(size, flags);
        if (unlikely(cachep == NULL))
                return NULL;
-       return __cache_alloc(cachep, flags);
+       return __cache_alloc(cachep, flags, caller);
+}
+
+#ifndef CONFIG_DEBUG_SLAB
+
+void *__kmalloc(size_t size, gfp_t flags)
+{
+       return __do_kmalloc(size, flags, NULL);
 }
 EXPORT_SYMBOL(__kmalloc);
 
+#else
+
+void *__kmalloc_track_caller(size_t size, gfp_t flags, void *caller)
+{
+       return __do_kmalloc(size, flags, caller);
+}
+EXPORT_SYMBOL(__kmalloc_track_caller);
+
+#endif
+
 #ifdef CONFIG_SMP
 /**
  * __alloc_percpu - allocate one copy of the object for every present
@@ -3054,7 +3138,7 @@ EXPORT_SYMBOL(__alloc_percpu);
  * Free an object which was previously allocated from this
  * cache.
  */
-void kmem_cache_free(kmem_cache_t *cachep, void *objp)
+void kmem_cache_free(struct kmem_cache *cachep, void *objp)
 {
        unsigned long flags;
 
@@ -3075,15 +3159,15 @@ EXPORT_SYMBOL(kmem_cache_free);
  */
 void kfree(const void *objp)
 {
-       kmem_cache_t *c;
+       struct kmem_cache *c;
        unsigned long flags;
 
        if (unlikely(!objp))
                return;
        local_irq_save(flags);
        kfree_debugcheck(objp);
-       c = page_get_cache(virt_to_page(objp));
-       mutex_debug_check_no_locks_freed(objp, obj_reallen(c));
+       c = virt_to_cache(objp);
+       mutex_debug_check_no_locks_freed(objp, obj_size(c));
        __cache_free(c, (void *)objp);
        local_irq_restore(flags);
 }
@@ -3112,13 +3196,13 @@ void free_percpu(const void *objp)
 EXPORT_SYMBOL(free_percpu);
 #endif
 
-unsigned int kmem_cache_size(kmem_cache_t *cachep)
+unsigned int kmem_cache_size(struct kmem_cache *cachep)
 {
-       return obj_reallen(cachep);
+       return obj_size(cachep);
 }
 EXPORT_SYMBOL(kmem_cache_size);
 
-const char *kmem_cache_name(kmem_cache_t *cachep)
+const char *kmem_cache_name(struct kmem_cache *cachep)
 {
        return cachep->name;
 }
@@ -3127,7 +3211,7 @@ EXPORT_SYMBOL_GPL(kmem_cache_name);
 /*
  * This initializes kmem_list3 for all nodes.
  */
-static int alloc_kmemlist(kmem_cache_t *cachep)
+static int alloc_kmemlist(struct kmem_cache *cachep)
 {
        int node;
        struct kmem_list3 *l3;
@@ -3183,7 +3267,7 @@ static int alloc_kmemlist(kmem_cache_t *cachep)
 }
 
 struct ccupdate_struct {
-       kmem_cache_t *cachep;
+       struct kmem_cache *cachep;
        struct array_cache *new[NR_CPUS];
 };
 
@@ -3193,13 +3277,13 @@ static void do_ccupdate_local(void *info)
        struct array_cache *old;
 
        check_irq_off();
-       old = ac_data(new->cachep);
+       old = cpu_cache_get(new->cachep);
 
        new->cachep->array[smp_processor_id()] = new->new[smp_processor_id()];
        new->new[smp_processor_id()] = old;
 }
 
-static int do_tune_cpucache(kmem_cache_t *cachep, int limit, int batchcount,
+static int do_tune_cpucache(struct kmem_cache *cachep, int limit, int batchcount,
                            int shared)
 {
        struct ccupdate_struct new;
@@ -3245,7 +3329,7 @@ static int do_tune_cpucache(kmem_cache_t *cachep, int limit, int batchcount,
        return 0;
 }
 
-static void enable_cpucache(kmem_cache_t *cachep)
+static void enable_cpucache(struct kmem_cache *cachep)
 {
        int err;
        int limit, shared;
@@ -3258,13 +3342,13 @@ static void enable_cpucache(kmem_cache_t *cachep)
         * The numbers are guessed, we should auto-tune as described by
         * Bonwick.
         */
-       if (cachep->objsize > 131072)
+       if (cachep->buffer_size > 131072)
                limit = 1;
-       else if (cachep->objsize > PAGE_SIZE)
+       else if (cachep->buffer_size > PAGE_SIZE)
                limit = 8;
-       else if (cachep->objsize > 1024)
+       else if (cachep->buffer_size > 1024)
                limit = 24;
-       else if (cachep->objsize > 256)
+       else if (cachep->buffer_size > 256)
                limit = 54;
        else
                limit = 120;
@@ -3279,7 +3363,7 @@ static void enable_cpucache(kmem_cache_t *cachep)
         */
        shared = 0;
 #ifdef CONFIG_SMP
-       if (cachep->objsize <= PAGE_SIZE)
+       if (cachep->buffer_size <= PAGE_SIZE)
                shared = 8;
 #endif
 
@@ -3297,7 +3381,7 @@ static void enable_cpucache(kmem_cache_t *cachep)
                       cachep->name, -err);
 }
 
-static void drain_array_locked(kmem_cache_t *cachep, struct array_cache *ac,
+static void drain_array_locked(struct kmem_cache *cachep, struct array_cache *ac,
                                int force, int node)
 {
        int tofree;
@@ -3342,12 +3426,12 @@ static void cache_reap(void *unused)
        }
 
        list_for_each(walk, &cache_chain) {
-               kmem_cache_t *searchp;
+               struct kmem_cache *searchp;
                struct list_head *p;
                int tofree;
                struct slab *slabp;
 
-               searchp = list_entry(walk, kmem_cache_t, next);
+               searchp = list_entry(walk, struct kmem_cache, next);
 
                if (searchp->flags & SLAB_NO_REAP)
                        goto next;
@@ -3359,7 +3443,7 @@ static void cache_reap(void *unused)
                        drain_alien_cache(searchp, l3);
                spin_lock_irq(&l3->list_lock);
 
-               drain_array_locked(searchp, ac_data(searchp), 0,
+               drain_array_locked(searchp, cpu_cache_get(searchp), 0,
                                   numa_node_id());
 
                if (time_after(l3->next_reap, jiffies))
@@ -3450,15 +3534,15 @@ static void *s_start(struct seq_file *m, loff_t *pos)
                if (p == &cache_chain)
                        return NULL;
        }
-       return list_entry(p, kmem_cache_t, next);
+       return list_entry(p, struct kmem_cache, next);
 }
 
 static void *s_next(struct seq_file *m, void *p, loff_t *pos)
 {
-       kmem_cache_t *cachep = p;
+       struct kmem_cache *cachep = p;
        ++*pos;
        return cachep->next.next == &cache_chain ? NULL
-           : list_entry(cachep->next.next, kmem_cache_t, next);
+           : list_entry(cachep->next.next, struct kmem_cache, next);
 }
 
 static void s_stop(struct seq_file *m, void *p)
@@ -3468,7 +3552,7 @@ static void s_stop(struct seq_file *m, void *p)
 
 static int s_show(struct seq_file *m, void *p)
 {
-       kmem_cache_t *cachep = p;
+       struct kmem_cache *cachep = p;
        struct list_head *q;
        struct slab *slabp;
        unsigned long active_objs;
@@ -3528,7 +3612,7 @@ static int s_show(struct seq_file *m, void *p)
                printk(KERN_ERR "slab: cache %s error: %s\n", name, error);
 
        seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d",
-                  name, active_objs, num_objs, cachep->objsize,
+                  name, active_objs, num_objs, cachep->buffer_size,
                   cachep->num, (1 << cachep->gfporder));
        seq_printf(m, " : tunables %4u %4u %4u",
                   cachep->limit, cachep->batchcount, cachep->shared);
@@ -3618,7 +3702,8 @@ ssize_t slabinfo_write(struct file *file, const char __user * buffer,
        mutex_lock(&cache_chain_mutex);
        res = -EINVAL;
        list_for_each(p, &cache_chain) {
-               kmem_cache_t *cachep = list_entry(p, kmem_cache_t, next);
+               struct kmem_cache *cachep = list_entry(p, struct kmem_cache,
+                                                      next);
 
                if (!strcmp(cachep->name, kbuf)) {
                        if (limit < 1 ||
@@ -3656,5 +3741,5 @@ unsigned int ksize(const void *objp)
        if (unlikely(objp == NULL))
                return 0;
 
-       return obj_reallen(page_get_cache(virt_to_page(objp)));
+       return obj_size(virt_to_cache(objp));
 }
index 7b09ac503fec9dde77422705a08b2a1f087d0d70..db8a3d3e163651c7c3baa85cd1c82434db177ae8 100644 (file)
@@ -27,6 +27,7 @@ static struct address_space_operations swap_aops = {
        .writepage      = swap_writepage,
        .sync_page      = block_sync_page,
        .set_page_dirty = __set_page_dirty_nobuffers,
+       .migratepage    = migrate_page,
 };
 
 static struct backing_dev_info swap_backing_dev_info = {
index f1e69c30d203871146d10b13b4e90831b2f0f7cf..1f9cf0d073b84caad71234ddfb091618906d3047 100644 (file)
@@ -554,6 +554,15 @@ static int unuse_mm(struct mm_struct *mm,
        return 0;
 }
 
+#ifdef CONFIG_MIGRATION
+int remove_vma_swap(struct vm_area_struct *vma, struct page *page)
+{
+       swp_entry_t entry = { .val = page_private(page) };
+
+       return unuse_vma(vma, entry, page);
+}
+#endif
+
 /*
  * Scan swap_map from current position to next entry still in use.
  * Recycle to start on reaching the end, returning 0 when empty.
@@ -646,6 +655,7 @@ static int try_to_unuse(unsigned int type)
                 */
                swap_map = &si->swap_map[i];
                entry = swp_entry(type, i);
+again:
                page = read_swap_cache_async(entry, NULL, 0);
                if (!page) {
                        /*
@@ -680,6 +690,12 @@ static int try_to_unuse(unsigned int type)
                wait_on_page_locked(page);
                wait_on_page_writeback(page);
                lock_page(page);
+               if (!PageSwapCache(page)) {
+                       /* Page migration has occured */
+                       unlock_page(page);
+                       page_cache_release(page);
+                       goto again;
+               }
                wait_on_page_writeback(page);
 
                /*
index 2e34b61a70c727afc2895529c1997a1a8d399eee..5a610804cd06a938b902006d2780a540d66be704 100644 (file)
@@ -477,7 +477,13 @@ static int shrink_list(struct list_head *page_list, struct scan_control *sc)
                 * processes. Try to unmap it here.
                 */
                if (page_mapped(page) && mapping) {
-                       switch (try_to_unmap(page)) {
+                       /*
+                        * No unmapping if we do not swap
+                        */
+                       if (!sc->may_swap)
+                               goto keep_locked;
+
+                       switch (try_to_unmap(page, 0)) {
                        case SWAP_FAIL:
                                goto activate_locked;
                        case SWAP_AGAIN:
@@ -492,7 +498,7 @@ static int shrink_list(struct list_head *page_list, struct scan_control *sc)
                                goto keep_locked;
                        if (!may_enter_fs)
                                goto keep_locked;
-                       if (laptop_mode && !sc->may_writepage)
+                       if (!sc->may_writepage)
                                goto keep_locked;
 
                        /* Page is dirty, try to write it out here */
@@ -608,6 +614,15 @@ int putback_lru_pages(struct list_head *l)
        return count;
 }
 
+/*
+ * Non migratable page
+ */
+int fail_migrate_page(struct page *newpage, struct page *page)
+{
+       return -EIO;
+}
+EXPORT_SYMBOL(fail_migrate_page);
+
 /*
  * swapout a single page
  * page is locked upon entry, unlocked on exit
@@ -617,7 +632,7 @@ static int swap_page(struct page *page)
        struct address_space *mapping = page_mapping(page);
 
        if (page_mapped(page) && mapping)
-               if (try_to_unmap(page) != SWAP_SUCCESS)
+               if (try_to_unmap(page, 0) != SWAP_SUCCESS)
                        goto unlock_retry;
 
        if (PageDirty(page)) {
@@ -653,6 +668,167 @@ unlock_retry:
 retry:
        return -EAGAIN;
 }
+EXPORT_SYMBOL(swap_page);
+
+/*
+ * Page migration was first developed in the context of the memory hotplug
+ * project. The main authors of the migration code are:
+ *
+ * IWAMOTO Toshihiro <iwamoto@valinux.co.jp>
+ * Hirokazu Takahashi <taka@valinux.co.jp>
+ * Dave Hansen <haveblue@us.ibm.com>
+ * Christoph Lameter <clameter@sgi.com>
+ */
+
+/*
+ * Remove references for a page and establish the new page with the correct
+ * basic settings to be able to stop accesses to the page.
+ */
+int migrate_page_remove_references(struct page *newpage,
+                               struct page *page, int nr_refs)
+{
+       struct address_space *mapping = page_mapping(page);
+       struct page **radix_pointer;
+
+       /*
+        * Avoid doing any of the following work if the page count
+        * indicates that the page is in use or truncate has removed
+        * the page.
+        */
+       if (!mapping || page_mapcount(page) + nr_refs != page_count(page))
+               return 1;
+
+       /*
+        * Establish swap ptes for anonymous pages or destroy pte
+        * maps for files.
+        *
+        * In order to reestablish file backed mappings the fault handlers
+        * will take the radix tree_lock which may then be used to stop
+        * processses from accessing this page until the new page is ready.
+        *
+        * A process accessing via a swap pte (an anonymous page) will take a
+        * page_lock on the old page which will block the process until the
+        * migration attempt is complete. At that time the PageSwapCache bit
+        * will be examined. If the page was migrated then the PageSwapCache
+        * bit will be clear and the operation to retrieve the page will be
+        * retried which will find the new page in the radix tree. Then a new
+        * direct mapping may be generated based on the radix tree contents.
+        *
+        * If the page was not migrated then the PageSwapCache bit
+        * is still set and the operation may continue.
+        */
+       try_to_unmap(page, 1);
+
+       /*
+        * Give up if we were unable to remove all mappings.
+        */
+       if (page_mapcount(page))
+               return 1;
+
+       write_lock_irq(&mapping->tree_lock);
+
+       radix_pointer = (struct page **)radix_tree_lookup_slot(
+                                               &mapping->page_tree,
+                                               page_index(page));
+
+       if (!page_mapping(page) || page_count(page) != nr_refs ||
+                       *radix_pointer != page) {
+               write_unlock_irq(&mapping->tree_lock);
+               return 1;
+       }
+
+       /*
+        * Now we know that no one else is looking at the page.
+        *
+        * Certain minimal information about a page must be available
+        * in order for other subsystems to properly handle the page if they
+        * find it through the radix tree update before we are finished
+        * copying the page.
+        */
+       get_page(newpage);
+       newpage->index = page->index;
+       newpage->mapping = page->mapping;
+       if (PageSwapCache(page)) {
+               SetPageSwapCache(newpage);
+               set_page_private(newpage, page_private(page));
+       }
+
+       *radix_pointer = newpage;
+       __put_page(page);
+       write_unlock_irq(&mapping->tree_lock);
+
+       return 0;
+}
+EXPORT_SYMBOL(migrate_page_remove_references);
+
+/*
+ * Copy the page to its new location
+ */
+void migrate_page_copy(struct page *newpage, struct page *page)
+{
+       copy_highpage(newpage, page);
+
+       if (PageError(page))
+               SetPageError(newpage);
+       if (PageReferenced(page))
+               SetPageReferenced(newpage);
+       if (PageUptodate(page))
+               SetPageUptodate(newpage);
+       if (PageActive(page))
+               SetPageActive(newpage);
+       if (PageChecked(page))
+               SetPageChecked(newpage);
+       if (PageMappedToDisk(page))
+               SetPageMappedToDisk(newpage);
+
+       if (PageDirty(page)) {
+               clear_page_dirty_for_io(page);
+               set_page_dirty(newpage);
+       }
+
+       ClearPageSwapCache(page);
+       ClearPageActive(page);
+       ClearPagePrivate(page);
+       set_page_private(page, 0);
+       page->mapping = NULL;
+
+       /*
+        * If any waiters have accumulated on the new page then
+        * wake them up.
+        */
+       if (PageWriteback(newpage))
+               end_page_writeback(newpage);
+}
+EXPORT_SYMBOL(migrate_page_copy);
+
+/*
+ * Common logic to directly migrate a single page suitable for
+ * pages that do not use PagePrivate.
+ *
+ * Pages are locked upon entry and exit.
+ */
+int migrate_page(struct page *newpage, struct page *page)
+{
+       BUG_ON(PageWriteback(page));    /* Writeback must be complete */
+
+       if (migrate_page_remove_references(newpage, page, 2))
+               return -EAGAIN;
+
+       migrate_page_copy(newpage, page);
+
+       /*
+        * Remove auxiliary swap entries and replace
+        * them with real ptes.
+        *
+        * Note that a real pte entry will allow processes that are not
+        * waiting on the page lock to use the new page via the page tables
+        * before the new page is unlocked.
+        */
+       remove_from_swap(newpage);
+       return 0;
+}
+EXPORT_SYMBOL(migrate_page);
+
 /*
  * migrate_pages
  *
@@ -666,11 +842,6 @@ retry:
  * are movable anymore because t has become empty
  * or no retryable pages exist anymore.
  *
- * SIMPLIFIED VERSION: This implementation of migrate_pages
- * is only swapping out pages and never touches the second
- * list. The direct migration patchset
- * extends this function to avoid the use of swap.
- *
  * Return: Number of pages not migrated when "to" ran empty.
  */
 int migrate_pages(struct list_head *from, struct list_head *to,
@@ -691,6 +862,9 @@ redo:
        retry = 0;
 
        list_for_each_entry_safe(page, page2, from, lru) {
+               struct page *newpage = NULL;
+               struct address_space *mapping;
+
                cond_resched();
 
                rc = 0;
@@ -698,6 +872,9 @@ redo:
                        /* page was freed from under us. So we are done. */
                        goto next;
 
+               if (to && list_empty(to))
+                       break;
+
                /*
                 * Skip locked pages during the first two passes to give the
                 * functions holding the lock time to release the page. Later we
@@ -734,12 +911,69 @@ redo:
                        }
                }
 
+               if (!to) {
+                       rc = swap_page(page);
+                       goto next;
+               }
+
+               newpage = lru_to_page(to);
+               lock_page(newpage);
+
                /*
-                * Page is properly locked and writeback is complete.
+                * Pages are properly locked and writeback is complete.
                 * Try to migrate the page.
                 */
-               rc = swap_page(page);
-               goto next;
+               mapping = page_mapping(page);
+               if (!mapping)
+                       goto unlock_both;
+
+               if (mapping->a_ops->migratepage) {
+                       rc = mapping->a_ops->migratepage(newpage, page);
+                       goto unlock_both;
+                }
+
+               /*
+                * Trigger writeout if page is dirty
+                */
+               if (PageDirty(page)) {
+                       switch (pageout(page, mapping)) {
+                       case PAGE_KEEP:
+                       case PAGE_ACTIVATE:
+                               goto unlock_both;
+
+                       case PAGE_SUCCESS:
+                               unlock_page(newpage);
+                               goto next;
+
+                       case PAGE_CLEAN:
+                               ; /* try to migrate the page below */
+                       }
+                }
+               /*
+                * If we have no buffer or can release the buffer
+                * then do a simple migration.
+                */
+               if (!page_has_buffers(page) ||
+                   try_to_release_page(page, GFP_KERNEL)) {
+                       rc = migrate_page(newpage, page);
+                       goto unlock_both;
+               }
+
+               /*
+                * On early passes with mapped pages simply
+                * retry. There may be a lock held for some
+                * buffers that may go away. Later
+                * swap them out.
+                */
+               if (pass > 4) {
+                       unlock_page(newpage);
+                       newpage = NULL;
+                       rc = swap_page(page);
+                       goto next;
+               }
+
+unlock_both:
+               unlock_page(newpage);
 
 unlock_page:
                unlock_page(page);
@@ -752,7 +986,10 @@ next:
                        list_move(&page->lru, failed);
                        nr_failed++;
                } else {
-                       /* Success */
+                       if (newpage) {
+                               /* Successful migration. Return page to LRU */
+                               move_to_lru(newpage);
+                       }
                        list_move(&page->lru, moved);
                }
        }
@@ -1170,7 +1407,7 @@ int try_to_free_pages(struct zone **zones, gfp_t gfp_mask)
        int i;
 
        sc.gfp_mask = gfp_mask;
-       sc.may_writepage = 0;
+       sc.may_writepage = !laptop_mode;
        sc.may_swap = 1;
 
        inc_page_state(allocstall);
@@ -1273,7 +1510,7 @@ loop_again:
        total_scanned = 0;
        total_reclaimed = 0;
        sc.gfp_mask = GFP_KERNEL;
-       sc.may_writepage = 0;
+       sc.may_writepage = !laptop_mode;
        sc.may_swap = 1;
        sc.nr_mapped = read_page_state(nr_mapped);
 
@@ -1586,40 +1823,61 @@ module_init(kswapd_init)
  */
 int zone_reclaim_mode __read_mostly;
 
+#define RECLAIM_OFF 0
+#define RECLAIM_ZONE (1<<0)    /* Run shrink_cache on the zone */
+#define RECLAIM_WRITE (1<<1)   /* Writeout pages during reclaim */
+#define RECLAIM_SWAP (1<<2)    /* Swap pages out during reclaim */
+#define RECLAIM_SLAB (1<<3)    /* Do a global slab shrink if the zone is out of memory */
+
 /*
  * Mininum time between zone reclaim scans
  */
-#define ZONE_RECLAIM_INTERVAL HZ/2
+int zone_reclaim_interval __read_mostly = 30*HZ;
+
+/*
+ * Priority for ZONE_RECLAIM. This determines the fraction of pages
+ * of a node considered for each zone_reclaim. 4 scans 1/16th of
+ * a zone.
+ */
+#define ZONE_RECLAIM_PRIORITY 4
+
 /*
  * Try to free up some pages from this zone through reclaim.
  */
 int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
 {
-       int nr_pages = 1 << order;
+       int nr_pages;
        struct task_struct *p = current;
        struct reclaim_state reclaim_state;
-       struct scan_control sc = {
-               .gfp_mask       = gfp_mask,
-               .may_writepage  = 0,
-               .may_swap       = 0,
-               .nr_mapped      = read_page_state(nr_mapped),
-               .nr_scanned     = 0,
-               .nr_reclaimed   = 0,
-               .priority       = 0
-       };
+       struct scan_control sc;
+       cpumask_t mask;
+       int node_id;
+
+       if (time_before(jiffies,
+               zone->last_unsuccessful_zone_reclaim + zone_reclaim_interval))
+                       return 0;
 
        if (!(gfp_mask & __GFP_WAIT) ||
-               zone->zone_pgdat->node_id != numa_node_id() ||
                zone->all_unreclaimable ||
                atomic_read(&zone->reclaim_in_progress) > 0)
                        return 0;
 
-       if (time_before(jiffies,
-               zone->last_unsuccessful_zone_reclaim + ZONE_RECLAIM_INTERVAL))
-                       return 0;
+       node_id = zone->zone_pgdat->node_id;
+       mask = node_to_cpumask(node_id);
+       if (!cpus_empty(mask) && node_id != numa_node_id())
+               return 0;
+
+       sc.may_writepage = !!(zone_reclaim_mode & RECLAIM_WRITE);
+       sc.may_swap = !!(zone_reclaim_mode & RECLAIM_SWAP);
+       sc.nr_scanned = 0;
+       sc.nr_reclaimed = 0;
+       sc.priority = ZONE_RECLAIM_PRIORITY + 1;
+       sc.nr_mapped = read_page_state(nr_mapped);
+       sc.gfp_mask = gfp_mask;
 
        disable_swap_token();
 
+       nr_pages = 1 << order;
        if (nr_pages > SWAP_CLUSTER_MAX)
                sc.swap_cluster_max = nr_pages;
        else
@@ -1629,14 +1887,37 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
        p->flags |= PF_MEMALLOC;
        reclaim_state.reclaimed_slab = 0;
        p->reclaim_state = &reclaim_state;
-       shrink_zone(zone, &sc);
+
+       /*
+        * Free memory by calling shrink zone with increasing priorities
+        * until we have enough memory freed.
+        */
+       do {
+               sc.priority--;
+               shrink_zone(zone, &sc);
+
+       } while (sc.nr_reclaimed < nr_pages && sc.priority > 0);
+
+       if (sc.nr_reclaimed < nr_pages && (zone_reclaim_mode & RECLAIM_SLAB)) {
+               /*
+                * shrink_slab does not currently allow us to determine
+                * how many pages were freed in the zone. So we just
+                * shake the slab and then go offnode for a single allocation.
+                *
+                * shrink_slab will free memory on all zones and may take
+                * a long time.
+                */
+               shrink_slab(sc.nr_scanned, gfp_mask, order);
+               sc.nr_reclaimed = 1;    /* Avoid getting the off node timeout */
+       }
+
        p->reclaim_state = NULL;
        current->flags &= ~PF_MEMALLOC;
 
        if (sc.nr_reclaimed == 0)
                zone->last_unsuccessful_zone_reclaim = jiffies;
 
-       return sc.nr_reclaimed > nr_pages;
+       return sc.nr_reclaimed >= nr_pages;
 }
 #endif
 
index 7415406aa1ae510639e24bc103ea42d3a862db03..802d4fe0f55cb5fc37b358b360a7bffb5ee3bbb5 100644 (file)
@@ -908,10 +908,10 @@ void rpc_release_task(struct rpc_task *task)
 
 /**
  * rpc_run_task - Allocate a new RPC task, then run rpc_execute against it
- * @clnt - pointer to RPC client
- * @flags - RPC flags
- * @ops - RPC call ops
- * @data - user call data
+ * @clnt: pointer to RPC client
+ * @flags: RPC flags
+ * @ops: RPC call ops
+ * @data: user call data
  */
 struct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags,
                                        const struct rpc_call_ops *ops,
@@ -930,6 +930,7 @@ EXPORT_SYMBOL(rpc_run_task);
 /**
  * rpc_find_parent - find the parent of a child task.
  * @child: child task
+ * @parent: parent task
  *
  * Checks that the parent task is still sleeping on the
  * queue 'childq'. If so returns a pointer to the parent.
index 9fd5f5b87d1e47cc160ec86fe7cf8aff7c4c091d..99fe4b7fb2f1733a5b4412553c1734a58b39ec2f 100755 (executable)
@@ -45,7 +45,7 @@ use strict;
 # Note: This only supports 'c'.
 
 # usage:
-# kerneldoc [ -docbook | -html | -text | -man ]
+# kernel-doc [ -docbook | -html | -text | -man ]
 #           [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile
 # or
 #           [ -nofunction funcname [ -function funcname ...] ] c file(s)s > outputfile
@@ -59,7 +59,7 @@ use strict;
 #  -nofunction funcname
 #      If set, then only generate documentation for the other function(s).  All
 #      other functions are ignored. Cannot be used with -function together
-#      (yes thats a bug - perl hackers can fix it 8))
+#      (yes, that's a bug -- perl hackers can fix it 8))
 #
 #  c files - list of 'c' files to process
 #
@@ -90,28 +90,28 @@ use strict;
 #  * my_function - does my stuff
 #  * @my_arg: its mine damnit
 #  *
-#  * Does my stuff explained. 
+#  * Does my stuff explained.
 #  */
 #
 #  or, could also use:
 # /**
 #  * my_function - does my stuff
 #  * @my_arg: its mine damnit
-#  * Description: Does my stuff explained. 
+#  * Description: Does my stuff explained.
 #  */
 # etc.
 #
-# Beside functions you can also write documentation for structs, unions, 
-# enums and typedefs. Instead of the function name you must write the name 
-# of the declaration;  the struct/union/enum/typedef must always precede 
-# the name. Nesting of declarations is not supported. 
+# Beside functions you can also write documentation for structs, unions,
+# enums and typedefs. Instead of the function name you must write the name
+# of the declaration;  the struct/union/enum/typedef must always precede
+# the name. Nesting of declarations is not supported.
 # Use the argument mechanism to document members or constants.
 # e.g.
 # /**
 #  * struct my_struct - short description
 #  * @a: first member
 #  * @b: second member
-#  * 
+#  *
 #  * Longer description
 #  */
 # struct my_struct {
@@ -122,12 +122,12 @@ use strict;
 # };
 #
 # All descriptions can be multiline, except the short function description.
-# 
-# You can also add additional sections. When documenting kernel functions you 
-# should document the "Context:" of the function, e.g. whether the functions 
+#
+# You can also add additional sections. When documenting kernel functions you
+# should document the "Context:" of the function, e.g. whether the functions
 # can be called form interrupts. Unlike other sections you can end it with an
-# empty line. 
-# Example-sections should contain the string EXAMPLE so that they are marked 
+# empty line.
+# Example-sections should contain the string EXAMPLE so that they are marked
 # appropriately in DocBook.
 #
 # Example:
@@ -135,7 +135,7 @@ use strict;
 #  * user_function - function that can only be called in user context
 #  * @a: some argument
 #  * Context: !in_interrupt()
-#  * 
+#  *
 #  * Some description
 #  * Example:
 #  *    user_function(22);
@@ -223,9 +223,9 @@ my %highlights = %highlights_man;
 my $blankline = $blankline_man;
 my $modulename = "Kernel API";
 my $function_only = 0;
-my $man_date = ('January', 'February', 'March', 'April', 'May', 'June', 
-               'July', 'August', 'September', 'October', 
-               'November', 'December')[(localtime)[4]] . 
+my $man_date = ('January', 'February', 'March', 'April', 'May', 'June',
+               'July', 'August', 'September', 'October',
+               'November', 'December')[(localtime)[4]] .
   " " . ((localtime)[5]+1900);
 
 # Essentially these are globals
@@ -236,7 +236,7 @@ my ($function, %function_table,%parametertypes,$declaration_purpose);
 my ($type,$declaration_name,$return_type);
 my ($newsection,$newcontents,$prototype,$filelist, $brcount, %source_map);
 
-# Generated docbook code is inserted in a template at a point where 
+# Generated docbook code is inserted in a template at a point where
 # docbook v3.1 requires a non-zero sequence of RefEntry's; see:
 # http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html
 # We keep track of number of generated entries and generate a dummy
@@ -365,7 +365,7 @@ sub dump_section {
 #  parameterdescs => %parameter descriptions
 #  sectionlist => @list of sections
 #  sections => %descriont descriptions
-#  
+#
 
 sub output_highlight {
     my $contents = join "\n",@_;
@@ -400,7 +400,7 @@ sub output_section_html(%) {
        print "<blockquote>\n";
        output_highlight($args{'sections'}{$section});
        print "</blockquote>\n";
-    }  
+    }
 }
 
 # output enum in html
@@ -434,7 +434,7 @@ sub output_enum_html(%) {
     print "<hr>\n";
 }
 
-# output tyepdef in html
+# output typedef in html
 sub output_typedef_html(%) {
     my %args = %{$_[0]};
     my ($parameter);
@@ -551,7 +551,7 @@ sub output_intro_html(%) {
 
 sub output_section_xml(%) {
     my %args = %{$_[0]};
-    my $section;    
+    my $section;
     # print out each section
     $lineprefix="   ";
     foreach $section (@{$args{'sectionlist'}}) {
@@ -778,7 +778,7 @@ sub output_enum_xml(%) {
     print "</refsynopsisdiv>\n";
 
     print "<refsect1>\n";
-    print " <title>Constants</title>\n";    
+    print " <title>Constants</title>\n";
     print "  <variablelist>\n";
     foreach $parameter (@{$args{'parameterlist'}}) {
       my $parameter_name = $parameter;
@@ -1157,7 +1157,7 @@ sub output_section_text(%) {
     foreach $section (@{$args{'sectionlist'}}) {
        print "$section:\n\n";
        output_highlight($args{'sections'}{$section});
-    }  
+    }
     print "\n\n";
 }
 
@@ -1262,8 +1262,8 @@ sub output_declaration {
     my $name = shift;
     my $functype = shift;
     my $func = "output_${functype}_$output_mode";
-    if (($function_only==0) || 
-       ( $function_only == 1 && defined($function_table{$name})) || 
+    if (($function_only==0) ||
+       ( $function_only == 1 && defined($function_table{$name})) ||
        ( $function_only == 2 && !defined($function_table{$name})))
     {
         &$func(@_);
@@ -1282,7 +1282,7 @@ sub output_intro {
 }
 
 ##
-# takes a declaration (struct, union, enum, typedef) and 
+# takes a declaration (struct, union, enum, typedef) and
 # invokes the right handler. NOT called for functions.
 sub dump_declaration($$) {
     no strict 'refs';
@@ -1352,7 +1352,7 @@ sub dump_enum($$) {
            }
 
        }
-       
+
        output_declaration($declaration_name,
                           'enum',
                           {'enum' => $declaration_name,
@@ -1409,7 +1409,7 @@ sub create_parameterlist($$$) {
     while ($args =~ /(\([^\),]+),/) {
         $args =~ s/(\([^\),]+),/$1#/g;
     }
-    
+
     foreach my $arg (split($splitter, $args)) {
        # strip comments
        $arg =~ s/\/\*.*\*\///;
@@ -1529,7 +1529,7 @@ sub dump_function($$) {
     # the following functions' documentation still comes out right:
     # - parport_register_device (function pointer parameters)
     # - atomic_set (macro)
-    # - pci_match_device (long return type)
+    # - pci_match_device, __copy_to_user (long return type)
 
     if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
        $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
@@ -1544,7 +1544,9 @@ sub dump_function($$) {
        $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
        $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
        $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
-       $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/)  {
+       $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/)  {
        $return_type = $1;
        $declaration_name = $2;
        my $args = $3;
@@ -1556,7 +1558,7 @@ sub dump_function($$) {
        return;
     }
 
-    output_declaration($declaration_name, 
+    output_declaration($declaration_name,
                       'function',
                       {'function' => $declaration_name,
                        'module' => $modulename,
@@ -1615,11 +1617,11 @@ sub reset_state {
     %sections = ();
     @sectionlist = ();
     $prototype = "";
-    
+
     $state = 0;
 }
 
-sub process_state3_function($$) { 
+sub process_state3_function($$) {
     my $x = shift;
     my $file = shift;
 
@@ -1638,7 +1640,7 @@ sub process_state3_function($$) {
     }
 }
 
-sub process_state3_type($$) { 
+sub process_state3_type($$) {
     my $x = shift;
     my $file = shift;
 
@@ -1778,7 +1780,7 @@ sub process_file($) {
            } elsif (/$doc_content/) {
                # miguel-style comment kludge, look for blank lines after
                # @parameter line to signify start of description
-               if ($1 eq "" && 
+               if ($1 eq "" &&
                        ($section =~ m/^@/ || $section eq $section_context)) {
                    dump_section($section, xml_escape($contents));
                    $section = $section_default;
@@ -1788,7 +1790,7 @@ sub process_file($) {
                }
            } else {
                # i dont know - bad line?  ignore.
-               print STDERR "Warning(${file}:$.): bad line: $_"; 
+               print STDERR "Warning(${file}:$.): bad line: $_";
                ++$warnings;
            }
        } elsif ($state == 3) { # scanning for function { (end of prototype)
@@ -1843,7 +1845,7 @@ sub process_file($) {
                        else
                        {
                                $contents .= $1 . "\n";
-                       }       
+                       }
                }
           }
     }
index b9f8d9731c3d54ba345ef7f2b24c09ffc7cad1ad..4ae834d89bce9e81a98c8be4a0056341603ffded 100644 (file)
@@ -127,7 +127,6 @@ static int task_alloc_security(struct task_struct *task)
        if (!tsec)
                return -ENOMEM;
 
-       tsec->magic = SELINUX_MAGIC;
        tsec->task = task;
        tsec->osid = tsec->sid = tsec->ptrace_sid = SECINITSID_UNLABELED;
        task->security = tsec;
@@ -138,10 +137,6 @@ static int task_alloc_security(struct task_struct *task)
 static void task_free_security(struct task_struct *task)
 {
        struct task_security_struct *tsec = task->security;
-
-       if (!tsec || tsec->magic != SELINUX_MAGIC)
-               return;
-
        task->security = NULL;
        kfree(tsec);
 }
@@ -157,14 +152,10 @@ static int inode_alloc_security(struct inode *inode)
 
        init_MUTEX(&isec->sem);
        INIT_LIST_HEAD(&isec->list);
-       isec->magic = SELINUX_MAGIC;
        isec->inode = inode;
        isec->sid = SECINITSID_UNLABELED;
        isec->sclass = SECCLASS_FILE;
-       if (tsec && tsec->magic == SELINUX_MAGIC)
-               isec->task_sid = tsec->sid;
-       else
-               isec->task_sid = SECINITSID_UNLABELED;
+       isec->task_sid = tsec->sid;
        inode->i_security = isec;
 
        return 0;
@@ -175,9 +166,6 @@ static void inode_free_security(struct inode *inode)
        struct inode_security_struct *isec = inode->i_security;
        struct superblock_security_struct *sbsec = inode->i_sb->s_security;
 
-       if (!isec || isec->magic != SELINUX_MAGIC)
-               return;
-
        spin_lock(&sbsec->isec_lock);
        if (!list_empty(&isec->list))
                list_del_init(&isec->list);
@@ -192,19 +180,13 @@ static int file_alloc_security(struct file *file)
        struct task_security_struct *tsec = current->security;
        struct file_security_struct *fsec;
 
-       fsec = kzalloc(sizeof(struct file_security_struct), GFP_ATOMIC);
+       fsec = kzalloc(sizeof(struct file_security_struct), GFP_KERNEL);
        if (!fsec)
                return -ENOMEM;
 
-       fsec->magic = SELINUX_MAGIC;
        fsec->file = file;
-       if (tsec && tsec->magic == SELINUX_MAGIC) {
-               fsec->sid = tsec->sid;
-               fsec->fown_sid = tsec->sid;
-       } else {
-               fsec->sid = SECINITSID_UNLABELED;
-               fsec->fown_sid = SECINITSID_UNLABELED;
-       }
+       fsec->sid = tsec->sid;
+       fsec->fown_sid = tsec->sid;
        file->f_security = fsec;
 
        return 0;
@@ -213,10 +195,6 @@ static int file_alloc_security(struct file *file)
 static void file_free_security(struct file *file)
 {
        struct file_security_struct *fsec = file->f_security;
-
-       if (!fsec || fsec->magic != SELINUX_MAGIC)
-               return;
-
        file->f_security = NULL;
        kfree(fsec);
 }
@@ -233,7 +211,6 @@ static int superblock_alloc_security(struct super_block *sb)
        INIT_LIST_HEAD(&sbsec->list);
        INIT_LIST_HEAD(&sbsec->isec_head);
        spin_lock_init(&sbsec->isec_lock);
-       sbsec->magic = SELINUX_MAGIC;
        sbsec->sb = sb;
        sbsec->sid = SECINITSID_UNLABELED;
        sbsec->def_sid = SECINITSID_FILE;
@@ -246,9 +223,6 @@ static void superblock_free_security(struct super_block *sb)
 {
        struct superblock_security_struct *sbsec = sb->s_security;
 
-       if (!sbsec || sbsec->magic != SELINUX_MAGIC)
-               return;
-
        spin_lock(&sb_security_lock);
        if (!list_empty(&sbsec->list))
                list_del_init(&sbsec->list);
@@ -270,7 +244,6 @@ static int sk_alloc_security(struct sock *sk, int family, gfp_t priority)
        if (!ssec)
                return -ENOMEM;
 
-       ssec->magic = SELINUX_MAGIC;
        ssec->sk = sk;
        ssec->peer_sid = SECINITSID_UNLABELED;
        sk->sk_security = ssec;
@@ -282,7 +255,7 @@ static void sk_free_security(struct sock *sk)
 {
        struct sk_security_struct *ssec = sk->sk_security;
 
-       if (sk->sk_family != PF_UNIX || ssec->magic != SELINUX_MAGIC)
+       if (sk->sk_family != PF_UNIX)
                return;
 
        sk->sk_security = NULL;
@@ -1483,7 +1456,6 @@ static int selinux_bprm_alloc_security(struct linux_binprm *bprm)
        if (!bsec)
                return -ENOMEM;
 
-       bsec->magic = SELINUX_MAGIC;
        bsec->bprm = bprm;
        bsec->sid = SECINITSID_UNLABELED;
        bsec->set = 0;
@@ -2454,35 +2426,27 @@ static int selinux_file_mprotect(struct vm_area_struct *vma,
                prot = reqprot;
 
 #ifndef CONFIG_PPC32
-       if ((prot & PROT_EXEC) && !(vma->vm_flags & VM_EXECUTABLE) &&
-          (vma->vm_start >= vma->vm_mm->start_brk &&
-           vma->vm_end <= vma->vm_mm->brk)) {
-               /*
-                * We are making an executable mapping in the brk region.
-                * This has an additional execheap check.
-                */
-               rc = task_has_perm(current, current, PROCESS__EXECHEAP);
-               if (rc)
-                       return rc;
-       }
-       if (vma->vm_file != NULL && vma->anon_vma != NULL && (prot & PROT_EXEC)) {
-               /*
-                * We are making executable a file mapping that has
-                * had some COW done. Since pages might have been written,
-                * check ability to execute the possibly modified content.
-                * This typically should only occur for text relocations.
-                */
-               int rc = file_has_perm(current, vma->vm_file, FILE__EXECMOD);
-               if (rc)
-                       return rc;
-       }
-       if (!vma->vm_file && (prot & PROT_EXEC) &&
-               vma->vm_start <= vma->vm_mm->start_stack &&
-               vma->vm_end >= vma->vm_mm->start_stack) {
-               /* Attempt to make the process stack executable.
-                * This has an additional execstack check.
-                */
-               rc = task_has_perm(current, current, PROCESS__EXECSTACK);
+       if ((prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
+               rc = 0;
+               if (vma->vm_start >= vma->vm_mm->start_brk &&
+                   vma->vm_end <= vma->vm_mm->brk) {
+                       rc = task_has_perm(current, current,
+                                          PROCESS__EXECHEAP);
+               } else if (!vma->vm_file &&
+                          vma->vm_start <= vma->vm_mm->start_stack &&
+                          vma->vm_end >= vma->vm_mm->start_stack) {
+                       rc = task_has_perm(current, current, PROCESS__EXECSTACK);
+               } else if (vma->vm_file && vma->anon_vma) {
+                       /*
+                        * We are making executable a file mapping that has
+                        * had some COW done. Since pages might have been
+                        * written, check ability to execute the possibly
+                        * modified content.  This typically should only
+                        * occur for text relocations.
+                        */
+                       rc = file_has_perm(current, vma->vm_file,
+                                          FILE__EXECMOD);
+               }
                if (rc)
                        return rc;
        }
@@ -3642,14 +3606,9 @@ static int ipc_alloc_security(struct task_struct *task,
        if (!isec)
                return -ENOMEM;
 
-       isec->magic = SELINUX_MAGIC;
        isec->sclass = sclass;
        isec->ipc_perm = perm;
-       if (tsec) {
-               isec->sid = tsec->sid;
-       } else {
-               isec->sid = SECINITSID_UNLABELED;
-       }
+       isec->sid = tsec->sid;
        perm->security = isec;
 
        return 0;
@@ -3658,9 +3617,6 @@ static int ipc_alloc_security(struct task_struct *task,
 static void ipc_free_security(struct kern_ipc_perm *perm)
 {
        struct ipc_security_struct *isec = perm->security;
-       if (!isec || isec->magic != SELINUX_MAGIC)
-               return;
-
        perm->security = NULL;
        kfree(isec);
 }
@@ -3673,7 +3629,6 @@ static int msg_msg_alloc_security(struct msg_msg *msg)
        if (!msec)
                return -ENOMEM;
 
-       msec->magic = SELINUX_MAGIC;
        msec->msg = msg;
        msec->sid = SECINITSID_UNLABELED;
        msg->security = msec;
@@ -3684,8 +3639,6 @@ static int msg_msg_alloc_security(struct msg_msg *msg)
 static void msg_msg_free_security(struct msg_msg *msg)
 {
        struct msg_security_struct *msec = msg->security;
-       if (!msec || msec->magic != SELINUX_MAGIC)
-               return;
 
        msg->security = NULL;
        kfree(msec);
index 887937c8134a46557a39ccb8f30318d6ceab4f44..54c03077888214a37c0cfd88be4d87575d2377f4 100644 (file)
@@ -27,7 +27,6 @@
 #include "avc.h"
 
 struct task_security_struct {
-        unsigned long magic;           /* magic number for this module */
        struct task_struct *task;      /* back pointer to task object */
        u32 osid;            /* SID prior to last execve */
        u32 sid;             /* current SID */
@@ -37,7 +36,6 @@ struct task_security_struct {
 };
 
 struct inode_security_struct {
-       unsigned long magic;           /* magic number for this module */
         struct inode *inode;           /* back pointer to inode object */
        struct list_head list;         /* list of inode_security_struct */
        u32 task_sid;        /* SID of creating task */
@@ -49,14 +47,12 @@ struct inode_security_struct {
 };
 
 struct file_security_struct {
-       unsigned long magic;            /* magic number for this module */
        struct file *file;              /* back pointer to file object */
        u32 sid;              /* SID of open file description */
        u32 fown_sid;         /* SID of file owner (for SIGIO) */
 };
 
 struct superblock_security_struct {
-       unsigned long magic;            /* magic number for this module */
        struct super_block *sb;         /* back pointer to sb object */
        struct list_head list;          /* list of superblock_security_struct */
        u32 sid;              /* SID of file system */
@@ -70,20 +66,17 @@ struct superblock_security_struct {
 };
 
 struct msg_security_struct {
-        unsigned long magic;           /* magic number for this module */
        struct msg_msg *msg;            /* back pointer */
        u32 sid;              /* SID of message */
 };
 
 struct ipc_security_struct {
-        unsigned long magic;           /* magic number for this module */
        struct kern_ipc_perm *ipc_perm; /* back pointer */
        u16 sclass;     /* security class of this object */
        u32 sid;              /* SID of IPC resource */
 };
 
 struct bprm_security_struct {
-       unsigned long magic;           /* magic number for this module */
        struct linux_binprm *bprm;     /* back pointer to bprm object */
        u32 sid;                       /* SID for transformed process */
        unsigned char set;
@@ -102,7 +95,6 @@ struct netif_security_struct {
 };
 
 struct sk_security_struct {
-       unsigned long magic;            /* magic number for this module */
        struct sock *sk;                /* back pointer to sk object */
        u32 peer_sid;                   /* SID of peer */
 };