diff -u --recursive --new-file v2.4.13/linux/Documentation/Configure.help linux/Documentation/Configure.help --- v2.4.13/linux/Documentation/Configure.help Tue Oct 23 22:48:49 2001 +++ linux/Documentation/Configure.help Thu Oct 25 00:07:39 2001 @@ -1412,6 +1412,12 @@ have a high-level driver for the type of device that you want to support. +Shuttle EPAT c7/c8 extension +CONFIG_PARIDE_EPATC8 + This option enables support for the newer Shuttle EP1284 (aka c7 and + c8) chip. You need this if you are using any recent Imation SuperDisk + (LS-120) drive. + Shuttle EPIA protocol CONFIG_PARIDE_EPIA This option enables support for the (obsolete) EPIA parallel port diff -u --recursive --new-file v2.4.13/linux/Documentation/DocBook/Makefile linux/Documentation/DocBook/Makefile --- v2.4.13/linux/Documentation/DocBook/Makefile Tue Oct 9 17:06:51 2001 +++ linux/Documentation/DocBook/Makefile Thu Oct 25 00:07:40 2001 @@ -8,7 +8,7 @@ HTML := $(patsubst %.sgml, %, $(BOOKS)) IMG-parportbook := parport-share.fig parport-multi.fig parport-structure.fig EPS-parportbook := $(patsubst %.fig, %.eps, $(IMG-parportbook)) -JPG-parportbook := $(patsubst %.fig, %.jpeg, $(IMG-parportbook)) +PNG-parportbook := $(patsubst %.fig, %.png, $(IMG-parportbook)) C-procfs-example = procfs_example.sgml books: $(BOOKS) @@ -26,8 +26,8 @@ %.eps: %.fig fig2dev -Leps $< $@ -%.jpeg: %.fig - fig2dev -Ljpeg $< $@ +%.png: %.fig + fig2dev -Lpng $< $@ %.sgml: %.c echo "" > $@ @@ -129,8 +129,8 @@ $(TOPDIR)/scripts/kernel-doc -man $^ | \ $(PERL) $(TOPDIR)/scripts/split-man $(TOPDIR)/Documentation/man -parportbook: $(JPG-parportbook) -parportbook.ps parportbook.pdf: $(EPS-parportbook) +parportbook parportbook.pdf: $(PNG-parportbook) +parportbook.ps: $(EPS-parportbook) parportbook.sgml: parportbook.tmpl $(TOPDIR)/drivers/parport/init.c $(TOPDIR)/scripts/docgen $(TOPDIR)/drivers/parport/init.c <$< >$@ diff -u --recursive --new-file v2.4.13/linux/Documentation/DocBook/parportbook.tmpl linux/Documentation/DocBook/parportbook.tmpl --- v2.4.13/linux/Documentation/DocBook/parportbook.tmpl Sun Sep 23 11:40:54 2001 +++ linux/Documentation/DocBook/parportbook.tmpl Thu Oct 25 00:07:40 2001 @@ -1,5 +1,5 @@ - + @@ -184,10 +184,10 @@ - + - + @@ -270,10 +270,10 @@ - + - + @@ -461,10 +461,10 @@ - + - + diff -u --recursive --new-file v2.4.13/linux/Documentation/computone.txt linux/Documentation/computone.txt --- v2.4.13/linux/Documentation/computone.txt Fri Jul 28 12:50:51 2000 +++ linux/Documentation/computone.txt Wed Oct 24 12:05:18 2001 @@ -4,16 +4,15 @@ Release Notes For Linux Kernel 2.2 and higher. These notes are for the drivers which have already been integrated into the -kernel and have been tested on Linux kernels 2.0, 2.2, and 2.3. +kernel and have been tested on Linux kernels 2.0, 2.2, 2.3, and 2.4. -Version: 1.2.9 -Date: 04/12/2000 -Author: Andrew Manison +Version: 1.2.12 +Date: 10/24/2001 +Historical Author: Andrew Manison +Primary Author: Doug McNash Testing: larryg@computone.com Support: support@computone.com -Fixes and Updates: Doug McNash -Proc Filesystem and Kernel Integration: Mike Warfield - +Fixes and Updates: Mike Warfield This file assumes that you are using the Computone drivers which are integrated into the kernel sources. For updating the drivers or installing @@ -42,7 +41,7 @@ before or after drivers installation. Note the hardware address from the Computone ISA cards installed into - the system. These are required for editing ip2.h or editing + the system. These are required for editing ip2.c or editing /etc/modules.conf, or for specification on the modprobe command line. @@ -58,7 +57,7 @@ Select (m) module for CONFIG_COMPUTONE under character devices. CONFIG_PCI and CONFIG_MODULES also may need to be set. c) Set address on ISA cards then: - edit /usr/src/linux/drivers/char/ip2/ip2.h if needed + edit /usr/src/linux/drivers/char/ip2.c if needed or edit /etc/modules.conf if needed (module). or both to match this setting. @@ -77,7 +76,8 @@ Select (y) kernel for CONFIG_COMPUTONE under character devices. CONFIG_PCI may need to be set if you have PCI bus. c) Set address on ISA cards then: - edit /usr/src/linux/drivers/char/ip2/ip2.h + edit /usr/src/linux/drivers/char/ip2.c + (Optional - may be specified on kernel command line now) d) Run "make dep" e) Run "make zImage" or whatever target you prefer. f) mv /usr/src/linux/arch/i386/boot/zImage to /boot. @@ -86,6 +86,41 @@ h) Reboot using this kernel i) run ip2mkdev (either the script below or the binary version) +Kernel command line options: + +When compiling the driver into the kernel, io and irq may be +compiled into the driver by editing ip2.c and setting the values for +io and irq in the appropriate array. An alternative is to specify +a command line parameter to the kernel at boot up. + + ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3 + +Note that this order is very different from the specifications for the +modload parameters which have separate IRQ and IO specifiers. + +The io port also selects PCI (1) and EISA (2) boards. + + io=0 No board + io=1 PCI board + io=2 EISA board + else ISA board io address + +You only need to specify the boards which are present. + + Examples: + + 2 PCI boards: + + ip2=1,0,1,0 + + 1 ISA board at 0x310 irq 5: + + ip2=0x310,5 + +This can be added to and "append" option in lilo.conf similar to this: + + append="ip2=1,0,1,0" + 3. INSTALLATION @@ -100,7 +135,7 @@ The driver can be installed as a module (recommended) or built into the kernel. This is selected as for other drivers through the `make config` command from the root of the Linux source tree. If the driver is built -into the kernel you will need to edit the file ip2.h to match the boards +into the kernel you will need to edit the file ip2.c to match the boards you are installing. See that file for instructions. If the driver is installed as a module the configuration can also be specified on the modprobe command line as follows: @@ -109,13 +144,13 @@ where irqnum is one of the valid Intelliport II interrupts (3,4,5,7,10,11, 12,15) and addr1-4 are the base addresses for up to four controllers. If -the irqs are not specified the driver uses the default in ip2/ip2.h (which +the irqs are not specified the driver uses the default in ip2.c (which selects polled mode). If no base addresses are specified the defaults in -ip2.h are used. If you are autoloading the driver module with kerneld or -kmod the base addresses and interrupt number must also be set in ip2/ip2.h +ip2.c are used. If you are autoloading the driver module with kerneld or +kmod the base addresses and interrupt number must also be set in ip2.c and recompile or just insert and options line in /etc/modules.conf or both. The options line is equivalent to the command line and takes precidence over -what is in ip2.h. +what is in ip2.c. /etc/modules.conf sample: options ip2 io=1,0x328 irq=1,10 @@ -123,22 +158,18 @@ alias char-major-72 ip2 alias char-major-73 ip2 -equivelant ip2.h: -static ip2config_t ip2config = -{ - {1,10,0,0}, - { - 0x0001, // Board 0, ttyF0 - ttyF63 /* PCI card */ - 0x0328, // Board 1, ttyF64 - ttyF127 /* ISA card */ - 0x0000, // Board 2, ttyF128 - ttyF191 /* empty */ - 0x0000 // Board 3, ttyF192 - ttyF255 /* empty */ - } -}; +The equivalent in ip2.c: + +static int io[IP2_MAX_BOARDS]= { 1, 0x328, 0, 0 }; +static int irq[IP2_MAX_BOARDS] = { 1, 10, -1, -1 }; + +The equivalent for the kernel command line (in lilo.conf): + + append="ip2=1,1,0x328,10" Note: Both io and irq should be updated to reflect YOUR system. An "io" - address of "1/2" indicates a PCI/EISA card in the board table. The - PCI or EISA irq will be assigned automatically. + address of 1 or 2 indicates a PCI or EISA card in the board table. The PCI or EISA irq will be assigned automatically. Specifying an invalid or in-use irq will default the driver into running in polled mode for that card. If all irq entries are 0 then diff -u --recursive --new-file v2.4.13/linux/MAINTAINERS linux/MAINTAINERS --- v2.4.13/linux/MAINTAINERS Tue Oct 23 22:48:49 2001 +++ linux/MAINTAINERS Wed Oct 24 12:05:18 2001 @@ -296,9 +296,7 @@ S: Supported COMPUTONE INTELLIPORT MULTIPORT CARD -P: Doug McNash P: Michael H. Warfield -M: Doug McNash M: Michael H. Warfield W: http://www.computone.com/ W: http://www.wittsend.com/computone.html diff -u --recursive --new-file v2.4.13/linux/Makefile linux/Makefile --- v2.4.13/linux/Makefile Tue Oct 23 22:48:49 2001 +++ linux/Makefile Tue Oct 23 22:48:36 2001 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 4 -SUBLEVEL = 13 -EXTRAVERSION = +SUBLEVEL = 14 +EXTRAVERSION =-pre1 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/Makefile linux/drivers/acpi/Makefile --- v2.4.13/linux/drivers/acpi/Makefile Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/Makefile Wed Oct 24 14:06:21 2001 @@ -36,12 +36,11 @@ subdir-$(CONFIG_ACPI) += $(acpi-subdirs) subdir-$(CONFIG_ACPI_BUSMGR) += ospm -obj-$(CONFIG_ACPI) += os.o acpi_ksyms.o +obj-$(CONFIG_ACPI) += driver.o os.o acpi_ksyms.o obj-$(CONFIG_ACPI) += $(foreach dir,$(acpi-subdirs),$(dir)/$(dir).o) ifdef CONFIG_ACPI_KERNEL_CONFIG obj-$(CONFIG_ACPI) += acpiconf.o osconf.o endif -obj-$(CONFIG_ACPI) += driver.o ifeq ($(CONFIG_ACPI_BUSMGR),y) obj-y += ospm/ospm.o diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/acpi_ksyms.c linux/drivers/acpi/acpi_ksyms.c --- v2.4.13/linux/drivers/acpi/acpi_ksyms.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/acpi_ksyms.c Wed Oct 24 14:06:21 2001 @@ -38,6 +38,14 @@ EXPORT_SYMBOL(acpi_db_user_commands); #endif +#ifdef ACPI_DEBUG +EXPORT_SYMBOL(acpi_ut_debug_print_raw); +EXPORT_SYMBOL(acpi_ut_debug_print); +EXPORT_SYMBOL(acpi_ut_status_exit); +EXPORT_SYMBOL(acpi_ut_exit); +EXPORT_SYMBOL(acpi_ut_trace); +#endif + EXPORT_SYMBOL(acpi_gbl_FADT); EXPORT_SYMBOL(acpi_os_free); @@ -103,6 +111,5 @@ EXPORT_SYMBOL(acpi_hw_register_read); EXPORT_SYMBOL(acpi_set_firmware_waking_vector); EXPORT_SYMBOL(acpi_subsystem_status); - EXPORT_SYMBOL(acpi_os_signal); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbcmds.c linux/drivers/acpi/debugger/dbcmds.c --- v2.4.13/linux/drivers/acpi/debugger/dbcmds.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbcmds.c Wed Oct 24 14:06:21 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbcmds - debug commands and output routines - * $Revision: 65 $ + * $Revision: 66 $ * ******************************************************************************/ @@ -422,7 +422,7 @@ /* Display the subtree */ acpi_db_set_output_destination (DB_REDIRECTABLE_OUTPUT); - acpi_ns_dump_objects (ACPI_TYPE_ANY, max_depth, ACPI_UINT32_MAX, subtree_entry); + acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth, ACPI_UINT32_MAX, subtree_entry); acpi_db_set_output_destination (DB_CONSOLE_OUTPUT); } @@ -466,7 +466,7 @@ /* Display the subtree */ acpi_db_set_output_destination (DB_REDIRECTABLE_OUTPUT); - acpi_ns_dump_objects (ACPI_TYPE_ANY, max_depth, owner_id, subtree_entry); + acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth, owner_id, subtree_entry); acpi_db_set_output_destination (DB_CONSOLE_OUTPUT); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbdisasm.c linux/drivers/acpi/debugger/dbdisasm.c --- v2.4.13/linux/drivers/acpi/debugger/dbdisasm.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbdisasm.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbdisasm - parser op tree display routines - * $Revision: 48 $ + * $Revision: 50 $ * ******************************************************************************/ @@ -97,6 +97,7 @@ acpi_status acpi_ps_display_object_pathname ( + acpi_walk_state *walk_state, acpi_parse_object *op) { acpi_parse_object *target_op; @@ -130,26 +131,43 @@ acpi_status acpi_ps_display_object_pathname ( + acpi_walk_state *walk_state, acpi_parse_object *op) { acpi_status status; acpi_namespace_node *node; NATIVE_CHAR buffer[MAX_SHOW_ENTRY]; u32 buffer_size = MAX_SHOW_ENTRY; + u32 debug_level; - acpi_os_printf (" (Path "); + /* Save current debug level so we don't get extraneous debug output */ + + debug_level = acpi_dbg_level; + acpi_dbg_level = 0; /* Just get the Node out of the Op object */ node = op->node; if (!node) { - /* - * No Named obj, so we can't get the pathname since the object - * is not in the namespace. This can happen during single - * stepping where a dynamic named object is *about* to be created. - */ - return (AE_OK); + /* Node not defined in this scope, look it up */ + + status = acpi_ns_lookup (walk_state->scope_info, op->value.string, ACPI_TYPE_ANY, + IMODE_EXECUTE, NS_SEARCH_PARENT, walk_state, &(node)); + + if (ACPI_FAILURE (status)) { + /* + * We can't get the pathname since the object + * is not in the namespace. This can happen during single + * stepping where a dynamic named object is *about* to be created. + */ + acpi_os_printf (" [Path not found]"); + goto exit; + } + + /* Save it for next time. */ + + op->node = node; } /* Convert Named_desc/handle to a full pathname */ @@ -157,11 +175,17 @@ status = acpi_ns_handle_to_pathname (node, &buffer_size, buffer); if (ACPI_FAILURE (status)) { acpi_os_printf ("****Could not get pathname****)"); - return (status); + goto exit; } - acpi_os_printf ("%s)", buffer); - return (AE_OK); + acpi_os_printf (" (Path %s)", buffer); + + +exit: + /* Restore the debug level */ + + acpi_dbg_level = debug_level; + return (status); } #endif @@ -275,7 +299,7 @@ if ((op->opcode == AML_INT_NAMEPATH_OP && op->value.name) && (op->parent) && (acpi_gbl_db_opt_verbose)) { - acpi_ps_display_object_pathname (op); + acpi_ps_display_object_pathname (walk_state, op); } acpi_os_printf ("\n"); @@ -561,7 +585,7 @@ case AML_QWORD_OP: if (acpi_gbl_db_opt_verbose) { - acpi_os_printf ("(UINT64) 0x%8.8X%8.8X", op->value.integer64.hi, + acpi_os_printf ("(u64) 0x%8.8X%8.8X", op->value.integer64.hi, op->value.integer64.lo); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbdisply.c linux/drivers/acpi/debugger/dbdisply.c --- v2.4.13/linux/drivers/acpi/debugger/dbdisply.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbdisply.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbdisply - debug display commands - * $Revision: 52 $ + * $Revision: 57 $ * ******************************************************************************/ @@ -246,7 +246,7 @@ } else { - acpi_os_printf ("Object Pathname: %s\n", ret_buf.pointer); + acpi_os_printf ("Object (%p) Pathname: %s\n", node, ret_buf.pointer); } if (!acpi_os_readable (node, sizeof (acpi_namespace_node))) { @@ -264,7 +264,7 @@ return; } - acpi_ut_dump_buffer (node->object, sizeof (acpi_operand_object), display, ACPI_UINT32_MAX); + acpi_ut_dump_buffer ((void *) node->object, sizeof (acpi_operand_object), display, ACPI_UINT32_MAX); acpi_ex_dump_object_descriptor (node->object, 1); } } @@ -402,7 +402,7 @@ break; case AML_REVISION_OP: - acpi_os_printf ("[Const] Revision (%X)", ACPI_CA_VERSION); + acpi_os_printf ("[Const] Revision (%X)", ACPI_CA_SUPPORT_LEVEL); break; case AML_LOCAL_OP: @@ -520,28 +520,22 @@ num_remaining_ops++; } - op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { - /* Bad opcode or ASCII character */ - - continue; - } - - /* Decode the opcode */ - switch (ACPI_GET_OP_CLASS (op_info)) { - case OPTYPE_CONSTANT: /* argument type only */ - case OPTYPE_LITERAL: /* argument type only */ - case OPTYPE_DATA_TERM: /* argument type only */ - case OPTYPE_LOCAL_VARIABLE: /* argument type only */ - case OPTYPE_METHOD_ARGUMENT: /* argument type only */ + op_info = acpi_ps_get_opcode_info (op->opcode); + switch (op_info->class) { + case AML_CLASS_ARGUMENT: if (count_remaining) { num_remaining_operands++; } num_operands++; break; + + case AML_CLASS_UNKNOWN: + /* Bad opcode or ASCII character */ + + continue; default: if (count_remaining) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbfileio.c linux/drivers/acpi/debugger/dbfileio.c --- v2.4.13/linux/drivers/acpi/debugger/dbfileio.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbfileio.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: dbfileio - Debugger file I/O commands. These can't usually * be used when running the debugger in Ring 0 (Kernel mode) - * $Revision: 48 $ + * $Revision: 53 $ * ******************************************************************************/ @@ -38,16 +38,18 @@ MODULE_NAME ("dbfileio") +/* + * NOTE: this is here for lack of a better place. It is used in all + * flavors of the debugger, need LCD file + */ #ifdef ACPI_APPLICATION #include FILE *acpi_gbl_debug_file = NULL; #endif -/* - * NOTE: this is here for lack of a better place. It is used in all - * flavors of the debugger, need LCD file - */ +acpi_table_header *acpi_gbl_db_table_ptr = NULL; + /******************************************************************************* * @@ -172,7 +174,7 @@ u32 *table_length) { acpi_table_header table_header; - u8 *aml_ptr; + u8 *aml_start; u32 aml_length; u32 actual; acpi_status status; @@ -209,7 +211,7 @@ /* Allocate a buffer for the table */ *table_length = table_header.length; - *table_ptr = ACPI_MEM_ALLOCATE ((size_t) *table_length); + *table_ptr = acpi_os_allocate ((size_t) *table_length); if (!*table_ptr) { acpi_os_printf ("Could not allocate memory for ACPI table %4.4s (size=%X)\n", table_header.signature, table_header.length); @@ -217,8 +219,8 @@ } - aml_ptr = (u8 *) *table_ptr + sizeof (table_header); - aml_length = *table_length - sizeof (table_header); + aml_start = (u8 *) *table_ptr + sizeof (table_header); + aml_length = *table_length - sizeof (table_header); /* Copy the header to the buffer */ @@ -226,19 +228,19 @@ /* Get the rest of the table */ - actual = fread (aml_ptr, 1, (size_t) aml_length, fp); + actual = fread (aml_start, 1, (size_t) aml_length, fp); if (actual == aml_length) { return (AE_OK); } if (actual > 0) { acpi_os_printf ("Warning - reading table, asked for %X got %X\n", aml_length, actual); - return (AE_OK); + return (AE_OK); } acpi_os_printf ("Error - could not read the table file\n"); - ACPI_MEM_FREE (*table_ptr); + acpi_os_free (*table_ptr); *table_ptr = NULL; *table_length = 0; @@ -325,7 +327,6 @@ #ifdef ACPI_APPLICATION FILE *fp; acpi_status status; - acpi_table_header *table_ptr; u32 table_length; @@ -341,7 +342,7 @@ /* Get the entire file */ acpi_os_printf ("Loading Acpi table from file %s\n", filename); - status = acpi_db_load_table (fp, &table_ptr, &table_length); + status = acpi_db_load_table (fp, &acpi_gbl_db_table_ptr, &table_length); fclose(fp); if (ACPI_FAILURE (status)) { @@ -349,27 +350,25 @@ return (status); } - /* Attempt to recognize and install the table */ - status = ae_local_load_table (table_ptr); + status = ae_local_load_table (acpi_gbl_db_table_ptr); if (ACPI_FAILURE (status)) { if (status == AE_EXIST) { acpi_os_printf ("Table %4.4s is already installed\n", - &table_ptr->signature); + &acpi_gbl_db_table_ptr->signature); } - else { acpi_os_printf ("Could not install table, %s\n", acpi_format_exception (status)); } - ACPI_MEM_FREE (table_ptr); + acpi_os_free (acpi_gbl_db_table_ptr); return (status); } acpi_os_printf ("%4.4s at %p successfully installed and loaded\n", - &table_ptr->signature, table_ptr); + &acpi_gbl_db_table_ptr->signature, acpi_gbl_db_table_ptr); acpi_gbl_acpi_hardware_present = FALSE; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbinput.c linux/drivers/acpi/debugger/dbinput.c --- v2.4.13/linux/drivers/acpi/debugger/dbinput.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbinput.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbinput - user front-end to the AML debugger - * $Revision: 68 $ + * $Revision: 72 $ * ******************************************************************************/ @@ -47,11 +47,10 @@ NATIVE_CHAR acpi_gbl_db_scope_buf[40]; NATIVE_CHAR acpi_gbl_db_debug_filename[40]; NATIVE_CHAR *acpi_gbl_db_args[DB_MAX_ARGS]; -NATIVE_CHAR *acpi_gbl_db_buffer; +NATIVE_CHAR *acpi_gbl_db_buffer = NULL; NATIVE_CHAR *acpi_gbl_db_filename = NULL; u8 acpi_gbl_db_output_to_file = FALSE; - u32 acpi_gbl_db_debug_level = ACPI_LV_VERBOSITY2; u32 acpi_gbl_db_console_debug_level = NORMAL_DEFAULT | ACPI_LV_TABLES; u8 acpi_gbl_db_output_flags = DB_CONSOLE_OUTPUT; @@ -525,7 +524,7 @@ case CMD_ALLOCATIONS: #ifdef ACPI_DBG_TRACK_ALLOCATIONS - acpi_ut_dump_current_allocations ((u32) -1, NULL); + acpi_ut_dump_allocations ((u32) -1, NULL); #endif break; @@ -917,7 +916,6 @@ * because all the semaphores are deleted during termination */ acpi_terminate (); - return (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbstats.c linux/drivers/acpi/debugger/dbstats.c --- v2.4.13/linux/drivers/acpi/debugger/dbstats.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbstats.c Wed Oct 24 14:06:22 2001 @@ -368,11 +368,11 @@ if (acpi_gbl_memory_lists[i].object_size) { - size = ROUND_UP_TO_1_k (outstanding * acpi_gbl_memory_lists[i].object_size); + size = ROUND_UP_TO_1K (outstanding * acpi_gbl_memory_lists[i].object_size); } else { - size = ROUND_UP_TO_1_k (acpi_gbl_memory_lists[i].current_total_size); + size = ROUND_UP_TO_1K (acpi_gbl_memory_lists[i].current_total_size); } acpi_os_printf (" Mem: [Alloc Free Outstanding Size] % 7d % 7d % 7d % 7d Kb\n", diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbutils.c linux/drivers/acpi/debugger/dbutils.c --- v2.4.13/linux/drivers/acpi/debugger/dbutils.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbutils - AML debugger utilities - * $Revision: 43 $ + * $Revision: 45 $ * ******************************************************************************/ @@ -135,7 +135,7 @@ case ACPI_TYPE_INTEGER: - acpi_os_printf ("[Integer] = %X%8.8X\n", HIDWORD (obj_desc->integer.value), + acpi_os_printf ("[Integer] = %8.8X%8.8X\n", HIDWORD (obj_desc->integer.value), LODWORD (obj_desc->integer.value)); break; @@ -265,15 +265,37 @@ acpi_parse_object *start_op; acpi_status status = AE_OK; u32 base_aml_offset; + acpi_walk_state *walk_state; + + + FUNCTION_ENTRY (); acpi_os_printf ("Pass two parse ....\n"); + while (op) { if (op->opcode == AML_METHOD_OP) { method = (acpi_parse2_object *) op; - status = acpi_ps_parse_aml (op, method->data, method->length, 0, - NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op); + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return (AE_NO_MEMORY); + } + + + walk_state->parser_state.aml = + walk_state->parser_state.aml_start = method->data; + walk_state->parser_state.aml_end = + walk_state->parser_state.pkg_end = method->data + method->length; + walk_state->parser_state.start_scope = op; + + walk_state->descending_callback = acpi_ds_load1_begin_op; + walk_state->ascending_callback = acpi_ds_load1_end_op; + + + status = acpi_ps_parse_aml (walk_state); base_aml_offset = (method->value.arg)->aml_offset + 1; @@ -297,7 +319,7 @@ } if (ACPI_FAILURE (status)) { - return (status); + break; } op = acpi_ps_get_depth_next (root, op); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbxface.c linux/drivers/acpi/debugger/dbxface.c --- v2.4.13/linux/drivers/acpi/debugger/dbxface.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbxface - AML Debugger external interfaces - * $Revision: 41 $ + * $Revision: 45 $ * ******************************************************************************/ @@ -46,7 +46,7 @@ * * PARAMETERS: Walk_state - Current walk * Op - Current executing op - * Op_type - Type of the current AML Opcode + * Opcode_class - Class of the current AML Opcode * * RETURN: Status * @@ -58,7 +58,7 @@ acpi_db_single_step ( acpi_walk_state *walk_state, acpi_parse_object *op, - u8 op_type) + u32 opcode_class) { acpi_parse_object *next; acpi_status status = AE_OK; @@ -91,22 +91,11 @@ return (AE_OK); } - switch (op_type) { - case OPTYPE_UNDEFINED: - case OPTYPE_CONSTANT: /* argument type only */ - case OPTYPE_LITERAL: /* argument type only */ - case OPTYPE_DATA_TERM: /* argument type only */ - case OPTYPE_LOCAL_VARIABLE: /* argument type only */ - case OPTYPE_METHOD_ARGUMENT: /* argument type only */ + switch (opcode_class) { + case AML_CLASS_UNKNOWN: + case AML_CLASS_ARGUMENT: /* constants, literals, etc. do nothing */ return (AE_OK); break; - - case OPTYPE_NAMED_OBJECT: - switch (op->opcode) { - case AML_INT_NAMEPATH_OP: - return (AE_OK); - break; - } } /* @@ -270,7 +259,7 @@ /* Init globals */ - acpi_gbl_db_buffer = acpi_os_allocate (ACPI_DEBUG_BUFFER_SIZE); + acpi_gbl_db_buffer = acpi_os_callocate (ACPI_DEBUG_BUFFER_SIZE); /* Initial scope is the root */ @@ -301,6 +290,31 @@ } return (0); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_db_terminate + * + * PARAMETERS: None + * + * RETURN: Status + * + * DESCRIPTION: Stop debugger + * + ******************************************************************************/ + +void +acpi_db_terminate (void) +{ + + if (acpi_gbl_db_table_ptr) { + acpi_os_free (acpi_gbl_db_table_ptr); + } + if (acpi_gbl_db_buffer) { + acpi_os_free (acpi_gbl_db_buffer); + } } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsfield.c linux/drivers/acpi/dispatcher/dsfield.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsfield.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsfield.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsfield - Dispatcher field routines - * $Revision: 44 $ + * $Revision: 46 $ * *****************************************************************************/ @@ -29,78 +29,178 @@ #include "acdispat.h" #include "acinterp.h" #include "acnamesp.h" +#include "acparser.h" #define _COMPONENT ACPI_DISPATCHER MODULE_NAME ("dsfield") -/* - * Field flags: Bits 00 - 03 : Access_type (Any_acc, Byte_acc, etc.) - * 04 : Lock_rule (1 == Lock) - * 05 - 06 : Update_rule - */ - -#define FIELD_ACCESS_TYPE_MASK 0x0F -#define FIELD_LOCK_RULE_MASK 0x10 -#define FIELD_UPDATE_RULE_MASK 0x60 - - /******************************************************************************* * - * FUNCTION: Acpi_ds_create_field + * FUNCTION: Acpi_ds_create_buffer_field * - * PARAMETERS: Op - Op containing the Field definition and args - * Region_node - Object for the containing Operation Region - * ` Walk_state - Current method state + * PARAMETERS: Opcode - The opcode to be executed + * Operands - List of operands for the opcode + * Walk_state - Current state * * RETURN: Status * - * DESCRIPTION: Create a new field in the specified operation region + * DESCRIPTION: Execute the Create_field operators: + * Create_bit_field_op, + * Create_byte_field_op, + * Create_word_field_op, + * Create_dWord_field_op, + * Create_qWord_field_op, + * Create_field_op (all of which define fields in buffers) * ******************************************************************************/ acpi_status -acpi_ds_create_field ( +acpi_ds_create_buffer_field ( acpi_parse_object *op, - acpi_namespace_node *region_node, acpi_walk_state *walk_state) { - acpi_status status = AE_AML_ERROR; acpi_parse_object *arg; acpi_namespace_node *node; - u8 field_flags; - u32 field_bit_position = 0; + acpi_status status; + acpi_operand_object *obj_desc; - FUNCTION_TRACE_PTR ("Ds_create_field", op); + FUNCTION_TRACE ("Ds_create_buffer_field"); - /* First arg is the name of the parent Op_region */ + /* Get the Name_string argument */ - arg = op->value.arg; - if (!region_node) { - status = acpi_ns_lookup (walk_state->scope_info, arg->value.name, - ACPI_TYPE_REGION, IMODE_EXECUTE, - NS_SEARCH_PARENT, walk_state, ®ion_node); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + if (op->opcode == AML_CREATE_FIELD_OP) { + arg = acpi_ps_get_arg (op, 3); } + else { + /* Create Bit/Byte/Word/Dword field */ - /* Second arg is the field flags */ + arg = acpi_ps_get_arg (op, 2); + } - arg = arg->next; - field_flags = (u8) arg->value.integer; + if (!arg) { + return_ACPI_STATUS (AE_AML_NO_OPERAND); + } - /* Each remaining arg is a Named Field */ + /* + * Enter the Name_string into the namespace + */ + status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, + INTERNAL_TYPE_DEF_ANY, IMODE_LOAD_PASS1, + NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, + walk_state, &(node)); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + /* We could put the returned object (Node) on the object stack for later, but + * for now, we will put it in the "op" object that the parser uses, so we + * can get it again at the end of this scope + */ + op->node = node; + + /* + * If there is no object attached to the node, this node was just created and + * we need to create the field object. Otherwise, this was a lookup of an + * existing node and we don't want to create the field object again. + */ + if (node->object) { + return_ACPI_STATUS (AE_OK); + } + + /* + * The Field definition is not fully parsed at this time. + * (We must save the address of the AML for the buffer and index operands) + */ + + /* Create the buffer field object */ + + obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER_FIELD); + if (!obj_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* + * Allocate a method object for this field unit + */ + obj_desc->buffer_field.extra = acpi_ut_create_internal_object ( + INTERNAL_TYPE_EXTRA); + if (!obj_desc->buffer_field.extra) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* + * Remember location in AML stream of the field unit + * opcode and operands -- since the buffer and index + * operands must be evaluated. + */ + obj_desc->buffer_field.extra->extra.aml_start = ((acpi_parse2_object *) op)->data; + obj_desc->buffer_field.extra->extra.aml_length = ((acpi_parse2_object *) op)->length; + obj_desc->buffer_field.node = node; + + /* Attach constructed field descriptor to parent node */ + + status = acpi_ns_attach_object (node, obj_desc, ACPI_TYPE_BUFFER_FIELD); + + +cleanup: + + /* Remove local reference to the object */ + + acpi_ut_remove_reference (obj_desc); + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ds_get_field_names + * + * PARAMETERS: Info - Create_field info structure + * ` Walk_state - Current method state + * Arg - First parser arg for the field name list + * + * RETURN: Status + * + * DESCRIPTION: Process all named fields in a field declaration. Names are + * entered into the namespace. + * + ******************************************************************************/ + +acpi_status +acpi_ds_get_field_names ( + ACPI_CREATE_FIELD_INFO *info, + acpi_walk_state *walk_state, + acpi_parse_object *arg) +{ + acpi_status status; + + + FUNCTION_TRACE_U32 ("Ds_get_field_names", info); + + + /* First field starts at bit zero */ + + info->field_bit_position = 0; + + /* Process all elements in the field list (of parse nodes) */ - arg = arg->next; while (arg) { + /* + * Three types of field elements are handled: + * 1) Offset - specifies a bit offset + * 2) Access_as - changes the access mode + * 3) Name - Enters a new named field into the namespace + */ switch (arg->opcode) { case AML_INT_RESERVEDFIELD_OP: - field_bit_position += arg->value.size; + info->field_bit_position += arg->value.size; break; @@ -110,48 +210,57 @@ * Get a new Access_type and Access_attribute for all * entries (until end or another Access_as keyword) */ - field_flags = (u8) ((field_flags & FIELD_ACCESS_TYPE_MASK) || - ((u8) (arg->value.integer >> 8))); + info->field_flags = (u8) ((info->field_flags & FIELD_ACCESS_TYPE_MASK) || + ((u8) (arg->value.integer >> 8))); break; case AML_INT_NAMEDFIELD_OP: + /* Enter a new field name into the namespace */ + status = acpi_ns_lookup (walk_state->scope_info, (NATIVE_CHAR *) &((acpi_parse2_object *)arg)->name, - INTERNAL_TYPE_REGION_FIELD, IMODE_LOAD_PASS1, + info->field_type, IMODE_LOAD_PASS1, NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &node); + NULL, &info->field_node); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - /* - * Initialize an object for the new Node that is on - * the object stack - */ - status = acpi_ex_prep_region_field_value (node, region_node, field_flags, - field_bit_position, arg->value.size); + /* Create and initialize an object for the new Field Node */ + + info->field_bit_length = arg->value.size; + + status = acpi_ex_prep_field_value (info); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - /* Keep track of bit position for *next* field */ + /* Keep track of bit position for the next field */ + + info->field_bit_position += info->field_bit_length; + break; + + + default: - field_bit_position += arg->value.size; + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid opcode in field list: %X\n", + arg->opcode)); + return_ACPI_STATUS (AE_AML_ERROR); break; } arg = arg->next; } - return_ACPI_STATUS (status); + return_ACPI_STATUS (AE_OK); } /******************************************************************************* * - * FUNCTION: Acpi_ds_create_bank_field + * FUNCTION: Acpi_ds_create_field * * PARAMETERS: Op - Op containing the Field definition and args * Region_node - Object for the containing Operation Region @@ -159,29 +268,25 @@ * * RETURN: Status * - * DESCRIPTION: Create a new bank field in the specified operation region + * DESCRIPTION: Create a new field in the specified operation region * ******************************************************************************/ acpi_status -acpi_ds_create_bank_field ( +acpi_ds_create_field ( acpi_parse_object *op, acpi_namespace_node *region_node, acpi_walk_state *walk_state) { acpi_status status = AE_AML_ERROR; acpi_parse_object *arg; - acpi_namespace_node *register_node; - acpi_namespace_node *node; - u32 bank_value; - u8 field_flags; - u32 field_bit_position = 0; + ACPI_CREATE_FIELD_INFO info; - FUNCTION_TRACE_PTR ("Ds_create_bank_field", op); + FUNCTION_TRACE_PTR ("Ds_create_field", op); - /* First arg is the name of the parent Op_region */ + /* First arg is the name of the parent Op_region (must already exist) */ arg = op->value.arg; if (!region_node) { @@ -193,82 +298,88 @@ } } - /* Second arg is the Bank Register */ + /* Second arg is the field flags */ arg = arg->next; + info.field_flags = arg->value.integer8; - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - INTERNAL_TYPE_BANK_FIELD_DEFN, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, ®ister_node); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + /* Each remaining arg is a Named Field */ - /* Third arg is the Bank_value */ + info.field_type = INTERNAL_TYPE_REGION_FIELD; + info.region_node = region_node; - arg = arg->next; - bank_value = arg->value.integer32; + status = acpi_ds_get_field_names (&info, walk_state, arg->next); + return_ACPI_STATUS (status); +} - /* Next arg is the field flags */ - arg = arg->next; - field_flags = arg->value.integer8; +/******************************************************************************* + * + * FUNCTION: Acpi_ds_create_bank_field + * + * PARAMETERS: Op - Op containing the Field definition and args + * Region_node - Object for the containing Operation Region + * ` Walk_state - Current method state + * + * RETURN: Status + * + * DESCRIPTION: Create a new bank field in the specified operation region + * + ******************************************************************************/ - /* Each remaining arg is a Named Field */ +acpi_status +acpi_ds_create_bank_field ( + acpi_parse_object *op, + acpi_namespace_node *region_node, + acpi_walk_state *walk_state) +{ + acpi_status status = AE_AML_ERROR; + acpi_parse_object *arg; + ACPI_CREATE_FIELD_INFO info; - arg = arg->next; - while (arg) { - switch (arg->opcode) { - case AML_INT_RESERVEDFIELD_OP: - field_bit_position += arg->value.size; - break; + FUNCTION_TRACE_PTR ("Ds_create_bank_field", op); - case AML_INT_ACCESSFIELD_OP: + /* First arg is the name of the parent Op_region (must already exist) */ - /* - * Get a new Access_type and Access_attribute for - * all entries (until end or another Access_as keyword) - */ - field_flags = (u8) ((field_flags & FIELD_ACCESS_TYPE_MASK) || - ((u8) (arg->value.integer >> 8))); - break; + arg = op->value.arg; + if (!region_node) { + status = acpi_ns_lookup (walk_state->scope_info, arg->value.name, + ACPI_TYPE_REGION, IMODE_EXECUTE, + NS_SEARCH_PARENT, walk_state, ®ion_node); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } + /* Second arg is the Bank Register (must already exist) */ - case AML_INT_NAMEDFIELD_OP: + arg = arg->next; + status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, + INTERNAL_TYPE_BANK_FIELD_DEFN, IMODE_EXECUTE, + NS_SEARCH_PARENT, walk_state, &info.register_node); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } - status = acpi_ns_lookup (walk_state->scope_info, - (NATIVE_CHAR *) &((acpi_parse2_object *)arg)->name, - INTERNAL_TYPE_REGION_FIELD, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &node); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + /* Third arg is the Bank_value */ - /* - * Initialize an object for the new Node that is on - * the object stack - */ - status = acpi_ex_prep_bank_field_value (node, region_node, register_node, - bank_value, field_flags, field_bit_position, - arg->value.size); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + arg = arg->next; + info.bank_value = arg->value.integer32; - /* Keep track of bit position for the *next* field */ + /* Fourth arg is the field flags */ - field_bit_position += arg->value.size; - break; + arg = arg->next; + info.field_flags = arg->value.integer8; - } + /* Each remaining arg is a Named Field */ - arg = arg->next; - } + info.field_type = INTERNAL_TYPE_BANK_FIELD; + info.region_node = region_node; + + status = acpi_ds_get_field_names (&info, walk_state, arg->next); return_ACPI_STATUS (status); } @@ -296,107 +407,44 @@ { acpi_status status; acpi_parse_object *arg; - acpi_namespace_node *node; - acpi_namespace_node *index_register_node; - acpi_namespace_node *data_register_node; - u8 field_flags; - u32 field_bit_position = 0; + ACPI_CREATE_FIELD_INFO info; FUNCTION_TRACE_PTR ("Ds_create_index_field", op); - arg = op->value.arg; - - /* First arg is the name of the Index register */ + /* First arg is the name of the Index register (must already exist) */ + arg = op->value.arg; status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - ACPI_TYPE_ANY, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &index_register_node); + ACPI_TYPE_ANY, IMODE_EXECUTE, + NS_SEARCH_PARENT, walk_state, &info.register_node); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - /* Second arg is the data register */ + /* Second arg is the data register (must already exist) */ arg = arg->next; - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - INTERNAL_TYPE_INDEX_FIELD_DEFN, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &data_register_node); + INTERNAL_TYPE_INDEX_FIELD_DEFN, IMODE_EXECUTE, + NS_SEARCH_PARENT, walk_state, &info.data_register_node); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - /* Next arg is the field flags */ arg = arg->next; - field_flags = (u8) arg->value.integer; + info.field_flags = arg->value.integer8; /* Each remaining arg is a Named Field */ - arg = arg->next; - while (arg) { - switch (arg->opcode) { - case AML_INT_RESERVEDFIELD_OP: - - field_bit_position += arg->value.size; - break; - - - case AML_INT_ACCESSFIELD_OP: - - /* - * Get a new Access_type and Access_attribute for all - * entries (until end or another Access_as keyword) - */ - field_flags = (u8) ((field_flags & FIELD_ACCESS_TYPE_MASK) || - ((u8) (arg->value.integer >> 8))); - break; - + info.field_type = INTERNAL_TYPE_INDEX_FIELD; + info.region_node = region_node; - case AML_INT_NAMEDFIELD_OP: - - status = acpi_ns_lookup (walk_state->scope_info, - (NATIVE_CHAR *) &((acpi_parse2_object *)arg)->name, - INTERNAL_TYPE_INDEX_FIELD, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &node); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* - * Initialize an object for the new Node that is on - * the object stack - */ - status = acpi_ex_prep_index_field_value (node, index_register_node, - data_register_node, field_flags, - field_bit_position, arg->value.size); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* Keep track of bit position for the *next* field */ - - field_bit_position += arg->value.size; - break; - - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid opcode in field list: %X\n", - arg->opcode)); - status = AE_AML_ERROR; - break; - } - - arg = arg->next; - } + status = acpi_ds_get_field_names (&info, walk_state, arg->next); return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsmethod.c linux/drivers/acpi/dispatcher/dsmethod.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsmethod.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsmethod.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsmethod - Parser/Interpreter interface - control method parsing - * $Revision: 65 $ + * $Revision: 69 $ * *****************************************************************************/ @@ -65,6 +65,7 @@ acpi_parse_object *op; acpi_namespace_node *node; acpi_owner_id owner_id; + acpi_walk_state *walk_state; FUNCTION_TRACE_PTR ("Ds_parse_method", obj_handle); @@ -77,7 +78,7 @@ } ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Parsing [%4.4s] **** Named_obj=%p\n", - &((acpi_namespace_node *)obj_handle)->name, obj_handle)); + (char*)&((acpi_namespace_node *)obj_handle)->name, obj_handle)); /* Extract the method object from the method Node */ @@ -88,7 +89,7 @@ return_ACPI_STATUS (AE_NULL_OBJECT); } - /* Create a mutex for the method if there is a concurrency limit */ + /* Create a mutex for the method if there is a concurrency limit */ if ((obj_desc->method.concurrency != INFINITE_CONCURRENCY) && (!obj_desc->method.semaphore)) { @@ -114,6 +115,20 @@ acpi_ps_set_name (op, node->name); op->node = node; + /* Create and initialize a new walk state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, node, obj_desc->method.aml_start, + obj_desc->method.aml_length, NULL, NULL, 1); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } /* * Parse the method, first pass @@ -125,12 +140,7 @@ * method so that operands to the named objects can * take on dynamic run-time values. */ - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - node, NULL, NULL, - acpi_ds_load1_begin_op, acpi_ds_load1_end_op); - + status = acpi_ps_parse_aml (walk_state); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } @@ -141,10 +151,7 @@ obj_desc->method.owning_id = owner_id; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** [%4.4s] Parsed **** Named_obj=%p Op=%p\n", - &((acpi_namespace_node *)obj_handle)->name, obj_handle, op)); - - /* Install the parsed tree in the method object */ - /* TBD: [Restructure] Obsolete field? */ + (char*)&((acpi_namespace_node *)obj_handle)->name, obj_handle, op)); acpi_ps_delete_parse_tree (op); @@ -242,13 +249,12 @@ acpi_ds_call_control_method ( acpi_walk_list *walk_list, acpi_walk_state *this_walk_state, - acpi_parse_object *op) + acpi_parse_object *op) /* TBD: This operand is obsolete */ { acpi_status status; acpi_namespace_node *method_node; acpi_operand_object *obj_desc; acpi_walk_state *next_walk_state; - acpi_parse_state *parser_state; u32 i; @@ -270,7 +276,6 @@ return_ACPI_STATUS (AE_NULL_OBJECT); } - /* Init for new method, wait on concurrency semaphore */ status = acpi_ds_begin_method_execution (method_node, obj_desc, @@ -279,78 +284,62 @@ return_ACPI_STATUS (status); } - /* Create and initialize a new parser state */ - - parser_state = acpi_ps_create_state (obj_desc->method.pcode, - obj_desc->method.pcode_length); - if (!parser_state) { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - acpi_ps_init_scope (parser_state, NULL); - parser_state->start_node = method_node; - - /* Create a new state for the preempting walk */ + /* 1) Parse: Create a new walk state for the preempting walk */ next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id, - NULL, obj_desc, walk_list); + op, obj_desc, NULL); if (!next_walk_state) { - /* TBD: delete parser state */ - return_ACPI_STATUS (AE_NO_MEMORY); + goto cleanup; } - next_walk_state->walk_type = WALK_METHOD; - next_walk_state->method_node = method_node; - next_walk_state->parser_state = parser_state; - next_walk_state->parse_flags = this_walk_state->parse_flags; - next_walk_state->descending_callback = this_walk_state->descending_callback; - next_walk_state->ascending_callback = this_walk_state->ascending_callback; - - /* The Next_op of the Next_walk will be the beginning of the method */ - /* TBD: [Restructure] -- obsolete? */ - - next_walk_state->next_op = NULL; + /* Create and init a Root Node */ - /* Open a new scope */ + op = acpi_ps_alloc_op (AML_SCOPE_OP); + if (!op) { + status = AE_NO_MEMORY; + goto cleanup; + } - status = acpi_ds_scope_stack_push (method_node, - ACPI_TYPE_METHOD, next_walk_state); + status = acpi_ds_init_aml_walk (next_walk_state, op, method_node, + obj_desc->method.aml_start, obj_desc->method.aml_length, + NULL, NULL, 1); if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ goto cleanup; } + /* Begin AML parse */ + + status = acpi_ps_parse_aml (next_walk_state); + acpi_ps_delete_parse_tree (op); + + + /* 2) Execute: Create a new state for the preempting walk */ + + next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id, + NULL, obj_desc, walk_list); + if (!next_walk_state) { + status = AE_NO_MEMORY; + goto cleanup; + } /* - * Initialize the arguments for the method. The resolved - * arguments were put on the previous walk state's operand + * The resolved arguments were put on the previous walk state's operand * stack. Operands on the previous walk state stack always * start at index 0. + * Null terminate the list of arguments */ - status = acpi_ds_method_data_init_args (&this_walk_state->operands[0], - this_walk_state->num_operands, - next_walk_state); + this_walk_state->operands [this_walk_state->num_operands] = NULL; + + status = acpi_ds_init_aml_walk (next_walk_state, NULL, method_node, + obj_desc->method.aml_start, obj_desc->method.aml_length, + &this_walk_state->operands[0], NULL, 3); if (ACPI_FAILURE (status)) { goto cleanup; } - - /* Create and init a Root Node */ - - op = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!op) { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - method_node, NULL, NULL, - acpi_ds_load1_begin_op, acpi_ds_load1_end_op); - acpi_ps_delete_parse_tree (op); - - /* * Delete the operands on the previous walkstate operand stack * (they were copied to new objects) @@ -363,7 +352,6 @@ /* Clear the operand stack */ this_walk_state->num_operands = 0; - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Starting nested execution, newstate=%p\n", next_walk_state)); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsobject.c linux/drivers/acpi/dispatcher/dsobject.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsobject.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsobject.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsobject - Dispatcher object management routines - * $Revision: 75 $ + * $Revision: 81 $ * *****************************************************************************/ @@ -64,7 +64,7 @@ { acpi_object_type8 type; acpi_status status; - ACPI_INIT_WALK_INFO *info = (ACPI_INIT_WALK_INFO *) context; + acpi_init_walk_info *info = (acpi_init_walk_info *) context; u8 table_revision; @@ -118,15 +118,14 @@ * Always parse methods to detect errors, we may delete * the parse tree below */ - status = acpi_ds_parse_method (obj_handle); - - /* TBD: [Errors] what do we do with an error? */ - if (ACPI_FAILURE (status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Method %p [%4.4s] parse failed! %s\n", - obj_handle, &((acpi_namespace_node *)obj_handle)->name, + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Method %p [%4.4s] - parse failure, %s\n", + obj_handle, (char*)&((acpi_namespace_node *)obj_handle)->name, acpi_format_exception (status))); + + /* This parse failed, but we will continue parsing more methods */ + break; } @@ -168,7 +167,7 @@ acpi_namespace_node *start_node) { acpi_status status; - ACPI_INIT_WALK_INFO info; + acpi_init_walk_info info; FUNCTION_TRACE ("Ds_initialize_objects"); @@ -241,7 +240,7 @@ obj_desc = *ret_obj_desc; op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { /* Unknown opcode */ return (AE_TYPE); @@ -308,7 +307,7 @@ byte_list = (acpi_parse2_object *) arg->next; if (byte_list) { if (byte_list->opcode != AML_INT_BYTELIST_OP) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Expecting bytelist, got: %x\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Expecting bytelist, got: %p\n", byte_list)); return (AE_TYPE); } @@ -356,8 +355,8 @@ case INTERNAL_TYPE_REFERENCE: - switch (ACPI_GET_OP_CLASS (op_info)) { - case OPTYPE_LOCAL_VARIABLE: + switch (op_info->type) { + case AML_TYPE_LOCAL_VARIABLE: /* Split the opcode into a base opcode + offset */ @@ -366,7 +365,7 @@ break; - case OPTYPE_METHOD_ARGUMENT: + case AML_TYPE_METHOD_ARGUMENT: /* Split the opcode into a base opcode + offset */ @@ -655,6 +654,15 @@ FUNCTION_TRACE_PTR ("Ds_create_node", op); + /* + * Because of the execution pass through the non-control-method + * parts of the table, we can arrive here twice. Only init + * the named object node the first time through + */ + if (node->object) { + return_ACPI_STATUS (AE_OK); + } + if (!op->value.arg) { /* No arguments, there is nothing to do */ @@ -675,14 +683,8 @@ /* Init obj */ status = acpi_ns_attach_object (node, obj_desc, (u8) node->type); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - return_ACPI_STATUS (status); - -cleanup: + /* Remove local reference to the object */ acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsopcode.c linux/drivers/acpi/dispatcher/dsopcode.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsopcode.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsopcode.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: dsopcode - Dispatcher Op Region support and handling of * "control" opcodes - * $Revision: 52 $ + * $Revision: 56 $ * *****************************************************************************/ @@ -61,6 +61,7 @@ acpi_parse_object *field_op; acpi_status status; acpi_table_desc *table_desc; + acpi_walk_state *walk_state; FUNCTION_TRACE_PTR ("Ds_get_buffer_field_arguments", obj_desc); @@ -78,7 +79,7 @@ DEBUG_EXEC(acpi_ut_display_init_pathname (node, " [Field]")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] Buffer_field JIT Init\n", - &node->name)); + (char*)&node->name)); /* @@ -101,17 +102,34 @@ return_ACPI_STATUS (status); } + /* Create and initialize a new parser state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, NULL, extra_desc->extra.aml_start, + extra_desc->extra.aml_length, NULL, NULL, 1); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + + /* TBD: No Walk flags?? */ + + walk_state->parse_flags = 0; + /* Pass1: Parse the entire Buffer_field declaration */ - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, 0, - NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op); + status = acpi_ps_parse_aml (walk_state); if (ACPI_FAILURE (status)) { acpi_ps_delete_parse_tree (op); return_ACPI_STATUS (status); } - /* Get and init the actual Fiel_unit_op created above */ + /* Get and init the actual Field_unit Op created above */ field_op = op->value.arg; op->node = node; @@ -121,7 +139,7 @@ field_op->node = node; acpi_ps_delete_parse_tree (op); - /* Acpi_evaluate the address and length arguments for the Op_region */ + /* Evaluate the address and length arguments for the Op_region */ op = acpi_ps_alloc_op (AML_SCOPE_OP); if (!op) { @@ -130,15 +148,23 @@ op->node = acpi_ns_get_parent_object (node); - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, - ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE, - NULL /*Method_desc*/, NULL, NULL, - acpi_ds_exec_begin_op, acpi_ds_exec_end_op); - /* All done with the parse tree, delete it */ + /* Create and initialize a new parser state */ - acpi_ps_delete_parse_tree (op); + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + status = acpi_ds_init_aml_walk (walk_state, op, NULL, extra_desc->extra.aml_start, + extra_desc->extra.aml_length, NULL, NULL, 3); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + + status = acpi_ps_parse_aml (walk_state); + acpi_ps_delete_parse_tree (op); /* * The pseudo-method object is no longer needed since the region is @@ -174,6 +200,7 @@ acpi_parse_object *region_op; acpi_status status; acpi_table_desc *table_desc; + acpi_walk_state *walk_state; FUNCTION_TRACE_PTR ("Ds_get_region_arguments", obj_desc); @@ -191,9 +218,8 @@ DEBUG_EXEC(acpi_ut_display_init_pathname (node, " [Operation Region]")); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] Op_region Init at AML %p[%x]\n", - &node->name, extra_desc->extra.pcode, - *(u32*) extra_desc->extra.pcode)); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] Op_region Init at AML %p\n", + (char*)&node->name, extra_desc->extra.aml_start)); /* * Allocate a new parser op to be the root of the parsed @@ -215,11 +241,28 @@ return_ACPI_STATUS (status); } + /* Create and initialize a new parser state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + op, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, NULL, extra_desc->extra.aml_start, + extra_desc->extra.aml_length, NULL, NULL, 1); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + + /* TBD: No Walk flags?? */ + + walk_state->parse_flags = 0; + /* Parse the entire Op_region declaration, creating a parse tree */ - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, 0, - NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op); + status = acpi_ps_parse_aml (walk_state); if (ACPI_FAILURE (status)) { acpi_ps_delete_parse_tree (op); return_ACPI_STATUS (status); @@ -244,14 +287,22 @@ op->node = acpi_ns_get_parent_object (node); - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, - ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE, - NULL /*Method_desc*/, NULL, NULL, - acpi_ds_exec_begin_op, acpi_ds_exec_end_op); + /* Create and initialize a new parser state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + op, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } - /* All done with the parse tree, delete it */ + status = acpi_ds_init_aml_walk (walk_state, op, NULL, extra_desc->extra.aml_start, + extra_desc->extra.aml_length, NULL, NULL, 3); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (op); return_ACPI_STATUS (status); @@ -668,7 +719,7 @@ acpi_ut_remove_reference (operand_desc); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Rgn_obj %p Addr %8.8lX%8.8lX Len %X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Rgn_obj %p Addr %8.8X%8.8X Len %X\n", obj_desc, HIDWORD(obj_desc->region.address), LODWORD(obj_desc->region.address), obj_desc->region.length)); @@ -731,7 +782,7 @@ * of a loop */ walk_state->control_state->control.aml_predicate_start = - walk_state->parser_state->aml - 1; + walk_state->parser_state.aml - 1; /* TBD: can this be removed? */ /*Acpi_ps_pkg_length_encoding_size (GET8 (Walk_state->Parser_state->Aml));*/ break; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsutils.c linux/drivers/acpi/dispatcher/dsutils.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsutils.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dsutils - Dispatcher utilities - * $Revision: 72 $ + * $Revision: 80 $ * ******************************************************************************/ @@ -85,8 +85,8 @@ */ parent_info = acpi_ps_get_opcode_info (op->parent->opcode); - if (ACPI_GET_OP_TYPE (parent_info) != ACPI_OP_TYPE_OPCODE) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown parent opcode. Op=%X\n", op)); + if (parent_info->class == AML_CLASS_UNKNOWN) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown parent opcode. Op=%p\n", op)); return_VALUE (FALSE); } @@ -97,11 +97,11 @@ * Otherwise leave it as is, it will be deleted when it is used * as an operand later. */ - switch (ACPI_GET_OP_CLASS (parent_info)) { + switch (parent_info->class) { /* * In these cases, the parent will never use the return object */ - case OPTYPE_CONTROL: /* IF, ELSE, WHILE only */ + case AML_CLASS_CONTROL: /* IF, ELSE, WHILE only */ switch (op->parent->opcode) { case AML_RETURN_OP: @@ -109,7 +109,7 @@ /* Never delete the return value associated with a return opcode */ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result used, [RETURN] opcode=%X Op=%X\n", op->opcode, op)); + "Result used, [RETURN] opcode=%X Op=%p\n", op->opcode, op)); return_VALUE (TRUE); break; @@ -123,7 +123,7 @@ if ((walk_state->control_state->common.state == CONTROL_PREDICATE_EXECUTING) && (walk_state->control_state->control.predicate_op == op)) { ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result used as a predicate, [IF/WHILE] opcode=%X Op=%X\n", + "Result used as a predicate, [IF/WHILE] opcode=%X Op=%p\n", op->opcode, op)); return_VALUE (TRUE); } @@ -135,7 +135,8 @@ /* Fall through to not used case below */ - case OPTYPE_NAMED_OBJECT: /* Scope, method, etc. */ + case AML_CLASS_NAMED_OBJECT: /* Scope, method, etc. */ + case AML_CLASS_CREATE: /* * These opcodes allow Term_arg(s) as operands and therefore @@ -149,13 +150,13 @@ (op->parent->opcode == AML_CREATE_DWORD_FIELD_OP) || (op->parent->opcode == AML_CREATE_QWORD_FIELD_OP)) { ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result used, [Region or Create_field] opcode=%X Op=%X\n", + "Result used, [Region or Create_field] opcode=%X Op=%p\n", op->opcode, op)); return_VALUE (TRUE); } ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result not used, Parent opcode=%X Op=%X\n", op->opcode, op)); + "Result not used, Parent opcode=%X Op=%p\n", op->opcode, op)); return_VALUE (FALSE); break; @@ -338,6 +339,11 @@ * very serious error at this point */ status = AE_AML_NAME_NOT_FOUND; + + /* TBD: Externalize Name_string and print */ + + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Object name was not found in namespace\n")); } } @@ -580,16 +586,21 @@ op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { /* Unknown opcode */ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown AML opcode: %x\n", opcode)); return (data_type); } - switch (ACPI_GET_OP_CLASS (op_info)) { - case OPTYPE_LITERAL: +/* + * TBD: Use op class + */ + + switch (op_info->type) { + + case AML_TYPE_LITERAL: switch (opcode) { case AML_BYTE_OP: @@ -618,7 +629,7 @@ break; - case OPTYPE_DATA_TERM: + case AML_TYPE_DATA_TERM: switch (opcode) { case AML_BUFFER_OP: @@ -640,44 +651,49 @@ break; - case OPTYPE_CONSTANT: - case OPTYPE_METHOD_ARGUMENT: - case OPTYPE_LOCAL_VARIABLE: + case AML_TYPE_CONSTANT: + case AML_TYPE_METHOD_ARGUMENT: + case AML_TYPE_LOCAL_VARIABLE: data_type = INTERNAL_TYPE_REFERENCE; break; - case OPTYPE_MONADIC2: - case OPTYPE_MONADIC2_r: - case OPTYPE_DYADIC2: - case OPTYPE_DYADIC2_r: - case OPTYPE_DYADIC2_s: - case OPTYPE_TRIADIC: - case OPTYPE_QUADRADIC: - case OPTYPE_HEXADIC: - case OPTYPE_RETURN: + case AML_TYPE_EXEC_1A_0T_1R: + case AML_TYPE_EXEC_1A_1T_1R: + case AML_TYPE_EXEC_2A_0T_1R: + case AML_TYPE_EXEC_2A_1T_1R: + case AML_TYPE_EXEC_2A_2T_1R: + case AML_TYPE_EXEC_3A_1T_1R: + case AML_TYPE_EXEC_6A_0T_1R: + case AML_TYPE_RETURN: flags = OP_HAS_RETURN_VALUE; data_type = ACPI_TYPE_ANY; break; - case OPTYPE_METHOD_CALL: + case AML_TYPE_METHOD_CALL: flags = OP_HAS_RETURN_VALUE; data_type = ACPI_TYPE_METHOD; break; - case OPTYPE_NAMED_OBJECT: + case AML_TYPE_NAMED_FIELD: + case AML_TYPE_NAMED_SIMPLE: + case AML_TYPE_NAMED_COMPLEX: + case AML_TYPE_NAMED_NO_OBJ: data_type = acpi_ds_map_named_opcode_to_data_type (opcode); break; - case OPTYPE_DYADIC1: - case OPTYPE_CONTROL: + case AML_TYPE_EXEC_1A_0T_0R: + case AML_TYPE_EXEC_2A_0T_0R: + case AML_TYPE_EXEC_3A_0T_0R: + case AML_TYPE_EXEC_1A_1T_0R: + case AML_TYPE_CONTROL: /* No mapping needed at this time */ @@ -784,6 +800,7 @@ data_type = ACPI_TYPE_EVENT; break; + case AML_DATA_REGION_OP: case AML_REGION_OP: data_type = ACPI_TYPE_REGION; break; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dswexec.c linux/drivers/acpi/dispatcher/dswexec.c --- v2.4.13/linux/drivers/acpi/dispatcher/dswexec.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dswexec.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: dswexec - Dispatcher method execution callbacks; * dispatch to interpreter. - * $Revision: 70 $ + * $Revision: 79 $ * *****************************************************************************/ @@ -37,6 +37,21 @@ #define _COMPONENT ACPI_DISPATCHER MODULE_NAME ("dswexec") +/* + * Dispatch tables for opcode classes + */ +ACPI_EXECUTE_OP acpi_gbl_op_type_dispatch [] = { + acpi_ex_opcode_1A_0T_0R, + acpi_ex_opcode_1A_0T_1R, + acpi_ex_opcode_1A_1T_0R, + acpi_ex_opcode_1A_1T_1R, + acpi_ex_opcode_2A_0T_0R, + acpi_ex_opcode_2A_0T_1R, + acpi_ex_opcode_2A_1T_1R, + acpi_ex_opcode_2A_2T_1R, + acpi_ex_opcode_3A_0T_0R, + acpi_ex_opcode_3A_1T_1R, + acpi_ex_opcode_6A_0T_1R}; /***************************************************************************** * @@ -53,9 +68,7 @@ acpi_status acpi_ds_get_predicate_value ( acpi_walk_state *walk_state, - acpi_parse_object *op, - u32 has_result_obj) -{ + u32 has_result_obj) { acpi_status status = AE_OK; acpi_operand_object *obj_desc; @@ -77,7 +90,7 @@ } else { - status = acpi_ds_create_operand (walk_state, op, 0); + status = acpi_ds_create_operand (walk_state, walk_state->op, 0); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } @@ -91,7 +104,7 @@ } if (!obj_desc) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No predicate Obj_desc=%X State=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No predicate Obj_desc=%p State=%p\n", obj_desc, walk_state)); return_ACPI_STATUS (AE_AML_NO_OPERAND); @@ -104,7 +117,7 @@ */ if (obj_desc->common.type != ACPI_TYPE_INTEGER) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Bad predicate (not a number) Obj_desc=%X State=%X Type=%X\n", + "Bad predicate (not a number) Obj_desc=%p State=%p Type=%X\n", obj_desc, walk_state, obj_desc->common.type)); status = AE_AML_OPERAND_TYPE; @@ -136,8 +149,8 @@ cleanup: - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%X\n", - walk_state->control_state->common.value, op)); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%pn", + walk_state->control_state->common.value, walk_state->op)); /* Break to debugger to display result */ @@ -159,8 +172,7 @@ * FUNCTION: Acpi_ds_exec_begin_op * * PARAMETERS: Walk_state - Current state of the parse tree walk - * Op - Op that has been just been reached in the - * walk; Arguments have not been evaluated yet. + * Out_op - Return op if a new one is created * * RETURN: Status * @@ -172,26 +184,28 @@ acpi_status acpi_ds_exec_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op) { - const acpi_opcode_info *op_info; + acpi_parse_object *op; acpi_status status = AE_OK; - u8 opcode_class; + u32 opcode_class; - FUNCTION_TRACE_PTR ("Ds_exec_begin_op", op); + FUNCTION_TRACE_PTR ("Ds_exec_begin_op", walk_state); + op = walk_state->op; if (!op) { - status = acpi_ds_load2_begin_op (opcode, NULL, walk_state, out_op); + status = acpi_ds_load2_begin_op (walk_state, out_op); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } op = *out_op; + walk_state->op = op; + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + walk_state->opcode = op->opcode; } if (op == walk_state->origin) { @@ -210,7 +224,7 @@ if ((walk_state->control_state) && (walk_state->control_state->common.state == CONTROL_CONDITIONAL_EXECUTING)) { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Exec predicate Op=%X State=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Exec predicate Op=%p State=%p\n", op, walk_state)); walk_state->control_state->common.state = CONTROL_PREDICATE_EXECUTING; @@ -221,20 +235,19 @@ } - op_info = acpi_ps_get_opcode_info (op->opcode); - opcode_class = (u8) ACPI_GET_OP_CLASS (op_info); + opcode_class = walk_state->op_info->class; /* We want to send namepaths to the load code */ if (op->opcode == AML_INT_NAMEPATH_OP) { - opcode_class = OPTYPE_NAMED_OBJECT; + opcode_class = AML_CLASS_NAMED_OBJECT; } /* * Handle the opcode based upon the opcode type */ switch (opcode_class) { - case OPTYPE_CONTROL: + case AML_CLASS_CONTROL: status = acpi_ds_result_stack_push (walk_state); if (ACPI_FAILURE (status)) { @@ -245,7 +258,7 @@ break; - case OPTYPE_NAMED_OBJECT: + case AML_CLASS_NAMED_OBJECT: if (walk_state->walk_type == WALK_METHOD) { /* @@ -255,7 +268,7 @@ * will be deleted upon completion of the execution * of this method. */ - status = acpi_ds_load2_begin_op (op->opcode, op, walk_state, NULL); + status = acpi_ds_load2_begin_op (walk_state, NULL); } @@ -268,18 +281,8 @@ /* most operators with arguments */ - case OPTYPE_MONADIC1: - case OPTYPE_DYADIC1: - case OPTYPE_MONADIC2: - case OPTYPE_MONADIC2_r: - case OPTYPE_DYADIC2: - case OPTYPE_DYADIC2_r: - case OPTYPE_DYADIC2_s: - case OPTYPE_RECONFIGURATION: - case OPTYPE_TRIADIC: - case OPTYPE_QUADRADIC: - case OPTYPE_HEXADIC: - case OPTYPE_CREATE_FIELD: + case AML_CLASS_EXECUTE: + case AML_CLASS_CREATE: /* Start a new result/operand state */ @@ -315,85 +318,53 @@ acpi_status acpi_ds_exec_end_op ( - acpi_walk_state *walk_state, - acpi_parse_object *op) + acpi_walk_state *walk_state) { + acpi_parse_object *op; acpi_status status = AE_OK; - u16 opcode; - u8 optype; + u32 op_type; + u32 op_class; acpi_parse_object *next_op; acpi_parse_object *first_arg; - acpi_operand_object *result_obj = NULL; - const acpi_opcode_info *op_info; u32 i; - FUNCTION_TRACE_PTR ("Ds_exec_end_op", op); - + FUNCTION_TRACE_PTR ("Ds_exec_end_op", walk_state); - opcode = (u16) op->opcode; + op = walk_state->op; + op_type = walk_state->op_info->type; + op_class = walk_state->op_info->class; - op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_class == AML_CLASS_UNKNOWN) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown opcode %X\n", op->opcode)); return_ACPI_STATUS (AE_NOT_IMPLEMENTED); } - optype = (u8) ACPI_GET_OP_CLASS (op_info); first_arg = op->value.arg; /* Init the walk state */ walk_state->num_operands = 0; walk_state->return_desc = NULL; - walk_state->op_info = op_info; - walk_state->opcode = opcode; + walk_state->result_obj = NULL; /* Call debugger for single step support (DEBUG build only) */ - DEBUGGER_EXEC (status = acpi_db_single_step (walk_state, op, optype)); + DEBUGGER_EXEC (status = acpi_db_single_step (walk_state, op, op_class)); DEBUGGER_EXEC (if (ACPI_FAILURE (status)) {return_ACPI_STATUS (status);}); - /* Decode the opcode */ - - switch (optype) { - case OPTYPE_UNDEFINED: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Undefined opcode type Op=%X\n", op)); - return_ACPI_STATUS (AE_NOT_IMPLEMENTED); - break; - - - case OPTYPE_BOGUS: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Internal opcode=%X type Op=%X\n", - opcode, op)); - break; + switch (op_class) { + /* Decode the Opcode Class */ - case OPTYPE_CONSTANT: /* argument type only */ - case OPTYPE_LITERAL: /* argument type only */ - case OPTYPE_DATA_TERM: /* argument type only */ - case OPTYPE_LOCAL_VARIABLE: /* argument type only */ - case OPTYPE_METHOD_ARGUMENT: /* argument type only */ + case AML_CLASS_ARGUMENT: /* constants, literals, etc. do nothing */ break; - /* most operators with arguments */ - case OPTYPE_MONADIC1: - case OPTYPE_DYADIC1: - case OPTYPE_MONADIC2: - case OPTYPE_MONADIC2_r: - case OPTYPE_DYADIC2: - case OPTYPE_DYADIC2_r: - case OPTYPE_DYADIC2_s: - case OPTYPE_RECONFIGURATION: - case OPTYPE_TRIADIC: - case OPTYPE_QUADRADIC: - case OPTYPE_HEXADIC: - + case AML_CLASS_EXECUTE: /* Build resolved operand stack */ @@ -411,14 +382,14 @@ /* Resolve all operands */ - status = acpi_ex_resolve_operands (opcode, + status = acpi_ex_resolve_operands (walk_state->opcode, &(walk_state->operands [walk_state->num_operands -1]), walk_state); if (ACPI_FAILURE (status)) { /* TBD: must pop and delete operands */ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "[%s]: Could not resolve operands, %s\n", - acpi_ps_get_opcode_name (opcode), acpi_format_exception (status))); + acpi_ps_get_opcode_name (walk_state->opcode), acpi_format_exception (status))); /* * On error, we must delete all the operands and clear the @@ -430,103 +401,31 @@ } walk_state->num_operands = 0; - goto cleanup; } - DUMP_OPERANDS (WALK_OPERANDS, IMODE_EXECUTE, acpi_ps_get_opcode_name (opcode), + DUMP_OPERANDS (WALK_OPERANDS, IMODE_EXECUTE, acpi_ps_get_opcode_name (walk_state->opcode), walk_state->num_operands, "after Ex_resolve_operands"); - switch (optype) { - case OPTYPE_MONADIC1: - - /* 1 Operand, 0 External_result, 0 Internal_result */ - - status = acpi_ex_monadic1 (opcode, walk_state); - break; - - - case OPTYPE_MONADIC2: - - /* 1 Operand, 0 External_result, 1 Internal_result */ - - status = acpi_ex_monadic2 (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_MONADIC2_r: - - /* 1 Operand, 1 External_result, 1 Internal_result */ - - status = acpi_ex_monadic2_r (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_DYADIC1: - - /* 2 Operands, 0 External_result, 0 Internal_result */ - - status = acpi_ex_dyadic1 (opcode, walk_state); - break; - - - case OPTYPE_DYADIC2: - - /* 2 Operands, 0 External_result, 1 Internal_result */ - - status = acpi_ex_dyadic2 (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_DYADIC2_r: - - /* 2 Operands, 1 or 2 External_results, 1 Internal_result */ - - status = acpi_ex_dyadic2_r (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_DYADIC2_s: /* Synchronization Operator */ - - /* 2 Operands, 0 External_result, 1 Internal_result */ - - status = acpi_ex_dyadic2_s (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_TRIADIC: /* Opcode with 3 operands */ - - /* 3 Operands, 1 External_result, 1 Internal_result */ - - status = acpi_ex_triadic (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_QUADRADIC: /* Opcode with 4 operands */ - break; - - - case OPTYPE_HEXADIC: /* Opcode with 6 operands */ - - /* 6 Operands, 0 External_result, 1 Internal_result */ - - status = acpi_ex_hexadic (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_RECONFIGURATION: - - /* 1 or 2 operands, 0 Internal Result */ + /* + * Dispatch the request to the appropriate interpreter handler + * routine. There is one routine per opcode "type" based upon the + * number of opcode arguments and return type. + */ + status = acpi_gbl_op_type_dispatch [op_type] (walk_state); - status = acpi_ex_reconfiguration (opcode, walk_state); - break; - } - /* Clear the operand stack */ + /* Delete argument objects and clear the operand stack */ for (i = 0; i < walk_state->num_operands; i++) { + /* + * Remove a reference to all operands, including both + * "Arguments" and "Targets". + */ + acpi_ut_remove_reference (walk_state->operands[i]); walk_state->operands[i] = NULL; } + walk_state->num_operands = 0; /* @@ -534,144 +433,140 @@ * current result stack */ if (ACPI_SUCCESS (status) && - result_obj) { - status = acpi_ds_result_push (result_obj, walk_state); + walk_state->result_obj) { + status = acpi_ds_result_push (walk_state->result_obj, walk_state); } break; - case OPTYPE_CONTROL: /* Type 1 opcode, IF/ELSE/WHILE/NOOP */ + default: - /* 1 Operand, 0 External_result, 0 Internal_result */ + switch (op_type) { + case AML_TYPE_CONTROL: /* Type 1 opcode, IF/ELSE/WHILE/NOOP */ - status = acpi_ds_exec_end_control_op (walk_state, op); + /* 1 Operand, 0 External_result, 0 Internal_result */ - acpi_ds_result_stack_pop (walk_state); - break; + status = acpi_ds_exec_end_control_op (walk_state, op); + acpi_ds_result_stack_pop (walk_state); + break; - case OPTYPE_METHOD_CALL: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Method invocation, Op=%X\n", op)); + case AML_TYPE_METHOD_CALL: - /* - * (AML_METHODCALL) Op->Value->Arg->Node contains - * the method Node pointer - */ - /* Next_op points to the op that holds the method name */ + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Method invocation, Op=%p\n", op)); - next_op = first_arg; + /* + * (AML_METHODCALL) Op->Value->Arg->Node contains + * the method Node pointer + */ + /* Next_op points to the op that holds the method name */ - /* Next_op points to first argument op */ + next_op = first_arg; - next_op = next_op->next; + /* Next_op points to first argument op */ - /* - * Get the method's arguments and put them on the operand stack - */ - status = acpi_ds_create_operands (walk_state, next_op); - if (ACPI_FAILURE (status)) { - break; - } - - /* - * Since the operands will be passed to another - * control method, we must resolve all local - * references here (Local variables, arguments - * to *this* method, etc.) - */ - status = acpi_ds_resolve_operands (walk_state); - if (ACPI_FAILURE (status)) { - break; - } - - /* - * Tell the walk loop to preempt this running method and - * execute the new method - */ - status = AE_CTRL_TRANSFER; - - /* - * Return now; we don't want to disturb anything, - * especially the operand count! - */ - return_ACPI_STATUS (status); - break; + next_op = next_op->next; + /* + * Get the method's arguments and put them on the operand stack + */ + status = acpi_ds_create_operands (walk_state, next_op); + if (ACPI_FAILURE (status)) { + break; + } - case OPTYPE_CREATE_FIELD: + /* + * Since the operands will be passed to another + * control method, we must resolve all local + * references here (Local variables, arguments + * to *this* method, etc.) + */ + status = acpi_ds_resolve_operands (walk_state); + if (ACPI_FAILURE (status)) { + break; + } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Executing Create_field Buffer/Index Op=%X\n", op)); + /* + * Tell the walk loop to preempt this running method and + * execute the new method + */ + status = AE_CTRL_TRANSFER; - status = acpi_ds_load2_end_op (walk_state, op); - if (ACPI_FAILURE (status)) { + /* + * Return now; we don't want to disturb anything, + * especially the operand count! + */ + return_ACPI_STATUS (status); break; - } - status = acpi_ds_eval_buffer_field_operands (walk_state, op); - break; + case AML_TYPE_CREATE_FIELD: - case OPTYPE_NAMED_OBJECT: + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, + "Executing Create_field Buffer/Index Op=%p\n", op)); - status = acpi_ds_load2_end_op (walk_state, op); - if (ACPI_FAILURE (status)) { + status = acpi_ds_load2_end_op (walk_state); + if (ACPI_FAILURE (status)) { + break; + } + + status = acpi_ds_eval_buffer_field_operands (walk_state, op); break; - } - switch (op->opcode) { - case AML_REGION_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Executing Op_region Address/Length Op=%X\n", op)); + case AML_TYPE_NAMED_FIELD: + case AML_TYPE_NAMED_COMPLEX: + case AML_TYPE_NAMED_SIMPLE: - status = acpi_ds_eval_region_operands (walk_state, op); + status = acpi_ds_load2_end_op (walk_state); if (ACPI_FAILURE (status)) { break; } - status = acpi_ds_result_stack_pop (walk_state); - break; + if (op->opcode == AML_REGION_OP) { + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, + "Executing Op_region Address/Length Op=%p\n", op)); + + status = acpi_ds_eval_region_operands (walk_state, op); + if (ACPI_FAILURE (status)) { + break; + } + status = acpi_ds_result_stack_pop (walk_state); + } - case AML_METHOD_OP: break; + case AML_TYPE_UNDEFINED: - case AML_ALIAS_OP: - - /* Alias creation was already handled by call - to psxload above */ + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Undefined opcode type Op=%p\n", op)); + return_ACPI_STATUS (AE_NOT_IMPLEMENTED); break; - default: - /* Nothing needs to be done */ - - status = AE_OK; + case AML_TYPE_BOGUS: + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Internal opcode=%X type Op=%p\n", + walk_state->opcode, op)); break; - } - - break; - default: + default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Unimplemented opcode, type=%X Opcode=%X Op=%X\n", - optype, op->opcode, op)); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p\n", + op_class, op_type, op->opcode, op)); - status = AE_NOT_IMPLEMENTED; - break; + status = AE_NOT_IMPLEMENTED; + break; + } } - /* * ACPI 2.0 support for 64-bit integers: * Truncate numeric result value if we are executing from a 32-bit ACPI table */ - acpi_ex_truncate_for32bit_table (result_obj, walk_state); + acpi_ex_truncate_for32bit_table (walk_state->result_obj, walk_state); /* * Check if we just completed the evaluation of a @@ -682,23 +577,23 @@ (walk_state->control_state->common.state == CONTROL_PREDICATE_EXECUTING) && (walk_state->control_state->control.predicate_op == op)) { - status = acpi_ds_get_predicate_value (walk_state, op, (u32) result_obj); - result_obj = NULL; + status = acpi_ds_get_predicate_value (walk_state, (u32) walk_state->result_obj); + walk_state->result_obj = NULL; } cleanup: - if (result_obj) { + if (walk_state->result_obj) { /* Break to debugger to display result */ - DEBUGGER_EXEC (acpi_db_display_result_object (result_obj, walk_state)); + DEBUGGER_EXEC (acpi_db_display_result_object (walk_state->result_obj, walk_state)); /* * Delete the result op if and only if: * Parent will not use the result -- such as any * non-nested type2 op in a method (parent will be method) */ - acpi_ds_delete_result_if_not_used (op, result_obj, walk_state); + acpi_ds_delete_result_if_not_used (op, walk_state->result_obj, walk_state); } /* Always clear the object stack */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dswload.c linux/drivers/acpi/dispatcher/dswload.c --- v2.4.13/linux/drivers/acpi/dispatcher/dswload.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dswload.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswload - Dispatcher namespace load callbacks - * $Revision: 44 $ + * $Revision: 50 $ * *****************************************************************************/ @@ -39,6 +39,53 @@ /******************************************************************************* * + * FUNCTION: Acpi_ds_init_callbacks + * + * PARAMETERS: Walk_state - Current state of the parse tree walk + * Pass_number - 1, 2, or 3 + * + * RETURN: Status + * + * DESCRIPTION: Init walk state callbacks + * + ******************************************************************************/ + +acpi_status +acpi_ds_init_callbacks ( + acpi_walk_state *walk_state, + u32 pass_number) +{ + + switch (pass_number) { + case 1: + walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE; + walk_state->descending_callback = acpi_ds_load1_begin_op; + walk_state->ascending_callback = acpi_ds_load1_end_op; + break; + + case 2: + walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE; + walk_state->descending_callback = acpi_ds_load2_begin_op; + walk_state->ascending_callback = acpi_ds_load2_end_op; + break; + + case 3: + walk_state->parse_flags |= ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE; + walk_state->descending_callback = acpi_ds_exec_begin_op; + walk_state->ascending_callback = acpi_ds_exec_end_op; + break; + + default: + return (AE_BAD_PARAMETER); + break; + } + + return (AE_OK); +} + + +/******************************************************************************* + * * FUNCTION: Acpi_ds_load1_begin_op * * PARAMETERS: Walk_state - Current state of the parse tree walk @@ -53,49 +100,50 @@ acpi_status acpi_ds_load1_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op) { + acpi_parse_object *op; acpi_namespace_node *node; acpi_status status; acpi_object_type8 data_type; NATIVE_CHAR *path; - const acpi_opcode_info *op_info; PROC_NAME ("Ds_load1_begin_op"); + + op = walk_state->op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); /* We are only interested in opcodes that have an associated name */ - op_info = acpi_ps_get_opcode_info (opcode); - if (!(op_info->flags & AML_NAMED)) { - *out_op = op; - return (AE_OK); - } + if (walk_state->op) { + if (!(walk_state->op_info->flags & AML_NAMED)) { + *out_op = op; + return (AE_OK); + } - /* Check if this object has already been installed in the namespace */ + /* Check if this object has already been installed in the namespace */ - if (op && op->node) { - *out_op = op; - return (AE_OK); + if (op->node) { + *out_op = op; + return (AE_OK); + } } - path = acpi_ps_get_next_namestring (walk_state->parser_state); + path = acpi_ps_get_next_namestring (&walk_state->parser_state); /* Map the raw opcode into an internal object type */ - data_type = acpi_ds_map_named_opcode_to_data_type (opcode); + data_type = acpi_ds_map_named_opcode_to_data_type (walk_state->opcode); ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p Type=%x\n", walk_state, op, data_type)); - if (opcode == AML_SCOPE_OP) { + if (walk_state->opcode == AML_SCOPE_OP) { ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p Type=%x\n", walk_state, op, data_type)); } @@ -115,7 +163,7 @@ if (!op) { /* Create a new op */ - op = acpi_ps_alloc_op (opcode); + op = acpi_ps_alloc_op (walk_state->opcode); if (!op) { return (AE_NO_MEMORY); } @@ -130,7 +178,7 @@ * can get it again quickly when this scope is closed */ op->node = node; - acpi_ps_append_arg (acpi_ps_get_parent_scope (walk_state->parser_state), op); + acpi_ps_append_arg (acpi_ps_get_parent_scope (&walk_state->parser_state), op); *out_op = op; return (status); @@ -154,21 +202,21 @@ acpi_status acpi_ds_load1_end_op ( - acpi_walk_state *walk_state, - acpi_parse_object *op) + acpi_walk_state *walk_state) { + acpi_parse_object *op; acpi_object_type8 data_type; - const acpi_opcode_info *op_info; PROC_NAME ("Ds_load1_end_op"); + + op = walk_state->op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); /* We are only interested in opcodes that have an associated name */ - op_info = acpi_ps_get_opcode_info (op->opcode); - if (!(op_info->flags & AML_NAMED)) { + if (!(walk_state->op_info->flags & AML_NAMED)) { return (AE_OK); } @@ -216,42 +264,41 @@ acpi_status acpi_ds_load2_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op) { + acpi_parse_object *op; acpi_namespace_node *node; acpi_status status; acpi_object_type8 data_type; NATIVE_CHAR *buffer_ptr; void *original = NULL; - const acpi_opcode_info *op_info; PROC_NAME ("Ds_load2_begin_op"); + + op = walk_state->op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); - /* We only care about Namespace opcodes here */ + if (op) { + /* We only care about Namespace opcodes here */ - op_info = acpi_ps_get_opcode_info (opcode); - if (!(op_info->flags & AML_NSOPCODE) && - opcode != AML_INT_NAMEPATH_OP) { - return (AE_OK); - } + if (!(walk_state->op_info->flags & AML_NSOPCODE) && + walk_state->opcode != AML_INT_NAMEPATH_OP) { + return (AE_OK); + } - /* TBD: [Restructure] Temp! same code as in psparse */ + /* TBD: [Restructure] Temp! same code as in psparse */ - if (!(op_info->flags & AML_NAMED)) { - return (AE_OK); - } + if (!(walk_state->op_info->flags & AML_NAMED)) { + return (AE_OK); + } - if (op) { /* * Get the name we are going to enter or lookup in the namespace */ - if (opcode == AML_INT_NAMEPATH_OP) { + if (walk_state->opcode == AML_INT_NAMEPATH_OP) { /* For Namepath op, get the path string */ buffer_ptr = op->value.string; @@ -261,35 +308,33 @@ return (AE_OK); } } - else { /* Get name from the op */ buffer_ptr = (NATIVE_CHAR *) &((acpi_parse2_object *)op)->name; } } - else { - buffer_ptr = acpi_ps_get_next_namestring (walk_state->parser_state); + buffer_ptr = acpi_ps_get_next_namestring (&walk_state->parser_state); } /* Map the raw opcode into an internal object type */ - data_type = acpi_ds_map_named_opcode_to_data_type (opcode); + data_type = acpi_ds_map_named_opcode_to_data_type (walk_state->opcode); ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p Type=%x\n", walk_state, op, data_type)); - if (opcode == AML_FIELD_OP || - opcode == AML_BANK_FIELD_OP || - opcode == AML_INDEX_FIELD_OP) { + if (walk_state->opcode == AML_FIELD_OP || + walk_state->opcode == AML_BANK_FIELD_OP || + walk_state->opcode == AML_INDEX_FIELD_OP) { node = NULL; status = AE_OK; } - else if (opcode == AML_INT_NAMEPATH_OP) { + else if (walk_state->opcode == AML_INT_NAMEPATH_OP) { /* * The Name_path is an object reference to an existing object. Don't enter the * name into the namespace, but look it up for use later @@ -326,7 +371,7 @@ if (!op) { /* Create a new op */ - op = acpi_ps_alloc_op (opcode); + op = acpi_ps_alloc_op (walk_state->opcode); if (!op) { return (AE_NO_MEMORY); } @@ -374,25 +419,26 @@ acpi_status acpi_ds_load2_end_op ( - acpi_walk_state *walk_state, - acpi_parse_object *op) + acpi_walk_state *walk_state) { + acpi_parse_object *op; acpi_status status = AE_OK; acpi_object_type8 data_type; acpi_namespace_node *node; acpi_parse_object *arg; acpi_namespace_node *new_node; - const acpi_opcode_info *op_info; + u32 i; PROC_NAME ("Ds_load2_end_op"); + + op = walk_state->op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); /* Only interested in opcodes that have namespace objects */ - op_info = acpi_ps_get_opcode_info (op->opcode); - if (!(op_info->flags & AML_NSOBJECT)) { + if (!(walk_state->op_info->flags & AML_NSOBJECT)) { return (AE_OK); } @@ -435,323 +481,210 @@ /* * Named operations are as follows: * - * AML_SCOPE - * AML_DEVICE - * AML_THERMALZONE - * AML_METHOD - * AML_POWERRES - * AML_PROCESSOR - * AML_FIELD - * AML_INDEXFIELD - * AML_BANKFIELD - * AML_NAMEDFIELD - * AML_NAME * AML_ALIAS - * AML_MUTEX - * AML_EVENT - * AML_OPREGION - * AML_CREATEFIELD + * AML_BANKFIELD * AML_CREATEBITFIELD * AML_CREATEBYTEFIELD - * AML_CREATEWORDFIELD * AML_CREATEDWORDFIELD + * AML_CREATEFIELD * AML_CREATEQWORDFIELD + * AML_CREATEWORDFIELD + * AML_DATA_REGION + * AML_DEVICE + * AML_EVENT + * AML_FIELD + * AML_INDEXFIELD + * AML_METHOD * AML_METHODCALL + * AML_MUTEX + * AML_NAME + * AML_NAMEDFIELD + * AML_OPREGION + * AML_POWERRES + * AML_PROCESSOR + * AML_SCOPE + * AML_THERMALZONE */ + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + "Create-Load [%s] State=%p Op=%p Named_obj=%p\n", + acpi_ps_get_opcode_name (op->opcode), walk_state, op, node)); /* Decode the opcode */ arg = op->value.arg; - switch (op->opcode) { - - case AML_CREATE_FIELD_OP: - case AML_CREATE_BIT_FIELD_OP: - case AML_CREATE_BYTE_FIELD_OP: - case AML_CREATE_WORD_FIELD_OP: - case AML_CREATE_DWORD_FIELD_OP: - case AML_CREATE_QWORD_FIELD_OP: + switch (walk_state->op_info->type) { + case AML_TYPE_CREATE_FIELD: /* * Create the field object, but the field buffer and index must * be evaluated later during the execution phase */ - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Create_xxx_field: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - - /* Get the Name_string argument */ - - if (op->opcode == AML_CREATE_FIELD_OP) { - arg = acpi_ps_get_arg (op, 3); - } - else { - /* Create Bit/Byte/Word/Dword field */ - - arg = acpi_ps_get_arg (op, 2); - } - - if (!arg) { - status = AE_AML_NO_OPERAND; - goto cleanup; - } - - /* - * Enter the Name_string into the namespace - */ - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - INTERNAL_TYPE_DEF_ANY, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - walk_state, &(new_node)); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* We could put the returned object (Node) on the object stack for later, but - * for now, we will put it in the "op" object that the parser uses, so we - * can get it again at the end of this scope - */ - op->node = new_node; - - /* - * If there is no object attached to the node, this node was just created and - * we need to create the field object. Otherwise, this was a lookup of an - * existing node and we don't want to create the field object again. - */ - if (!new_node->object) { - /* - * The Field definition is not fully parsed at this time. - * (We must save the address of the AML for the buffer and index operands) - */ - status = acpi_ex_create_buffer_field (((acpi_parse2_object *) op)->data, - ((acpi_parse2_object *) op)->length, - new_node, walk_state); - } + status = acpi_ds_create_buffer_field (op, walk_state); break; - case AML_INT_METHODCALL_OP: - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "RESOLVING-Method_call: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - - /* - * Lookup the method name and save the Node - */ - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - ACPI_TYPE_ANY, IMODE_LOAD_PASS2, - NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, - walk_state, &(new_node)); - if (ACPI_SUCCESS (status)) { - /* TBD: has name already been resolved by here ??*/ - - /* TBD: [Restructure] Make sure that what we found is indeed a method! */ - /* We didn't search for a method on purpose, to see if the name would resolve! */ + case AML_TYPE_NAMED_FIELD: - /* We could put the returned object (Node) on the object stack for later, but - * for now, we will put it in the "op" object that the parser uses, so we - * can get it again at the end of this scope - */ - op->node = new_node; - } + arg = op->value.arg; + switch (op->opcode) { + case AML_INDEX_FIELD_OP: + status = acpi_ds_create_index_field (op, (acpi_handle) arg->node, + walk_state); + break; - break; + case AML_BANK_FIELD_OP: - case AML_PROCESSOR_OP: + status = acpi_ds_create_bank_field (op, arg->node, walk_state); + break; - /* Nothing to do other than enter object into namespace */ - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Processor: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); + case AML_FIELD_OP: - status = acpi_ex_create_processor (op, node); - if (ACPI_FAILURE (status)) { - goto cleanup; + status = acpi_ds_create_field (op, arg->node, walk_state); + break; } - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Completed Processor Init, Op=%p State=%p entry=%p\n", - op, walk_state, node)); break; - case AML_POWER_RES_OP: + case AML_TYPE_NAMED_SIMPLE: - /* Nothing to do other than enter object into namespace */ - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Power_resource: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - - status = acpi_ex_create_power_resource (op, node); + status = acpi_ds_create_operands (walk_state, arg); if (ACPI_FAILURE (status)) { goto cleanup; } - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Completed Power_resource Init, Op=%p State=%p entry=%p\n", - op, walk_state, node)); - break; - - - case AML_THERMAL_ZONE_OP: - - /* Nothing to do other than enter object into namespace */ - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Thermal_zone: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - break; + switch (op->opcode) { + case AML_PROCESSOR_OP: + status = acpi_ex_create_processor (walk_state); + break; - case AML_FIELD_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Field: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); + case AML_POWER_RES_OP: - arg = op->value.arg; + status = acpi_ex_create_power_resource (walk_state); + break; - status = acpi_ds_create_field (op, arg->node, walk_state); - break; + case AML_MUTEX_OP: - case AML_INDEX_FIELD_OP: + status = acpi_ex_create_mutex (walk_state); + break; - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Index_field: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - arg = op->value.arg; - - status = acpi_ds_create_index_field (op, (acpi_handle) arg->node, - walk_state); - break; + case AML_EVENT_OP: + status = acpi_ex_create_event (walk_state); + break; - case AML_BANK_FIELD_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Bank_field: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); + case AML_DATA_REGION_OP: - arg = op->value.arg; - status = acpi_ds_create_bank_field (op, arg->node, walk_state); - break; + status = acpi_ex_create_table_region (walk_state); + break; + case AML_ALIAS_OP: - /* - * Method_op Pkg_length Names_string Method_flags Term_list - */ - case AML_METHOD_OP: + status = acpi_ex_create_alias (walk_state); + break; - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Method: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); + default: + /* Unknown opcode */ - if (!node->object) { - status = acpi_ex_create_method (((acpi_parse2_object *) op)->data, - ((acpi_parse2_object *) op)->length, - arg->value.integer32, node); + status = AE_OK; + goto cleanup; + break; } - break; + /* Delete operands */ - case AML_MUTEX_OP: - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Mutex: Op=%p State=%p\n", op, walk_state)); - - status = acpi_ds_create_operands (walk_state, arg); - if (ACPI_FAILURE (status)) { - goto cleanup; + for (i = 1; i < walk_state->num_operands; i++) { + acpi_ut_remove_reference (walk_state->operands[i]); + walk_state->operands[i] = NULL; } - status = acpi_ex_create_mutex (walk_state); break; - case AML_EVENT_OP: - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Event: Op=%p State=%p\n", op, walk_state)); + case AML_TYPE_NAMED_COMPLEX: - status = acpi_ds_create_operands (walk_state, arg); - if (ACPI_FAILURE (status)) { - goto cleanup; - } + switch (op->opcode) { + case AML_METHOD_OP: + /* + * Method_op Pkg_length Names_string Method_flags Term_list + */ + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + "LOADING-Method: State=%p Op=%p Named_obj=%p\n", + walk_state, op, node)); - status = acpi_ex_create_event (walk_state); - break; + if (!node->object) { + status = acpi_ds_create_operands (walk_state, arg); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + status = acpi_ex_create_method (((acpi_parse2_object *) op)->data, + ((acpi_parse2_object *) op)->length, + walk_state); + } + break; - case AML_REGION_OP: - if (node->object) { + case AML_REGION_OP: + /* + * The Op_region is not fully parsed at this time. Only valid argument is the Space_id. + * (We must save the address of the AML of the address and length operands) + */ + status = acpi_ex_create_region (((acpi_parse2_object *) op)->data, + ((acpi_parse2_object *) op)->length, + (ACPI_ADR_SPACE_TYPE) arg->value.integer, walk_state); break; - } - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Opregion: Op=%p State=%p Named_obj=%p\n", - op, walk_state, node)); - /* - * The Op_region is not fully parsed at this time. Only valid argument is the Space_id. - * (We must save the address of the AML of the address and length operands) - */ - status = acpi_ex_create_region (((acpi_parse2_object *) op)->data, - ((acpi_parse2_object *) op)->length, - (ACPI_ADR_SPACE_TYPE) arg->value.integer, walk_state); + case AML_NAME_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Completed Op_region Init, Op=%p State=%p entry=%p\n", - op, walk_state, node)); + status = acpi_ds_create_node (walk_state, node, op); + break; + } break; - /* Namespace Modifier Opcodes */ - - case AML_ALIAS_OP: + case AML_CLASS_INTERNAL: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Alias: Op=%p State=%p\n", op, walk_state)); - - status = acpi_ds_create_operands (walk_state, arg); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - status = acpi_ex_create_alias (walk_state); + /* case AML_INT_NAMEPATH_OP: */ break; - case AML_NAME_OP: + case AML_CLASS_METHOD_CALL: ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Name: Op=%p State=%p\n", op, walk_state)); + "RESOLVING-Method_call: State=%p Op=%p Named_obj=%p\n", + walk_state, op, node)); /* - * Because of the execution pass through the non-control-method - * parts of the table, we can arrive here twice. Only init - * the named object node the first time through + * Lookup the method name and save the Node */ - if (!node->object) { - status = acpi_ds_create_node (walk_state, node, op); - } - - break; + status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, + ACPI_TYPE_ANY, IMODE_LOAD_PASS2, + NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, + walk_state, &(new_node)); + if (ACPI_SUCCESS (status)) { + /* TBD: has name already been resolved by here ??*/ + /* TBD: [Restructure] Make sure that what we found is indeed a method! */ + /* We didn't search for a method on purpose, to see if the name would resolve! */ - case AML_INT_NAMEPATH_OP: + /* We could put the returned object (Node) on the object stack for later, but + * for now, we will put it in the "op" object that the parser uses, so we + * can get it again at the end of this scope + */ + op->node = new_node; + } - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Name_path object: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); break; @@ -764,7 +697,8 @@ /* Remove the Node pushed at the very beginning */ - acpi_ds_obj_stack_pop (1, walk_state); + walk_state->operands[0] = NULL; + walk_state->num_operands = 0; return (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dswscope.c linux/drivers/acpi/dispatcher/dswscope.c --- v2.4.13/linux/drivers/acpi/dispatcher/dswscope.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dswscope.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswscope - Scope stack manipulation - * $Revision: 48 $ + * $Revision: 49 $ * *****************************************************************************/ @@ -116,8 +116,9 @@ /* Init new scope object */ - scope_info->scope.node = node; - scope_info->common.value = (u16) type; + scope_info->common.data_type = ACPI_DESC_TYPE_STATE_WSCOPE; + scope_info->scope.node = node; + scope_info->common.value = (u16) type; /* Push new scope object onto stack */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dswstate.c linux/drivers/acpi/dispatcher/dswstate.c --- v2.4.13/linux/drivers/acpi/dispatcher/dswstate.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dswstate.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswstate - Dispatcher parse tree walk management routines - * $Revision: 51 $ + * $Revision: 54 $ * *****************************************************************************/ @@ -368,6 +368,7 @@ return (AE_NO_MEMORY); } + state->common.data_type = ACPI_DESC_TYPE_STATE_RESULT; acpi_ut_push_generic_state (&walk_state->results, state); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Results=%p State=%p\n", @@ -744,7 +745,7 @@ * ******************************************************************************/ -static void +void acpi_ds_push_walk_state ( acpi_walk_state *walk_state, acpi_walk_list *walk_list) @@ -855,12 +856,103 @@ /* Put the new state at the head of the walk list */ - acpi_ds_push_walk_state (walk_state, walk_list); + if (walk_list) { + acpi_ds_push_walk_state (walk_state, walk_list); + } return_PTR (walk_state); } +#ifndef _ACPI_ASL_COMPILER +/******************************************************************************* + * + * FUNCTION: Acpi_ds_init_aml_walk + * + * PARAMETERS: Walk_state - New state to be initialized + * + * RETURN: None + * + * DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk + * + ******************************************************************************/ + +acpi_status +acpi_ds_init_aml_walk ( + acpi_walk_state *walk_state, + acpi_parse_object *op, + acpi_namespace_node *method_node, + u8 *aml_start, + u32 aml_length, + acpi_operand_object **params, + acpi_operand_object **return_obj_desc, + u32 pass_number) +{ + acpi_status status; + acpi_parse_state *parser_state = &walk_state->parser_state; + + + FUNCTION_TRACE ("Ds_init_aml_walk"); + + + walk_state->parser_state.aml = + walk_state->parser_state.aml_start = aml_start; + walk_state->parser_state.aml_end = + walk_state->parser_state.pkg_end = aml_start + aml_length; + + /* The Next_op of the Next_walk will be the beginning of the method */ + /* TBD: [Restructure] -- obsolete? */ + + walk_state->next_op = NULL; + walk_state->params = params; + walk_state->caller_return_desc = return_obj_desc; + + status = acpi_ps_init_scope (&walk_state->parser_state, op); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + if (method_node) { + walk_state->parser_state.start_node = method_node; + walk_state->walk_type = WALK_METHOD; + walk_state->method_node = method_node; + walk_state->method_desc = acpi_ns_get_attached_object (method_node); + + + /* Push start scope on scope stack and make it current */ + + status = acpi_ds_scope_stack_push (method_node, ACPI_TYPE_METHOD, walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + /* Init the method arguments */ + + acpi_ds_method_data_init_args (params, MTH_NUM_ARGS, walk_state); + } + + else { + /* Setup the current scope */ + + parser_state->start_node = parser_state->start_op->node; + if (parser_state->start_node) { + /* Push start scope on scope stack and make it current */ + + status = acpi_ds_scope_stack_push (parser_state->start_node, + parser_state->start_node->type, walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } + } + + acpi_ds_init_callbacks (walk_state, pass_number); + + return_ACPI_STATUS (AE_OK); +} +#endif + + /******************************************************************************* * * FUNCTION: Acpi_ds_delete_walk_state @@ -893,7 +985,11 @@ } - /* Always must free any linked control states */ + if (walk_state->parser_state.scope) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n", walk_state)); + } + + /* Always must free any linked control states */ while (walk_state->control_state) { state = walk_state->control_state; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/driver.c linux/drivers/acpi/driver.c --- v2.4.13/linux/drivers/acpi/driver.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/driver.c Wed Oct 24 14:06:22 2001 @@ -40,7 +40,6 @@ #include #include #include "acpi.h" -#include "driver.h" #define _COMPONENT OS_DEPENDENT @@ -50,6 +49,70 @@ static int acpi_disabled = 0; +enum acpi_blacklist_predicates +{ + all_versions, + less_than_or_equal, + equal, + greater_than_or_equal, +}; + +struct acpi_blacklist_item +{ + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; + enum acpi_blacklist_predicates oem_revision_predicate; +}; + +/* + * Currently, this blacklists based on items in the FADT. We may want to + * expand this to using other ACPI tables in the future, too. + */ +static struct acpi_blacklist_item acpi_blacklist[] __initdata = +{ + {"TOSHIB", "750 ", 0x970814, less_than_or_equal}, /* Portege 7020, BIOS 8.10 */ + {""} +}; + +int +acpi_blacklisted(FADT_DESCRIPTOR *fadt) +{ + int i = 0; + + while (acpi_blacklist[i].oem_id[0] != '\0') + { + if (strncmp(acpi_blacklist[i].oem_id, fadt->header.oem_id, 6)) { + i++; + continue; + } + + if (strncmp(acpi_blacklist[i].oem_table_id, fadt->header.oem_table_id, 8)) { + i++; + continue; + } + + if (acpi_blacklist[i].oem_revision_predicate == all_versions) + return TRUE; + + if (acpi_blacklist[i].oem_revision_predicate == less_than_or_equal + && fadt->header.oem_revision <= acpi_blacklist[i].oem_revision) + return TRUE; + + if (acpi_blacklist[i].oem_revision_predicate == greater_than_or_equal + && fadt->header.oem_revision >= acpi_blacklist[i].oem_revision) + return TRUE; + + if (acpi_blacklist[i].oem_revision_predicate == equal + && fadt->header.oem_revision == acpi_blacklist[i].oem_revision) + return TRUE; + + i++; + } + + return FALSE; +} + /* * Start the interpreter */ @@ -64,7 +127,6 @@ return -ENODEV; } - if (acpi_disabled) { printk(KERN_NOTICE "ACPI: disabled by cmdline, exiting\n"); return -ENODEV; @@ -89,6 +151,12 @@ if (!ACPI_SUCCESS(acpi_get_table(ACPI_TABLE_FADT, 1, &buffer))) { printk(KERN_ERR "ACPI: Could not get FADT\n"); + acpi_terminate(); + return -ENODEV; + } + + if (acpi_blacklisted(&acpi_fadt)) { + printk(KERN_ERR "ACPI: On blacklist -- BIOS not fully ACPI compliant\n"); acpi_terminate(); return -ENODEV; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/driver.h linux/drivers/acpi/driver.h --- v2.4.13/linux/drivers/acpi/driver.h Tue Jul 3 17:08:19 2001 +++ linux/drivers/acpi/driver.h Wed Dec 31 16:00:00 1969 @@ -1,72 +0,0 @@ -/* - * driver.h - ACPI driver - * - * Copyright (C) 2000 Andrew Henroid - * - * 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. - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __DRIVER_H -#define __DRIVER_H - -#include -#include -#include -#include -#include - -#define ACPI_MAX_THROTTLE 10 -#define ACPI_INVALID ~0UL -#define ACPI_INFINITE ~0UL - -/* - * cpu.c - */ -int acpi_cpu_init(void); -u32 acpi_read_pm_timer(void); - -extern u32 acpi_c2_exit_latency; -extern u32 acpi_c3_exit_latency; -extern u32 acpi_c2_enter_latency; -extern u32 acpi_c3_enter_latency; -extern u32 acpi_use_idle; -extern u32 acpi_c1_count; -extern u32 acpi_c2_count; -extern u32 acpi_c3_count; - -/* - * driver.c - */ -int acpi_run(void (*callback)(void*), void *context); - -/* - * ec.c - */ -int acpi_ec_init(void); - -/* - * power.c - */ -int acpi_power_init(void); - -/* - * sys.c - */ -int acpi_sys_init(void); -int acpi_enter_sx(acpi_sstate_t state); - -extern volatile acpi_sstate_t acpi_sleep_state; - -#endif /* __DRIVER_H */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evevent.c linux/drivers/acpi/events/evevent.c --- v2.4.13/linux/drivers/acpi/events/evevent.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evevent.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: evevent - Fixed and General Purpose Acpi_event * handling and dispatch - * $Revision: 50 $ + * $Revision: 51 $ * *****************************************************************************/ @@ -354,7 +354,7 @@ * Allocate the Gpe information block */ acpi_gbl_gpe_registers = ACPI_MEM_CALLOCATE (acpi_gbl_gpe_register_count * - sizeof (ACPI_GPE_REGISTERS)); + sizeof (acpi_gpe_registers)); if (!acpi_gbl_gpe_registers) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not allocate the Gpe_registers block\n")); @@ -442,9 +442,9 @@ register_index++; } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE registers: %X@%p (Blk0) %X@%p (Blk1)\n", - gpe0register_count, acpi_gbl_FADT->Xgpe0blk.address, gpe1_register_count, - acpi_gbl_FADT->Xgpe1_blk.address)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE registers: %X@%8.8X%8.8X (Blk0) %X@%8.8X%8.8X (Blk1)\n", + gpe0register_count, HIDWORD(acpi_gbl_FADT->Xgpe0blk.address), LODWORD(acpi_gbl_FADT->Xgpe0blk.address), + gpe1_register_count, HIDWORD(acpi_gbl_FADT->Xgpe1_blk.address), LODWORD(acpi_gbl_FADT->Xgpe1_blk.address))); return_ACPI_STATUS (AE_OK); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evmisc.c linux/drivers/acpi/events/evmisc.c --- v2.4.13/linux/drivers/acpi/events/evmisc.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evmisc.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: evmisc - ACPI device notification handler dispatch * and ACPI Global Lock support - * $Revision: 33 $ + * $Revision: 35 $ * *****************************************************************************/ @@ -88,7 +88,7 @@ break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Unknown Notify Value: %lx \n", notify_value)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Unknown Notify Value: %X \n", notify_value)); break; } @@ -134,6 +134,7 @@ return (AE_NO_MEMORY); } + notify_info->common.data_type = ACPI_DESC_TYPE_STATE_NOTIFY; notify_info->notify.node = node; notify_info->notify.value = (u16) notify_value; notify_info->notify.handler_obj = handler_obj; @@ -173,7 +174,7 @@ void *context) { acpi_generic_state *notify_info = (acpi_generic_state *) context; - ACPI_NOTIFY_HANDLER global_handler = NULL; + acpi_notify_handler global_handler = NULL; void *global_context = NULL; acpi_operand_object *handler_obj; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evregion.c linux/drivers/acpi/events/evregion.c --- v2.4.13/linux/drivers/acpi/events/evregion.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evregion.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evregion - ACPI Address_space (Op_region) handler dispatch - * $Revision: 110 $ + * $Revision: 113 $ * *****************************************************************************/ @@ -147,17 +147,16 @@ params[1] = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); if (!params[1]) { - acpi_ut_remove_reference (params[0]); - return_ACPI_STATUS (AE_NO_MEMORY); + status = AE_NO_MEMORY; + goto cleanup; } - params[2] = NULL; - /* * Set up the parameter objects */ params[0]->integer.value = region_obj->region.space_id; params[1]->integer.value = function; + params[2] = NULL; /* * Execute the method, no return value @@ -165,9 +164,10 @@ DEBUG_EXEC(acpi_ut_display_init_pathname (region_obj->region.extra->extra.method_REG, " [Method]")); status = acpi_ns_evaluate_by_handle (region_obj->region.extra->extra.method_REG, params, NULL); + acpi_ut_remove_reference (params[1]); +cleanup: acpi_ut_remove_reference (params[0]); - acpi_ut_remove_reference (params[1]); return_ACPI_STATUS (status); } @@ -200,8 +200,8 @@ u32 *value) { acpi_status status; - ACPI_ADR_SPACE_HANDLER handler; - ACPI_ADR_SPACE_SETUP region_setup; + acpi_adr_space_handler handler; + acpi_adr_space_setup region_setup; acpi_operand_object *handler_desc; void *region_context = NULL; @@ -276,7 +276,7 @@ handler = handler_desc->addr_handler.handler; ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, - "Addrhandler %p (%p), Address %8.8lX%8.8lX\n", + "Addrhandler %p (%p), Address %8.8X%8.8X\n", ®ion_obj->region.addr_handler->addr_handler, handler, HIDWORD(address), LODWORD(address))); @@ -335,7 +335,7 @@ acpi_operand_object *handler_obj; acpi_operand_object *obj_desc; acpi_operand_object **last_obj_ptr; - ACPI_ADR_SPACE_SETUP region_setup; + acpi_adr_space_setup region_setup; void *region_context; acpi_status status; @@ -548,7 +548,7 @@ /* Convert and validate the device handle */ - node = acpi_ns_convert_handle_to_entry (obj_handle); + node = acpi_ns_map_handle_to_node (obj_handle); if (!node) { return (AE_BAD_PARAMETER); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evrgnini.c linux/drivers/acpi/events/evrgnini.c --- v2.4.13/linux/drivers/acpi/events/evrgnini.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evrgnini.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evrgnini- ACPI Address_space (Op_region) init - * $Revision: 46 $ + * $Revision: 48 $ * *****************************************************************************/ @@ -145,7 +145,7 @@ acpi_operand_object *handler_obj; acpi_namespace_node *node; acpi_operand_object *region_obj = (acpi_operand_object *) handle; - ACPI_DEVICE_ID object_hID; + acpi_device_id object_hID; FUNCTION_TRACE ("Ev_pci_config_region_setup"); @@ -158,7 +158,7 @@ * routine checks before we get here, but we check again just in case. */ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, - "Attempting to init a region %X, with no handler\n", region_obj)); + "Attempting to init a region %p, with no handler\n", region_obj)); return_ACPI_STATUS (AE_NOT_EXIST); } @@ -257,6 +257,70 @@ } *region_context = pci_id; + return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ev_pci_bar_region_setup + * + * PARAMETERS: Region_obj - region we are interested in + * Function - start or stop + * Handler_context - Address space handler context + * Region_context - Region specific context + * + * RETURN: Status + * + * DESCRIPTION: Do any prep work for region handling + * + * MUTEX: Assumes namespace is not locked + * + ******************************************************************************/ + +acpi_status +acpi_ev_pci_bar_region_setup ( + acpi_handle handle, + u32 function, + void *handler_context, + void **region_context) +{ + + FUNCTION_TRACE ("Ev_pci_bar_region_setup"); + + + return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ev_cmos_region_setup + * + * PARAMETERS: Region_obj - region we are interested in + * Function - start or stop + * Handler_context - Address space handler context + * Region_context - Region specific context + * + * RETURN: Status + * + * DESCRIPTION: Do any prep work for region handling + * + * MUTEX: Assumes namespace is not locked + * + ******************************************************************************/ + +acpi_status +acpi_ev_cmos_region_setup ( + acpi_handle handle, + u32 function, + void *handler_context, + void **region_context) +{ + + FUNCTION_TRACE ("Ev_cmos_region_setup"); + + return_ACPI_STATUS (AE_OK); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evxface.c linux/drivers/acpi/events/evxface.c --- v2.4.13/linux/drivers/acpi/events/evxface.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evxface - External interfaces for ACPI events - * $Revision: 112 $ + * $Revision: 116 $ * *****************************************************************************/ @@ -54,7 +54,7 @@ acpi_status acpi_install_fixed_event_handler ( u32 event, - ACPI_EVENT_HANDLER handler, + acpi_event_handler handler, void *context) { acpi_status status; @@ -63,13 +63,6 @@ FUNCTION_TRACE ("Acpi_install_fixed_event_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (event > ACPI_EVENT_MAX) { @@ -86,12 +79,12 @@ } - /* Install the handler before enabling the event - just in case... */ + /* Install the handler before enabling the event */ acpi_gbl_fixed_event_handlers[event].handler = handler; acpi_gbl_fixed_event_handlers[event].context = context; - status = acpi_enable_event (event, ACPI_EVENT_FIXED); + status = acpi_enable_event (event, ACPI_EVENT_FIXED, 0); if (!ACPI_SUCCESS (status)) { ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Could not enable fixed event.\n")); @@ -129,7 +122,7 @@ acpi_status acpi_remove_fixed_event_handler ( u32 event, - ACPI_EVENT_HANDLER handler) + acpi_event_handler handler) { acpi_status status = AE_OK; @@ -137,13 +130,6 @@ FUNCTION_TRACE ("Acpi_remove_fixed_event_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (event > ACPI_EVENT_MAX) { @@ -152,21 +138,19 @@ acpi_ut_acquire_mutex (ACPI_MTX_EVENTS); - /* Disable the event before removing the handler - just in case... */ + /* Disable the event before removing the handler */ - status = acpi_disable_event(event, ACPI_EVENT_FIXED); + status = acpi_disable_event(event, ACPI_EVENT_FIXED, 0); /* Always Remove the handler */ acpi_gbl_fixed_event_handlers[event].handler = NULL; acpi_gbl_fixed_event_handlers[event].context = NULL; - - if (!ACPI_SUCCESS(status)) { + if (!ACPI_SUCCESS (status)) { ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Could not write to fixed event enable register.\n")); } - else { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Disabled fixed event %X.\n", event)); } @@ -197,7 +181,7 @@ acpi_install_notify_handler ( acpi_handle device, u32 handler_type, - ACPI_NOTIFY_HANDLER handler, + acpi_notify_handler handler, void *context) { acpi_operand_object *obj_desc; @@ -209,13 +193,6 @@ FUNCTION_TRACE ("Acpi_install_notify_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((!handler) || @@ -227,7 +204,7 @@ /* Convert and validate the device handle */ - device_node = acpi_ns_convert_handle_to_entry (device); + device_node = acpi_ns_map_handle_to_node (device); if (!device_node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -235,7 +212,6 @@ /* * Root Object: - * ------------ * Registering a notify handler on the root object indicates that the * caller wishes to receive notifications for all objects. Note that * only one global handler can be regsitered (per notify type). @@ -266,8 +242,7 @@ } /* - * Other Objects: - * -------------- + * All Other Objects: * Caller will only receive notifications specific to the target object. * Note that only certain object types can receive notifications. */ @@ -338,6 +313,7 @@ } } + unlock_and_exit: acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return_ACPI_STATUS (status); @@ -363,7 +339,7 @@ acpi_remove_notify_handler ( acpi_handle device, u32 handler_type, - ACPI_NOTIFY_HANDLER handler) + acpi_notify_handler handler) { acpi_operand_object *notify_obj; acpi_operand_object *obj_desc; @@ -374,13 +350,6 @@ FUNCTION_TRACE ("Acpi_remove_notify_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((!handler) || @@ -392,18 +361,16 @@ /* Convert and validate the device handle */ - device_node = acpi_ns_convert_handle_to_entry (device); + device_node = acpi_ns_map_handle_to_node (device); if (!device_node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; } /* - * Root Object: - * ------------ + * Root Object */ if (device == ACPI_ROOT_OBJECT) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n")); if (((handler_type == ACPI_SYSTEM_NOTIFY) && @@ -415,20 +382,19 @@ } if (handler_type == ACPI_SYSTEM_NOTIFY) { - acpi_gbl_sys_notify.node = NULL; + acpi_gbl_sys_notify.node = NULL; acpi_gbl_sys_notify.handler = NULL; acpi_gbl_sys_notify.context = NULL; } else { - acpi_gbl_drv_notify.node = NULL; + acpi_gbl_drv_notify.node = NULL; acpi_gbl_drv_notify.handler = NULL; acpi_gbl_drv_notify.context = NULL; } } /* - * Other Objects: - * -------------- + * All Other Objects */ else { /* @@ -505,7 +471,7 @@ acpi_install_gpe_handler ( u32 gpe_number, u32 type, - ACPI_GPE_HANDLER handler, + acpi_gpe_handler handler, void *context) { acpi_status status = AE_OK; @@ -514,13 +480,6 @@ FUNCTION_TRACE ("Acpi_install_gpe_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (!handler || (gpe_number > ACPI_GPE_MAX)) { @@ -553,6 +512,7 @@ acpi_hw_clear_gpe (gpe_number); acpi_hw_enable_gpe (gpe_number); + cleanup: acpi_ut_release_mutex (ACPI_MTX_EVENTS); return_ACPI_STATUS (status); @@ -575,7 +535,7 @@ acpi_status acpi_remove_gpe_handler ( u32 gpe_number, - ACPI_GPE_HANDLER handler) + acpi_gpe_handler handler) { acpi_status status = AE_OK; @@ -583,13 +543,6 @@ FUNCTION_TRACE ("Acpi_remove_gpe_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (!handler || (gpe_number > ACPI_GPE_MAX)) { @@ -621,6 +574,7 @@ acpi_gbl_gpe_info[gpe_number].handler = NULL; acpi_gbl_gpe_info[gpe_number].context = NULL; + cleanup: acpi_ut_release_mutex (ACPI_MTX_EVENTS); return_ACPI_STATUS (status); @@ -639,6 +593,7 @@ * DESCRIPTION: Acquire the ACPI Global Lock * ******************************************************************************/ + acpi_status acpi_acquire_global_lock ( void) @@ -646,13 +601,6 @@ acpi_status status; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - status = acpi_ex_enter_interpreter (); if (ACPI_FAILURE (status)) { return (status); @@ -685,15 +633,6 @@ acpi_release_global_lock ( void) { - acpi_status status; - - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } acpi_ev_release_global_lock (); return (AE_OK); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evxfevnt.c linux/drivers/acpi/events/evxfevnt.c --- v2.4.13/linux/drivers/acpi/events/evxfevnt.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evxfevnt.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable - * $Revision: 36 $ + * $Revision: 38 $ * *****************************************************************************/ @@ -106,13 +106,6 @@ FUNCTION_TRACE ("Acpi_disable"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Restore original mode */ status = acpi_hw_set_mode (acpi_gbl_original_mode); @@ -136,6 +129,7 @@ * * PARAMETERS: Event - The fixed event or GPE to be enabled * Type - The type of event + * Flags - Just enable, or also wake enable? * * RETURN: Status * @@ -146,7 +140,8 @@ acpi_status acpi_enable_event ( u32 event, - u32 type) + u32 type, + u32 flags) { acpi_status status = AE_OK; u32 register_id; @@ -155,13 +150,6 @@ FUNCTION_TRACE ("Acpi_enable_event"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* The Type must be either Fixed Acpi_event or GPE */ switch (type) { @@ -223,7 +211,13 @@ /* Enable the requested GPE number */ - acpi_hw_enable_gpe (event); + if (flags & ACPI_EVENT_ENABLE) { + acpi_hw_enable_gpe (event); + } + if (flags & ACPI_EVENT_WAKE_ENABLE) { + acpi_hw_enable_gpe_for_wakeup (event); + } + break; @@ -242,7 +236,8 @@ * FUNCTION: Acpi_disable_event * * PARAMETERS: Event - The fixed event or GPE to be enabled - * Type - The type of event + * Type - The type of event, fixed or general purpose + * Flags - Wake disable vs. non-wake disable * * RETURN: Status * @@ -253,7 +248,8 @@ acpi_status acpi_disable_event ( u32 event, - u32 type) + u32 type, + u32 flags) { acpi_status status = AE_OK; u32 register_id; @@ -262,13 +258,6 @@ FUNCTION_TRACE ("Acpi_disable_event"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* The Type must be either Fixed Acpi_event or GPE */ switch (type) { @@ -329,7 +318,13 @@ /* Disable the requested GPE number */ - acpi_hw_disable_gpe (event); + if (flags & ACPI_EVENT_DISABLE) { + acpi_hw_disable_gpe (event); + } + if (flags & ACPI_EVENT_WAKE_DISABLE) { + acpi_hw_disable_gpe_for_wakeup (event); + } + break; @@ -366,13 +361,6 @@ FUNCTION_TRACE ("Acpi_clear_event"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* The Type must be either Fixed Acpi_event or GPE */ switch (type) { @@ -466,13 +454,6 @@ FUNCTION_TRACE ("Acpi_get_event_status"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } if (!event_status) { return_ACPI_STATUS (AE_BAD_PARAMETER); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evxfregn.c linux/drivers/acpi/events/evxfregn.c --- v2.4.13/linux/drivers/acpi/events/evxfregn.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evxfregn.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: evxfregn - External Interfaces, ACPI Operation Regions and * Address Spaces. - * $Revision: 36 $ + * $Revision: 40 $ * *****************************************************************************/ @@ -56,8 +56,8 @@ acpi_install_address_space_handler ( acpi_handle device, ACPI_ADR_SPACE_TYPE space_id, - ACPI_ADR_SPACE_HANDLER handler, - ACPI_ADR_SPACE_SETUP setup, + acpi_adr_space_handler handler, + acpi_adr_space_setup setup, void *context) { acpi_operand_object *obj_desc; @@ -71,13 +71,6 @@ FUNCTION_TRACE ("Acpi_install_address_space_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((!device) || @@ -90,16 +83,16 @@ /* Convert and validate the device handle */ - node = acpi_ns_convert_handle_to_entry (device); + node = acpi_ns_map_handle_to_node (device); if (!node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; } /* - * This registration is valid for only the types below - * and the root. This is where the default handlers - * get placed. + * This registration is valid for only the types below + * and the root. This is where the default handlers + * get placed. */ if ((node->type != ACPI_TYPE_DEVICE) && (node->type != ACPI_TYPE_PROCESSOR) && @@ -115,17 +108,27 @@ switch (space_id) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: handler = acpi_ex_system_memory_space_handler; - setup = acpi_ev_system_memory_region_setup; + setup = acpi_ev_system_memory_region_setup; break; case ACPI_ADR_SPACE_SYSTEM_IO: handler = acpi_ex_system_io_space_handler; - setup = acpi_ev_io_space_region_setup; + setup = acpi_ev_io_space_region_setup; break; case ACPI_ADR_SPACE_PCI_CONFIG: handler = acpi_ex_pci_config_space_handler; - setup = acpi_ev_pci_config_region_setup; + setup = acpi_ev_pci_config_region_setup; + break; + + case ACPI_ADR_SPACE_CMOS: + handler = acpi_ex_cmos_space_handler; + setup = acpi_ev_cmos_region_setup; + break; + + case ACPI_ADR_SPACE_PCI_BAR_TARGET: + handler = acpi_ex_pci_bar_space_handler; + setup = acpi_ev_pci_bar_region_setup; break; default: @@ -136,20 +139,20 @@ } /* - * If the caller hasn't specified a setup routine, use the default + * If the caller hasn't specified a setup routine, use the default */ if (!setup) { setup = acpi_ev_default_region_setup; } /* - * Check for an existing internal object + * Check for an existing internal object */ obj_desc = acpi_ns_get_attached_object (node); if (obj_desc) { /* - * The object exists. - * Make sure the handler is not already installed. + * The object exists. + * Make sure the handler is not already installed. */ /* check the address handler the user requested */ @@ -157,8 +160,8 @@ handler_obj = obj_desc->device.addr_handler; while (handler_obj) { /* - * We have an Address handler, see if user requested this - * address space. + * We have an Address handler, see if user requested this + * address space. */ if(handler_obj->addr_handler.space_id == space_id) { status = AE_EXIST; @@ -166,7 +169,7 @@ } /* - * Move through the linked list of handlers + * Move through the linked list of handlers */ handler_obj = handler_obj->addr_handler.next; } @@ -181,7 +184,6 @@ if (node->type == ACPI_TYPE_ANY) { type = ACPI_TYPE_DEVICE; } - else { type = node->type; } @@ -210,11 +212,11 @@ acpi_ut_get_region_name (space_id), space_id, node, obj_desc)); /* - * Now we can install the handler + * Now we can install the handler * - * At this point we know that there is no existing handler. - * So, we just allocate the object for the handler and link it - * into the list. + * At this point we know that there is no existing handler. + * So, we just allocate the object for the handler and link it + * into the list. */ handler_obj = acpi_ut_create_internal_object (INTERNAL_TYPE_ADDRESS_HANDLER); if (!handler_obj) { @@ -232,16 +234,16 @@ handler_obj->addr_handler.setup = setup; /* - * Now walk the namespace finding all of the regions this - * handler will manage. + * Now walk the namespace finding all of the regions this + * handler will manage. * - * We start at the device and search the branch toward - * the leaf nodes until either the leaf is encountered or - * a device is detected that has an address handler of the - * same type. + * We start at the device and search the branch toward + * the leaf nodes until either the leaf is encountered or + * a device is detected that has an address handler of the + * same type. * - * In either case we back up and search down the remainder - * of the branch + * In either case we back up and search down the remainder + * of the branch */ status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device, ACPI_UINT32_MAX, NS_WALK_UNLOCK, @@ -249,7 +251,7 @@ handler_obj, NULL); /* - * Place this handler 1st on the list + * Place this handler 1st on the list */ handler_obj->common.reference_count = (u16) (handler_obj->common.reference_count + @@ -280,7 +282,7 @@ acpi_remove_address_space_handler ( acpi_handle device, ACPI_ADR_SPACE_TYPE space_id, - ACPI_ADR_SPACE_HANDLER handler) + acpi_adr_space_handler handler) { acpi_operand_object *obj_desc; acpi_operand_object *handler_obj; @@ -293,13 +295,6 @@ FUNCTION_TRACE ("Acpi_remove_address_space_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((!device) || @@ -312,7 +307,7 @@ /* Convert and validate the device handle */ - node = acpi_ns_convert_handle_to_entry (device); + node = acpi_ns_map_handle_to_node (device); if (!node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -323,25 +318,22 @@ obj_desc = acpi_ns_get_attached_object (node); if (!obj_desc) { - /* - * The object DNE. - */ status = AE_NOT_EXIST; goto unlock_and_exit; } /* - * find the address handler the user requested + * find the address handler the user requested */ handler_obj = obj_desc->device.addr_handler; last_obj_ptr = &obj_desc->device.addr_handler; while (handler_obj) { /* - * We have a handler, see if user requested this one + * We have a handler, see if user requested this one */ - if(handler_obj->addr_handler.space_id == space_id) { + if (handler_obj->addr_handler.space_id == space_id) { /* - * Got it, first dereference this in the Regions + * Got it, first dereference this in the Regions */ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, "Removing address handler %p(%p) for region %s on Device %p(%p)\n", @@ -354,30 +346,30 @@ while (region_obj) { /* - * First disassociate the handler from the region. + * First disassociate the handler from the region. * - * NOTE: this doesn't mean that the region goes away - * The region is just inaccessible as indicated to - * the _REG method + * NOTE: this doesn't mean that the region goes away + * The region is just inaccessible as indicated to + * the _REG method */ acpi_ev_disassociate_region_from_handler(region_obj, TRUE); /* - * Walk the list, since we took the first region and it - * was removed from the list by the dissassociate call - * we just get the first item on the list again + * Walk the list, since we took the first region and it + * was removed from the list by the dissassociate call + * we just get the first item on the list again */ region_obj = handler_obj->addr_handler.region_list; } /* - * Remove this Handler object from the list + * Remove this Handler object from the list */ *last_obj_ptr = handler_obj->addr_handler.next; /* - * Now we can delete the handler object + * Now we can delete the handler object */ acpi_ut_remove_reference (handler_obj); acpi_ut_remove_reference (handler_obj); @@ -386,7 +378,7 @@ } /* - * Move through the linked list of handlers + * Move through the linked list of handlers */ last_obj_ptr = &handler_obj->addr_handler.next; handler_obj = handler_obj->addr_handler.next; @@ -394,7 +386,7 @@ /* - * The handler does not exist + * The handler does not exist */ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, "Unable to remove address handler %p for %s(%X), Dev_node %p, obj %p\n", diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exconfig.c linux/drivers/acpi/executer/exconfig.c --- v2.4.13/linux/drivers/acpi/executer/exconfig.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exconfig.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exconfig - Namespace reconfiguration (Load/Unload opcodes) - * $Revision: 41 $ + * $Revision: 44 $ * *****************************************************************************/ @@ -51,10 +51,10 @@ * ****************************************************************************/ -static acpi_status -acpi_ex_load_table_op ( +acpi_status +acpi_ex_load_op ( acpi_operand_object *rgn_desc, - acpi_operand_object **ddb_handle) + acpi_operand_object *ddb_handle) { acpi_status status; acpi_operand_object *table_desc = NULL; @@ -65,7 +65,7 @@ u32 i; - FUNCTION_TRACE ("Ex_load_table"); + FUNCTION_TRACE ("Ex_load_op"); /* TBD: [Unhandled] Object can be either a field or an opregion */ @@ -117,7 +117,7 @@ acpi_gbl_acpi_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_header.signature)); + (char*)table_header.signature)); status = AE_BAD_SIGNATURE; goto cleanup; } @@ -165,7 +165,8 @@ table_desc->reference.opcode = AML_LOAD_OP; table_desc->reference.object = table_info.installed_desc; - *ddb_handle = table_desc; + /* TBD: store the tabledesc into the Ddb_handle target */ + /* Ddb_handle = Table_desc; */ return_ACPI_STATUS (status); @@ -175,7 +176,6 @@ ACPI_MEM_FREE (table_desc); ACPI_MEM_FREE (table_ptr); return_ACPI_STATUS (status); - } @@ -191,7 +191,7 @@ * ****************************************************************************/ -static acpi_status +acpi_status acpi_ex_unload_table ( acpi_operand_object *ddb_handle) { @@ -236,60 +236,6 @@ /* Delete the table descriptor (Ddb_handle) */ acpi_ut_remove_reference (table_desc); - - return_ACPI_STATUS (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ex_reconfiguration - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current state of the parse tree walk - * - * RETURN: Status - * - * DESCRIPTION: Reconfiguration opcodes such as LOAD and UNLOAD - * - ****************************************************************************/ - -acpi_status -acpi_ex_reconfiguration ( - u16 opcode, - acpi_walk_state *walk_state) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_status status; - - - FUNCTION_TRACE ("Ex_reconfiguration"); - -#define ddb_handle operand[0] -#define region_desc operand[1] - - - switch (opcode) { - - case AML_LOAD_OP: - - status = acpi_ex_load_table_op (region_desc, &ddb_handle); - break; - - - case AML_UNLOAD_OP: - - status = acpi_ex_unload_table (ddb_handle); - break; - - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "bad opcode=%X\n", opcode)); - status = AE_AML_BAD_OPCODE; - break; - } - return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exconvrt.c linux/drivers/acpi/executer/exconvrt.c --- v2.4.13/linux/drivers/acpi/executer/exconvrt.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exconvrt.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exconvrt - Object conversion routines - * $Revision: 22 $ + * $Revision: 24 $ * *****************************************************************************/ @@ -230,7 +230,7 @@ new_buf = ACPI_MEM_CALLOCATE (integer_size); if (!new_buf) { REPORT_ERROR - (("Ex_dyadic2_r/Concat_op: Buffer allocation failure\n")); + (("Ex_convert_to_buffer: Buffer allocation failure\n")); acpi_ut_remove_reference (ret_desc); return (AE_NO_MEMORY); } @@ -296,8 +296,9 @@ u32 k = 0; u8 hex_digit; acpi_integer digit; - u8 leading_zero = TRUE; + u32 remainder; u32 length = sizeof (acpi_integer); + u8 leading_zero = TRUE; FUNCTION_ENTRY (); @@ -306,12 +307,13 @@ switch (base) { case 10: + remainder = 0; for (i = ACPI_MAX_DECIMAL_DIGITS; i > 0 ; i--) { /* Divide by nth factor of 10 */ digit = integer; for (j = 1; j < i; j++) { - digit = ACPI_DIVIDE (digit, 10); + acpi_ut_short_divide (&digit, 10, &digit, &remainder); } /* Create the decimal digit */ @@ -321,7 +323,7 @@ } if (!leading_zero) { - string[k] = (u8) (ASCII_ZERO + ACPI_MODULO (digit, 10)); + string[k] = (u8) (ASCII_ZERO + remainder); k++; } } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/excreate.c linux/drivers/acpi/executer/excreate.c --- v2.4.13/linux/drivers/acpi/executer/excreate.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/excreate.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: excreate - Named object creation - * $Revision: 66 $ + * $Revision: 71 $ * *****************************************************************************/ @@ -37,162 +37,6 @@ MODULE_NAME ("excreate") -/******************************************************************************* - * - * FUNCTION: Acpi_ex_create_buffer_field - * - * PARAMETERS: Opcode - The opcode to be executed - * Operands - List of operands for the opcode - * - * RETURN: Status - * - * DESCRIPTION: Execute Create_field operators: Create_bit_field_op, - * Create_byte_field_op, Create_word_field_op, Create_dWord_field_op, - * Create_field_op (which define fields in buffers) - * - * ALLOCATION: Deletes Create_field_op's count operand descriptor - * - * - * ACPI SPECIFICATION REFERENCES: - * Def_create_bit_field := Create_bit_field_op Src_buf Bit_idx Name_string - * Def_create_byte_field := Create_byte_field_op Src_buf Byte_idx Name_string - * Def_create_dWord_field := Create_dWord_field_op Src_buf Byte_idx Name_string - * Def_create_field := Create_field_op Src_buf Bit_idx Num_bits Name_string - * Def_create_word_field := Create_word_field_op Src_buf Byte_idx Name_string - * Bit_index := Term_arg=>Integer - * Byte_index := Term_arg=>Integer - * Num_bits := Term_arg=>Integer - * Source_buff := Term_arg=>Buffer - * - ******************************************************************************/ - -acpi_status -acpi_ex_create_buffer_field ( - u8 *aml_ptr, - u32 aml_length, - acpi_namespace_node *node, - acpi_walk_state *walk_state) -{ - acpi_status status; - acpi_operand_object *obj_desc; - acpi_operand_object *tmp_desc; - - - FUNCTION_TRACE ("Ex_create_buffer_field"); - - - /* Create the descriptor */ - - obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER_FIELD); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - - /* - * Allocate a method object for this field unit - */ - obj_desc->buffer_field.extra = acpi_ut_create_internal_object ( - INTERNAL_TYPE_EXTRA); - if (!obj_desc->buffer_field.extra) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* - * Remember location in AML stream of the field unit - * opcode and operands -- since the buffer and index - * operands must be evaluated. - */ - obj_desc->buffer_field.extra->extra.pcode = aml_ptr; - obj_desc->buffer_field.extra->extra.pcode_length = aml_length; - obj_desc->buffer_field.node = node; - - - /* - * This operation is supposed to cause the destination Name to refer - * to the defined Buffer_field -- it must not store the constructed - * Buffer_field object (or its current value) in some location that the - * Name may already be pointing to. So, if the Name currently contains - * a reference which would cause Acpi_ex_store() to perform an indirect - * store rather than setting the value of the Name itself, clobber that - * reference before calling Acpi_ex_store(). - */ - - /* Type of Name's existing value */ - - switch (acpi_ns_get_type (node)) { - - case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_ALIAS: - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: - - tmp_desc = acpi_ns_get_attached_object (node); - if (tmp_desc) { - /* - * There is an existing object here; delete it and zero out the - * object field within the Node - */ - DUMP_PATHNAME (node, - "Ex_create_buffer_field: Removing Current Reference", - ACPI_LV_BFIELD, _COMPONENT); - - DUMP_ENTRY (node, ACPI_LV_BFIELD); - DUMP_STACK_ENTRY (tmp_desc); - - acpi_ut_remove_reference (tmp_desc); - acpi_ns_attach_object ((acpi_namespace_node *) node, NULL, - ACPI_TYPE_ANY); - } - - /* Set the type to ANY (or the store below will fail) */ - - ((acpi_namespace_node *) node)->type = ACPI_TYPE_ANY; - - break; - - - default: - - break; - } - - - /* Store constructed field descriptor in result location */ - - status = acpi_ex_store (obj_desc, (acpi_operand_object *) node, - walk_state); - - /* - * If the field descriptor was not physically stored (or if a failure - * above), we must delete it - */ - if (obj_desc->common.reference_count <= 1) { - acpi_ut_remove_reference (obj_desc); - } - - - return_ACPI_STATUS (AE_OK); - - -cleanup: - - /* Delete region object and method subobject */ - - if (obj_desc) { - /* Remove deletes both objects! */ - - acpi_ut_remove_reference (obj_desc); - obj_desc = NULL; - } - - return_ACPI_STATUS (status); -} - - /***************************************************************************** * * FUNCTION: Acpi_ex_create_alias @@ -211,7 +55,6 @@ acpi_walk_state *walk_state) { acpi_namespace_node *source_node; - acpi_namespace_node *alias_node; acpi_status status; @@ -220,29 +63,19 @@ /* Get the source/alias operands (both namespace nodes) */ - source_node = (acpi_namespace_node *) walk_state->operands[walk_state->num_operands -1]; - walk_state->num_operands--; - - /* - * Don't pop it, it gets removed in the calling routine - */ - alias_node = acpi_ds_obj_stack_get_value (0, walk_state); + source_node = (acpi_namespace_node *) walk_state->operands[1]; - /* Add an additional reference to the object */ - acpi_ut_add_reference (source_node->object); + /* Attach the original source object to the new Alias Node */ - /* - * Attach the original source Node to the new Alias Node. - */ - status = acpi_ns_attach_object (alias_node, source_node->object, + status = acpi_ns_attach_object ((acpi_namespace_node *) walk_state->operands[0], + source_node->object, source_node->type); - /* * The new alias assumes the type of the source, but it points - * to the same object. The reference count of the object has two - * additional references to prevent deletion out from under either the + * to the same object. The reference count of the object has an + * additional reference to prevent deletion out from under either the * source or the alias Node */ @@ -256,7 +89,7 @@ * * FUNCTION: Acpi_ex_create_event * - * PARAMETERS: None + * PARAMETERS: Walk_state - Current state * * RETURN: Status * @@ -288,23 +121,20 @@ status = acpi_os_create_semaphore (ACPI_NO_UNIT_LIMIT, 1, &obj_desc->event.semaphore); if (ACPI_FAILURE (status)) { - acpi_ut_remove_reference (obj_desc); goto cleanup; } /* Attach object to the Node */ - status = acpi_ns_attach_object (acpi_ds_obj_stack_get_value (0, walk_state), + status = acpi_ns_attach_object ((acpi_namespace_node *) walk_state->operands[0], obj_desc, (u8) ACPI_TYPE_EVENT); - if (ACPI_FAILURE (status)) { - acpi_os_delete_semaphore (obj_desc->event.semaphore); - acpi_ut_remove_reference (obj_desc); - goto cleanup; - } - cleanup: - + /* + * Remove local reference to the object (on error, will cause deletion + * of both object and semaphore if present.) + */ + acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); } @@ -313,13 +143,14 @@ * * FUNCTION: Acpi_ex_create_mutex * - * PARAMETERS: Interpreter_mode - Current running mode (load1/Load2/Exec) - * Operands - List of operands for the opcode + * PARAMETERS: Walk_state - Current state * * RETURN: Status * * DESCRIPTION: Create a new mutex object * + * Mutex (Name[0], Sync_level[1]) + * ****************************************************************************/ acpi_status @@ -327,19 +158,13 @@ acpi_walk_state *walk_state) { acpi_status status = AE_OK; - acpi_operand_object *sync_desc; acpi_operand_object *obj_desc; FUNCTION_TRACE_PTR ("Ex_create_mutex", WALK_OPERANDS); - /* Get the operand */ - - sync_desc = walk_state->operands[walk_state->num_operands -1]; - walk_state->num_operands--; - - /* Attempt to allocate a new object */ + /* Create the new mutex object */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_MUTEX); if (!obj_desc) { @@ -351,29 +176,23 @@ status = acpi_os_create_semaphore (1, 1, &obj_desc->mutex.semaphore); if (ACPI_FAILURE (status)) { - acpi_ut_remove_reference (obj_desc); goto cleanup; } - obj_desc->mutex.sync_level = (u8) sync_desc->integer.value; + /* Init object and attach to NS node */ - /* Obj_desc was on the stack top, and the name is below it */ + obj_desc->mutex.sync_level = (u8) walk_state->operands[1]->integer.value; - status = acpi_ns_attach_object (acpi_ds_obj_stack_get_value (0, walk_state), + status = acpi_ns_attach_object ((acpi_namespace_node *) walk_state->operands[0], obj_desc, (u8) ACPI_TYPE_MUTEX); - if (ACPI_FAILURE (status)) { - acpi_os_delete_semaphore (obj_desc->mutex.semaphore); - acpi_ut_remove_reference (obj_desc); - goto cleanup; - } cleanup: - - /* Always delete the operand */ - - acpi_ut_remove_reference (sync_desc); - + /* + * Remove local reference to the object (on error, will cause deletion + * of both object and semaphore if present.) + */ + acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); } @@ -382,10 +201,10 @@ * * FUNCTION: Acpi_ex_create_region * - * PARAMETERS: Aml_ptr - Pointer to the region declaration AML + * PARAMETERS: Aml_start - Pointer to the region declaration AML * Aml_length - Max length of the declaration AML * Operands - List of operands for the opcode - * Interpreter_mode - Load1/Load2/Execute + * Walk_state - Current state * * RETURN: Status * @@ -395,7 +214,7 @@ acpi_status acpi_ex_create_region ( - u8 *aml_ptr, + u8 *aml_start, u32 aml_length, u8 region_space, acpi_walk_state *walk_state) @@ -408,6 +227,18 @@ FUNCTION_TRACE ("Ex_create_region"); + /* Get the Node from the object stack */ + + node = (acpi_namespace_node *) walk_state->operands[0]; + + /* + * If the region object is already attached to this node, + * just return + */ + if (node->object) { + return_ACPI_STATUS (AE_OK); + } + /* * Space ID must be one of the predefined IDs, or in the user-defined * range @@ -422,10 +253,6 @@ acpi_ut_get_region_name (region_space), region_space)); - /* Get the Node from the object stack */ - - node = (acpi_namespace_node *) acpi_ds_obj_stack_get_value (0, walk_state); - /* Create the region descriptor */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_REGION); @@ -434,9 +261,8 @@ goto cleanup; } - /* - * Allocate a method object for this region. - */ + /* Allocate a method object for this region */ + obj_desc->region.extra = acpi_ut_create_internal_object ( INTERNAL_TYPE_EXTRA); if (!obj_desc->region.extra) { @@ -448,23 +274,20 @@ * Remember location in AML stream of address & length * operands since they need to be evaluated at run time. */ - obj_desc->region.extra->extra.pcode = aml_ptr; - obj_desc->region.extra->extra.pcode_length = aml_length; + obj_desc->region.extra->extra.aml_start = aml_start; + obj_desc->region.extra->extra.aml_length = aml_length; /* Init the region from the operands */ - obj_desc->region.space_id = region_space; - obj_desc->region.address = 0; - obj_desc->region.length = 0; - + obj_desc->region.space_id = region_space; + obj_desc->region.address = 0; + obj_desc->region.length = 0; + obj_desc->region.node = node; /* Install the new region object in the parent Node */ - obj_desc->region.node = node; - status = acpi_ns_attach_object (node, obj_desc, (u8) ACPI_TYPE_REGION); - if (ACPI_FAILURE (status)) { goto cleanup; } @@ -474,7 +297,6 @@ * Namespace is NOT locked at this point. */ status = acpi_ev_initialize_region (obj_desc, FALSE); - if (ACPI_FAILURE (status)) { /* * If AE_NOT_EXIST is returned, it is not fatal @@ -488,17 +310,48 @@ cleanup: - if (ACPI_FAILURE (status)) { - /* Delete region object and method subobject */ + /* Remove local reference to the object */ - if (obj_desc) { - /* Remove deletes both objects! */ + acpi_ut_remove_reference (obj_desc); - acpi_ut_remove_reference (obj_desc); - obj_desc = NULL; - } + return_ACPI_STATUS (status); +} + + +/***************************************************************************** + * + * FUNCTION: Acpi_ex_create_table_region + * + * PARAMETERS: Walk_state - Current state + * + * RETURN: Status + * + * DESCRIPTION: Create a new Data_table_region object + * + ****************************************************************************/ + +acpi_status +acpi_ex_create_table_region ( + acpi_walk_state *walk_state) +{ + acpi_status status = AE_OK; + + + FUNCTION_TRACE ("Ex_create_table_region"); + +/* + acpi_operand_object *Obj_desc; + Obj_desc = Acpi_ut_create_internal_object (ACPI_TYPE_REGION); + if (!Obj_desc) + { + Status = AE_NO_MEMORY; + goto Cleanup; } + +Cleanup: +*/ + return_ACPI_STATUS (status); } @@ -515,68 +368,46 @@ * * DESCRIPTION: Create a new processor object and populate the fields * + * Processor (Name[0], Cpu_iD[1], Pblock_addr[2], Pblock_length[3]) + * ****************************************************************************/ acpi_status acpi_ex_create_processor ( - acpi_parse_object *op, - acpi_namespace_node *processor_node) + acpi_walk_state *walk_state) { - acpi_status status; - acpi_parse_object *arg; + acpi_operand_object **operand = &walk_state->operands[0]; acpi_operand_object *obj_desc; + acpi_status status; + + FUNCTION_TRACE_PTR ("Ex_create_processor", walk_state); - FUNCTION_TRACE_PTR ("Ex_create_processor", op); + /* Create the processor object */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_PROCESSOR); if (!obj_desc) { return_ACPI_STATUS (AE_NO_MEMORY); } - /* Install the new processor object in the parent Node */ - - status = acpi_ns_attach_object (processor_node, obj_desc, - (u8) ACPI_TYPE_PROCESSOR); - if (ACPI_FAILURE (status)) { - acpi_ut_delete_object_desc (obj_desc); - return_ACPI_STATUS (status); - } - - /* Get first arg and verify existence */ - - arg = op->value.arg; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - /* First arg is the Processor ID */ - - obj_desc->processor.proc_id = (u8) arg->value.integer; - - /* Get second arg and verify existence */ - - arg = arg->next; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - /* Second arg is the PBlock Address */ + /* + * Initialize the processor object from the operands + */ + obj_desc->processor.proc_id = (u8) operand[1]->integer.value; + obj_desc->processor.address = (ACPI_IO_ADDRESS) operand[2]->integer.value; + obj_desc->processor.length = (u8) operand[3]->integer.value; - obj_desc->processor.address = (ACPI_IO_ADDRESS) arg->value.integer; + /* Install the processor object in the parent Node */ - /* Get third arg and verify existence */ + status = acpi_ns_attach_object ((acpi_namespace_node *) operand[0], + obj_desc, (u8) ACPI_TYPE_PROCESSOR); - arg = arg->next; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - /* Third arg is the PBlock Length */ + /* Remove local reference to the object */ - obj_desc->processor.length = (u8) arg->value.integer; - return_ACPI_STATUS (AE_OK); + acpi_ut_remove_reference (obj_desc); + return_ACPI_STATUS (status); } @@ -592,58 +423,44 @@ * * DESCRIPTION: Create a new Power_resource object and populate the fields * + * Power_resource (Name[0], System_level[1], Resource_order[2]) + * ****************************************************************************/ acpi_status acpi_ex_create_power_resource ( - acpi_parse_object *op, - acpi_namespace_node *power_node) + acpi_walk_state *walk_state) { + acpi_operand_object **operand = &walk_state->operands[0]; acpi_status status; - acpi_parse_object *arg; acpi_operand_object *obj_desc; - FUNCTION_TRACE_PTR ("Ex_create_power_resource", op); + FUNCTION_TRACE_PTR ("Ex_create_power_resource", walk_state); + + /* Create the power resource object */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_POWER); if (!obj_desc) { return_ACPI_STATUS (AE_NO_MEMORY); } - /* Install the new power resource object in the parent Node */ - - status = acpi_ns_attach_object (power_node, obj_desc, - (u8) ACPI_TYPE_POWER); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS(status); - } + /* Initialize the power object from the operands */ + obj_desc->power_resource.system_level = (u8) operand[1]->integer.value; + obj_desc->power_resource.resource_order = (u16) operand[2]->integer.value; - /* Get first arg and verify existence */ + /* Install the power resource object in the parent Node */ - arg = op->value.arg; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - /* First arg is the System_level */ - - obj_desc->power_resource.system_level = (u8) arg->value.integer; - - /* Get second arg and check existence */ - - arg = arg->next; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } + status = acpi_ns_attach_object ((acpi_namespace_node *) operand[0], + obj_desc, (u8) ACPI_TYPE_POWER); - /* Second arg is the PBlock Address */ - obj_desc->power_resource.resource_order = (u16) arg->value.integer; + /* Remove local reference to the object */ - return_ACPI_STATUS (AE_OK); + acpi_ut_remove_reference (obj_desc); + return_ACPI_STATUS (status); } @@ -651,7 +468,7 @@ * * FUNCTION: Acpi_ex_create_method * - * PARAMETERS: Aml_ptr - First byte of the method's AML + * PARAMETERS: Aml_start - First byte of the method's AML * Aml_length - AML byte count for this method * Method_flags - AML method flag byte * Method - Method Node @@ -664,16 +481,17 @@ acpi_status acpi_ex_create_method ( - u8 *aml_ptr, + u8 *aml_start, u32 aml_length, - u32 method_flags, - acpi_namespace_node *method) + acpi_walk_state *walk_state) { + acpi_operand_object **operand = &walk_state->operands[0]; acpi_operand_object *obj_desc; acpi_status status; + u8 method_flags; - FUNCTION_TRACE_PTR ("Ex_create_method", method); + FUNCTION_TRACE_PTR ("Ex_create_method", walk_state); /* Create a new method object */ @@ -683,18 +501,17 @@ return_ACPI_STATUS (AE_NO_MEMORY); } - /* Get the method's AML pointer/length from the Op */ + /* Save the method's AML pointer and length */ - obj_desc->method.pcode = aml_ptr; - obj_desc->method.pcode_length = aml_length; + obj_desc->method.aml_start = aml_start; + obj_desc->method.aml_length = aml_length; - /* - * First argument is the Method Flags (contains parameter count for the - * method) - */ - obj_desc->method.method_flags = (u8) method_flags; - obj_desc->method.param_count = (u8) (method_flags & - METHOD_FLAGS_ARG_COUNT); + /* disassemble the method flags */ + + method_flags = (u8) operand[1]->integer.value; + + obj_desc->method.method_flags = method_flags; + obj_desc->method.param_count = (u8) (method_flags & METHOD_FLAGS_ARG_COUNT); /* * Get the concurrency count. If required, a semaphore will be @@ -715,11 +532,16 @@ /* Attach the new object to the method Node */ - status = acpi_ns_attach_object (method, obj_desc, (u8) ACPI_TYPE_METHOD); - if (ACPI_FAILURE (status)) { - acpi_ut_delete_object_desc (obj_desc); - } + status = acpi_ns_attach_object ((acpi_namespace_node *) operand[0], + obj_desc, (u8) ACPI_TYPE_METHOD); + + /* Remove local reference to the object */ + + acpi_ut_remove_reference (obj_desc); + + /* Remove a reference to the operand */ + acpi_ut_remove_reference (operand[1]); return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exdump.c linux/drivers/acpi/executer/exdump.c --- v2.4.13/linux/drivers/acpi/executer/exdump.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exdump.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exdump - Interpreter debug output routines - * $Revision: 123 $ + * $Revision: 126 $ * *****************************************************************************/ @@ -46,12 +46,12 @@ * FUNCTION: Acpi_ex_show_hex_value * * PARAMETERS: Byte_count - Number of bytes to print (1, 2, or 4) - * *Aml_ptr - Address in AML stream of bytes to print + * *Aml_start - Address in AML stream of bytes to print * Interpreter_mode - Current running mode (load1/Load2/Exec) * Lead_space - # of spaces to print ahead of value * 0 => none ahead but one behind * - * DESCRIPTION: Print Byte_count byte(s) starting at Aml_ptr as a single + * DESCRIPTION: Print Byte_count byte(s) starting at Aml_start as a single * value, in hex. If Byte_count > 1 or the value printed is > 9, also * print in decimal. * @@ -60,7 +60,7 @@ void acpi_ex_show_hex_value ( u32 byte_count, - u8 *aml_ptr, + u8 *aml_start, u32 lead_space) { u32 value; /* Value retrieved from AML stream */ @@ -72,7 +72,7 @@ FUNCTION_TRACE ("Ex_show_hex_value"); - if (!aml_ptr) { + if (!aml_start) { REPORT_ERROR (("Ex_show_hex_value: null pointer\n")); } @@ -80,9 +80,9 @@ * AML numbers are always stored little-endian, * even if the processor is big-endian. */ - for (current_aml_ptr = aml_ptr + byte_count, + for (current_aml_ptr = aml_start + byte_count, value = 0; - current_aml_ptr > aml_ptr; ) { + current_aml_ptr > aml_start; ) { value = (value << 8) + (u32)* --current_aml_ptr; } @@ -96,14 +96,12 @@ length += 3 + acpi_ex_digits_needed (value, 10); } - ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "")); - for (length = lead_space; length; --length ) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " ")); } while (byte_count--) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, "%02x", *aml_ptr++)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, "%02x", *aml_start++)); if (byte_count) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " ")); @@ -111,7 +109,7 @@ } if (show_decimal_value) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " [%ld]", value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " [%d]", value)); } if (0 == lead_space) { @@ -163,12 +161,6 @@ return (AE_OK); } - if (acpi_tb_system_table_pointer (entry_desc)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%p is an AML pointer\n", - entry_desc)); - return (AE_OK); - } - if (!VALID_DESCRIPTOR_TYPE (entry_desc, ACPI_DESC_TYPE_INTERNAL)) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%p Is not a local object \n", entry_desc)); DUMP_BUFFER (entry_desc, sizeof (acpi_operand_object)); @@ -236,8 +228,9 @@ if (ACPI_TYPE_INTEGER == entry_desc->common.type) { /* Value is a Number */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%ld]", - entry_desc->integer.value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%8.8X%8.8x]", + HIDWORD(entry_desc->integer.value), + LODWORD(entry_desc->integer.value))); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); @@ -253,8 +246,9 @@ /* Value is a Number */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%ld]", - entry_desc->integer.value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%8.8X%8.8x]", + HIDWORD(entry_desc->integer.value), + LODWORD(entry_desc->integer.value))); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); @@ -262,7 +256,7 @@ case AML_INT_NAMEPATH_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference.Node->Name %x\n", + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference.Node->Name %X\n", entry_desc->reference.node->name)); break; @@ -297,8 +291,7 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Buffer Contents: ")); for (buf = entry_desc->buffer.pointer; length--; ++buf) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, - length ? " %02x" : " %02x", *buf)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " %02x", *buf)); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO,"\n")); } @@ -371,8 +364,10 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); } else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " base %p Length %X\n", - entry_desc->region.address, entry_desc->region.length)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " base %8.8X%8.8X Length %X\n", + HIDWORD(entry_desc->region.address), + LODWORD(entry_desc->region.address), + entry_desc->region.length)); } break; @@ -400,7 +395,7 @@ case INTERNAL_TYPE_REGION_FIELD: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, - "Region_field: bits=%X bitaccwidth=%X lock=%X update=%X at byte=%lX bit=%X of below:\n", + "Region_field: bits=%X bitaccwidth=%X lock=%X update=%X at byte=%X bit=%X of below:\n", entry_desc->field.bit_length, entry_desc->field.access_bit_width, entry_desc->field.lock_rule, entry_desc->field.update_rule, entry_desc->field.base_byte_offset, entry_desc->field.start_field_bit_offset)); @@ -417,7 +412,7 @@ case ACPI_TYPE_BUFFER_FIELD: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, - "Buffer_field: %X bits at byte %lX bit %X of \n", + "Buffer_field: %X bits at byte %X bit %X of \n", entry_desc->buffer_field.bit_length, entry_desc->buffer_field.base_byte_offset, entry_desc->buffer_field.start_field_bit_offset)); @@ -449,9 +444,9 @@ case ACPI_TYPE_METHOD: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, - "Method(%X) @ %p:%lX\n", + "Method(%X) @ %p:%X\n", entry_desc->method.param_count, - entry_desc->method.pcode, entry_desc->method.pcode_length)); + entry_desc->method.aml_start, entry_desc->method.aml_length)); break; @@ -608,7 +603,7 @@ } - acpi_os_printf ("%20s : %4.4s\n", "Name", &node->name); + acpi_os_printf ("%20s : %4.4s\n", "Name", (char*)&node->name); acpi_os_printf ("%20s : %s\n", "Type", acpi_ut_get_type_name (node->type)); acpi_os_printf ("%20s : %X\n", "Flags", node->flags); acpi_os_printf ("%20s : %X\n", "Owner Id", node->owner_id); @@ -730,8 +725,8 @@ acpi_os_printf ("%20s : %X\n", "Param_count", obj_desc->method.param_count); acpi_os_printf ("%20s : %X\n", "Concurrency", obj_desc->method.concurrency); acpi_os_printf ("%20s : %p\n", "Semaphore", obj_desc->method.semaphore); - acpi_os_printf ("%20s : %X\n", "Pcode_length", obj_desc->method.pcode_length); - acpi_os_printf ("%20s : %X\n", "Pcode", obj_desc->method.pcode); + acpi_os_printf ("%20s : %X\n", "Aml_length", obj_desc->method.aml_length); + acpi_os_printf ("%20s : %X\n", "Aml_start", obj_desc->method.aml_start); break; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exdyadic.c linux/drivers/acpi/executer/exdyadic.c --- v2.4.13/linux/drivers/acpi/executer/exdyadic.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exdyadic.c Wed Dec 31 16:00:00 1969 @@ -1,874 +0,0 @@ -/****************************************************************************** - * - * Module Name: exdyadic - ACPI AML execution for dyadic (2-operand) operators - * $Revision: 88 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * 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. - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "acpi.h" -#include "acparser.h" -#include "acnamesp.h" -#include "acinterp.h" -#include "acevents.h" -#include "amlcode.h" -#include "acdispat.h" - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("exdyadic") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_do_concatenate - * - * PARAMETERS: *Obj_desc - Object to be converted. Must be an - * Integer, Buffer, or String - * Walk_state - Current walk state - * - * RETURN: Status - * - * DESCRIPTION: Concatenate two objects OF THE SAME TYPE. - * - ******************************************************************************/ - -acpi_status -acpi_ex_do_concatenate ( - acpi_operand_object *obj_desc, - acpi_operand_object *obj_desc2, - acpi_operand_object **actual_ret_desc, - acpi_walk_state *walk_state) -{ - acpi_status status; - u32 i; - acpi_integer this_integer; - acpi_operand_object *ret_desc; - NATIVE_CHAR *new_buf; - u32 integer_size = sizeof (acpi_integer); - - - FUNCTION_ENTRY (); - - - /* - * There are three cases to handle: - * 1) Two Integers concatenated to produce a buffer - * 2) Two Strings concatenated to produce a string - * 3) Two Buffers concatenated to produce a buffer - */ - switch (obj_desc->common.type) { - case ACPI_TYPE_INTEGER: - - /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */ - - if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) { - /* - * We are running a method that exists in a 32-bit ACPI table. - * Truncate the value to 32 bits by zeroing out the upper - * 32-bit field - */ - integer_size = sizeof (u32); - } - - /* Result of two integers is a buffer */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - /* Need enough space for two integers */ - - ret_desc->buffer.length = integer_size * 2; - new_buf = ACPI_MEM_CALLOCATE (ret_desc->buffer.length); - if (!new_buf) { - REPORT_ERROR - (("Ex_do_concatenate: Buffer allocation failure\n")); - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->buffer.pointer = (u8 *) new_buf; - - /* Convert the first integer */ - - this_integer = obj_desc->integer.value; - for (i = 0; i < integer_size; i++) { - new_buf[i] = (u8) this_integer; - this_integer >>= 8; - } - - /* Convert the second integer */ - - this_integer = obj_desc2->integer.value; - for (; i < (integer_size * 2); i++) { - new_buf[i] = (u8) this_integer; - this_integer >>= 8; - } - - break; - - - case ACPI_TYPE_STRING: - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_STRING); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - /* Operand1 is string */ - - new_buf = ACPI_MEM_ALLOCATE (obj_desc->string.length + - obj_desc2->string.length + 1); - if (!new_buf) { - REPORT_ERROR - (("Ex_do_concatenate: String allocation failure\n")); - status = AE_NO_MEMORY; - goto cleanup; - } - - STRCPY (new_buf, obj_desc->string.pointer); - STRCPY (new_buf + obj_desc->string.length, - obj_desc2->string.pointer); - - /* Point the return object to the new string */ - - ret_desc->string.pointer = new_buf; - ret_desc->string.length = obj_desc->string.length += - obj_desc2->string.length; - break; - - - case ACPI_TYPE_BUFFER: - - /* Operand1 is a buffer */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - new_buf = ACPI_MEM_ALLOCATE (obj_desc->buffer.length + - obj_desc2->buffer.length); - if (!new_buf) { - REPORT_ERROR - (("Ex_do_concatenate: Buffer allocation failure\n")); - status = AE_NO_MEMORY; - goto cleanup; - } - - MEMCPY (new_buf, obj_desc->buffer.pointer, - obj_desc->buffer.length); - MEMCPY (new_buf + obj_desc->buffer.length, obj_desc2->buffer.pointer, - obj_desc2->buffer.length); - - /* - * Point the return object to the new buffer - */ - - ret_desc->buffer.pointer = (u8 *) new_buf; - ret_desc->buffer.length = obj_desc->buffer.length + - obj_desc2->buffer.length; - break; - - default: - status = AE_AML_INTERNAL; - ret_desc = NULL; - } - - - *actual_ret_desc = ret_desc; - return (AE_OK); - - -cleanup: - - acpi_ut_remove_reference (ret_desc); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_dyadic1 - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 1 dyadic operator with numeric operands: - * Notify_op - * - * ALLOCATION: Deletes both operands - * - ******************************************************************************/ - -acpi_status -acpi_ex_dyadic1 ( - u16 opcode, - acpi_walk_state *walk_state) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_namespace_node *node; - acpi_status status = AE_OK; - - - FUNCTION_TRACE_PTR ("Ex_dyadic1", WALK_OPERANDS); - - - /* Examine the opcode */ - - switch (opcode) { - - /* Def_notify := Notify_op (0)Notify_object (1)Notify_value */ - - case AML_NOTIFY_OP: - - /* The Obj_desc is actually an Node */ - - node = (acpi_namespace_node *) operand[0]; - operand[0] = NULL; - - /* Object must be a device or thermal zone */ - - if (node && operand[1]) { - switch (node->type) { - case ACPI_TYPE_DEVICE: - case ACPI_TYPE_THERMAL: - - /* - * Dispatch the notify to the appropriate handler - * NOTE: the request is queued for execution after this method - * completes. The notify handlers are NOT invoked synchronously - * from this thread -- because handlers may in turn run other - * control methods. - */ - status = acpi_ev_queue_notify_request (node, - (u32) operand[1]->integer.value); - break; - - default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unexpected notify object type %X\n", - operand[0]->common.type)); - - status = AE_AML_OPERAND_TYPE; - break; - } - } - break; - - default: - - REPORT_ERROR (("Acpi_ex_dyadic1: Unknown dyadic opcode %X\n", opcode)); - status = AE_AML_BAD_OPCODE; - } - - - /* Always delete both operands */ - - acpi_ut_remove_reference (operand[1]); - acpi_ut_remove_reference (operand[0]); - - - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_dyadic2_r - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * Return_desc - Where to store the return object - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 dyadic operator with numeric operands and - * one or two result operands. - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * - ******************************************************************************/ - -acpi_status -acpi_ex_dyadic2_r ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_operand_object *ret_desc2 = NULL; - acpi_status status = AE_OK; - - - FUNCTION_TRACE_U32 ("Ex_dyadic2_r", opcode); - - - /* Create an internal return object if necessary */ - - switch (opcode) { - case AML_ADD_OP: - case AML_BIT_AND_OP: - case AML_BIT_NAND_OP: - case AML_BIT_OR_OP: - case AML_BIT_NOR_OP: - case AML_BIT_XOR_OP: - case AML_DIVIDE_OP: - case AML_MOD_OP: - case AML_MULTIPLY_OP: - case AML_SHIFT_LEFT_OP: - case AML_SHIFT_RIGHT_OP: - case AML_SUBTRACT_OP: - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - break; - } - - - /* - * Execute the opcode - */ - switch (opcode) { - - /* Def_add := Add_op Operand1 Operand2 Result */ - - case AML_ADD_OP: - - ret_desc->integer.value = operand[0]->integer.value + - operand[1]->integer.value; - break; - - - /* Def_and := And_op Operand1 Operand2 Result */ - - case AML_BIT_AND_OP: - - ret_desc->integer.value = operand[0]->integer.value & - operand[1]->integer.value; - break; - - - /* Def_nAnd := NAnd_op Operand1 Operand2 Result */ - - case AML_BIT_NAND_OP: - - ret_desc->integer.value = ~(operand[0]->integer.value & - operand[1]->integer.value); - break; - - - /* Def_or := Or_op Operand1 Operand2 Result */ - - case AML_BIT_OR_OP: - - ret_desc->integer.value = operand[0]->integer.value | - operand[1]->integer.value; - break; - - - /* Def_nOr := NOr_op Operand1 Operand2 Result */ - - case AML_BIT_NOR_OP: - - ret_desc->integer.value = ~(operand[0]->integer.value | - operand[1]->integer.value); - break; - - - /* Def_xOr := XOr_op Operand1 Operand2 Result */ - - case AML_BIT_XOR_OP: - - ret_desc->integer.value = operand[0]->integer.value ^ - operand[1]->integer.value; - break; - - - /* Def_divide := Divide_op Dividend Divisor Remainder Quotient */ - - case AML_DIVIDE_OP: - - if (!operand[1]->integer.value) { - REPORT_ERROR - (("Divide_op: Divide by zero\n")); - - status = AE_AML_DIVIDE_BY_ZERO; - goto cleanup; - } - - ret_desc2 = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc2) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* Remainder (modulo) */ - - ret_desc->integer.value = ACPI_MODULO (operand[0]->integer.value, - operand[1]->integer.value); - - /* Result (what we used to call the quotient) */ - - ret_desc2->integer.value = ACPI_DIVIDE (operand[0]->integer.value, - operand[1]->integer.value); - break; - - - /* Def_mod := Mod_op Dividend Divisor Remainder */ - - case AML_MOD_OP: /* ACPI 2.0 */ - - if (!operand[1]->integer.value) { - REPORT_ERROR - (("Mod_op: Divide by zero\n")); - - status = AE_AML_DIVIDE_BY_ZERO; - goto cleanup; - } - - /* Remainder (modulo) */ - - ret_desc->integer.value = ACPI_MODULO (operand[0]->integer.value, - operand[1]->integer.value); - break; - - - /* Def_multiply := Multiply_op Operand1 Operand2 Result */ - - case AML_MULTIPLY_OP: - - ret_desc->integer.value = operand[0]->integer.value * - operand[1]->integer.value; - break; - - - /* Def_shift_left := Shift_left_op Operand Shift_count Result */ - - case AML_SHIFT_LEFT_OP: - - ret_desc->integer.value = operand[0]->integer.value << - operand[1]->integer.value; - break; - - - /* Def_shift_right := Shift_right_op Operand Shift_count Result */ - - case AML_SHIFT_RIGHT_OP: - - ret_desc->integer.value = operand[0]->integer.value >> - operand[1]->integer.value; - break; - - - /* Def_subtract := Subtract_op Operand1 Operand2 Result */ - - case AML_SUBTRACT_OP: - - ret_desc->integer.value = operand[0]->integer.value - - operand[1]->integer.value; - break; - - - /* Def_concat := Concat_op Data1 Data2 Result */ - - case AML_CONCAT_OP: - - /* - * Convert the second operand if necessary. The first operand - * determines the type of the second operand, (See the Data Types - * section of the ACPI specification.) Both object types are - * guaranteed to be either Integer/String/Buffer by the operand - * resolution mechanism above. - */ - switch (operand[0]->common.type) { - case ACPI_TYPE_INTEGER: - status = acpi_ex_convert_to_integer (operand[1], &operand[1], walk_state); - break; - - case ACPI_TYPE_STRING: - status = acpi_ex_convert_to_string (operand[1], &operand[1], 16, ACPI_UINT32_MAX, walk_state); - break; - - case ACPI_TYPE_BUFFER: - status = acpi_ex_convert_to_buffer (operand[1], &operand[1], walk_state); - break; - - default: - status = AE_AML_INTERNAL; - } - - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* - * Both operands are now known to be the same object type - * (Both are Integer, String, or Buffer), and we can now perform the - * concatenation. - */ - status = acpi_ex_do_concatenate (operand[0], operand[1], &ret_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - break; - - - /* Def_to_string := Buffer, Length, Result */ - - case AML_TO_STRING_OP: /* ACPI 2.0 */ - - status = acpi_ex_convert_to_string (operand[0], &ret_desc, 16, - (u32) operand[1]->integer.value, walk_state); - break; - - - /* Def_concat_res := Buffer, Buffer, Result */ - - case AML_CONCAT_RES_OP: /* ACPI 2.0 */ - - status = AE_NOT_IMPLEMENTED; - goto cleanup; - break; - - - default: - - REPORT_ERROR (("Acpi_ex_dyadic2_r: Unknown dyadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - /* - * Store the result of the operation (which is now in Operand[0]) into - * the result descriptor, or the location pointed to by the result - * descriptor (Operand[2]). - */ - status = acpi_ex_store (ret_desc, operand[2], walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - if (AML_DIVIDE_OP == opcode) { - status = acpi_ex_store (ret_desc2, operand[3], walk_state); - - /* - * Since the remainder is not returned, remove a reference to - * the object we created earlier - */ - acpi_ut_remove_reference (ret_desc); - *return_desc = ret_desc2; - } - - else { - *return_desc = ret_desc; - } - - -cleanup: - - /* Always delete the operands */ - - acpi_ut_remove_reference (operand[0]); - acpi_ut_remove_reference (operand[1]); - - - /* Delete return object on error */ - - if (ACPI_FAILURE (status)) { - /* On failure, delete the result ops */ - - acpi_ut_remove_reference (operand[2]); - acpi_ut_remove_reference (operand[3]); - - if (ret_desc) { - /* And delete the internal return object */ - - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - } - - /* Set the return object and exit */ - - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_dyadic2_s - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * Return_desc - Where to store the return object - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 dyadic synchronization operator - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * - ******************************************************************************/ - -acpi_status -acpi_ex_dyadic2_s ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_status status; - - - FUNCTION_TRACE_PTR ("Ex_dyadic2_s", WALK_OPERANDS); - - - /* Create the internal return object */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* Default return value is FALSE, operation did not time out */ - - ret_desc->integer.value = 0; - - - /* Examine the opcode */ - - switch (opcode) { - - /* Def_acquire := Acquire_op Mutex_object Timeout */ - - case AML_ACQUIRE_OP: - - status = acpi_ex_acquire_mutex (operand[1], operand[0], walk_state); - break; - - - /* Def_wait := Wait_op Acpi_event_object Timeout */ - - case AML_WAIT_OP: - - status = acpi_ex_system_wait_event (operand[1], operand[0]); - break; - - - default: - - REPORT_ERROR (("Acpi_ex_dyadic2_s: Unknown dyadic synchronization opcode %X\n", opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - /* - * Return a boolean indicating if operation timed out - * (TRUE) or not (FALSE) - */ - if (status == AE_TIME) { - ret_desc->integer.value = ACPI_INTEGER_MAX; /* TRUE, op timed out */ - status = AE_OK; - } - - -cleanup: - - /* Delete params */ - - acpi_ut_remove_reference (operand[1]); - acpi_ut_remove_reference (operand[0]); - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_dyadic2 - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * Return_desc - Where to store the return object - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 dyadic operator with numeric operands and - * no result operands - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * containing result value - * - ******************************************************************************/ - -acpi_status -acpi_ex_dyadic2 ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_status status = AE_OK; - u8 lboolean; - - - FUNCTION_TRACE_PTR ("Ex_dyadic2", WALK_OPERANDS); - - - /* Create the internal return object */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* - * Execute the Opcode - */ - lboolean = FALSE; - switch (opcode) { - - /* Def_lAnd := LAnd_op Operand1 Operand2 */ - - case AML_LAND_OP: - - lboolean = (u8) (operand[0]->integer.value && - operand[1]->integer.value); - break; - - - /* Def_lEqual := LEqual_op Operand1 Operand2 */ - - case AML_LEQUAL_OP: - - lboolean = (u8) (operand[0]->integer.value == - operand[1]->integer.value); - break; - - - /* Def_lGreater := LGreater_op Operand1 Operand2 */ - - case AML_LGREATER_OP: - - lboolean = (u8) (operand[0]->integer.value > - operand[1]->integer.value); - break; - - - /* Def_lLess := LLess_op Operand1 Operand2 */ - - case AML_LLESS_OP: - - lboolean = (u8) (operand[0]->integer.value < - operand[1]->integer.value); - break; - - - /* Def_lOr := LOr_op Operand1 Operand2 */ - - case AML_LOR_OP: - - lboolean = (u8) (operand[0]->integer.value || - operand[1]->integer.value); - break; - - - /* Def_copy := Source, Destination */ - - case AML_COPY_OP: /* ACPI 2.0 */ - - status = AE_NOT_IMPLEMENTED; - goto cleanup; - break; - - - default: - - REPORT_ERROR (("Acpi_ex_dyadic2: Unknown dyadic opcode %X\n", opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - break; - } - - - /* Set return value to logical TRUE (all ones) or FALSE (zero) */ - - if (lboolean) { - ret_desc->integer.value = ACPI_INTEGER_MAX; - } - else { - ret_desc->integer.value = 0; - } - - -cleanup: - - /* Always delete operands */ - - acpi_ut_remove_reference (operand[0]); - acpi_ut_remove_reference (operand[1]); - - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return_ACPI_STATUS (status); -} - - diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exfldio.c linux/drivers/acpi/executer/exfldio.c --- v2.4.13/linux/drivers/acpi/executer/exfldio.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exfldio.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exfldio - Aml Field I/O - * $Revision: 64 $ + * $Revision: 66 $ * *****************************************************************************/ @@ -71,7 +71,6 @@ return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } - /* * If the Region Address and Length have not been previously evaluated, * evaluate them now and save the results. @@ -84,7 +83,6 @@ } } - /* * Validate the request. The entire request from the byte offset for a * length of one field datum (access width) must fit within the region. @@ -158,7 +156,6 @@ *value = 0; - /* * Buffer_fields - Read from a Buffer * Other Fields - Read from a Operation Region. @@ -189,7 +186,6 @@ return_ACPI_STATUS (status); } - /* * The physical address of this field datum is: * @@ -201,13 +197,12 @@ address = rgn_desc->region.address + obj_desc->common_field.base_byte_offset + field_datum_byte_offset; - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Region %s(%X) width %X base:off %X:%X at %8.8lX%8.8lX\n", + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Region %s(%X) width %X base:off %X:%X at %8.8X%8.8X\n", acpi_ut_get_region_name (rgn_desc->region.space_id), rgn_desc->region.space_id, obj_desc->common_field.access_bit_width, obj_desc->common_field.base_byte_offset, field_datum_byte_offset, HIDWORD(address), LODWORD(address))); - /* Invoke the appropriate Address_space/Op_region handler */ status = acpi_ev_address_space_dispatch (rgn_desc, ACPI_READ_ADR_SPACE, @@ -235,7 +230,7 @@ } - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Returned value=%08lX \n", *value)); + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Returned value=%08X \n", *value)); return_ACPI_STATUS (status); } @@ -381,7 +376,6 @@ byte_field_length, datum_count, obj_desc->common_field.access_bit_width, obj_desc->common_field.access_byte_width)); - /* * Clear the caller's buffer (the whole buffer length as given) * This is very important, especially in the cases where a byte is read, @@ -485,7 +479,6 @@ } } - /* * Store the merged field datum in the caller's buffer, according to * the granularity of the field (size of each datum). @@ -501,7 +494,6 @@ datum_offset++; } - return_ACPI_STATUS (AE_OK); } @@ -576,7 +568,7 @@ field_datum_byte_offset; ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "Store %X in Region %s(%X) at %8.8lX%8.8lX width %X\n", + "Store %X in Region %s(%X) at %8.8X%8.8X width %X\n", value, acpi_ut_get_region_name (rgn_desc->region.space_id), rgn_desc->region.space_id, HIDWORD(address), LODWORD(address), obj_desc->common_field.access_bit_width)); @@ -612,7 +604,7 @@ } - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value written=%08lX \n", value)); + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value written=%08X \n", value)); return_ACPI_STATUS (status); } @@ -649,16 +641,13 @@ merged_value = field_value; - /* If the mask is all ones, we don't need to worry about the update rule */ if (mask != ACPI_UINT32_MAX) { /* Decode the update rule */ switch (obj_desc->common_field.update_rule) { - case UPDATE_PRESERVE: - /* * Check if update rule needs to be applied (not if mask is all * ones) The left shift drops the bits we want to ignore. @@ -772,7 +761,6 @@ byte_field_length, datum_count, obj_desc->common_field.access_bit_width, obj_desc->common_field.access_byte_width)); - /* * Break the request into up to three parts (similar to an I/O request): * 1) non-aligned part at start @@ -868,31 +856,34 @@ merged_datum = this_raw_datum; } - /* * Special handling for the last datum if the field does NOT end on * a datum boundary. Update Rule must be applied to the bits outside * the field. */ - if ((datum_offset == datum_count) && - obj_desc->common_field.end_field_valid_bits) { + if (datum_offset == datum_count) { /* - * Part3: - * This is the last datum and the field does not end on a datum boundary. - * Build the partial datum and write with the update rule. + * If there are dangling non-aligned bits, perform one more merged write + * Else - field is aligned at the end, no need for any more writes */ + if (obj_desc->common_field.end_field_valid_bits) { + /* + * Part3: + * This is the last datum and the field does not end on a datum boundary. + * Build the partial datum and write with the update rule. + * + * Mask off the unused bits above (after) the end-of-field + */ + mask = MASK_BITS_ABOVE (obj_desc->common_field.end_field_valid_bits); + merged_datum &= mask; - /* Mask off the unused bits above (after) the end-of-field */ - - mask = MASK_BITS_ABOVE (obj_desc->common_field.end_field_valid_bits); - merged_datum &= mask; - - /* Write the last datum with the update rule */ + /* Write the last datum with the update rule */ - status = acpi_ex_write_field_datum_with_update_rule (obj_desc, mask, - merged_datum, field_datum_byte_offset); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); + status = acpi_ex_write_field_datum_with_update_rule (obj_desc, mask, + merged_datum, field_datum_byte_offset); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } } } @@ -912,7 +903,6 @@ */ previous_raw_datum = this_raw_datum; } - return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exmisc.c linux/drivers/acpi/executer/exmisc.c --- v2.4.13/linux/drivers/acpi/executer/exmisc.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exmisc.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exmisc - ACPI AML (p-code) execution - specific opcodes - * $Revision: 83 $ + * $Revision: 92 $ * *****************************************************************************/ @@ -38,424 +38,403 @@ /******************************************************************************* * - * FUNCTION: Acpi_ex_triadic + * FUNCTION: Acpi_ex_get_object_reference * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * Return_desc - Where to store the return object + * PARAMETERS: Obj_desc - Create a reference to this object + * Return_desc - Where to store the reference * * RETURN: Status * - * DESCRIPTION: Execute Triadic operator (3 operands) - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack + * DESCRIPTION: Obtain and return a "reference" to the target object + * Common code for the Ref_of_op and the Cond_ref_of_op. * ******************************************************************************/ acpi_status -acpi_ex_triadic ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) +acpi_ex_get_object_reference ( + acpi_operand_object *obj_desc, + acpi_operand_object **return_desc, + acpi_walk_state *walk_state) { - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_operand_object *tmp_desc; - ACPI_SIGNAL_FATAL_INFO *fatal; acpi_status status = AE_OK; - FUNCTION_TRACE ("Ex_triadic"); - - -#define obj_desc1 operand[0] -#define obj_desc2 operand[1] -#define res_desc operand[2] - - - switch (opcode) { - - case AML_FATAL_OP: - - /* Def_fatal := Fatal_op Fatal_type Fatal_code Fatal_arg */ + FUNCTION_TRACE_PTR ("Ex_get_object_reference", obj_desc); - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "Fatal_op: Type %x Code %x Arg %x <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", - (u32) obj_desc1->integer.value, (u32) obj_desc2->integer.value, - (u32) res_desc->integer.value)); - - fatal = ACPI_MEM_ALLOCATE (sizeof (ACPI_SIGNAL_FATAL_INFO)); - if (fatal) { - fatal->type = (u32) obj_desc1->integer.value; - fatal->code = (u32) obj_desc2->integer.value; - fatal->argument = (u32) res_desc->integer.value; + if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) { + if (obj_desc->common.type != INTERNAL_TYPE_REFERENCE) { + *return_desc = NULL; + status = AE_TYPE; + goto cleanup; } /* - * Signal the OS + * Not a Name -- an indirect name pointer would have + * been converted to a direct name pointer in Acpi_ex_resolve_operands */ - acpi_os_signal (ACPI_SIGNAL_FATAL, fatal); - - /* Might return while OS is shutting down */ - - ACPI_MEM_FREE (fatal); - break; - + switch (obj_desc->reference.opcode) { + case AML_LOCAL_OP: + case AML_ARG_OP: - case AML_MID_OP: - - /* Def_mid := Mid_op Source Index Length Result */ - - /* Create the internal return object (string or buffer) */ - - break; - - - case AML_INDEX_OP: - - /* Def_index := Index_op Source Index Destination */ + *return_desc = (void *) acpi_ds_method_data_get_node (obj_desc->reference.opcode, + obj_desc->reference.offset, walk_state); + break; - /* Create the internal return object */ + default: - ret_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE); - if (!ret_desc) { - status = AE_NO_MEMORY; + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(Internal) Unknown Ref subtype %02x\n", + obj_desc->reference.opcode)); + *return_desc = NULL; + status = AE_AML_INTERNAL; goto cleanup; } - /* - * At this point, the Obj_desc1 operand is either a Package or a Buffer - */ - if (obj_desc1->common.type == ACPI_TYPE_PACKAGE) { - /* Object to be indexed is a Package */ + } - if (obj_desc2->integer.value >= obj_desc1->package.count) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value beyond package end\n")); - status = AE_AML_PACKAGE_LIMIT; - goto cleanup; - } - - if ((res_desc->common.type == INTERNAL_TYPE_REFERENCE) && - (res_desc->reference.opcode == AML_ZERO_OP)) { - /* - * There is no actual result descriptor (the Zero_op Result - * descriptor is a placeholder), so just delete the placeholder and - * return a reference to the package element - */ - acpi_ut_remove_reference (res_desc); - } - - else { - /* - * Each element of the package is an internal object. Get the one - * we are after. - */ - tmp_desc = obj_desc1->package.elements[obj_desc2->integer.value]; - ret_desc->reference.opcode = AML_INDEX_OP; - ret_desc->reference.target_type = tmp_desc->common.type; - ret_desc->reference.object = tmp_desc; - - status = acpi_ex_store (ret_desc, res_desc, walk_state); - ret_desc->reference.object = NULL; - } + else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { + /* Must be a named object; Just return the Node */ - /* - * The local return object must always be a reference to the package element, - * not the element itself. - */ - ret_desc->reference.opcode = AML_INDEX_OP; - ret_desc->reference.target_type = ACPI_TYPE_PACKAGE; - ret_desc->reference.where = &obj_desc1->package.elements[obj_desc2->integer.value]; - } - - else { - /* Object to be indexed is a Buffer */ - - if (obj_desc2->integer.value >= obj_desc1->buffer.length) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value beyond end of buffer\n")); - status = AE_AML_BUFFER_LIMIT; - goto cleanup; - } - - ret_desc->reference.opcode = AML_INDEX_OP; - ret_desc->reference.target_type = ACPI_TYPE_BUFFER_FIELD; - ret_desc->reference.object = obj_desc1; - ret_desc->reference.offset = (u32) obj_desc2->integer.value; + *return_desc = obj_desc; + } - status = acpi_ex_store (ret_desc, res_desc, walk_state); - } - break; + else { + *return_desc = NULL; + status = AE_TYPE; } cleanup: - /* Always delete operands */ - - acpi_ut_remove_reference (obj_desc1); - acpi_ut_remove_reference (obj_desc2); - - /* Delete return object on error */ - - if (ACPI_FAILURE (status)) { - acpi_ut_remove_reference (res_desc); - - if (ret_desc) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - } - - /* Set the return object and exit */ - - *return_desc = ret_desc; + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p Ref=%p\n", obj_desc, *return_desc)); return_ACPI_STATUS (status); } /******************************************************************************* * - * FUNCTION: Acpi_ex_hexadic + * FUNCTION: Acpi_ex_do_concatenate * - * PARAMETERS: Opcode - The opcode to be executed + * PARAMETERS: *Obj_desc - Object to be converted. Must be an + * Integer, Buffer, or String * Walk_state - Current walk state - * Return_desc - Where to store the return object * * RETURN: Status * - * DESCRIPTION: Execute Match operator + * DESCRIPTION: Concatenate two objects OF THE SAME TYPE. * ******************************************************************************/ acpi_status -acpi_ex_hexadic ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) +acpi_ex_do_concatenate ( + acpi_operand_object *obj_desc, + acpi_operand_object *obj_desc2, + acpi_operand_object **actual_return_desc, + acpi_walk_state *walk_state) { - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_status status = AE_OK; - u32 index; - u32 match_value = (u32) -1; + acpi_status status; + u32 i; + acpi_integer this_integer; + acpi_operand_object *return_desc; + NATIVE_CHAR *new_buf; + u32 integer_size = sizeof (acpi_integer); - FUNCTION_TRACE ("Ex_hexadic"); + FUNCTION_ENTRY (); -#define pkg_desc operand[0] -#define op1_desc operand[1] -#define V1_desc operand[2] -#define op2_desc operand[3] -#define V2_desc operand[4] -#define start_desc operand[5] + /* + * There are three cases to handle: + * 1) Two Integers concatenated to produce a buffer + * 2) Two Strings concatenated to produce a string + * 3) Two Buffers concatenated to produce a buffer + */ + switch (obj_desc->common.type) { + case ACPI_TYPE_INTEGER: - switch (opcode) { + /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */ - case AML_MATCH_OP: + if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) { + /* + * We are running a method that exists in a 32-bit ACPI table. + * Truncate the value to 32 bits by zeroing out the upper + * 32-bit field + */ + integer_size = sizeof (u32); + } - /* Validate match comparison sub-opcodes */ + /* Result of two integers is a buffer */ - if ((op1_desc->integer.value > MAX_MATCH_OPERATOR) || - (op2_desc->integer.value > MAX_MATCH_OPERATOR)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "operation encoding out of range\n")); - status = AE_AML_OPERAND_VALUE; - goto cleanup; + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER); + if (!return_desc) { + return (AE_NO_MEMORY); } - index = (u32) start_desc->integer.value; - if (index >= (u32) pkg_desc->package.count) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Start position value out of range\n")); - status = AE_AML_PACKAGE_LIMIT; + /* Need enough space for two integers */ + + return_desc->buffer.length = integer_size * 2; + new_buf = ACPI_MEM_CALLOCATE (return_desc->buffer.length); + if (!new_buf) { + REPORT_ERROR + (("Ex_do_concatenate: Buffer allocation failure\n")); + status = AE_NO_MEMORY; goto cleanup; } - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { + return_desc->buffer.pointer = (u8 *) new_buf; + + /* Convert the first integer */ + + this_integer = obj_desc->integer.value; + for (i = 0; i < integer_size; i++) { + new_buf[i] = (u8) this_integer; + this_integer >>= 8; + } + + /* Convert the second integer */ + + this_integer = obj_desc2->integer.value; + for (; i < (integer_size * 2); i++) { + new_buf[i] = (u8) this_integer; + this_integer >>= 8; + } + + break; + + + case ACPI_TYPE_STRING: + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_STRING); + if (!return_desc) { + return (AE_NO_MEMORY); + } + + /* Operand0 is string */ + + new_buf = ACPI_MEM_ALLOCATE (obj_desc->string.length + + obj_desc2->string.length + 1); + if (!new_buf) { + REPORT_ERROR + (("Ex_do_concatenate: String allocation failure\n")); status = AE_NO_MEMORY; goto cleanup; + } + + STRCPY (new_buf, obj_desc->string.pointer); + STRCPY (new_buf + obj_desc->string.length, + obj_desc2->string.pointer); + + /* Point the return object to the new string */ + + return_desc->string.pointer = new_buf; + return_desc->string.length = obj_desc->string.length += + obj_desc2->string.length; + break; + + + case ACPI_TYPE_BUFFER: + + /* Operand0 is a buffer */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER); + if (!return_desc) { + return (AE_NO_MEMORY); + } + new_buf = ACPI_MEM_ALLOCATE (obj_desc->buffer.length + + obj_desc2->buffer.length); + if (!new_buf) { + REPORT_ERROR + (("Ex_do_concatenate: Buffer allocation failure\n")); + status = AE_NO_MEMORY; + goto cleanup; } + MEMCPY (new_buf, obj_desc->buffer.pointer, + obj_desc->buffer.length); + MEMCPY (new_buf + obj_desc->buffer.length, obj_desc2->buffer.pointer, + obj_desc2->buffer.length); + /* - * Examine each element until a match is found. Within the loop, - * "continue" signifies that the current element does not match - * and the next should be examined. - * Upon finding a match, the loop will terminate via "break" at - * the bottom. If it terminates "normally", Match_value will be -1 - * (its initial value) indicating that no match was found. When - * returned as a Number, this will produce the Ones value as specified. + * Point the return object to the new buffer */ - for ( ; index < pkg_desc->package.count; ++index) { - /* - * Treat any NULL or non-numeric elements as non-matching. - * TBD [Unhandled] - if an element is a Name, - * should we examine its value? - */ - if (!pkg_desc->package.elements[index] || - ACPI_TYPE_INTEGER != pkg_desc->package.elements[index]->common.type) { - continue; - } - /* - * Within these switch statements: - * "break" (exit from the switch) signifies a match; - * "continue" (proceed to next iteration of enclosing - * "for" loop) signifies a non-match. - */ - switch (op1_desc->integer.value) { + return_desc->buffer.pointer = (u8 *) new_buf; + return_desc->buffer.length = obj_desc->buffer.length + + obj_desc2->buffer.length; + break; - case MATCH_MTR: /* always true */ - break; + default: + status = AE_AML_INTERNAL; + return_desc = NULL; + } - case MATCH_MEQ: /* true if equal */ + *actual_return_desc = return_desc; + return (AE_OK); - if (pkg_desc->package.elements[index]->integer.value - != V1_desc->integer.value) { - continue; - } - break; +cleanup: - case MATCH_MLE: /* true if less than or equal */ + acpi_ut_remove_reference (return_desc); + return (status); +} - if (pkg_desc->package.elements[index]->integer.value - > V1_desc->integer.value) { - continue; - } - break; +/******************************************************************************* + * + * FUNCTION: Acpi_ex_do_math_op + * + * PARAMETERS: Opcode - AML opcode + * Operand0 - Integer operand #0 + * Operand0 - Integer operand #1 + * + * RETURN: Integer result of the operation + * + * DESCRIPTION: Execute a math AML opcode. The purpose of having all of the + * math functions here is to prevent a lot of pointer dereferencing + * to obtain the operands. + * + ******************************************************************************/ - case MATCH_MLT: /* true if less than */ +acpi_integer +acpi_ex_do_math_op ( + u16 opcode, + acpi_integer operand0, + acpi_integer operand1) +{ - if (pkg_desc->package.elements[index]->integer.value - >= V1_desc->integer.value) { - continue; - } - break; + switch (opcode) { + case AML_ADD_OP: /* Add (Operand0, Operand1, Result) */ - case MATCH_MGE: /* true if greater than or equal */ + return (operand0 + operand1); - if (pkg_desc->package.elements[index]->integer.value - < V1_desc->integer.value) { - continue; - } - break; + case AML_BIT_AND_OP: /* And (Operand0, Operand1, Result) */ - case MATCH_MGT: /* true if greater than */ + return (operand0 & operand1); - if (pkg_desc->package.elements[index]->integer.value - <= V1_desc->integer.value) { - continue; - } - break; + case AML_BIT_NAND_OP: /* NAnd (Operand0, Operand1, Result) */ - default: /* undefined */ + return (~(operand0 & operand1)); - continue; - } + case AML_BIT_OR_OP: /* Or (Operand0, Operand1, Result) */ - switch(op2_desc->integer.value) { + return (operand0 | operand1); - case MATCH_MTR: - break; + case AML_BIT_NOR_OP: /* NOr (Operand0, Operand1, Result) */ + return (~(operand0 | operand1)); - case MATCH_MEQ: - if (pkg_desc->package.elements[index]->integer.value - != V2_desc->integer.value) { - continue; - } - break; + case AML_BIT_XOR_OP: /* XOr (Operand0, Operand1, Result) */ + return (operand0 ^ operand1); - case MATCH_MLE: - if (pkg_desc->package.elements[index]->integer.value - > V2_desc->integer.value) { - continue; - } - break; + case AML_MULTIPLY_OP: /* Multiply (Operand0, Operand1, Result) */ + return (operand0 * operand1); - case MATCH_MLT: - if (pkg_desc->package.elements[index]->integer.value - >= V2_desc->integer.value) { - continue; - } - break; + case AML_SHIFT_LEFT_OP: /* Shift_left (Operand, Shift_count, Result) */ + return (operand0 << operand1); - case MATCH_MGE: - if (pkg_desc->package.elements[index]->integer.value - < V2_desc->integer.value) { - continue; - } - break; + case AML_SHIFT_RIGHT_OP: /* Shift_right (Operand, Shift_count, Result) */ + return (operand0 >> operand1); - case MATCH_MGT: - if (pkg_desc->package.elements[index]->integer.value - <= V2_desc->integer.value) { - continue; - } - break; + case AML_SUBTRACT_OP: /* Subtract (Operand0, Operand1, Result) */ + return (operand0 - operand1); - default: + default: - continue; - } + return (0); + } +} - /* Match found: exit from loop */ - match_value = index; - break; +/******************************************************************************* + * + * FUNCTION: Acpi_ex_do_logical_op + * + * PARAMETERS: Opcode - AML opcode + * Operand0 - Integer operand #0 + * Operand0 - Integer operand #1 + * + * RETURN: TRUE/FALSE result of the operation + * + * DESCRIPTION: Execute a logical AML opcode. The purpose of having all of the + * functions here is to prevent a lot of pointer dereferencing + * to obtain the operands and to simplify the generation of the + * logical value. + * + * Note: cleanest machine code seems to be produced by the code + * below, rather than using statements of the form: + * Result = (Operand0 == Operand1); + * + ******************************************************************************/ + +u8 +acpi_ex_do_logical_op ( + u16 opcode, + acpi_integer operand0, + acpi_integer operand1) +{ + + + switch (opcode) { + + case AML_LAND_OP: /* LAnd (Operand0, Operand1) */ + + if (operand0 && operand1) { + return (TRUE); } + break; - /* Match_value is the return value */ - ret_desc->integer.value = match_value; + case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */ + + if (operand0 == operand1) { + return (TRUE); + } break; - } + case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */ -cleanup: + if (operand0 > operand1) { + return (TRUE); + } + break; - /* Free the operands */ - acpi_ut_remove_reference (start_desc); - acpi_ut_remove_reference (V2_desc); - acpi_ut_remove_reference (op2_desc); - acpi_ut_remove_reference (V1_desc); - acpi_ut_remove_reference (op1_desc); - acpi_ut_remove_reference (pkg_desc); - - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } + case AML_LLESS_OP: /* LLess (Operand0, Operand1) */ + if (operand0 < operand1) { + return (TRUE); + } + break; - /* Set the return object and exit */ - *return_desc = ret_desc; - return_ACPI_STATUS (status); + case AML_LOR_OP: /* LOr (Operand0, Operand1) */ + + if (operand0 || operand1) { + return (TRUE); + } + break; + } + + return (FALSE); } + + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exmonad.c linux/drivers/acpi/executer/exmonad.c --- v2.4.13/linux/drivers/acpi/executer/exmonad.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exmonad.c Wed Dec 31 16:00:00 1969 @@ -1,970 +0,0 @@ - -/****************************************************************************** - * - * Module Name: exmonad - ACPI AML execution for monadic (1 operand) operators - * $Revision: 111 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * 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. - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "acpi.h" -#include "acparser.h" -#include "acdispat.h" -#include "acinterp.h" -#include "amlcode.h" -#include "acnamesp.h" - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("exmonad") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_get_object_reference - * - * PARAMETERS: Obj_desc - Create a reference to this object - * Ret_desc - Where to store the reference - * - * RETURN: Status - * - * DESCRIPTION: Obtain and return a "reference" to the target object - * Common code for the Ref_of_op and the Cond_ref_of_op. - * - ******************************************************************************/ - -static acpi_status -acpi_ex_get_object_reference ( - acpi_operand_object *obj_desc, - acpi_operand_object **ret_desc, - acpi_walk_state *walk_state) -{ - acpi_status status = AE_OK; - - - FUNCTION_TRACE_PTR ("Ex_get_object_reference", obj_desc); - - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) { - if (obj_desc->common.type != INTERNAL_TYPE_REFERENCE) { - *ret_desc = NULL; - status = AE_TYPE; - goto cleanup; - } - - /* - * Not a Name -- an indirect name pointer would have - * been converted to a direct name pointer in Acpi_ex_resolve_operands - */ - switch (obj_desc->reference.opcode) { - case AML_LOCAL_OP: - case AML_ARG_OP: - - *ret_desc = (void *) acpi_ds_method_data_get_node (obj_desc->reference.opcode, - obj_desc->reference.offset, walk_state); - break; - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(Internal) Unknown Ref subtype %02x\n", - obj_desc->reference.opcode)); - *ret_desc = NULL; - status = AE_AML_INTERNAL; - goto cleanup; - } - - } - - else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* Must be a named object; Just return the Node */ - - *ret_desc = obj_desc; - } - - else { - *ret_desc = NULL; - status = AE_TYPE; - } - - -cleanup: - - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p Ref=%p\n", obj_desc, *ret_desc)); - return_ACPI_STATUS (status); -} - -#define obj_desc operand[0] -#define res_desc operand[1] - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_monadic1 - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 1 monadic operator with numeric operand on - * object stack - * - ******************************************************************************/ - -acpi_status -acpi_ex_monadic1 ( - u16 opcode, - acpi_walk_state *walk_state) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_status status; - - - FUNCTION_TRACE_PTR ("Ex_monadic1", WALK_OPERANDS); - - - /* Examine the opcode */ - - switch (opcode) { - - /* Def_release := Release_op Mutex_object */ - - case AML_RELEASE_OP: - - status = acpi_ex_release_mutex (obj_desc, walk_state); - break; - - - /* Def_reset := Reset_op Acpi_event_object */ - - case AML_RESET_OP: - - status = acpi_ex_system_reset_event (obj_desc); - break; - - - /* Def_signal := Signal_op Acpi_event_object */ - - case AML_SIGNAL_OP: - - status = acpi_ex_system_signal_event (obj_desc); - break; - - - /* Def_sleep := Sleep_op Msec_time */ - - case AML_SLEEP_OP: - - acpi_ex_system_do_suspend ((u32) obj_desc->integer.value); - break; - - - /* Def_stall := Stall_op Usec_time */ - - case AML_STALL_OP: - - acpi_ex_system_do_stall ((u32) obj_desc->integer.value); - break; - - - /* Unknown opcode */ - - default: - - REPORT_ERROR (("Acpi_ex_monadic1: Unknown monadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - break; - - } /* switch */ - - - /* Always delete the operand */ - - acpi_ut_remove_reference (obj_desc); - - return_ACPI_STATUS (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_monadic2_r - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 monadic operator with numeric operand and - * result operand on operand stack - * - ******************************************************************************/ - -acpi_status -acpi_ex_monadic2_r ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_operand_object *ret_desc2 = NULL; - u32 res_val; - acpi_status status = AE_OK; - u32 i; - u32 j; - acpi_integer digit; - - - FUNCTION_TRACE_PTR ("Ex_monadic2_r", WALK_OPERANDS); - - - /* Create a return object of type NUMBER for most opcodes */ - - switch (opcode) { - case AML_BIT_NOT_OP: - case AML_FIND_SET_LEFT_BIT_OP: - case AML_FIND_SET_RIGHT_BIT_OP: - case AML_FROM_BCD_OP: - case AML_TO_BCD_OP: - case AML_COND_REF_OF_OP: - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - break; - } - - - switch (opcode) { - /* Def_not := Not_op Operand Result */ - - case AML_BIT_NOT_OP: - - ret_desc->integer.value = ~obj_desc->integer.value; - break; - - - /* Def_find_set_left_bit := Find_set_left_bit_op Operand Result */ - - case AML_FIND_SET_LEFT_BIT_OP: - - ret_desc->integer.value = obj_desc->integer.value; - - /* - * Acpi specification describes Integer type as a little - * endian unsigned value, so this boundary condition is valid. - */ - for (res_val = 0; ret_desc->integer.value && res_val < ACPI_INTEGER_BIT_SIZE; ++res_val) { - ret_desc->integer.value >>= 1; - } - - ret_desc->integer.value = res_val; - break; - - - /* Def_find_set_right_bit := Find_set_right_bit_op Operand Result */ - - case AML_FIND_SET_RIGHT_BIT_OP: - - ret_desc->integer.value = obj_desc->integer.value; - - /* - * Acpi specification describes Integer type as a little - * endian unsigned value, so this boundary condition is valid. - */ - for (res_val = 0; ret_desc->integer.value && res_val < ACPI_INTEGER_BIT_SIZE; ++res_val) { - ret_desc->integer.value <<= 1; - } - - /* Since returns must be 1-based, subtract from 33 (65) */ - - ret_desc->integer.value = res_val == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - res_val; - break; - - - /* Def_from_bDC := From_bCDOp BCDValue Result */ - - case AML_FROM_BCD_OP: - - /* - * The 64-bit ACPI integer can hold 16 4-bit BCD integers - */ - ret_desc->integer.value = 0; - for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { - /* Get one BCD digit */ - - digit = (acpi_integer) ((obj_desc->integer.value >> (i * 4)) & 0xF); - - /* Check the range of the digit */ - - if (digit > 9) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "BCD digit too large: \n", - digit)); - status = AE_AML_NUMERIC_OVERFLOW; - goto cleanup; - } - - if (digit > 0) { - /* Sum into the result with the appropriate power of 10 */ - - for (j = 0; j < i; j++) { - digit *= 10; - } - - ret_desc->integer.value += digit; - } - } - break; - - - /* Def_to_bDC := To_bCDOp Operand Result */ - - case AML_TO_BCD_OP: - - - if (obj_desc->integer.value > ACPI_MAX_BCD_VALUE) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "BCD overflow: %d\n", - obj_desc->integer.value)); - status = AE_AML_NUMERIC_OVERFLOW; - goto cleanup; - } - - ret_desc->integer.value = 0; - for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { - /* Divide by nth factor of 10 */ - - digit = obj_desc->integer.value; - for (j = 0; j < i; j++) { - digit = ACPI_DIVIDE (digit, 10); - } - - /* Create the BCD digit */ - - if (digit > 0) { - ret_desc->integer.value += (ACPI_MODULO (digit, 10) << (i * 4)); - } - } - break; - - - /* Def_cond_ref_of := Cond_ref_of_op Source_object Result */ - - case AML_COND_REF_OF_OP: - - /* - * This op is a little strange because the internal return value is - * different than the return value stored in the result descriptor - * (There are really two return values) - */ - if ((acpi_namespace_node *) obj_desc == acpi_gbl_root_node) { - /* - * This means that the object does not exist in the namespace, - * return FALSE - */ - ret_desc->integer.value = 0; - - /* - * Must delete the result descriptor since there is no reference - * being returned - */ - acpi_ut_remove_reference (res_desc); - goto cleanup; - } - - /* Get the object reference and store it */ - - status = acpi_ex_get_object_reference (obj_desc, &ret_desc2, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - status = acpi_ex_store (ret_desc2, res_desc, walk_state); - - /* The object exists in the namespace, return TRUE */ - - ret_desc->integer.value = ACPI_INTEGER_MAX; - goto cleanup; - break; - - - case AML_STORE_OP: - - /* - * A store operand is typically a number, string, buffer or lvalue - * TBD: [Unhandled] What about a store to a package? - */ - - /* - * Do the store, and be careful about deleting the source object, - * since the object itself may have been stored. - */ - status = acpi_ex_store (obj_desc, res_desc, walk_state); - if (ACPI_FAILURE (status)) { - /* On failure, just delete the Obj_desc */ - - acpi_ut_remove_reference (obj_desc); - return_ACPI_STATUS (status); - } - - /* - * Normally, we would remove a reference on the Obj_desc parameter; - * But since it is being used as the internal return object - * (meaning we would normally increment it), the two cancel out, - * and we simply don't do anything. - */ - *return_desc = obj_desc; - return_ACPI_STATUS (status); - break; - - - case AML_DEBUG_OP: - - /* Reference, returning an Reference */ - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Debug_op should never get here!\n")); - return_ACPI_STATUS (AE_OK); - break; - - - /* - * ACPI 2.0 Opcodes - */ - case AML_TO_DECSTRING_OP: - status = acpi_ex_convert_to_string (obj_desc, &ret_desc, 10, ACPI_UINT32_MAX, walk_state); - break; - - - case AML_TO_HEXSTRING_OP: - status = acpi_ex_convert_to_string (obj_desc, &ret_desc, 16, ACPI_UINT32_MAX, walk_state); - break; - - case AML_TO_BUFFER_OP: - status = acpi_ex_convert_to_buffer (obj_desc, &ret_desc, walk_state); - break; - - case AML_TO_INTEGER_OP: - status = acpi_ex_convert_to_integer (obj_desc, &ret_desc, walk_state); - break; - - - /* - * These are obsolete opcodes - */ - - /* Def_shift_left_bit := Shift_left_bit_op Source Bit_num */ - /* Def_shift_right_bit := Shift_right_bit_op Source Bit_num */ - - case AML_SHIFT_LEFT_BIT_OP: - case AML_SHIFT_RIGHT_BIT_OP: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s is unimplemented\n", - acpi_ps_get_opcode_name (opcode))); - status = AE_SUPPORT; - goto cleanup; - break; - - - default: - - REPORT_ERROR (("Acpi_ex_monadic2_r: Unknown monadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - status = acpi_ex_store (ret_desc, res_desc, walk_state); - - -cleanup: - /* Always delete the operand object */ - - acpi_ut_remove_reference (obj_desc); - - /* Delete return object(s) on error */ - - if (ACPI_FAILURE (status)) { - acpi_ut_remove_reference (res_desc); /* Result descriptor */ - if (ret_desc) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - } - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_monadic2 - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 monadic operator with numeric operand: - * Deref_of_op, Ref_of_op, Size_of_op, Type_op, Increment_op, - * Decrement_op, LNot_op, - * - ******************************************************************************/ - -acpi_status -acpi_ex_monadic2 ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *tmp_desc; - acpi_operand_object *ret_desc = NULL; - acpi_status status = AE_OK; - u32 type; - acpi_integer value; - - - FUNCTION_TRACE_PTR ("Ex_monadic2", WALK_OPERANDS); - - - /* Get the operand and decode the opcode */ - - switch (opcode) { - - /* Def_lNot := LNot_op Operand */ - - case AML_LNOT_OP: - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->integer.value = !obj_desc->integer.value; - break; - - - /* Def_decrement := Decrement_op Target */ - /* Def_increment := Increment_op Target */ - - case AML_DECREMENT_OP: - case AML_INCREMENT_OP: - - /* - * Since we are expecting an Reference on the top of the stack, it - * can be either an Node or an internal object. - * - * TBD: [Future] This may be the prototype code for all cases where - * a Reference is expected!! 10/99 - */ - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - ret_desc = obj_desc; - } - - else { - /* - * Duplicate the Reference in a new object so that we can resolve it - * without destroying the original Reference object - */ - ret_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->reference.opcode = obj_desc->reference.opcode; - ret_desc->reference.offset = obj_desc->reference.offset; - ret_desc->reference.object = obj_desc->reference.object; - } - - - /* - * Convert the Ret_desc Reference to a Number - * (This deletes the original Ret_desc) - */ - status = acpi_ex_resolve_operands (AML_LNOT_OP, &ret_desc, walk_state); - if (ACPI_FAILURE (status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s: bad operand(s) %s\n", - acpi_ps_get_opcode_name (opcode), acpi_format_exception(status))); - - goto cleanup; - } - - /* Do the actual increment or decrement */ - - if (AML_INCREMENT_OP == opcode) { - ret_desc->integer.value++; - } - else { - ret_desc->integer.value--; - } - - /* Store the result back in the original descriptor */ - - status = acpi_ex_store (ret_desc, obj_desc, walk_state); - - /* Objdesc was just deleted (because it is an Reference) */ - - obj_desc = NULL; - - break; - - - /* Def_object_type := Object_type_op Source_object */ - - case AML_TYPE_OP: - - if (INTERNAL_TYPE_REFERENCE == obj_desc->common.type) { - /* - * Not a Name -- an indirect name pointer would have - * been converted to a direct name pointer in Resolve_operands - */ - switch (obj_desc->reference.opcode) { - case AML_ZERO_OP: - case AML_ONE_OP: - case AML_ONES_OP: - case AML_REVISION_OP: - - /* Constants are of type Number */ - - type = ACPI_TYPE_INTEGER; - break; - - - case AML_DEBUG_OP: - - /* Per 1.0b spec, Debug object is of type Debug_object */ - - type = ACPI_TYPE_DEBUG_OBJECT; - break; - - - case AML_INDEX_OP: - - /* Get the type of this reference (index into another object) */ - - type = obj_desc->reference.target_type; - if (type == ACPI_TYPE_PACKAGE) { - /* - * The main object is a package, we want to get the type - * of the individual package element that is referenced by - * the index. - */ - type = (*(obj_desc->reference.where))->common.type; - } - - break; - - - case AML_LOCAL_OP: - case AML_ARG_OP: - - type = acpi_ds_method_data_get_type (obj_desc->reference.opcode, - obj_desc->reference.offset, walk_state); - break; - - - default: - - REPORT_ERROR (("Acpi_ex_monadic2/Type_op: Internal error - Unknown Reference subtype %X\n", - obj_desc->reference.opcode)); - status = AE_AML_INTERNAL; - goto cleanup; - } - } - - else { - /* - * It's not a Reference, so it must be a direct name pointer. - */ - type = acpi_ns_get_type ((acpi_namespace_node *) obj_desc); - - /* Convert internal types to external types */ - - switch (type) { - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: - - type = ACPI_TYPE_FIELD_UNIT; - } - - } - - /* Allocate a descriptor to hold the type. */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->integer.value = type; - break; - - - /* Def_size_of := Size_of_op Source_object */ - - case AML_SIZE_OF_OP: - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - obj_desc = acpi_ns_get_attached_object ((acpi_namespace_node *) obj_desc); - } - - if (!obj_desc) { - value = 0; - } - - else { - switch (obj_desc->common.type) { - - case ACPI_TYPE_BUFFER: - - value = obj_desc->buffer.length; - break; - - - case ACPI_TYPE_STRING: - - value = obj_desc->string.length; - break; - - - case ACPI_TYPE_PACKAGE: - - value = obj_desc->package.count; - break; - - case INTERNAL_TYPE_REFERENCE: - - value = 4; - break; - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Not Buf/Str/Pkg - found type %X\n", - obj_desc->common.type)); - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - } - - /* - * Now that we have the size of the object, create a result - * object to hold the value - */ - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->integer.value = value; - break; - - - /* Def_ref_of := Ref_of_op Source_object */ - - case AML_REF_OF_OP: - - status = acpi_ex_get_object_reference (obj_desc, &ret_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - break; - - - /* Def_deref_of := Deref_of_op Obj_reference */ - - case AML_DEREF_OF_OP: - - - /* Check for a method local or argument */ - - if (!VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* - * Must resolve/dereference the local/arg reference first - */ - switch (obj_desc->reference.opcode) { - /* Set Obj_desc to the value of the local/arg */ - - case AML_LOCAL_OP: - case AML_ARG_OP: - - acpi_ds_method_data_get_value (obj_desc->reference.opcode, - obj_desc->reference.offset, walk_state, &tmp_desc); - - /* - * Delete our reference to the input object and - * point to the object just retrieved - */ - acpi_ut_remove_reference (obj_desc); - obj_desc = tmp_desc; - break; - - default: - - /* Index op - handled below */ - break; - } - } - - - /* Obj_desc may have changed from the code above */ - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* Get the actual object from the Node (This is the dereference) */ - - ret_desc = ((acpi_namespace_node *) obj_desc)->object; - - /* Returning a pointer to the object, add another reference! */ - - acpi_ut_add_reference (ret_desc); - } - - else { - /* - * This must be a reference object produced by the Index - * ASL operation -- check internal opcode - */ - if ((obj_desc->reference.opcode != AML_INDEX_OP) && - (obj_desc->reference.opcode != AML_REF_OF_OP)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown opcode in ref(%p) - %X\n", - obj_desc, obj_desc->reference.opcode)); - - status = AE_TYPE; - goto cleanup; - } - - - switch (obj_desc->reference.opcode) { - case AML_INDEX_OP: - - /* - * Supported target types for the Index operator are - * 1) A Buffer - * 2) A Package - */ - if (obj_desc->reference.target_type == ACPI_TYPE_BUFFER_FIELD) { - /* - * The target is a buffer, we must create a new object that - * contains one element of the buffer, the element pointed - * to by the index. - * - * NOTE: index into a buffer is NOT a pointer to a - * sub-buffer of the main buffer, it is only a pointer to a - * single element (byte) of the buffer! - */ - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - tmp_desc = obj_desc->reference.object; - ret_desc->integer.value = - tmp_desc->buffer.pointer[obj_desc->reference.offset]; - - /* TBD: [Investigate] (see below) Don't add an additional - * ref! - */ - } - - else if (obj_desc->reference.target_type == ACPI_TYPE_PACKAGE) { - /* - * The target is a package, we want to return the referenced - * element of the package. We must add another reference to - * this object, however. - */ - ret_desc = *(obj_desc->reference.where); - if (!ret_desc) { - /* - * We can't return a NULL dereferenced value. This is - * an uninitialized package element and is thus a - * severe error. - */ - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "NULL package element obj %p\n", - obj_desc)); - status = AE_AML_UNINITIALIZED_ELEMENT; - goto cleanup; - } - - acpi_ut_add_reference (ret_desc); - } - - else { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Target_type %X in obj %p\n", - obj_desc->reference.target_type, obj_desc)); - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - - break; - - - case AML_REF_OF_OP: - - ret_desc = obj_desc->reference.object; - - /* Add another reference to the object! */ - - acpi_ut_add_reference (ret_desc); - break; - } - } - - break; - - - default: - - REPORT_ERROR (("Acpi_ex_monadic2: Unknown monadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - -cleanup: - - if (obj_desc) { - acpi_ut_remove_reference (obj_desc); - } - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - - *return_desc = ret_desc; - return_ACPI_STATUS (status); -} - diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exoparg1.c linux/drivers/acpi/executer/exoparg1.c --- v2.4.13/linux/drivers/acpi/executer/exoparg1.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/executer/exoparg1.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,878 @@ + +/****************************************************************************** + * + * Module Name: exoparg1 - AML execution - opcodes with 1 argument + * $Revision: 120 $ + * + *****************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * 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. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" +#include "acparser.h" +#include "acdispat.h" +#include "acinterp.h" +#include "amlcode.h" +#include "acnamesp.h" + + +#define _COMPONENT ACPI_EXECUTER + MODULE_NAME ("exoparg1") + + +/*! + * Naming convention for AML interpreter execution routines. + * + * The routines that begin execution of AML opcodes are named with a common + * convention based upon the number of arguments, the number of target operands, + * and whether or not a value is returned: + * + * AcpiExOpcode_xA_yT_zR + * + * Where: + * + * xA - ARGUMENTS: The number of arguments (input operands) that are + * required for this opcode type (1 through 6 args). + * yT - TARGETS: The number of targets (output operands) that are required + * for this opcode type (0, 1, or 2 targets). + * zR - RETURN VALUE: Indicates whether this opcode type returns a value + * as the function return (0 or 1). + * + * The AcpiExOpcode* functions are called via the Dispatcher component with + * fully resolved operands. +!*/ + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_1A_0T_0R + * + * PARAMETERS: Walk_state - Current state (contains AML opcode) + * + * RETURN: Status + * + * DESCRIPTION: Execute Type 1 monadic operator with numeric operand on + * object stack + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_1A_0T_0R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_status status = AE_OK; + + + FUNCTION_TRACE_STR ("Ex_opcode_1A_0T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Examine the opcode */ + + switch (walk_state->opcode) { + case AML_RELEASE_OP: /* Release (Mutex_object) */ + + status = acpi_ex_release_mutex (operand[0], walk_state); + break; + + + case AML_RESET_OP: /* Reset (Event_object) */ + + status = acpi_ex_system_reset_event (operand[0]); + break; + + + case AML_SIGNAL_OP: /* Signal (Event_object) */ + + status = acpi_ex_system_signal_event (operand[0]); + break; + + + case AML_SLEEP_OP: /* Sleep (Msec_time) */ + + acpi_ex_system_do_suspend ((u32) operand[0]->integer.value); + break; + + + case AML_STALL_OP: /* Stall (Usec_time) */ + + acpi_ex_system_do_stall ((u32) operand[0]->integer.value); + break; + + + case AML_UNLOAD_OP: /* Unload (Handle) */ + + status = acpi_ex_unload_table (operand[0]); + break; + + + default: /* Unknown opcode */ + + REPORT_ERROR (("Acpi_ex_opcode_1A_0T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + break; + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_1A_1T_0R + * + * PARAMETERS: Walk_state - Current state (contains AML opcode) + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with one argument, one target, and no + * return value. + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_1A_1T_0R ( + acpi_walk_state *walk_state) +{ + acpi_status status = AE_OK; + acpi_operand_object **operand = &walk_state->operands[0]; + + + FUNCTION_TRACE_STR ("Ex_opcode_1A_1T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + switch (walk_state->opcode) { + + case AML_LOAD_OP: + + status = acpi_ex_load_op (operand[0], operand[1]); + break; + + default: /* Unknown opcode */ + + REPORT_ERROR (("Acpi_ex_opcode_1A_1T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + } + + +cleanup: + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_1A_1T_1R + * + * PARAMETERS: Walk_state - Current state (contains AML opcode) + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with one argument, one target, and a + * return value. + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_1A_1T_1R ( + acpi_walk_state *walk_state) +{ + acpi_status status = AE_OK; + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + acpi_operand_object *return_desc2 = NULL; + u32 temp32; + u32 i; + u32 j; + acpi_integer digit; + + + FUNCTION_TRACE_STR ("Ex_opcode_1A_1T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Create a return object of type Integer for most opcodes */ + + switch (walk_state->opcode) { + case AML_BIT_NOT_OP: + case AML_FIND_SET_LEFT_BIT_OP: + case AML_FIND_SET_RIGHT_BIT_OP: + case AML_FROM_BCD_OP: + case AML_TO_BCD_OP: + case AML_COND_REF_OF_OP: + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + break; + } + + + switch (walk_state->opcode) { + + case AML_BIT_NOT_OP: /* Not (Operand, Result) */ + + return_desc->integer.value = ~operand[0]->integer.value; + break; + + + case AML_FIND_SET_LEFT_BIT_OP: /* Find_set_left_bit (Operand, Result) */ + + + return_desc->integer.value = operand[0]->integer.value; + + /* + * Acpi specification describes Integer type as a little + * endian unsigned value, so this boundary condition is valid. + */ + for (temp32 = 0; return_desc->integer.value && temp32 < ACPI_INTEGER_BIT_SIZE; ++temp32) { + return_desc->integer.value >>= 1; + } + + return_desc->integer.value = temp32; + break; + + + case AML_FIND_SET_RIGHT_BIT_OP: /* Find_set_right_bit (Operand, Result) */ + + + return_desc->integer.value = operand[0]->integer.value; + + /* + * The Acpi specification describes Integer type as a little + * endian unsigned value, so this boundary condition is valid. + */ + for (temp32 = 0; return_desc->integer.value && temp32 < ACPI_INTEGER_BIT_SIZE; ++temp32) { + return_desc->integer.value <<= 1; + } + + /* Since the bit position is one-based, subtract from 33 (65) */ + + return_desc->integer.value = temp32 == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - temp32; + break; + + + case AML_FROM_BCD_OP: /* From_bcd (BCDValue, Result) */ + + /* + * The 64-bit ACPI integer can hold 16 4-bit BCD integers + */ + return_desc->integer.value = 0; + for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { + /* Get one BCD digit */ + + digit = (acpi_integer) ((operand[0]->integer.value >> (i * 4)) & 0xF); + + /* Check the range of the digit */ + + if (digit > 9) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "BCD digit too large: %d\n", + (u32) digit)); + status = AE_AML_NUMERIC_OVERFLOW; + goto cleanup; + } + + if (digit > 0) { + /* Sum into the result with the appropriate power of 10 */ + + for (j = 0; j < i; j++) { + digit *= 10; + } + + return_desc->integer.value += digit; + } + } + break; + + + case AML_TO_BCD_OP: /* To_bcd (Operand, Result) */ + + if (operand[0]->integer.value > ACPI_MAX_BCD_VALUE) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "BCD overflow: %8.8X%8.8X\n", + HIDWORD(operand[0]->integer.value), LODWORD(operand[0]->integer.value))); + status = AE_AML_NUMERIC_OVERFLOW; + goto cleanup; + } + + return_desc->integer.value = 0; + for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { + /* Divide by nth factor of 10 */ + + temp32 = 0; + digit = operand[0]->integer.value; + for (j = 0; j < i; j++) { + acpi_ut_short_divide (&digit, 10, &digit, &temp32); + } + + /* Create the BCD digit from the remainder above */ + + if (digit > 0) { + return_desc->integer.value += (temp32 << (i * 4)); + } + } + break; + + + case AML_COND_REF_OF_OP: /* Cond_ref_of (Source_object, Result) */ + + /* + * This op is a little strange because the internal return value is + * different than the return value stored in the result descriptor + * (There are really two return values) + */ + if ((acpi_namespace_node *) operand[0] == acpi_gbl_root_node) { + /* + * This means that the object does not exist in the namespace, + * return FALSE + */ + return_desc->integer.value = 0; + + /* + * Must delete the result descriptor since there is no reference + * being returned + */ + acpi_ut_remove_reference (operand[1]); + goto cleanup; + } + + /* Get the object reference and store it */ + + status = acpi_ex_get_object_reference (operand[0], &return_desc2, walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + status = acpi_ex_store (return_desc2, operand[1], walk_state); + + /* The object exists in the namespace, return TRUE */ + + return_desc->integer.value = ACPI_INTEGER_MAX; + goto cleanup; + break; + + + case AML_STORE_OP: /* Store (Source, Target) */ + + /* + * A store operand is typically a number, string, buffer or lvalue + * Be careful about deleting the source object, + * since the object itself may have been stored. + */ + status = acpi_ex_store (operand[0], operand[1], walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + /* + * Normally, we would remove a reference on the Operand[0] parameter; + * But since it is being used as the internal return object + * (meaning we would normally increment it), the two cancel out, + * and we simply don't do anything. + */ + walk_state->result_obj = operand[0]; + walk_state->operands[0] = NULL; /* Prevent deletion */ + return_ACPI_STATUS (status); + break; + + + /* + * ACPI 2.0 Opcodes + */ + case AML_COPY_OP: /* Copy (Source, Target) */ + + status = AE_NOT_IMPLEMENTED; + goto cleanup; + break; + + + case AML_TO_DECSTRING_OP: /* To_decimal_string (Data, Result) */ + + status = acpi_ex_convert_to_string (operand[0], &return_desc, 10, ACPI_UINT32_MAX, walk_state); + break; + + + case AML_TO_HEXSTRING_OP: /* To_hex_string (Data, Result) */ + + status = acpi_ex_convert_to_string (operand[0], &return_desc, 16, ACPI_UINT32_MAX, walk_state); + break; + + + case AML_TO_BUFFER_OP: /* To_buffer (Data, Result) */ + + status = acpi_ex_convert_to_buffer (operand[0], &return_desc, walk_state); + break; + + + case AML_TO_INTEGER_OP: /* To_integer (Data, Result) */ + + status = acpi_ex_convert_to_integer (operand[0], &return_desc, walk_state); + break; + + + /* + * These are two obsolete opcodes + */ + case AML_SHIFT_LEFT_BIT_OP: /* Shift_left_bit (Source, Bit_num) */ + case AML_SHIFT_RIGHT_BIT_OP: /* Shift_right_bit (Source, Bit_num) */ + + + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s is obsolete and not implemented\n", + acpi_ps_get_opcode_name (walk_state->opcode))); + status = AE_SUPPORT; + goto cleanup; + break; + + + default: /* Unknown opcode */ + + REPORT_ERROR (("Acpi_ex_opcode_1A_1T_1R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + } + + + /* + * Store the return value computed above into the target object + */ + status = acpi_ex_store (return_desc, operand[1], walk_state); + + +cleanup: + + walk_state->result_obj = return_desc; + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_1A_0T_1R + * + * PARAMETERS: Walk_state - Current state (contains AML opcode) + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with one argument, no target, and a return value + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_1A_0T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *temp_desc; + acpi_operand_object *return_desc = NULL; + acpi_status status = AE_OK; + u32 type; + acpi_integer value; + + + FUNCTION_TRACE_STR ("Ex_opcode_1A_0T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Get the operand and decode the opcode */ + + switch (walk_state->opcode) { + + case AML_LNOT_OP: /* LNot (Operand) */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc->integer.value = !operand[0]->integer.value; + break; + + + case AML_DECREMENT_OP: /* Decrement (Operand) */ + case AML_INCREMENT_OP: /* Increment (Operand) */ + + /* + * Since we are expecting a Reference operand, it + * can be either a Node or an internal object. + */ + return_desc = operand[0]; + if (VALID_DESCRIPTOR_TYPE (operand[0], ACPI_DESC_TYPE_INTERNAL)) { + /* Internal reference object - prevent deletion */ + + acpi_ut_add_reference (return_desc); + } + + /* + * Convert the Return_desc Reference to a Number + * (This removes a reference on the Return_desc object) + */ + status = acpi_ex_resolve_operands (AML_LNOT_OP, &return_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))); + + goto cleanup; + } + + /* + * Return_desc is now guaranteed to be an Integer object + * Do the actual increment or decrement + */ + if (AML_INCREMENT_OP == walk_state->opcode) { + return_desc->integer.value++; + } + else { + return_desc->integer.value--; + } + + /* Store the result back in the original descriptor */ + + status = acpi_ex_store (return_desc, operand[0], walk_state); + break; + + + case AML_TYPE_OP: /* Object_type (Source_object) */ + + if (INTERNAL_TYPE_REFERENCE == operand[0]->common.type) { + /* + * Not a Name -- an indirect name pointer would have + * been converted to a direct name pointer in Resolve_operands + */ + switch (operand[0]->reference.opcode) { + case AML_ZERO_OP: + case AML_ONE_OP: + case AML_ONES_OP: + case AML_REVISION_OP: + + /* Constants are of type Integer */ + + type = ACPI_TYPE_INTEGER; + break; + + + case AML_DEBUG_OP: + + /* Per 1.0b spec, Debug object is of type "Debug_object" */ + + type = ACPI_TYPE_DEBUG_OBJECT; + break; + + + case AML_INDEX_OP: + + /* Get the type of this reference (index into another object) */ + + type = operand[0]->reference.target_type; + if (type == ACPI_TYPE_PACKAGE) { + /* + * The main object is a package, we want to get the type + * of the individual package element that is referenced by + * the index. + */ + type = (*(operand[0]->reference.where))->common.type; + } + + break; + + + case AML_LOCAL_OP: + case AML_ARG_OP: + + type = acpi_ds_method_data_get_type (operand[0]->reference.opcode, + operand[0]->reference.offset, walk_state); + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_1A_0T_1R/Type_op: Internal error - Unknown Reference subtype %X\n", + operand[0]->reference.opcode)); + status = AE_AML_INTERNAL; + goto cleanup; + } + } + + else { + /* + * It's not a Reference, so it must be a direct name pointer. + */ + type = acpi_ns_get_type ((acpi_namespace_node *) operand[0]); + + /* Convert internal types to external types */ + + switch (type) { + case INTERNAL_TYPE_REGION_FIELD: + case INTERNAL_TYPE_BANK_FIELD: + case INTERNAL_TYPE_INDEX_FIELD: + + type = ACPI_TYPE_FIELD_UNIT; + } + + } + + /* Allocate a descriptor to hold the type. */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc->integer.value = type; + break; + + + case AML_SIZE_OF_OP: /* Size_of (Source_object) */ + + temp_desc = operand[0]; + if (VALID_DESCRIPTOR_TYPE (operand[0], ACPI_DESC_TYPE_NAMED)) { + temp_desc = acpi_ns_get_attached_object ((acpi_namespace_node *) operand[0]); + } + + if (!temp_desc) { + value = 0; + } + + else { + switch (temp_desc->common.type) { + case ACPI_TYPE_BUFFER: + value = temp_desc->buffer.length; + break; + + case ACPI_TYPE_STRING: + value = temp_desc->string.length; + break; + + case ACPI_TYPE_PACKAGE: + value = temp_desc->package.count; + break; + + case INTERNAL_TYPE_REFERENCE: + + /* TBD: this must be a reference to a buf/str/pkg?? */ + + value = 4; + break; + + default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Not Buf/Str/Pkg - found type %X\n", + temp_desc->common.type)); + status = AE_AML_OPERAND_TYPE; + goto cleanup; + } + } + + /* + * Now that we have the size of the object, create a result + * object to hold the value + */ + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc->integer.value = value; + break; + + + case AML_REF_OF_OP: /* Ref_of (Source_object) */ + + status = acpi_ex_get_object_reference (operand[0], &return_desc, walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + break; + + + case AML_DEREF_OF_OP: /* Deref_of (Obj_reference) */ + + /* Check for a method local or argument */ + + if (!VALID_DESCRIPTOR_TYPE (operand[0], ACPI_DESC_TYPE_NAMED)) { + /* + * Must resolve/dereference the local/arg reference first + */ + switch (operand[0]->reference.opcode) { + /* Set Operand[0] to the value of the local/arg */ + + case AML_LOCAL_OP: + case AML_ARG_OP: + + acpi_ds_method_data_get_value (operand[0]->reference.opcode, + operand[0]->reference.offset, walk_state, &temp_desc); + + /* + * Delete our reference to the input object and + * point to the object just retrieved + */ + acpi_ut_remove_reference (operand[0]); + operand[0] = temp_desc; + break; + + default: + + /* Index op - handled below */ + break; + } + } + + + /* Operand[0] may have changed from the code above */ + + if (VALID_DESCRIPTOR_TYPE (operand[0], ACPI_DESC_TYPE_NAMED)) { + /* Get the actual object from the Node (This is the dereference) */ + + return_desc = ((acpi_namespace_node *) operand[0])->object; + + /* Returning a pointer to the object, add another reference! */ + + acpi_ut_add_reference (return_desc); + } + + else { + /* + * This must be a reference object produced by the Index + * ASL operation -- check internal opcode + */ + if ((operand[0]->reference.opcode != AML_INDEX_OP) && + (operand[0]->reference.opcode != AML_REF_OF_OP)) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown opcode in ref(%p) - %X\n", + operand[0], operand[0]->reference.opcode)); + + status = AE_TYPE; + goto cleanup; + } + + + switch (operand[0]->reference.opcode) { + case AML_INDEX_OP: + + /* + * Supported target types for the Index operator are + * 1) A Buffer + * 2) A Package + */ + if (operand[0]->reference.target_type == ACPI_TYPE_BUFFER_FIELD) { + /* + * The target is a buffer, we must create a new object that + * contains one element of the buffer, the element pointed + * to by the index. + * + * NOTE: index into a buffer is NOT a pointer to a + * sub-buffer of the main buffer, it is only a pointer to a + * single element (byte) of the buffer! + */ + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + temp_desc = operand[0]->reference.object; + return_desc->integer.value = + temp_desc->buffer.pointer[operand[0]->reference.offset]; + + /* TBD: [Investigate] (see below) Don't add an additional + * ref! + */ + } + + else if (operand[0]->reference.target_type == ACPI_TYPE_PACKAGE) { + /* + * The target is a package, we want to return the referenced + * element of the package. We must add another reference to + * this object, however. + */ + return_desc = *(operand[0]->reference.where); + if (!return_desc) { + /* + * We can't return a NULL dereferenced value. This is + * an uninitialized package element and is thus a + * severe error. + */ + + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "NULL package element obj %p\n", + operand[0])); + status = AE_AML_UNINITIALIZED_ELEMENT; + goto cleanup; + } + + acpi_ut_add_reference (return_desc); + } + + else { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Target_type %X in obj %p\n", + operand[0]->reference.target_type, operand[0])); + status = AE_AML_OPERAND_TYPE; + goto cleanup; + } + + break; + + + case AML_REF_OF_OP: + + return_desc = operand[0]->reference.object; + + /* Add another reference to the object! */ + + acpi_ut_add_reference (return_desc); + break; + } + } + + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_1A_0T_1R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + } + + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + walk_state->result_obj = return_desc; + return_ACPI_STATUS (status); +} + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exoparg2.c linux/drivers/acpi/executer/exoparg2.c --- v2.4.13/linux/drivers/acpi/executer/exoparg2.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/executer/exoparg2.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,564 @@ +/****************************************************************************** + * + * Module Name: exoparg2 - AML execution - opcodes with 2 arguments + * $Revision: 97 $ + * + *****************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * 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. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" +#include "acparser.h" +#include "acnamesp.h" +#include "acinterp.h" +#include "acevents.h" +#include "amlcode.h" +#include "acdispat.h" + + +#define _COMPONENT ACPI_EXECUTER + MODULE_NAME ("exoparg2") + + +/*! + * Naming convention for AML interpreter execution routines. + * + * The routines that begin execution of AML opcodes are named with a common + * convention based upon the number of arguments, the number of target operands, + * and whether or not a value is returned: + * + * AcpiExOpcode_xA_yT_zR + * + * Where: + * + * xA - ARGUMENTS: The number of arguments (input operands) that are + * required for this opcode type (1 through 6 args). + * yT - TARGETS: The number of targets (output operands) that are required + * for this opcode type (0, 1, or 2 targets). + * zR - RETURN VALUE: Indicates whether this opcode type returns a value + * as the function return (0 or 1). + * + * The AcpiExOpcode* functions are called via the Dispatcher component with + * fully resolved operands. +!*/ + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_2A_0T_0R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with two arguments, no target, and no return + * value. + * + * ALLOCATION: Deletes both operands + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_2A_0T_0R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_namespace_node *node; + acpi_status status = AE_OK; + + + FUNCTION_TRACE_STR ("Ex_opcode_2A_0T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Examine the opcode */ + + switch (walk_state->opcode) { + + case AML_NOTIFY_OP: /* Notify (Notify_object, Notify_value) */ + + /* The first operand is a namespace node */ + + node = (acpi_namespace_node *) operand[0]; + + /* The node must refer to a device or thermal zone */ + + if (node && operand[1]) /* TBD: is this check necessary? */ { + switch (node->type) { + case ACPI_TYPE_DEVICE: + case ACPI_TYPE_THERMAL: + + /* + * Dispatch the notify to the appropriate handler + * NOTE: the request is queued for execution after this method + * completes. The notify handlers are NOT invoked synchronously + * from this thread -- because handlers may in turn run other + * control methods. + */ + status = acpi_ev_queue_notify_request (node, + (u32) operand[1]->integer.value); + break; + + default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unexpected notify object type %X\n", + node->type)); + + status = AE_AML_OPERAND_TYPE; + break; + } + } + break; + + default: + + REPORT_ERROR (("Acpi_ex_opcode_2A_0T_0R: Unknown opcode %X\n", walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_2A_2T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute a dyadic operator (2 operands) with 2 output targets + * and one implicit return value. + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_2A_2T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc1 = NULL; + acpi_operand_object *return_desc2 = NULL; + acpi_status status; + + + FUNCTION_TRACE_STR ("Ex_opcode_2A_2T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* + * Execute the opcode + */ + switch (walk_state->opcode) { + case AML_DIVIDE_OP: /* Divide (Dividend, Divisor, Remainder_result Quotient_result) */ + + return_desc1 = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc1) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc2 = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc2) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* Quotient to Return_desc1, remainder to Return_desc2 */ + + status = acpi_ut_divide (&operand[0]->integer.value, &operand[1]->integer.value, + &return_desc1->integer.value, &return_desc2->integer.value); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_2A_2T_1R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + + /* Store the results to the target reference operands */ + + status = acpi_ex_store (return_desc2, operand[2], walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + status = acpi_ex_store (return_desc1, operand[3], walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + /* Return the remainder */ + + walk_state->result_obj = return_desc1; + + +cleanup: + /* + * Since the remainder is not returned indirectly, remove a reference to + * it. Only the quotient is returned indirectly. + */ + acpi_ut_remove_reference (return_desc2); + + if (ACPI_FAILURE (status)) { + /* Delete the return object */ + + acpi_ut_remove_reference (return_desc1); + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_2A_1T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with two arguments, one target, and a return + * value. + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_2A_1T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + acpi_operand_object *temp_desc; + u32 index; + acpi_status status = AE_OK; + + + FUNCTION_TRACE_STR ("Ex_opcode_2A_1T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* + * Execute the opcode + */ + if (walk_state->op_info->flags & AML_MATH) { + /* All simple math opcodes (add, etc.) */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc->integer.value = acpi_ex_do_math_op (walk_state->opcode, + operand[0]->integer.value, + operand[1]->integer.value); + goto store_result_to_target; + } + + + switch (walk_state->opcode) { + case AML_MOD_OP: /* Mod (Dividend, Divisor, Remainder_result (ACPI 2.0) */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* Return_desc will contain the remainder */ + + status = acpi_ut_divide (&operand[0]->integer.value, &operand[1]->integer.value, + NULL, &return_desc->integer.value); + + break; + + + case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */ + + /* + * Convert the second operand if necessary. The first operand + * determines the type of the second operand, (See the Data Types + * section of the ACPI specification.) Both object types are + * guaranteed to be either Integer/String/Buffer by the operand + * resolution mechanism above. + */ + switch (operand[0]->common.type) { + case ACPI_TYPE_INTEGER: + status = acpi_ex_convert_to_integer (operand[1], &operand[1], walk_state); + break; + + case ACPI_TYPE_STRING: + status = acpi_ex_convert_to_string (operand[1], &operand[1], 16, ACPI_UINT32_MAX, walk_state); + break; + + case ACPI_TYPE_BUFFER: + status = acpi_ex_convert_to_buffer (operand[1], &operand[1], walk_state); + break; + + default: + status = AE_AML_INTERNAL; + } + + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + /* + * Both operands are now known to be the same object type + * (Both are Integer, String, or Buffer), and we can now perform the + * concatenation. + */ + status = acpi_ex_do_concatenate (operand[0], operand[1], &return_desc, walk_state); + break; + + + case AML_TO_STRING_OP: /* To_string (Buffer, Length, Result) (ACPI 2.0) */ + + status = acpi_ex_convert_to_string (operand[0], &return_desc, 16, + (u32) operand[1]->integer.value, walk_state); + break; + + + case AML_CONCAT_RES_OP: /* Concatenate_res_template (Buffer, Buffer, Result) (ACPI 2.0) */ + + status = AE_NOT_IMPLEMENTED; + break; + + + case AML_INDEX_OP: /* Index (Source Index Result) */ + + /* Create the internal return object */ + + return_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + index = (u32) operand[1]->integer.value; + + /* + * At this point, the Source operand is either a Package or a Buffer + */ + if (operand[0]->common.type == ACPI_TYPE_PACKAGE) { + /* Object to be indexed is a Package */ + + if (index >= operand[0]->package.count) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value beyond package end\n")); + status = AE_AML_PACKAGE_LIMIT; + goto cleanup; + } + + if ((operand[2]->common.type == INTERNAL_TYPE_REFERENCE) && + (operand[2]->reference.opcode == AML_ZERO_OP)) { + /* + * There is no actual result descriptor (the Zero_op Result + * descriptor is a placeholder), so just delete the placeholder and + * return a reference to the package element + */ + acpi_ut_remove_reference (operand[2]); + } + + else { + /* + * Each element of the package is an internal object. Get the one + * we are after. + */ + temp_desc = operand[0]->package.elements [index]; + return_desc->reference.opcode = AML_INDEX_OP; + return_desc->reference.target_type = temp_desc->common.type; + return_desc->reference.object = temp_desc; + + status = acpi_ex_store (return_desc, operand[2], walk_state); + return_desc->reference.object = NULL; + } + + /* + * The local return object must always be a reference to the package element, + * not the element itself. + */ + return_desc->reference.opcode = AML_INDEX_OP; + return_desc->reference.target_type = ACPI_TYPE_PACKAGE; + return_desc->reference.where = &operand[0]->package.elements [index]; + } + + else { + /* Object to be indexed is a Buffer */ + + if (index >= operand[0]->buffer.length) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value beyond end of buffer\n")); + status = AE_AML_BUFFER_LIMIT; + goto cleanup; + } + + return_desc->reference.opcode = AML_INDEX_OP; + return_desc->reference.target_type = ACPI_TYPE_BUFFER_FIELD; + return_desc->reference.object = operand[0]; + return_desc->reference.offset = index; + + status = acpi_ex_store (return_desc, operand[2], walk_state); + } + + walk_state->result_obj = return_desc; + goto cleanup; + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_2A_1T_1R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + break; + } + + +store_result_to_target: + + if (ACPI_SUCCESS (status)) { + /* + * Store the result of the operation (which is now in Return_desc) into + * the Target descriptor. + */ + status = acpi_ex_store (return_desc, operand[2], walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + walk_state->result_obj = return_desc; + } + + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_2A_0T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with 2 arguments, no target, and a return value + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_2A_0T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + acpi_status status = AE_OK; + u8 logical_result = FALSE; + + + FUNCTION_TRACE_STR ("Ex_opcode_2A_0T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Create the internal return object */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* + * Execute the Opcode + */ + if (walk_state->op_info->flags & AML_LOGICAL) /* Logical_op (Operand0, Operand1) */ { + logical_result = acpi_ex_do_logical_op (walk_state->opcode, + operand[0]->integer.value, + operand[1]->integer.value); + goto store_logical_result; + } + + + switch (walk_state->opcode) { + case AML_ACQUIRE_OP: /* Acquire (Mutex_object, Timeout) */ + + status = acpi_ex_acquire_mutex (operand[1], operand[0], walk_state); + if (status == AE_TIME) { + logical_result = TRUE; /* TRUE = Acquire timed out */ + status = AE_OK; + } + break; + + + case AML_WAIT_OP: /* Wait (Event_object, Timeout) */ + + status = acpi_ex_system_wait_event (operand[1], operand[0]); + if (status == AE_TIME) { + logical_result = TRUE; /* TRUE, Wait timed out */ + status = AE_OK; + } + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_2A_0T_1R: Unknown opcode %X\n", walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + +store_logical_result: + /* + * Set return value to according to Logical_result. logical TRUE (all ones) + * Default is FALSE (zero) + */ + if (logical_result) { + return_desc->integer.value = ACPI_INTEGER_MAX; + } + + walk_state->result_obj = return_desc; + + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + return_ACPI_STATUS (status); +} + + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exoparg3.c linux/drivers/acpi/executer/exoparg3.c --- v2.4.13/linux/drivers/acpi/executer/exoparg3.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/executer/exoparg3.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,235 @@ + +/****************************************************************************** + * + * Module Name: exoparg3 - AML execution - opcodes with 3 arguments + * $Revision: 3 $ + * + *****************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * 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. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" +#include "acinterp.h" +#include "acparser.h" +#include "amlcode.h" + + +#define _COMPONENT ACPI_EXECUTER + MODULE_NAME ("exoparg3") + + +/*! + * Naming convention for AML interpreter execution routines. + * + * The routines that begin execution of AML opcodes are named with a common + * convention based upon the number of arguments, the number of target operands, + * and whether or not a value is returned: + * + * AcpiExOpcode_xA_yT_zR + * + * Where: + * + * xA - ARGUMENTS: The number of arguments (input operands) that are + * required for this opcode type (1 through 6 args). + * yT - TARGETS: The number of targets (output operands) that are required + * for this opcode type (0, 1, or 2 targets). + * zR - RETURN VALUE: Indicates whether this opcode type returns a value + * as the function return (0 or 1). + * + * The AcpiExOpcode* functions are called via the Dispatcher component with + * fully resolved operands. +!*/ + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_3A_0T_0R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute Triadic operator (3 operands) + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_3A_0T_0R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + ACPI_SIGNAL_FATAL_INFO *fatal; + acpi_status status = AE_OK; + + + FUNCTION_TRACE_STR ("Ex_opcode_3A_0T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + switch (walk_state->opcode) { + + case AML_FATAL_OP: /* Fatal (Fatal_type Fatal_code Fatal_arg) */ + + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "Fatal_op: Type %x Code %x Arg %x <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", + (u32) operand[0]->integer.value, (u32) operand[1]->integer.value, + (u32) operand[2]->integer.value)); + + + fatal = ACPI_MEM_ALLOCATE (sizeof (ACPI_SIGNAL_FATAL_INFO)); + if (fatal) { + fatal->type = (u32) operand[0]->integer.value; + fatal->code = (u32) operand[1]->integer.value; + fatal->argument = (u32) operand[2]->integer.value; + } + + /* + * Always signal the OS! + */ + acpi_os_signal (ACPI_SIGNAL_FATAL, fatal); + + /* Might return while OS is shutting down, just continue */ + + ACPI_MEM_FREE (fatal); + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + +cleanup: + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_3A_1T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute Triadic operator (3 operands) + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_3A_1T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + char *buffer; + acpi_status status = AE_OK; + u32 index; + u32 length; + + + FUNCTION_TRACE_STR ("Ex_opcode_3A_1T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + switch (walk_state->opcode) { + case AML_MID_OP: /* Mid (Source[0], Index[1], Length[2], Result[3]) */ + + /* + * Create the return object. The Source operand is guaranteed to be + * either a String or a Buffer, so just use its type. + */ + return_desc = acpi_ut_create_internal_object (operand[0]->common.type); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* Get the Integer values from the objects */ + + index = (u32) operand[1]->integer.value; + length = (u32) operand[2]->integer.value; + + /* + * If the index is beyond the length of the String/Buffer, or if the + * requested length is zero, return a zero-length String/Buffer + */ + if ((index < operand[0]->string.length) && + (length > 0)) { + /* Truncate request if larger than the actual String/Buffer */ + + if ((index + length) > + operand[0]->string.length) { + length = operand[0]->string.length - index; + } + + /* Allocate a new buffer for the String/Buffer */ + + buffer = ACPI_MEM_CALLOCATE (length + 1); + if (!buffer) { + return (AE_NO_MEMORY); + } + + /* Copy the portion requested */ + + MEMCPY (buffer, operand[0]->string.pointer + index, + length); + + /* Set the length of the new String/Buffer */ + + return_desc->string.pointer = buffer; + return_desc->string.length = length; + } + + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + /* Store the result in the target */ + + status = acpi_ex_store (return_desc, operand[3], walk_state); + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + /* Set the return object and exit */ + + walk_state->result_obj = return_desc; + return_ACPI_STATUS (status); +} + + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exoparg6.c linux/drivers/acpi/executer/exoparg6.c --- v2.4.13/linux/drivers/acpi/executer/exoparg6.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/executer/exoparg6.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,276 @@ + +/****************************************************************************** + * + * Module Name: exoparg6 - AML execution - opcodes with 6 arguments + * $Revision: 4 $ + * + *****************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * 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. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" +#include "acinterp.h" +#include "acparser.h" +#include "amlcode.h" + + +#define _COMPONENT ACPI_EXECUTER + MODULE_NAME ("exoparg6") + + +/*! + * Naming convention for AML interpreter execution routines. + * + * The routines that begin execution of AML opcodes are named with a common + * convention based upon the number of arguments, the number of target operands, + * and whether or not a value is returned: + * + * AcpiExOpcode_xA_yT_zR + * + * Where: + * + * xA - ARGUMENTS: The number of arguments (input operands) that are + * required for this opcode type (1 through 6 args). + * yT - TARGETS: The number of targets (output operands) that are required + * for this opcode type (0, 1, or 2 targets). + * zR - RETURN VALUE: Indicates whether this opcode type returns a value + * as the function return (0 or 1). + * + * The AcpiExOpcode* functions are called via the Dispatcher component with + * fully resolved operands. +!*/ + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_do_match + * + * PARAMETERS: Match_op - The AML match operand + * Package_value - Value from the target package + * Match_value - Value to be matched + * + * RETURN: TRUE if the match is successful, FALSE otherwise + * + * DESCRIPTION: Implements the low-level match for the ASL Match operator + * + ******************************************************************************/ + +u8 +acpi_ex_do_match ( + u32 match_op, + acpi_integer package_value, + acpi_integer match_value) +{ + + switch (match_op) { + case MATCH_MTR: /* always true */ + + break; + + + case MATCH_MEQ: /* true if equal */ + + if (package_value != match_value) { + return (FALSE); + } + break; + + + case MATCH_MLE: /* true if less than or equal */ + + if (package_value > match_value) { + return (FALSE); + } + break; + + + case MATCH_MLT: /* true if less than */ + + if (package_value >= match_value) { + return (FALSE); + } + break; + + + case MATCH_MGE: /* true if greater than or equal */ + + if (package_value < match_value) { + return (FALSE); + } + break; + + + case MATCH_MGT: /* true if greater than */ + + if (package_value <= match_value) { + return (FALSE); + } + break; + + + default: /* undefined */ + + return (FALSE); + } + + + return TRUE; +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_6A_0T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with 6 arguments, no target, and a return value + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_6A_0T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + acpi_status status = AE_OK; + u32 index; + acpi_operand_object *this_element; + + + FUNCTION_TRACE_STR ("Ex_opcode_6A_0T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + switch (walk_state->opcode) { + case AML_MATCH_OP: + /* + * Match (Search_package[0], Match_op1[1], Match_object1[2], + * Match_op2[3], Match_object2[4], Start_index[5]) + */ + + /* Validate match comparison sub-opcodes */ + + if ((operand[1]->integer.value > MAX_MATCH_OPERATOR) || + (operand[3]->integer.value > MAX_MATCH_OPERATOR)) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "operation encoding out of range\n")); + status = AE_AML_OPERAND_VALUE; + goto cleanup; + } + + index = (u32) operand[5]->integer.value; + if (index >= (u32) operand[0]->package.count) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index beyond package end\n")); + status = AE_AML_PACKAGE_LIMIT; + goto cleanup; + } + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + + } + + /* Default return value if no match found */ + + return_desc->integer.value = ACPI_INTEGER_MAX; + + /* + * Examine each element until a match is found. Within the loop, + * "continue" signifies that the current element does not match + * and the next should be examined. + * Upon finding a match, the loop will terminate via "break" at + * the bottom. If it terminates "normally", Match_value will be -1 + * (its initial value) indicating that no match was found. When + * returned as a Number, this will produce the Ones value as specified. + */ + for ( ; index < operand[0]->package.count; index++) { + this_element = operand[0]->package.elements[index]; + + /* + * Treat any NULL or non-numeric elements as non-matching. + * TBD [Unhandled] - if an element is a Name, + * should we examine its value? + */ + if (!this_element || + this_element->common.type != ACPI_TYPE_INTEGER) { + continue; + } + + + /* + * Within these switch statements: + * "break" (exit from the switch) signifies a match; + * "continue" (proceed to next iteration of enclosing + * "for" loop) signifies a non-match. + */ + if (!acpi_ex_do_match ((u32) operand[1]->integer.value, + this_element->integer.value, operand[2]->integer.value)) { + continue; + } + + + if (!acpi_ex_do_match ((u32) operand[3]->integer.value, + this_element->integer.value, operand[4]->integer.value)) { + continue; + } + + /* Match found: Index is the return value */ + + return_desc->integer.value = index; + break; + } + + break; + + + case AML_LOAD_TABLE_OP: + + status = AE_NOT_IMPLEMENTED; + goto cleanup; + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + + walk_state->result_obj = return_desc; + + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + return_ACPI_STATUS (status); +} diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exprep.c linux/drivers/acpi/executer/exprep.c --- v2.4.13/linux/drivers/acpi/executer/exprep.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exprep.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exprep - ACPI AML (p-code) execution - field prep utilities - * $Revision: 95 $ + * $Revision: 99 $ * *****************************************************************************/ @@ -243,7 +243,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ex_prep_region_field_value + * FUNCTION: Acpi_ex_prep_field_value * * PARAMETERS: Node - Owning Node * Region_node - Region in which field is being defined @@ -253,280 +253,128 @@ * * RETURN: Status * - * DESCRIPTION: Construct an acpi_operand_object of type Def_field and + * DESCRIPTION: Construct an acpi_operand_object of type Def_field and * connect it to the parent Node. * ******************************************************************************/ acpi_status -acpi_ex_prep_region_field_value ( - acpi_namespace_node *node, - acpi_handle region_node, - u8 field_flags, - u32 field_bit_position, - u32 field_bit_length) +acpi_ex_prep_field_value ( + ACPI_CREATE_FIELD_INFO *info) { acpi_operand_object *obj_desc; u32 type; acpi_status status; - FUNCTION_TRACE ("Ex_prep_region_field_value"); + FUNCTION_TRACE ("Ex_prep_field_value"); /* Parameter validation */ - if (!region_node) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Region_node\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } + if (info->field_type != INTERNAL_TYPE_INDEX_FIELD) { + if (!info->region_node) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Region_node\n")); + 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))); - type = acpi_ns_get_type (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))); - return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + } } - /* Allocate a new object */ + /* Allocate a new region object */ - obj_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REGION_FIELD); + obj_desc = acpi_ut_create_internal_object (info->field_type); if (!obj_desc) { return_ACPI_STATUS (AE_NO_MEMORY); } - - /* Obj_desc and Region valid */ - - DUMP_OPERANDS ((acpi_operand_object **) &node, IMODE_EXECUTE, - "Ex_prep_region_field_value", 1, "case Region_field"); - DUMP_OPERANDS ((acpi_operand_object **) ®ion_node, IMODE_EXECUTE, - "Ex_prep_region_field_value", 1, "case Region_field"); - /* Initialize areas of the object that are common to all fields */ - status = acpi_ex_prep_common_field_object (obj_desc, field_flags, - field_bit_position, field_bit_length); + status = acpi_ex_prep_common_field_object (obj_desc, info->field_flags, + info->field_bit_position, info->field_bit_length); if (ACPI_FAILURE (status)) { + acpi_ut_delete_object_desc (obj_desc); return_ACPI_STATUS (status); } - /* Initialize areas of the object that are specific to this field type */ - - obj_desc->field.region_obj = acpi_ns_get_attached_object (region_node); - - /* An additional reference for the container */ + /* Initialize areas of the object that are specific to the field type */ - acpi_ut_add_reference (obj_desc->field.region_obj); + switch (info->field_type) { + case INTERNAL_TYPE_REGION_FIELD: + obj_desc->field.region_obj = acpi_ns_get_attached_object (info->region_node); - /* Debug info */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Bitoff=%X Off=%X Gran=%X Region %p\n", - obj_desc->field.start_field_bit_offset, obj_desc->field.base_byte_offset, - obj_desc->field.access_bit_width, obj_desc->field.region_obj)); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "set Named_obj %p (%4.4s) val = %p\n", - node, &(node->name), obj_desc)); + /* An additional reference for the container */ + acpi_ut_add_reference (obj_desc->field.region_obj); - /* - * Store the constructed descriptor (Obj_desc) into the parent Node, - * preserving the current type of that Named_obj. - */ - status = acpi_ns_attach_object (node, obj_desc, (u8) acpi_ns_get_type (node)); - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_prep_bank_field_value - * - * PARAMETERS: Node - Owning Node - * Region_node - Region in which field is being defined - * Bank_register_node - Bank selection register node - * Bank_val - Value to store in selection register - * Field_flags - Access, Lock_rule, and Update_rule - * Field_bit_position - Field start position - * Field_bit_length - Field length in number of bits - * - * RETURN: Status - * - * DESCRIPTION: Construct an object of type Bank_field and attach it to the - * parent Node. - * - ******************************************************************************/ - -acpi_status -acpi_ex_prep_bank_field_value ( - acpi_namespace_node *node, - acpi_namespace_node *region_node, - acpi_namespace_node *bank_register_node, - u32 bank_val, - u8 field_flags, - u32 field_bit_position, - u32 field_bit_length) -{ - acpi_operand_object *obj_desc; - u32 type; - acpi_status status; + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Region_field: Bitoff=%X Off=%X Gran=%X Region %p\n", + obj_desc->field.start_field_bit_offset, obj_desc->field.base_byte_offset, + obj_desc->field.access_bit_width, obj_desc->field.region_obj)); + break; - FUNCTION_TRACE ("Ex_prep_bank_field_value"); + case INTERNAL_TYPE_BANK_FIELD: + obj_desc->bank_field.value = info->bank_value; + obj_desc->bank_field.region_obj = acpi_ns_get_attached_object (info->region_node); + obj_desc->bank_field.bank_register_obj = acpi_ns_get_attached_object (info->register_node); - /* Parameter validation */ + /* An additional reference for the attached objects */ - if (!region_node) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Region_node\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } + acpi_ut_add_reference (obj_desc->bank_field.region_obj); + acpi_ut_add_reference (obj_desc->bank_field.bank_register_obj); - type = acpi_ns_get_type (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))); - return_ACPI_STATUS (AE_AML_OPERAND_TYPE); - } + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Bank Field: Bit_off=%X Off=%X Gran=%X Region %p Bank_reg %p\n", + obj_desc->bank_field.start_field_bit_offset, obj_desc->bank_field.base_byte_offset, + obj_desc->field.access_bit_width, obj_desc->bank_field.region_obj, + obj_desc->bank_field.bank_register_obj)); + break; - /* Allocate a new object */ - obj_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_BANK_FIELD); - if (!obj_desc) { - return_ACPI_STATUS (AE_NO_MEMORY); - } + case INTERNAL_TYPE_INDEX_FIELD: - /* Obj_desc and Region valid */ + 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 / + obj_desc->field.access_bit_width); + + if (!obj_desc->index_field.data_obj || !obj_desc->index_field.index_obj) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Index Object\n")); + return_ACPI_STATUS (AE_AML_INTERNAL); + } - DUMP_OPERANDS ((acpi_operand_object **) &node, IMODE_EXECUTE, - "Ex_prep_bank_field_value", 1, "case Bank_field"); - DUMP_OPERANDS ((acpi_operand_object **) ®ion_node, IMODE_EXECUTE, - "Ex_prep_bank_field_value", 1, "case Bank_field"); + /* An additional reference for the attached objects */ - /* Initialize areas of the object that are common to all fields */ + acpi_ut_add_reference (obj_desc->index_field.data_obj); + acpi_ut_add_reference (obj_desc->index_field.index_obj); - status = acpi_ex_prep_common_field_object (obj_desc, field_flags, - field_bit_position, field_bit_length); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Index_field: bitoff=%X off=%X gran=%X Index %p Data %p\n", + obj_desc->index_field.start_field_bit_offset, obj_desc->index_field.base_byte_offset, + obj_desc->field.access_bit_width, obj_desc->index_field.index_obj, + obj_desc->index_field.data_obj)); + break; } - /* Initialize areas of the object that are specific to this field type */ - - obj_desc->bank_field.value = bank_val; - obj_desc->bank_field.region_obj = acpi_ns_get_attached_object (region_node); - obj_desc->bank_field.bank_register_obj = acpi_ns_get_attached_object (bank_register_node); - - /* An additional reference for the attached objects */ - - acpi_ut_add_reference (obj_desc->bank_field.region_obj); - acpi_ut_add_reference (obj_desc->bank_field.bank_register_obj); - - /* Debug info */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Bit_off=%X Off=%X Gran=%X Region %p Bank_reg %p\n", - obj_desc->bank_field.start_field_bit_offset, obj_desc->bank_field.base_byte_offset, - obj_desc->field.access_bit_width, obj_desc->bank_field.region_obj, - obj_desc->bank_field.bank_register_obj)); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Set Named_obj %p (%4.4s) val=%p\n", - node, &(node->name), obj_desc)); - - /* * Store the constructed descriptor (Obj_desc) into the parent Node, * preserving the current type of that Named_obj. */ - status = acpi_ns_attach_object (node, obj_desc, (u8) acpi_ns_get_type (node)); - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_prep_index_field_value - * - * PARAMETERS: Node - Owning Node - * Index_reg - Index register - * Data_reg - Data register - * Field_flags - Access, Lock_rule, and Update_rule - * Field_bit_position - Field start position - * Field_bit_length - Field length in number of bits - * - * RETURN: Status - * - * DESCRIPTION: Construct an acpi_operand_object of type Index_field and - * connect it to the parent Node. - * - ******************************************************************************/ - -acpi_status -acpi_ex_prep_index_field_value ( - acpi_namespace_node *node, - acpi_namespace_node *index_reg, - acpi_namespace_node *data_reg, - u8 field_flags, - u32 field_bit_position, - u32 field_bit_length) -{ - acpi_operand_object *obj_desc; - acpi_status status; - - - FUNCTION_TRACE ("Ex_prep_index_field_value"); - - - /* Parameter validation */ - - if (!index_reg || !data_reg) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null handle\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - /* Allocate a new object descriptor */ - - obj_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_INDEX_FIELD); - if (!obj_desc) { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - /* Initialize areas of the object that are common to all fields */ - - status = acpi_ex_prep_common_field_object (obj_desc, field_flags, - field_bit_position, field_bit_length); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* Initialize areas of the object that are specific to this field type */ - - obj_desc->index_field.data_obj = acpi_ns_get_attached_object (data_reg); - obj_desc->index_field.index_obj = acpi_ns_get_attached_object (index_reg); - obj_desc->index_field.value = (u32) (field_bit_position / - obj_desc->field.access_bit_width); - - /* An additional reference for the attached objects */ - - acpi_ut_add_reference (obj_desc->index_field.data_obj); - acpi_ut_add_reference (obj_desc->index_field.index_obj); - - /* Debug info */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "bitoff=%X off=%X gran=%X Index %p Data %p\n", - obj_desc->index_field.start_field_bit_offset, obj_desc->index_field.base_byte_offset, - obj_desc->field.access_bit_width, obj_desc->index_field.index_obj, - obj_desc->index_field.data_obj)); + status = acpi_ns_attach_object (info->field_node, obj_desc, + (u8) acpi_ns_get_type (info->field_node)); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "set Named_obj %p (%4.4s) val = %p\n", - node, &(node->name), obj_desc)); + info->field_node, (char*)&(info->field_node->name), obj_desc)); + /* Remove local reference to the object */ - /* - * Store the constructed descriptor (Obj_desc) into the parent Node, - * preserving the current type of that Named_obj. - */ - status = acpi_ns_attach_object (node, obj_desc, (u8) acpi_ns_get_type (node)); + acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exregion.c linux/drivers/acpi/executer/exregion.c --- v2.4.13/linux/drivers/acpi/executer/exregion.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exregion.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exregion - ACPI default Op_region (address space) handlers - * $Revision: 58 $ + * $Revision: 61 $ * *****************************************************************************/ @@ -47,7 +47,7 @@ * Value - Pointer to in or out value * Handler_context - Pointer to Handler's context * Region_context - Pointer to context specific to the - * accessed region + * accessed region * * RETURN: Status * @@ -143,7 +143,7 @@ ((acpi_integer) address - (acpi_integer) mem_info->mapped_physical_address); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "IO %d (%d width) Address=%8.8lX%8.8lX\n", function, bit_width, + "System_memory %d (%d width) Address=%8.8X%8.8X\n", function, bit_width, HIDWORD (address), LODWORD (address))); /* Perform the memory read or write */ @@ -207,7 +207,7 @@ * Value - Pointer to in or out value * Handler_context - Pointer to Handler's context * Region_context - Pointer to context specific to the - * accessed region + * accessed region * * RETURN: Status * @@ -231,7 +231,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "IO %d (%d width) Address=%8.8lX%8.8lX\n", function, bit_width, + "System_iO %d (%d width) Address=%8.8X%8.8X\n", function, bit_width, HIDWORD (address), LODWORD (address))); /* Decode the function parameter */ @@ -270,7 +270,7 @@ * Value - Pointer to in or out value * Handler_context - Pointer to Handler's context * Region_context - Pointer to context specific to the - * accessed region + * accessed region * * RETURN: Status * @@ -311,7 +311,7 @@ pci_register = (u16) address; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "IO %d (%d) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n", + "Pci_config %d (%d) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n", function, bit_width, pci_id->segment, pci_id->bus, pci_id->device, pci_id->function, pci_register)); @@ -335,6 +335,80 @@ status = AE_BAD_PARAMETER; break; } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_cmos_space_handler + * + * PARAMETERS: Function - Read or Write operation + * Address - Where in the space to read or write + * Bit_width - Field width in bits (8, 16, or 32) + * Value - Pointer to in or out value + * Handler_context - Pointer to Handler's context + * Region_context - Pointer to context specific to the + * accessed region + * + * RETURN: Status + * + * DESCRIPTION: Handler for the CMOS address space (Op Region) + * + ******************************************************************************/ + +acpi_status +acpi_ex_cmos_space_handler ( + u32 function, + ACPI_PHYSICAL_ADDRESS address, + u32 bit_width, + u32 *value, + void *handler_context, + void *region_context) +{ + acpi_status status = AE_OK; + + + FUNCTION_TRACE ("Ex_cmos_space_handler"); + + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_pci_bar_space_handler + * + * PARAMETERS: Function - Read or Write operation + * Address - Where in the space to read or write + * Bit_width - Field width in bits (8, 16, or 32) + * Value - Pointer to in or out value + * Handler_context - Pointer to Handler's context + * Region_context - Pointer to context specific to the + * accessed region + * + * RETURN: Status + * + * DESCRIPTION: Handler for the PCI Bar_target address space (Op Region) + * + ******************************************************************************/ + +acpi_status +acpi_ex_pci_bar_space_handler ( + u32 function, + ACPI_PHYSICAL_ADDRESS address, + u32 bit_width, + u32 *value, + void *handler_context, + void *region_context) +{ + acpi_status status = AE_OK; + + + FUNCTION_TRACE ("Ex_pci_bar_space_handler"); + return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exresnte.c linux/drivers/acpi/executer/exresnte.c --- v2.4.13/linux/drivers/acpi/executer/exresnte.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exresnte.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresnte - AML Interpreter object resolution - * $Revision: 41 $ + * $Revision: 43 $ * *****************************************************************************/ @@ -43,14 +43,15 @@ * * FUNCTION: Acpi_ex_resolve_node_to_value * - * PARAMETERS: Stack_ptr - Pointer to a location on a stack that contains - * a pointer to a Node - * Walk_state - Current state + * PARAMETERS: Object_ptr - Pointer to a location that contains + * a pointer to a NS node, and will recieve a + * pointer to the resolved object. + * Walk_state - Current state. Valid only if executing AML + * code. NULL if simply resolving an object * * RETURN: Status * - * DESCRIPTION: Resolve a Namespace node (AKA a "direct name pointer") to - * a valued object + * DESCRIPTION: Resolve a Namespace node to a valued object * * Note: for some of the data types, the pointer attached to the Node * can be either a pointer to an actual internal object or a pointer into the @@ -66,12 +67,12 @@ acpi_status acpi_ex_resolve_node_to_value ( - acpi_namespace_node **stack_ptr, + acpi_namespace_node **object_ptr, acpi_walk_state *walk_state) { acpi_status status = AE_OK; - acpi_operand_object *val_desc; + acpi_operand_object *source_desc; acpi_operand_object *obj_desc = NULL; acpi_namespace_node *node; acpi_object_type8 entry_type; @@ -85,12 +86,12 @@ * The stack pointer points to a acpi_namespace_node (Node). Get the * object that is attached to the Node. */ - node = *stack_ptr; - val_desc = acpi_ns_get_attached_object (node); + node = *object_ptr; + source_desc = acpi_ns_get_attached_object (node); entry_type = acpi_ns_get_type ((acpi_handle) node); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p Val_desc=%p Type=%X\n", - node, val_desc, entry_type)); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p Source_desc=%p Type=%X\n", + node, source_desc, entry_type)); /* @@ -103,7 +104,7 @@ return_ACPI_STATUS (AE_OK); } - if (!val_desc) { + if (!source_desc) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object attached to node %p\n", node)); return_ACPI_STATUS (AE_AML_NO_OPERAND); @@ -117,60 +118,60 @@ case ACPI_TYPE_PACKAGE: - if (ACPI_TYPE_PACKAGE != val_desc->common.type) { + if (ACPI_TYPE_PACKAGE != source_desc->common.type) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a Package, type %s\n", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; case ACPI_TYPE_BUFFER: - if (ACPI_TYPE_BUFFER != val_desc->common.type) { + if (ACPI_TYPE_BUFFER != source_desc->common.type) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a Buffer, type %s\n", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; case ACPI_TYPE_STRING: - if (ACPI_TYPE_STRING != val_desc->common.type) { + if (ACPI_TYPE_STRING != source_desc->common.type) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a String, type %s\n", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; case ACPI_TYPE_INTEGER: - if (ACPI_TYPE_INTEGER != val_desc->common.type) { + if (ACPI_TYPE_INTEGER != source_desc->common.type) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a Integer, type %s\n", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; @@ -180,10 +181,10 @@ case INTERNAL_TYPE_BANK_FIELD: case INTERNAL_TYPE_INDEX_FIELD: - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Field_read Node=%p Val_desc=%p Type=%X\n", - node, val_desc, entry_type)); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Field_read Node=%p Source_desc=%p Type=%X\n", + node, source_desc, entry_type)); - status = acpi_ex_read_data_from_field (val_desc, &obj_desc); + status = acpi_ex_read_data_from_field (source_desc, &obj_desc); break; @@ -200,7 +201,7 @@ /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; @@ -222,7 +223,7 @@ */ case INTERNAL_TYPE_REFERENCE: - switch (val_desc->reference.opcode) { + switch (source_desc->reference.opcode) { case AML_ZERO_OP: @@ -241,13 +242,13 @@ case AML_REVISION_OP: - temp_val = ACPI_CA_VERSION; + temp_val = ACPI_CA_SUPPORT_LEVEL; break; default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported reference opcode %X\n", - val_desc->reference.opcode)); + source_desc->reference.opcode)); return_ACPI_STATUS (AE_AML_BAD_OPCODE); } @@ -261,9 +262,15 @@ obj_desc->integer.value = temp_val; - /* Truncate value if we are executing from a 32-bit ACPI table */ - - acpi_ex_truncate_for32bit_table (obj_desc, walk_state); + /* + * Truncate value if we are executing from a 32-bit ACPI table + * AND actually executing AML code. If we are resolving + * an object in the namespace via an external call to the + * subsystem, we will have a null Walk_state + */ + if (walk_state) { + acpi_ex_truncate_for32bit_table (obj_desc, walk_state); + } break; @@ -281,7 +288,7 @@ /* Put the object descriptor on the stack */ - *stack_ptr = (void *) obj_desc; + *object_ptr = (void *) obj_desc; return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exresolv.c linux/drivers/acpi/executer/exresolv.c --- v2.4.13/linux/drivers/acpi/executer/exresolv.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exresolv.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresolv - AML Interpreter object resolution - * $Revision: 99 $ + * $Revision: 101 $ * *****************************************************************************/ @@ -131,12 +131,14 @@ (result_desc->integer.value >> obj_desc->buffer_field.start_field_bit_offset) & mask; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "** Read from buffer %p byte %ld bit %d width %d addr %p mask %08lx val %08lx\n", + "** Read from buffer %p byte %d bit %d width %d addr %p mask %08X val %8.8X%8.8X\n", obj_desc->buffer_field.buffer_obj->buffer.pointer, obj_desc->buffer_field.base_byte_offset, obj_desc->buffer_field.start_field_bit_offset, obj_desc->buffer_field.bit_length, - location, mask, result_desc->integer.value)); + location, mask, + HIDWORD(result_desc->integer.value), + LODWORD(result_desc->integer.value))); return_ACPI_STATUS (AE_OK); } @@ -323,7 +325,7 @@ break; case AML_REVISION_OP: - obj_desc->integer.value = ACPI_CA_VERSION; + obj_desc->integer.value = ACPI_CA_SUPPORT_LEVEL; break; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exresop.c linux/drivers/acpi/executer/exresop.c --- v2.4.13/linux/drivers/acpi/executer/exresop.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exresop.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresop - AML Interpreter operand/object resolution - * $Revision: 38 $ + * $Revision: 41 $ * *****************************************************************************/ @@ -120,7 +120,7 @@ op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { return_ACPI_STATUS (AE_AML_BAD_OPCODE); } @@ -146,7 +146,7 @@ */ while (GET_CURRENT_ARG_TYPE (arg_types)) { if (!stack_ptr || !*stack_ptr) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null stack entry at %X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null stack entry at %p\n", stack_ptr)); return_ACPI_STATUS (AE_AML_INTERNAL); @@ -183,7 +183,7 @@ * Decode the Reference */ op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { return_ACPI_STATUS (AE_AML_BAD_OPCODE); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exstore.c linux/drivers/acpi/executer/exstore.c --- v2.4.13/linux/drivers/acpi/executer/exstore.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exstore.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exstore - AML Interpreter object store support - * $Revision: 148 $ + * $Revision: 150 $ * *****************************************************************************/ @@ -42,15 +42,14 @@ * * FUNCTION: Acpi_ex_store * - * PARAMETERS: *Val_desc - Value to be stored + * PARAMETERS: *Source_desc - Value to be stored * *Dest_desc - Where to store it. Must be an NS node * or an acpi_operand_object of type - * Reference; if the latter the descriptor - * will be either reused or deleted. + * Reference; * * RETURN: Status * - * DESCRIPTION: Store the value described by Val_desc into the location + * DESCRIPTION: Store the value described by Source_desc into the location * described by Dest_desc. Called by various interpreter * functions to store the result of an operation into * the destination operand. @@ -59,7 +58,7 @@ acpi_status acpi_ex_store ( - acpi_operand_object *val_desc, + acpi_operand_object *source_desc, acpi_operand_object *dest_desc, acpi_walk_state *walk_state) { @@ -72,7 +71,7 @@ /* Validate parameters */ - if (!val_desc || !dest_desc) { + if (!source_desc || !dest_desc) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null pointer\n")); return_ACPI_STATUS (AE_AML_NO_OPERAND); } @@ -84,7 +83,7 @@ * Dest is a namespace node, * Storing an object into a Name "container" */ - status = acpi_ex_store_object_to_node (val_desc, + status = acpi_ex_store_object_to_node (source_desc, (acpi_namespace_node *) dest_desc, walk_state); /* All done, that's it */ @@ -101,7 +100,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Destination is not a Reference_obj [%p]\n", dest_desc)); - DUMP_STACK_ENTRY (val_desc); + DUMP_STACK_ENTRY (source_desc); DUMP_STACK_ENTRY (dest_desc); DUMP_OPERANDS (&dest_desc, IMODE_EXECUTE, "Ex_store", 2, "Target is not a Reference_obj"); @@ -125,7 +124,7 @@ /* Storing an object into a Name "container" */ - status = acpi_ex_store_object_to_node (val_desc, ref_desc->reference.object, + status = acpi_ex_store_object_to_node (source_desc, ref_desc->reference.object, walk_state); break; @@ -134,7 +133,7 @@ /* Storing to an Index (pointer into a packager or buffer) */ - status = acpi_ex_store_object_to_index (val_desc, ref_desc, walk_state); + status = acpi_ex_store_object_to_index (source_desc, ref_desc, walk_state); break; @@ -144,7 +143,7 @@ /* Store to a method local/arg */ status = acpi_ds_store_object_to_local (ref_desc->reference.opcode, - ref_desc->reference.offset, val_desc, walk_state); + ref_desc->reference.offset, source_desc, walk_state); break; @@ -157,39 +156,39 @@ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Write to Debug Object: ****:\n\n")); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[ACPI Debug] %s: ", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); - switch (val_desc->common.type) { + switch (source_desc->common.type) { case ACPI_TYPE_INTEGER: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%X (%d)\n", - (u32) val_desc->integer.value, (u32) val_desc->integer.value)); + (u32) source_desc->integer.value, (u32) source_desc->integer.value)); break; case ACPI_TYPE_BUFFER: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Length 0x%X\n", - (u32) val_desc->buffer.length)); + (u32) source_desc->buffer.length)); break; case ACPI_TYPE_STRING: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%s\n", val_desc->string.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%s\n", source_desc->string.pointer)); break; case ACPI_TYPE_PACKAGE: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Elements - 0x%X\n", - (u32) val_desc->package.elements)); + (u32) source_desc->package.elements)); break; default: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "@0x%p\n", val_desc)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "@0x%p\n", source_desc)); break; } @@ -224,12 +223,6 @@ } /* switch (Ref_desc->Reference.Opcode) */ - /* Always delete the reference descriptor object */ - - if (ref_desc) { - acpi_ut_remove_reference (ref_desc); - } - return_ACPI_STATUS (status); } @@ -238,7 +231,7 @@ * * FUNCTION: Acpi_ex_store_object_to_index * - * PARAMETERS: *Val_desc - Value to be stored + * PARAMETERS: *Source_desc - Value to be stored * *Node - Named object to receive the value * * RETURN: Status @@ -249,7 +242,7 @@ acpi_status acpi_ex_store_object_to_index ( - acpi_operand_object *val_desc, + acpi_operand_object *source_desc, acpi_operand_object *dest_desc, acpi_walk_state *walk_state) { @@ -278,7 +271,7 @@ if (dest_desc->reference.target_type == ACPI_TYPE_PACKAGE) { /* * The object at *(Dest_desc->Reference.Where) is the - * element within the package that is to be modified. + * element within the package that is to be modified. */ obj_desc = *(dest_desc->reference.where); if (obj_desc) { @@ -288,16 +281,12 @@ * * TBD: [Investigate] Should both the src and dest be required * to be packages? - * && (Val_desc->Common.Type == ACPI_TYPE_PACKAGE) + * && (Source_desc->Common.Type == ACPI_TYPE_PACKAGE) */ if (obj_desc->common.type == ACPI_TYPE_PACKAGE) { - /* - * Take away the reference for being part of a package and - * delete - */ - acpi_ut_remove_reference (obj_desc); - acpi_ut_remove_reference (obj_desc); + /* Take away the reference for being part of a package */ + acpi_ut_remove_reference (obj_desc); obj_desc = NULL; } } @@ -307,9 +296,9 @@ * If the Obj_desc is NULL, it means that an uninitialized package * element has been used as a destination (this is OK), therefore, * we must create the destination element to match the type of the - * source element NOTE: Val_desc can be of any type. + * source element NOTE: Source_desccan be of any type. */ - obj_desc = acpi_ut_create_internal_object (val_desc->common.type); + obj_desc = acpi_ut_create_internal_object (source_desc->common.type); if (!obj_desc) { return_ACPI_STATUS (AE_NO_MEMORY); } @@ -318,29 +307,25 @@ * If the source is a package, copy the source to the new dest */ if (ACPI_TYPE_PACKAGE == obj_desc->common.type) { - status = acpi_ut_copy_ipackage_to_ipackage (val_desc, obj_desc, walk_state); + status = acpi_ut_copy_ipackage_to_ipackage (source_desc, obj_desc, walk_state); if (ACPI_FAILURE (status)) { acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); } } - /* - * Install the new descriptor into the package and add a - * reference to the newly created descriptor for now being - * part of the parent package - */ + /* Install the new descriptor into the package */ + *(dest_desc->reference.where) = obj_desc; - acpi_ut_add_reference (obj_desc); } if (ACPI_TYPE_PACKAGE != obj_desc->common.type) { /* * The destination element is not a package, so we need to - * convert the contents of the source (Val_desc) and copy into + * convert the contents of the source (Source_desc) and copy into * the destination (Obj_desc) */ - status = acpi_ex_store_object_to_object (val_desc, obj_desc, + status = acpi_ex_store_object_to_object (source_desc, obj_desc, walk_state); if (ACPI_FAILURE (status)) { /* @@ -380,7 +365,7 @@ * The assignment of the individual elements will be slightly * different for each source type. */ - switch (val_desc->common.type) { + switch (source_desc->common.type) { case ACPI_TYPE_INTEGER: /* * Type is Integer, assign bytewise @@ -389,7 +374,7 @@ */ length = sizeof (acpi_integer); for (i = length; i != 0; i--) { - value = (u8)(val_desc->integer.value >> (MUL_8 (i - 1))); + value = (u8)(source_desc->integer.value >> (MUL_8 (i - 1))); obj_desc->buffer.pointer[dest_desc->reference.offset] = value; } break; @@ -400,9 +385,9 @@ * Type is Buffer, the Length is in the structure. * Just loop through the elements and assign each one in turn. */ - length = val_desc->buffer.length; + length = source_desc->buffer.length; for (i = 0; i < length; i++) { - value = val_desc->buffer.pointer[i]; + value = source_desc->buffer.pointer[i]; obj_desc->buffer.pointer[dest_desc->reference.offset] = value; } break; @@ -413,9 +398,9 @@ * Type is String, the Length is in the structure. * Just loop through the elements and assign each one in turn. */ - length = val_desc->string.length; + length = source_desc->string.length; for (i = 0; i < length; i++) { - value = val_desc->string.pointer[i]; + value = source_desc->string.pointer[i]; obj_desc->buffer.pointer[dest_desc->reference.offset] = value; } break; @@ -427,7 +412,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Source must be Number/Buffer/String type, not %X\n", - val_desc->common.type)); + source_desc->common.type)); status = AE_AML_OPERAND_TYPE; break; } @@ -548,6 +533,7 @@ * Source_desc reference count is incremented by Attach_object. */ status = acpi_ns_attach_object (node, target_desc, target_type); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Store %s into %s via Convert/Attach\n", acpi_ut_get_type_name (target_desc->common.type), @@ -564,7 +550,6 @@ /* No conversions for all other types. Just attach the source object */ status = acpi_ns_attach_object (node, source_desc, source_desc->common.type); - break; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exutils.c linux/drivers/acpi/executer/exutils.c --- v2.4.13/linux/drivers/acpi/executer/exutils.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exutils.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exutils - interpreter/scanner utilities - * $Revision: 84 $ + * $Revision: 85 $ * *****************************************************************************/ @@ -265,16 +265,16 @@ * * FUNCTION: Acpi_ex_digits_needed * - * PARAMETERS: val - Value to be represented - * base - Base of representation + * PARAMETERS: Value - Value to be represented + * Base - Base of representation * - * RETURN: the number of digits needed to represent val in base + * RETURN: the number of digits needed to represent Value in Base * ******************************************************************************/ u32 acpi_ex_digits_needed ( - acpi_integer val, + acpi_integer value, u32 base) { u32 num_digits = 0; @@ -289,9 +289,11 @@ else { /* - * acpi_integer is unsigned, which is why we don't worry about the '-' + * acpi_integer is unsigned, which is why we don't worry about a '-' */ - for (num_digits = 1; (val = ACPI_DIVIDE (val,base)); ++num_digits) { ; } + for (num_digits = 1; + (acpi_ut_short_divide (&value, base, &value, NULL)); + ++num_digits) { ; } } return_VALUE (num_digits); @@ -394,17 +396,18 @@ { u32 count; u32 digits_needed; + u32 remainder; FUNCTION_ENTRY (); digits_needed = acpi_ex_digits_needed (value, 10); - out_string[digits_needed] = '\0'; + out_string[digits_needed] = 0; for (count = digits_needed; count > 0; count--) { - out_string[count-1] = (NATIVE_CHAR) ('0' + (ACPI_MODULO (value, 10))); - value = ACPI_DIVIDE (value, 10); + acpi_ut_short_divide (&value, 10, &value, &remainder); + out_string[count-1] = (NATIVE_CHAR) ('0' + remainder); } return (AE_OK); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exxface.c linux/drivers/acpi/executer/exxface.c --- v2.4.13/linux/drivers/acpi/executer/exxface.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exxface.c Wed Dec 31 16:00:00 1969 @@ -1,102 +0,0 @@ - -/****************************************************************************** - * - * Module Name: exxface - External interpreter interfaces - * $Revision: 29 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * 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. - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "acpi.h" -#include "acinterp.h" - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("exxface") - -#if 0 - -/* - * DEFINE_AML_GLOBALS is tested in amlcode.h - * to determine whether certain global names should be "defined" or only - * "declared" in the current compilation. This enhances maintainability - * by enabling a single header file to embody all knowledge of the names - * in question. - * - * Exactly one module of any executable should #define DEFINE_GLOBALS - * before #including the header files which use this convention. The - * names in question will be defined and initialized in that module, - * and declared as extern in all other modules which #include those - * header files. - */ - -#define DEFINE_AML_GLOBALS -#include "amlcode.h" -#include "acparser.h" -#include "acnamesp.h" - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_execute_method - * - * PARAMETERS: Pcode - Pointer to the pcode stream - * Pcode_length - Length of pcode that comprises the method - * **Params - List of parameters to pass to method, - * terminated by NULL. Params itself may be - * NULL if no parameters are being passed. - * - * RETURN: Status - * - * DESCRIPTION: Execute a control method - * - ******************************************************************************/ - -acpi_status -acpi_ex_execute_method ( - acpi_namespace_node *method_node, - acpi_operand_object **params, - acpi_operand_object **return_obj_desc) -{ - acpi_status status; - - - FUNCTION_TRACE ("Ex_execute_method"); - - - /* - * The point here is to lock the interpreter and call the low - * level execute. - */ - status = acpi_ex_enter_interpreter (); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - status = acpi_psx_execute (method_node, params, return_obj_desc); - - acpi_ex_exit_interpreter (); - - return_ACPI_STATUS (status); -} - - -#endif diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwacpi.c linux/drivers/acpi/hardware/hwacpi.c --- v2.4.13/linux/drivers/acpi/hardware/hwacpi.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwacpi.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface - * $Revision: 45 $ + * $Revision: 46 $ * *****************************************************************************/ @@ -220,7 +220,7 @@ /* Give the platform some time to react */ - acpi_os_stall (5000); + acpi_os_stall (20000); if (acpi_hw_get_mode () == mode) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n", mode)); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwgpe.c linux/drivers/acpi/hardware/hwgpe.c --- v2.4.13/linux/drivers/acpi/hardware/hwgpe.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwgpe.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: hwgpe - Low level GPE enable/disable/clear functions - * $Revision: 32 $ + * $Revision: 35 $ * *****************************************************************************/ @@ -77,6 +77,45 @@ (in_byte | bit_mask), 8); } +/****************************************************************************** + * + * FUNCTION: Acpi_hw_enable_gpe_for_wakeup + * + * PARAMETERS: Gpe_number - The GPE + * + * RETURN: None + * + * DESCRIPTION: Keep track of which GPEs the OS has requested not be + * disabled when going to sleep. + * + ******************************************************************************/ + +void +acpi_hw_enable_gpe_for_wakeup ( + u32 gpe_number) +{ + u32 register_index; + u32 bit_mask; + + + FUNCTION_ENTRY (); + + + /* + * Translate GPE number to index into global registers array. + */ + register_index = acpi_gbl_gpe_valid[gpe_number]; + + /* + * Figure out the bit offset for this GPE within the target register. + */ + bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)]; + + /* + * Set the bit so we will not disable this when sleeping + */ + acpi_gbl_gpe_registers[register_index].wake_enable |= bit_mask; +} /****************************************************************************** * @@ -120,8 +159,49 @@ acpi_os_read_port (acpi_gbl_gpe_registers[register_index].enable_addr, &in_byte, 8); acpi_os_write_port (acpi_gbl_gpe_registers[register_index].enable_addr, (in_byte & ~bit_mask), 8); + + acpi_hw_disable_gpe_for_wakeup(gpe_number); } +/****************************************************************************** + * + * FUNCTION: Acpi_hw_disable_gpe_for_wakeup + * + * PARAMETERS: Gpe_number - The GPE + * + * RETURN: None + * + * DESCRIPTION: Keep track of which GPEs the OS has requested not be + * disabled when going to sleep. + * + ******************************************************************************/ + +void +acpi_hw_disable_gpe_for_wakeup ( + u32 gpe_number) +{ + u32 register_index; + u32 bit_mask; + + + FUNCTION_ENTRY (); + + + /* + * Translate GPE number to index into global registers array. + */ + register_index = acpi_gbl_gpe_valid[gpe_number]; + + /* + * Figure out the bit offset for this GPE within the target register. + */ + bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)]; + + /* + * Clear the bit so we will disable this when sleeping + */ + acpi_gbl_gpe_registers[register_index].wake_enable &= ~bit_mask; +} /****************************************************************************** * @@ -215,11 +295,88 @@ } /* + * Enabled for wake?: + */ + if (bit_mask & acpi_gbl_gpe_registers[register_index].wake_enable) { + (*event_status) |= ACPI_EVENT_FLAG_WAKE_ENABLED; + } + + /* * Set? */ in_byte = 0; acpi_os_read_port (acpi_gbl_gpe_registers[register_index].status_addr, &in_byte, 8); if (bit_mask & in_byte) { (*event_status) |= ACPI_EVENT_FLAG_SET; + } +} + +/****************************************************************************** + * + * FUNCTION: Acpi_hw_disable_non_wakeup_gpes + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Disable all non-wakeup GPEs + * Call with interrupts disabled. The interrupt handler also + * modifies Acpi_gbl_Gpe_registers[i].Enable, so it should not be + * given the chance to run until after non-wake GPEs are + * re-enabled. + * + ******************************************************************************/ + +void +acpi_hw_disable_non_wakeup_gpes ( + void) +{ + u32 i; + + FUNCTION_ENTRY (); + + for (i = 0; i < acpi_gbl_gpe_register_count; i++) { + /* + * Read the enabled status of all GPEs. We + * will be using it to restore all the GPEs later. + */ + acpi_os_read_port (acpi_gbl_gpe_registers[i].enable_addr, + &acpi_gbl_gpe_registers[i].enable, 8); + + /* + * Disable all GPEs but wakeup GPEs. + */ + acpi_os_write_port(acpi_gbl_gpe_registers[i].enable_addr, + acpi_gbl_gpe_registers[i].wake_enable, 8); + } +} + +/****************************************************************************** + * + * FUNCTION: Acpi_hw_enable_non_wakeup_gpes + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Enable all non-wakeup GPEs we previously enabled. + * + ******************************************************************************/ + +void +acpi_hw_enable_non_wakeup_gpes ( + void) +{ + u32 i; + + FUNCTION_ENTRY (); + + for (i = 0; i < acpi_gbl_gpe_register_count; i++) { + /* + * We previously stored the enabled status of all GPEs. + * Blast them back in. + */ + acpi_os_write_port(acpi_gbl_gpe_registers[i].enable_addr, + acpi_gbl_gpe_registers[i].enable, 8); } } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwregs.c linux/drivers/acpi/hardware/hwregs.c --- v2.4.13/linux/drivers/acpi/hardware/hwregs.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwregs.c Wed Oct 24 14:06:22 2001 @@ -3,7 +3,7 @@ * * Module Name: hwregs - Read/write access functions for the various ACPI * control and status registers. - * $Revision: 109 $ + * $Revision: 110 $ * ******************************************************************************/ @@ -453,8 +453,9 @@ register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM2_CONTROL); - ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM2 control: Read %X from %p\n", - register_value, ACPI_GET_ADDRESS (acpi_gbl_FADT->Xpm2_cnt_blk.address))); + ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM2 control: Read %X from %8.8X%8.8X\n", + register_value, HIDWORD(acpi_gbl_FADT->Xpm2_cnt_blk.address), + LODWORD(acpi_gbl_FADT->Xpm2_cnt_blk.address))); if (read_write == ACPI_WRITE) { register_value &= ~mask; @@ -462,8 +463,10 @@ value &= mask; register_value |= value; - ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %04X to %p\n", register_value, - acpi_gbl_FADT->Xpm2_cnt_blk.address)); + ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %04X to %8.8X%8.8X\n", + register_value, + HIDWORD(acpi_gbl_FADT->Xpm2_cnt_blk.address), + LODWORD(acpi_gbl_FADT->Xpm2_cnt_blk.address))); acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, PM2_CONTROL, (u8) (register_value)); @@ -476,8 +479,10 @@ mask = TMR_VAL_MASK; register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM_TIMER); - ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM_TIMER: Read %X from %p\n", - register_value, ACPI_GET_ADDRESS (acpi_gbl_FADT->Xpm_tmr_blk.address))); + ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM_TIMER: Read %X from %8.8X%8.8X\n", + register_value, + HIDWORD(acpi_gbl_FADT->Xpm_tmr_blk.address), + LODWORD(acpi_gbl_FADT->Xpm_tmr_blk.address))); break; @@ -732,13 +737,13 @@ break; - case PM1_a_CONTROL: /* 16-bit access */ + case PM1A_CONTROL: /* 16-bit access */ acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0); break; - case PM1_b_CONTROL: /* 16-bit access */ + case PM1B_CONTROL: /* 16-bit access */ acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0); break; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwsleep.c linux/drivers/acpi/hardware/hwsleep.c --- v2.4.13/linux/drivers/acpi/hardware/hwsleep.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwsleep.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface - * $Revision: 21 $ + * $Revision: 22 $ * *****************************************************************************/ @@ -137,8 +137,8 @@ acpi_object arg; u8 type_a; u8 type_b; - u16 PM1_acontrol; - u16 PM1_bcontrol; + u16 PM1Acontrol; + u16 PM1Bcontrol; FUNCTION_TRACE ("Acpi_enter_sleep_state"); @@ -171,31 +171,31 @@ disable (); - /* TODO: disable all non-wake GPEs here */ + acpi_hw_disable_non_wakeup_gpes(); - PM1_acontrol = (u16) acpi_hw_register_read (ACPI_MTX_LOCK, PM1_CONTROL); + PM1Acontrol = (u16) acpi_hw_register_read (ACPI_MTX_LOCK, PM1_CONTROL); ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Entering S%d\n", sleep_state)); /* mask off SLP_EN and SLP_TYP fields */ - PM1_acontrol &= ~(SLP_TYPE_X_MASK | SLP_EN_MASK); - PM1_bcontrol = PM1_acontrol; + PM1Acontrol &= ~(SLP_TYPE_X_MASK | SLP_EN_MASK); + PM1Bcontrol = PM1Acontrol; /* mask in SLP_TYP */ - PM1_acontrol |= (type_a << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); - PM1_bcontrol |= (type_b << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); + PM1Acontrol |= (type_a << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); + PM1Bcontrol |= (type_b << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); /* write #1: fill in SLP_TYP data */ - acpi_hw_register_write (ACPI_MTX_LOCK, PM1_a_CONTROL, PM1_acontrol); - acpi_hw_register_write (ACPI_MTX_LOCK, PM1_b_CONTROL, PM1_bcontrol); + acpi_hw_register_write (ACPI_MTX_LOCK, PM1A_CONTROL, PM1Acontrol); + acpi_hw_register_write (ACPI_MTX_LOCK, PM1B_CONTROL, PM1Bcontrol); /* mask in SLP_EN */ - PM1_acontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)); - PM1_bcontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)); + PM1Acontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)); + PM1Bcontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)); /* flush caches */ @@ -203,8 +203,8 @@ /* write #2: SLP_TYP + SLP_EN */ - acpi_hw_register_write (ACPI_MTX_LOCK, PM1_a_CONTROL, PM1_acontrol); - acpi_hw_register_write (ACPI_MTX_LOCK, PM1_b_CONTROL, PM1_bcontrol); + acpi_hw_register_write (ACPI_MTX_LOCK, PM1A_CONTROL, PM1Acontrol); + acpi_hw_register_write (ACPI_MTX_LOCK, PM1B_CONTROL, PM1Bcontrol); /* * Wait a second, then try again. This is to get S4/5 to work on all machines. @@ -223,6 +223,8 @@ } while (!acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_LOCK, WAK_STS)); + acpi_hw_enable_non_wakeup_gpes(); + enable (); return_ACPI_STATUS (AE_OK); @@ -264,7 +266,7 @@ /* _WAK returns stuff - do we want to look at it? */ - /* Re-enable GPEs */ + acpi_hw_enable_non_wakeup_gpes(); return_ACPI_STATUS (AE_OK); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwtimer.c linux/drivers/acpi/hardware/hwtimer.c --- v2.4.13/linux/drivers/acpi/hardware/hwtimer.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwtimer.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwtimer.c - ACPI Power Management Timer Interface - * $Revision: 12 $ + * $Revision: 14 $ * *****************************************************************************/ @@ -47,19 +47,9 @@ acpi_get_timer_resolution ( u32 *resolution) { - acpi_status status; - - FUNCTION_TRACE ("Acpi_get_timer_resolution"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - if (!resolution) { return_ACPI_STATUS (AE_BAD_PARAMETER); } @@ -92,18 +82,8 @@ acpi_get_timer ( u32 *ticks) { - acpi_status status; - - FUNCTION_TRACE ("Acpi_get_timer"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } if (!ticks) { return_ACPI_STATUS (AE_BAD_PARAMETER); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acconfig.h linux/drivers/acpi/include/acconfig.h --- v2.4.13/linux/drivers/acpi/include/acconfig.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acconfig.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acconfig.h - Global configuration constants - * $Revision: 69 $ + * $Revision: 74 $ * *****************************************************************************/ @@ -53,7 +53,11 @@ /* Version string */ -#define ACPI_CA_VERSION 0x20010831 +#define ACPI_CA_VERSION 0x20011018 + +/* Version of ACPI supported */ + +#define ACPI_CA_SUPPORT_LEVEL 2 /* Maximum objects in the various object caches */ @@ -78,7 +82,7 @@ /* Max reference count (for debug only) */ -#define MAX_REFERENCE_COUNT 0x200 +#define MAX_REFERENCE_COUNT 0x400 /* Size of cached memory mapping for system memory operation region */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acdebug.h linux/drivers/acpi/include/acdebug.h --- v2.4.13/linux/drivers/acpi/include/acdebug.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acdebug.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acdebug.h - ACPI/AML debugger - * $Revision: 47 $ + * $Revision: 50 $ * *****************************************************************************/ @@ -35,7 +35,7 @@ extern int optind; extern NATIVE_CHAR *optarg; -extern u8 *aml_ptr; +extern u8 *aml_start; extern u32 aml_length; extern u8 acpi_gbl_db_opt_tables; @@ -57,6 +57,7 @@ extern u8 acpi_gbl_db_output_flags; extern u32 acpi_gbl_db_debug_level; extern u32 acpi_gbl_db_console_debug_level; +extern acpi_table_header *acpi_gbl_db_table_ptr; /* * Statistic globals @@ -119,11 +120,15 @@ acpi_db_initialize ( void); +void +acpi_db_terminate ( + void); + acpi_status acpi_db_single_step ( acpi_walk_state *walk_state, acpi_parse_object *op, - u8 op_type); + u32 op_type); /* diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acdispat.h linux/drivers/acpi/include/acdispat.h --- v2.4.13/linux/drivers/acpi/include/acdispat.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acdispat.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acdispat.h - dispatcher (parser to interpreter interface) - * $Revision: 40 $ + * $Revision: 45 $ * *****************************************************************************/ @@ -86,25 +86,20 @@ acpi_status acpi_ds_get_predicate_value ( acpi_walk_state *walk_state, - acpi_parse_object *op, u32 has_result_obj); acpi_status acpi_ds_exec_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op); acpi_status acpi_ds_exec_end_op ( - acpi_walk_state *state, - acpi_parse_object *op); + acpi_walk_state *state); /* dsfield - Parser/Interpreter interface for AML fields */ - acpi_status acpi_ds_create_field ( acpi_parse_object *op, @@ -123,44 +118,36 @@ acpi_namespace_node *region_node, acpi_walk_state *walk_state); +acpi_status +acpi_ds_create_buffer_field ( + acpi_parse_object *op, + acpi_walk_state *walk_state); + /* dsload - Parser/Interpreter interface, namespace load callbacks */ acpi_status acpi_ds_load1_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op); acpi_status acpi_ds_load1_end_op ( - acpi_walk_state *walk_state, - acpi_parse_object *op); + acpi_walk_state *walk_state); acpi_status acpi_ds_load2_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op); acpi_status acpi_ds_load2_end_op ( - acpi_walk_state *state, - acpi_parse_object *op); + acpi_walk_state *walk_state); acpi_status -acpi_ds_load3_begin_op ( - u16 opcode, - acpi_parse_object *op, +acpi_ds_init_callbacks ( acpi_walk_state *walk_state, - acpi_parse_object **out_op); - -acpi_status -acpi_ds_load3_end_op ( - acpi_walk_state *state, - acpi_parse_object *op); + u32 pass_number); /* dsmthdat - method data (locals/args) */ @@ -374,7 +361,7 @@ acpi_walk_state *walk_state); -/* Acpi_dswstate - parser WALK_STATE management routines */ +/* dswstate - parser WALK_STATE management routines */ acpi_walk_state * acpi_ds_create_walk_state ( @@ -384,6 +371,17 @@ acpi_walk_list *walk_list); acpi_status +acpi_ds_init_aml_walk ( + acpi_walk_state *walk_state, + acpi_parse_object *op, + acpi_namespace_node *method_node, + u8 *aml_start, + u32 aml_length, + acpi_operand_object **params, + acpi_operand_object **return_obj_desc, + u32 pass_number); + +acpi_status acpi_ds_obj_stack_delete_all ( acpi_walk_state *walk_state); @@ -398,6 +396,11 @@ acpi_walk_state * acpi_ds_pop_walk_state ( + acpi_walk_list *walk_list); + +void +acpi_ds_push_walk_state ( + acpi_walk_state *walk_state, acpi_walk_list *walk_list); acpi_status diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acevents.h linux/drivers/acpi/include/acevents.h --- v2.4.13/linux/drivers/acpi/include/acevents.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acevents.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acevents.h - Event subcomponent prototypes and defines - * $Revision: 65 $ + * $Revision: 66 $ * *****************************************************************************/ @@ -157,6 +157,20 @@ acpi_status acpi_ev_pci_config_region_setup ( + acpi_handle handle, + u32 function, + void *handler_context, + void **region_context); + +acpi_status +acpi_ev_cmos_region_setup ( + acpi_handle handle, + u32 function, + void *handler_context, + void **region_context); + +acpi_status +acpi_ev_pci_bar_region_setup ( acpi_handle handle, u32 function, void *handler_context, diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acglobal.h linux/drivers/acpi/include/acglobal.h --- v2.4.13/linux/drivers/acpi/include/acglobal.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acglobal.h Wed Oct 24 14:06:22 2001 @@ -94,7 +94,7 @@ * actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs. * (The table maps local handles to the real OS handles) */ -ACPI_EXTERN ACPI_MUTEX_INFO acpi_gbl_acpi_mutex_info [NUM_MTX]; +ACPI_EXTERN acpi_mutex_info acpi_gbl_acpi_mutex_info [NUM_MTX]; /***************************************************************************** @@ -172,7 +172,7 @@ /* Address Space handlers */ -ACPI_EXTERN ACPI_ADR_SPACE_INFO acpi_gbl_address_spaces[ACPI_NUM_ADDRESS_SPACES]; +ACPI_EXTERN acpi_adr_space_info acpi_gbl_address_spaces[ACPI_NUM_ADDRESS_SPACES]; /* Control method single step flag */ @@ -194,10 +194,10 @@ * ****************************************************************************/ -ACPI_EXTERN ACPI_FIXED_EVENT_INFO acpi_gbl_fixed_event_handlers[ACPI_NUM_FIXED_EVENTS]; +ACPI_EXTERN acpi_fixed_event_info acpi_gbl_fixed_event_handlers[ACPI_NUM_FIXED_EVENTS]; ACPI_EXTERN acpi_handle acpi_gbl_gpe_obj_handle; ACPI_EXTERN u32 acpi_gbl_gpe_register_count; -ACPI_EXTERN ACPI_GPE_REGISTERS *acpi_gbl_gpe_registers; +ACPI_EXTERN acpi_gpe_registers *acpi_gbl_gpe_registers; ACPI_EXTERN acpi_gpe_level_info *acpi_gbl_gpe_info; /* diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/achware.h linux/drivers/acpi/include/achware.h --- v2.4.13/linux/drivers/acpi/include/achware.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/achware.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: achware.h -- hardware specific interfaces - * $Revision: 55 $ + * $Revision: 56 $ * *****************************************************************************/ @@ -105,20 +105,37 @@ void acpi_hw_enable_gpe ( - u32 gpe_index); + u32 gpe_number); + +void +acpi_hw_enable_gpe_for_wakeup ( + u32 gpe_number); void acpi_hw_disable_gpe ( - u32 gpe_index); + u32 gpe_number); + +void +acpi_hw_disable_gpe_for_wakeup ( + u32 gpe_number); void acpi_hw_clear_gpe ( - u32 gpe_index); + u32 gpe_number); void acpi_hw_get_gpe_status ( u32 gpe_number, acpi_event_status *event_status); + +void +acpi_hw_disable_non_wakeup_gpes ( + void); + +void +acpi_hw_enable_non_wakeup_gpes ( + void); + /* Sleep Prototypes */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acinterp.h linux/drivers/acpi/include/acinterp.h --- v2.4.13/linux/drivers/acpi/include/acinterp.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acinterp.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acinterp.h - Interpreter subcomponent prototypes and defines - * $Revision: 106 $ + * $Revision: 116 $ * *****************************************************************************/ @@ -179,51 +179,75 @@ */ acpi_status -acpi_ex_triadic ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_3A_0T_0R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_hexadic ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_3A_1T_1R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_create_buffer_field ( - u8 *aml_ptr, - u32 aml_length, - acpi_namespace_node *node, +acpi_ex_opcode_6A_0T_1R ( acpi_walk_state *walk_state); acpi_status -acpi_ex_reconfiguration ( - u16 opcode, +acpi_ex_get_object_reference ( + acpi_operand_object *obj_desc, + acpi_operand_object **return_desc, acpi_walk_state *walk_state); acpi_status +acpi_ex_do_concatenate ( + acpi_operand_object *obj_desc, + acpi_operand_object *obj_desc2, + acpi_operand_object **actual_return_desc, + acpi_walk_state *walk_state); + +u8 +acpi_ex_do_logical_op ( + u16 opcode, + acpi_integer operand0, + acpi_integer operand1); + +acpi_integer +acpi_ex_do_math_op ( + u16 opcode, + acpi_integer operand0, + acpi_integer operand1); + +acpi_status +acpi_ex_load_op ( + acpi_operand_object *rgn_desc, + acpi_operand_object *ddb_handle); + +acpi_status +acpi_ex_unload_table ( + acpi_operand_object *ddb_handle); + +acpi_status acpi_ex_create_mutex ( acpi_walk_state *walk_state); acpi_status acpi_ex_create_processor ( - acpi_parse_object *op, - acpi_namespace_node *processor_node); + acpi_walk_state *walk_state); acpi_status acpi_ex_create_power_resource ( - acpi_parse_object *op, - acpi_namespace_node *power_node); + acpi_walk_state *walk_state); acpi_status acpi_ex_create_region ( - u8 *aml_ptr, + u8 *aml_start, u32 aml_length, u8 region_space, acpi_walk_state *walk_state); acpi_status +acpi_ex_create_table_region ( + acpi_walk_state *walk_state); + +acpi_status acpi_ex_create_event ( acpi_walk_state *walk_state); @@ -233,10 +257,9 @@ acpi_status acpi_ex_create_method ( - u8 *aml_ptr, + u8 *aml_start, u32 aml_length, - u32 method_flags, - acpi_namespace_node *method); + acpi_walk_state *walk_state); /* @@ -301,6 +324,9 @@ u32 field_position, u32 field_length); +acpi_status +acpi_ex_prep_field_value ( + ACPI_CREATE_FIELD_INFO *info); /* * amsystem - Interface to OS services @@ -352,49 +378,40 @@ */ acpi_status -acpi_ex_monadic1 ( - u16 opcode, +acpi_ex_opcode_1A_0T_0R ( acpi_walk_state *walk_state); acpi_status -acpi_ex_monadic2 ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_1A_0T_1R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_monadic2_r ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_1A_1T_1R ( + acpi_walk_state *walk_state); +acpi_status +acpi_ex_opcode_1A_1T_0R ( + acpi_walk_state *walk_state); /* * amdyadic - ACPI AML (p-code) execution, dyadic operators */ acpi_status -acpi_ex_dyadic1 ( - u16 opcode, +acpi_ex_opcode_2A_0T_0R ( acpi_walk_state *walk_state); acpi_status -acpi_ex_dyadic2 ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_2A_0T_1R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_dyadic2_r ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_2A_1T_1R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_dyadic2_s ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_2A_2T_1R ( + acpi_walk_state *walk_state); /* @@ -429,7 +446,7 @@ void acpi_ex_show_hex_value ( u32 byte_count, - u8 *aml_ptr, + u8 *aml_start, u32 lead_space); @@ -640,6 +657,24 @@ acpi_status acpi_ex_pci_config_space_handler ( + u32 function, + ACPI_PHYSICAL_ADDRESS address, + u32 bit_width, + u32 *value, + void *handler_context, + void *region_context); + +acpi_status +acpi_ex_cmos_space_handler ( + u32 function, + ACPI_PHYSICAL_ADDRESS address, + u32 bit_width, + u32 *value, + void *handler_context, + void *region_context); + +acpi_status +acpi_ex_pci_bar_space_handler ( u32 function, ACPI_PHYSICAL_ADDRESS address, u32 bit_width, diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/aclocal.h linux/drivers/acpi/include/aclocal.h --- v2.4.13/linux/drivers/acpi/include/aclocal.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/aclocal.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: aclocal.h - Internal data types used across the ACPI subsystem - * $Revision: 130 $ + * $Revision: 138 $ * *****************************************************************************/ @@ -29,7 +29,7 @@ #define WAIT_FOREVER ((u32) -1) -typedef void* ACPI_MUTEX; +typedef void* acpi_mutex; typedef u32 ACPI_MUTEX_HANDLE; @@ -40,7 +40,15 @@ /* Object descriptor types */ #define ACPI_CACHED_OBJECT 0x11 /* ORed in when object is cached */ -#define ACPI_DESC_TYPE_STATE 0x22 +#define ACPI_DESC_TYPE_STATE 0x20 +#define ACPI_DESC_TYPE_STATE_UPDATE 0x21 +#define ACPI_DESC_TYPE_STATE_PACKAGE 0x22 +#define ACPI_DESC_TYPE_STATE_CONTROL 0x23 +#define ACPI_DESC_TYPE_STATE_RPSCOPE 0x24 +#define ACPI_DESC_TYPE_STATE_PSCOPE 0x25 +#define ACPI_DESC_TYPE_STATE_WSCOPE 0x26 +#define ACPI_DESC_TYPE_STATE_RESULT 0x27 +#define ACPI_DESC_TYPE_STATE_NOTIFY 0x28 #define ACPI_DESC_TYPE_WALK 0x44 #define ACPI_DESC_TYPE_PARSER 0x66 #define ACPI_DESC_TYPE_INTERNAL 0x88 @@ -112,11 +120,11 @@ typedef struct acpi_mutex_info { - ACPI_MUTEX mutex; + acpi_mutex mutex; u32 use_count; u32 owner_id; -} ACPI_MUTEX_INFO; +} acpi_mutex_info; /* This owner ID means that the mutex is not in use (unlocked) */ @@ -181,7 +189,7 @@ u32 name; /* ACPI Name, always 4 chars per ACPI spec */ - void *object; /* Pointer to attached ACPI object (optional) */ + union acpi_operand_obj *object; /* Pointer to attached ACPI object (optional) */ struct acpi_node *child; /* first child */ struct acpi_node *peer; /* Next peer*/ u16 reference_count; /* Current count of references and children */ @@ -216,8 +224,8 @@ struct acpi_table_desc *installed_desc; acpi_table_header *pointer; void *base_pointer; - u8 *aml_pointer; - UINT64 physical_address; + u8 *aml_start; + u64 physical_address; u32 aml_length; u32 length; u32 count; @@ -235,13 +243,13 @@ acpi_handle *list; u32 *count; -} FIND_CONTEXT; +} find_context; typedef struct { acpi_namespace_node *node; -} NS_SEARCH_DATA; +} ns_search_data; /* @@ -274,7 +282,34 @@ u32 num_carats; u8 fully_qualified; -} ACPI_NAMESTRING_INFO; +} acpi_namestring_info; + + +/* Field creation info */ + +typedef struct +{ + acpi_namespace_node *region_node; + acpi_namespace_node *field_node; + acpi_namespace_node *register_node; + acpi_namespace_node *data_register_node; + u32 bank_value; + u32 field_bit_position; + u32 field_bit_length; + u8 field_flags; + u8 field_type; + +} ACPI_CREATE_FIELD_INFO; + +/* + * Field flags: Bits 00 - 03 : Access_type (Any_acc, Byte_acc, etc.) + * 04 : Lock_rule (1 == Lock) + * 05 - 06 : Update_rule + */ + +#define FIELD_ACCESS_TYPE_MASK 0x0F +#define FIELD_LOCK_RULE_MASK 0x10 +#define FIELD_UPDATE_RULE_MASK 0x60 /***************************************************************************** @@ -308,23 +343,24 @@ typedef struct { - ACPI_ADR_SPACE_HANDLER handler; + acpi_adr_space_handler handler; void *context; -} ACPI_ADR_SPACE_INFO; +} acpi_adr_space_info; /* Values and addresses of the GPE registers (both banks) */ typedef struct { - u8 status; /* Current value of status reg */ - u8 enable; /* Current value of enable reg */ u16 status_addr; /* Address of status reg */ u16 enable_addr; /* Address of enable reg */ + u8 status; /* Current value of status reg */ + u8 enable; /* Current value of enable reg */ + u8 wake_enable; /* Mask of bits to keep enabled when sleeping */ u8 gpe_base; /* Base GPE number */ -} ACPI_GPE_REGISTERS; +} acpi_gpe_registers; #define ACPI_GPE_LEVEL_TRIGGERED 1 @@ -338,7 +374,7 @@ u8 type; /* Level or Edge */ acpi_handle method_handle; /* Method handle for direct (fast) execution */ - ACPI_GPE_HANDLER handler; /* Address of handler, if any */ + acpi_gpe_handler handler; /* Address of handler, if any */ void *context; /* Context to be passed to handler */ } acpi_gpe_level_info; @@ -348,10 +384,10 @@ typedef struct { - ACPI_EVENT_HANDLER handler; /* Address of handler. */ + acpi_event_handler handler; /* Address of handler. */ void *context; /* Context to be passed to handler */ -} ACPI_FIXED_EVENT_INFO; +} acpi_fixed_event_info; /* Information used during field processing */ @@ -362,7 +398,7 @@ u8 field_flag; u32 pkg_length; -} ACPI_FIELD_INFO; +} acpi_field_info; /***************************************************************************** @@ -397,7 +433,7 @@ typedef struct acpi_common_state { ACPI_STATE_COMMON -} ACPI_COMMON_STATE; +} acpi_common_state; /* @@ -408,7 +444,7 @@ ACPI_STATE_COMMON union acpi_operand_obj *object; -} ACPI_UPDATE_STATE; +} acpi_update_state; /* @@ -424,7 +460,7 @@ u32 num_packages; u16 index; -} ACPI_PKG_STATE; +} acpi_pkg_state; /* @@ -437,7 +473,7 @@ struct acpi_parse_obj *predicate_op; u8 *aml_predicate_start; /* Start of if/while predicate */ -} ACPI_CONTROL_STATE; +} acpi_control_state; /* @@ -448,7 +484,7 @@ ACPI_STATE_COMMON acpi_namespace_node *node; -} ACPI_SCOPE_STATE; +} acpi_scope_state; typedef struct acpi_pscope_state @@ -460,7 +496,7 @@ u32 arg_list; /* next argument to parse */ u32 arg_count; /* Number of fixed arguments */ -} ACPI_PSCOPE_STATE; +} acpi_pscope_state; /* @@ -474,7 +510,17 @@ u8 num_results; u8 last_insert; -} ACPI_RESULT_VALUES; +} acpi_result_values; + + +typedef +acpi_status (*acpi_parse_downwards) ( + struct acpi_walk_state *walk_state, + struct acpi_parse_obj **out_op); + +typedef +acpi_status (*acpi_parse_upwards) ( + struct acpi_walk_state *walk_state); /* @@ -487,36 +533,34 @@ acpi_namespace_node *node; union acpi_operand_obj *handler_obj; -} ACPI_NOTIFY_INFO; +} acpi_notify_info; /* Generic state is union of structs above */ typedef union acpi_gen_state { - ACPI_COMMON_STATE common; - ACPI_CONTROL_STATE control; - ACPI_UPDATE_STATE update; - ACPI_SCOPE_STATE scope; - ACPI_PSCOPE_STATE parse_scope; - ACPI_PKG_STATE pkg; - ACPI_RESULT_VALUES results; - ACPI_NOTIFY_INFO notify; + acpi_common_state common; + acpi_control_state control; + acpi_update_state update; + acpi_scope_state scope; + acpi_pscope_state parse_scope; + acpi_pkg_state pkg; + acpi_result_values results; + acpi_notify_info notify; } acpi_generic_state; -typedef -acpi_status (*acpi_parse_downwards) ( - u16 opcode, - struct acpi_parse_obj *op, - struct acpi_walk_state *walk_state, - struct acpi_parse_obj **out_op); +/***************************************************************************** + * + * Interpreter typedefs and structs + * + ****************************************************************************/ typedef -acpi_status (*acpi_parse_upwards) ( - struct acpi_walk_state *walk_state, - struct acpi_parse_obj *op); +acpi_status (*ACPI_EXECUTE_OP) ( + struct acpi_walk_state *walk_state); /***************************************************************************** @@ -525,35 +569,6 @@ * ****************************************************************************/ -#define ACPI_OP_CLASS_MASK 0x1F -#define ACPI_OP_ARGS_MASK 0x20 -#define ACPI_OP_TYPE_MASK 0xC0 - -#define ACPI_OP_TYPE_OPCODE 0x00 -#define ACPI_OP_TYPE_ASCII 0x40 -#define ACPI_OP_TYPE_PREFIX 0x80 -#define ACPI_OP_TYPE_UNKNOWN 0xC0 - -#define ACPI_GET_OP_CLASS(a) ((a)->flags & ACPI_OP_CLASS_MASK) -#define ACPI_GET_OP_ARGS(a) ((a)->flags & ACPI_OP_ARGS_MASK) -#define ACPI_GET_OP_TYPE(a) ((a)->flags & ACPI_OP_TYPE_MASK) - -/* - * Flags byte: 0-4 (5 bits) = Opcode Class (0x001F - * 5 (1 bit) = Has arguments flag - * 6-7 (2 bits) = Reserved - */ -#define AML_NO_ARGS 0 -#define AML_HAS_ARGS 0x0020 -#define AML_NSOBJECT 0x0100 -#define AML_NSOPCODE 0x0200 -#define AML_NSNODE 0x0400 -#define AML_NAMED 0x0800 -#define AML_DEFER 0x1000 -#define AML_FIELD 0x2000 -#define AML_CREATE 0x4000 - - /* * AML opcode, name, and argument layout */ @@ -561,7 +576,9 @@ { u32 parse_args; /* Grammar/Parse time arguments */ u32 runtime_args; /* Interpret time arguments */ - u16 flags; /* Opcode type, Has_args flag */ + u16 flags; /* Misc flags */ + u8 class; /* Opcode class */ + u8 type; /* Opcode type */ #ifdef _OPCODE_NAMES NATIVE_CHAR *name; /* op name (debug only) */ @@ -583,7 +600,7 @@ NATIVE_CHAR *name; /* NULL terminated string */ struct acpi_parse_obj *arg; /* arguments and contained ops */ -} ACPI_PARSE_VALUE; +} acpi_parse_value; #define ACPI_PARSE_COMMON \ @@ -597,7 +614,7 @@ NATIVE_CHAR op_name[16]) /* op name (debug only) */\ /* NON-DEBUG members below: */\ acpi_namespace_node *node; /* for use by interpreter */\ - ACPI_PARSE_VALUE value; /* Value or args associated with the opcode */\ + acpi_parse_value value; /* Value or args associated with the opcode */\ /* @@ -627,18 +644,22 @@ * Parse state - one state per parser invocation and each control * method. */ - typedef struct acpi_parse_state { + u32 aml_size; u8 *aml_start; /* first AML byte */ u8 *aml; /* next AML byte */ u8 *aml_end; /* (last + 1) AML byte */ u8 *pkg_start; /* current package begin */ u8 *pkg_end; /* current package end */ - acpi_parse_object *start_op; /* root of parse tree */ + + struct acpi_parse_obj *start_op; /* root of parse tree */ struct acpi_node *start_node; - acpi_generic_state *scope; /* current scope */ - struct acpi_parse_state *next; + union acpi_gen_state *scope; /* current scope */ + + + struct acpi_parse_obj *start_scope; + } acpi_parse_state; @@ -683,8 +704,8 @@ #define PM1_STS 0x0100 #define PM1_EN 0x0200 #define PM1_CONTROL 0x0300 -#define PM1_a_CONTROL 0x0400 -#define PM1_b_CONTROL 0x0500 +#define PM1A_CONTROL 0x0400 +#define PM1B_CONTROL 0x0500 #define PM2_CONTROL 0x0600 #define PM_TIMER 0x0700 #define PROCESSOR_BLOCK 0x0800 @@ -838,7 +859,7 @@ { char buffer[ACPI_DEVICE_ID_LENGTH]; -} ACPI_DEVICE_ID; +} acpi_device_id; /***************************************************************************** @@ -879,7 +900,7 @@ NATIVE_CHAR *proc_name; NATIVE_CHAR *module_name; -} ACPI_DEBUG_PRINT_INFO; +} acpi_debug_print_info; /* Entry for a memory allocation (debug only) */ @@ -903,14 +924,14 @@ { ACPI_COMMON_DEBUG_MEM_HEADER -} ACPI_DEBUG_MEM_HEADER; +} acpi_debug_mem_header; typedef struct acpi_debug_mem_block { ACPI_COMMON_DEBUG_MEM_HEADER - UINT64 user_space; + u64 user_space; -} ACPI_DEBUG_MEM_BLOCK; +} acpi_debug_mem_block; #define ACPI_MEM_LIST_GLOBAL 0 diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acmacros.h linux/drivers/acpi/include/acmacros.h --- v2.4.13/linux/drivers/acpi/include/acmacros.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acmacros.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acmacros.h - C macros for the entire subsystem. - * $Revision: 94 $ + * $Revision: 97 $ * *****************************************************************************/ @@ -104,7 +104,7 @@ * Full 64-bit address/integer on both 32-bit and 64-bit platforms */ #ifndef LODWORD -#define LODWORD(l) ((u32)(UINT64)(l)) +#define LODWORD(l) ((u32)(u64)(l)) #endif #ifndef HIDWORD @@ -142,7 +142,7 @@ #define MOVE_UNALIGNED16_TO_16(d,s) *(u16*)(d) = *(u16*)(s) #define MOVE_UNALIGNED32_TO_32(d,s) *(u32*)(d) = *(u32*)(s) #define MOVE_UNALIGNED16_TO_32(d,s) *(u32*)(d) = *(u16*)(s) -#define MOVE_UNALIGNED64_TO_64(d,s) *(UINT64*)(d) = *(UINT64*)(s) +#define MOVE_UNALIGNED64_TO_64(d,s) *(u64*)(d) = *(u64*)(s) #else /* @@ -197,11 +197,6 @@ #define MUL_16(a) _MUL(a,4) #define MOD_16(a) _MOD(a,16) -/* - * Divide and Modulo - */ -#define ACPI_DIVIDE(n,d) ((n) / (d)) -#define ACPI_MODULO(n,d) ((n) % (d)) /* * Rounding macros (Power of two boundaries only) @@ -223,7 +218,7 @@ #define ROUND_BITS_UP_TO_BYTES(a) DIV_8((a) + 7) #define ROUND_BITS_DOWN_TO_BYTES(a) DIV_8((a)) -#define ROUND_UP_TO_1_k(a) (((a) + 1023) >> 10) +#define ROUND_UP_TO_1K(a) (((a) + 1023) >> 10) /* Generic (non-power-of-two) rounding */ @@ -243,9 +238,9 @@ #ifndef _IA16 -#define ACPI_PCI_DEVICE_MASK (UINT64) 0x0000FFFF00000000 -#define ACPI_PCI_FUNCTION_MASK (UINT64) 0x00000000FFFF0000 -#define ACPI_PCI_REGISTER_MASK (UINT64) 0x000000000000FFFF +#define ACPI_PCI_DEVICE_MASK (u64) 0x0000FFFF00000000 +#define ACPI_PCI_FUNCTION_MASK (u64) 0x00000000FFFF0000 +#define ACPI_PCI_REGISTER_MASK (u64) 0x000000000000FFFF #define ACPI_PCI_FUNCTION(a) (u16) ((((a) & ACPI_PCI_FUNCTION_MASK) >> 16)) #define ACPI_PCI_DEVICE(a) (u16) ((((a) & ACPI_PCI_DEVICE_MASK) >> 32)) @@ -279,10 +274,6 @@ #define IS_SINGLE_TABLE(x) (((x) & 0x01) == ACPI_TABLE_SINGLE ? 1 : 0) -/* Check if ACPI has been initialized properly */ - -#define ACPI_IS_INITIALIZATION_COMPLETE(s) {if (acpi_gbl_root_node) s = AE_OK; else s=AE_NO_NAMESPACE;} - /* * Macro to check if a pointer is within an ACPI table. * Parameter (a) is the pointer to check. Parameter (b) must be defined @@ -303,9 +294,9 @@ * Macros for the master AML opcode table */ #ifdef ACPI_DEBUG -#define ACPI_OP(name,Pargs,Iargs,flags) {Pargs,Iargs,flags,name} +#define ACPI_OP(name,Pargs,Iargs,class,type,flags) {Pargs,Iargs,flags,class,type,name} #else -#define ACPI_OP(name,Pargs,Iargs,flags) {Pargs,Iargs,flags} +#define ACPI_OP(name,Pargs,Iargs,class,type,flags) {Pargs,Iargs,flags,class,type} #endif #define ARG_TYPE_WIDTH 5 @@ -409,7 +400,7 @@ * as a local string ("_Proc_name) so that it can be also used by the function exit macros below. */ -#define PROC_NAME(a) ACPI_DEBUG_PRINT_INFO _dbg; \ +#define PROC_NAME(a) acpi_debug_print_info _dbg; \ _dbg.component_id = _COMPONENT; \ _dbg.proc_name = a; \ _dbg.module_name = _THIS_MODULE; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acnamesp.h linux/drivers/acpi/include/acnamesp.h --- v2.4.13/linux/drivers/acpi/include/acnamesp.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acnamesp.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acnamesp.h - Namespace subcomponent prototypes and defines - * $Revision: 107 $ + * $Revision: 110 $ * *****************************************************************************/ @@ -98,18 +98,16 @@ acpi_handle start_object, u32 max_depth, u8 unlock_before_callback, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value); - acpi_namespace_node * -acpi_ns_get_next_object ( +acpi_ns_get_next_node ( acpi_object_type8 type, acpi_namespace_node *parent, acpi_namespace_node *child); - acpi_status acpi_ns_delete_namespace_by_owner ( u16 table_id); @@ -224,6 +222,7 @@ void acpi_ns_dump_objects ( acpi_object_type8 type, + u8 display_type, u32 max_depth, u32 ownder_id, acpi_handle start_handle); @@ -304,7 +303,6 @@ acpi_namespace_node *obj_node, NATIVE_CHAR *search_for); - acpi_status acpi_ns_get_node ( NATIVE_CHAR *pathname, @@ -382,11 +380,11 @@ acpi_status acpi_ns_build_internal_name ( - ACPI_NAMESTRING_INFO *info); + acpi_namestring_info *info); acpi_status acpi_ns_get_internal_name_length ( - ACPI_NAMESTRING_INFO *info); + acpi_namestring_info *info); acpi_status acpi_ns_internalize_name ( @@ -401,7 +399,7 @@ NATIVE_CHAR **converted_name); acpi_namespace_node * -acpi_ns_convert_handle_to_entry ( +acpi_ns_map_handle_to_node ( acpi_handle handle); acpi_handle @@ -418,7 +416,7 @@ acpi_namespace_node * -acpi_ns_get_next_valid_object ( +acpi_ns_get_next_valid_node ( acpi_namespace_node *node); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acobject.h linux/drivers/acpi/include/acobject.h --- v2.4.13/linux/drivers/acpi/include/acobject.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acobject.h Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: acobject.h - Definition of acpi_operand_object (Internal object only) - * $Revision: 90 $ + * $Revision: 93 $ * *****************************************************************************/ @@ -98,6 +98,13 @@ #define AFIELD_SINGLE_DATUM 0x1 +/* + * Fields common to both Strings and Buffers + */ +#define ACPI_COMMON_BUFFER_INFO \ + u32 length; + + /****************************************************************************** * * Individual Object Descriptors @@ -132,8 +139,7 @@ typedef struct /* STRING - has length and pointer - Null terminated, ASCII characters only */ { ACPI_OBJECT_COMMON_HEADER - - u32 length; + ACPI_COMMON_BUFFER_INFO NATIVE_CHAR *pointer; /* String value in AML stream or in allocated space */ } ACPI_OBJECT_STRING; @@ -142,9 +148,8 @@ typedef struct /* BUFFER - has length and pointer - not null terminated */ { ACPI_OBJECT_COMMON_HEADER - - u32 length; - u8 *pointer; /* points to the buffer in allocated space */ + ACPI_COMMON_BUFFER_INFO + u8 *pointer; /* Buffer value in AML stream or in allocated space */ } ACPI_OBJECT_BUFFER; @@ -154,7 +159,6 @@ ACPI_OBJECT_COMMON_HEADER u32 count; /* # of elements in package */ - union acpi_operand_obj **elements; /* Array of pointers to Acpi_objects */ union acpi_operand_obj **next_element; /* used only while initializing */ @@ -188,10 +192,10 @@ u8 method_flags; u8 param_count; - u32 pcode_length; + u32 aml_length; void *semaphore; - u8 *pcode; + u8 *aml_start; u8 concurrency; u8 thread_count; @@ -341,7 +345,7 @@ ACPI_OBJECT_COMMON_HEADER acpi_namespace_node *node; /* Parent device */ - ACPI_NOTIFY_HANDLER handler; + acpi_notify_handler handler; void *context; } ACPI_OBJECT_NOTIFY_HANDLER; @@ -358,11 +362,11 @@ u8 space_id; u16 hflags; - ACPI_ADR_SPACE_HANDLER handler; + acpi_adr_space_handler handler; acpi_namespace_node *node; /* Parent device */ void *context; - ACPI_ADR_SPACE_SETUP setup; + acpi_adr_space_setup setup; union acpi_operand_obj *region_list; /* regions using this handler */ union acpi_operand_obj *next; @@ -402,8 +406,8 @@ ACPI_OBJECT_COMMON_HEADER u8 byte_fill1; u16 word_fill1; - u32 pcode_length; - u8 *pcode; + u32 aml_length; + u8 *aml_start; acpi_namespace_node *method_REG; /* _REG method for this region (if any) */ void *region_context; /* Region-specific data */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acparser.h linux/drivers/acpi/include/acparser.h --- v2.4.13/linux/drivers/acpi/include/acparser.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acparser.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: acparser.h - AML Parser subcomponent prototypes and defines - * $Revision: 51 $ + * $Revision: 54 $ * *****************************************************************************/ @@ -121,8 +121,6 @@ acpi_status acpi_ps_find_object ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op); @@ -136,15 +134,7 @@ acpi_status acpi_ps_parse_aml ( - acpi_parse_object *start_scope, - u8 *aml, - u32 aml_size, - u32 parse_flags, - acpi_namespace_node *method_node, - acpi_operand_object **params, - acpi_operand_object **caller_return_desc, - acpi_parse_downwards descending_callback, - acpi_parse_upwards ascending_callback); + acpi_walk_state *walk_state); acpi_status acpi_ps_parse_table ( @@ -245,12 +235,6 @@ /* psutils - parser utilities */ - - -acpi_parse_state * -acpi_ps_create_state ( - u8 *aml, - u32 aml_size); void acpi_ps_init_op ( diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acpixf.h linux/drivers/acpi/include/acpixf.h --- v2.4.13/linux/drivers/acpi/include/acpixf.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acpixf.h Wed Oct 24 14:06:22 2001 @@ -135,14 +135,14 @@ acpi_object_type type, acpi_handle start_object, u32 max_depth, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void * *return_value); acpi_status acpi_get_devices ( NATIVE_CHAR *HID, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value); @@ -200,46 +200,46 @@ acpi_status acpi_install_fixed_event_handler ( u32 acpi_event, - ACPI_EVENT_HANDLER handler, + acpi_event_handler handler, void *context); acpi_status acpi_remove_fixed_event_handler ( u32 acpi_event, - ACPI_EVENT_HANDLER handler); + acpi_event_handler handler); acpi_status acpi_install_notify_handler ( acpi_handle device, u32 handler_type, - ACPI_NOTIFY_HANDLER handler, + acpi_notify_handler handler, void *context); acpi_status acpi_remove_notify_handler ( acpi_handle device, u32 handler_type, - ACPI_NOTIFY_HANDLER handler); + acpi_notify_handler handler); acpi_status acpi_install_address_space_handler ( acpi_handle device, ACPI_ADR_SPACE_TYPE space_id, - ACPI_ADR_SPACE_HANDLER handler, - ACPI_ADR_SPACE_SETUP setup, + acpi_adr_space_handler handler, + acpi_adr_space_setup setup, void *context); acpi_status acpi_remove_address_space_handler ( acpi_handle device, ACPI_ADR_SPACE_TYPE space_id, - ACPI_ADR_SPACE_HANDLER handler); + acpi_adr_space_handler handler); acpi_status acpi_install_gpe_handler ( u32 gpe_number, u32 type, - ACPI_GPE_HANDLER handler, + acpi_gpe_handler handler, void *context); acpi_status @@ -253,17 +253,19 @@ acpi_status acpi_remove_gpe_handler ( u32 gpe_number, - ACPI_GPE_HANDLER handler); + acpi_gpe_handler handler); acpi_status acpi_enable_event ( u32 acpi_event, - u32 type); + u32 type, + u32 flags); acpi_status acpi_disable_event ( u32 acpi_event, - u32 type); + u32 type, + u32 flags); acpi_status acpi_clear_event ( diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acstruct.h linux/drivers/acpi/include/acstruct.h --- v2.4.13/linux/drivers/acpi/include/acstruct.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acstruct.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acstruct.h - Internal structs - * $Revision: 5 $ + * $Revision: 10 $ * *****************************************************************************/ @@ -51,46 +51,50 @@ u8 data_type; /* To differentiate various internal objs MUST BE FIRST!*/\ acpi_owner_id owner_id; /* Owner of objects created during the walk */ u8 last_predicate; /* Result of last predicate */ + u8 current_result; /* */ u8 next_op_info; /* Info about Next_op */ u8 num_operands; /* Stack pointer for Operands[] array */ - u8 current_result; /* */ + u8 return_used; + u8 walk_type; + u16 current_sync_level; /* Mutex Sync (nested acquire) level */ + u16 opcode; /* Current AML opcode */ + u32 arg_count; /* push for fixed or var args */ + u32 aml_offset; + u32 arg_types; + u32 method_breakpoint; /* For single stepping */ + u32 parse_flags; + u32 prev_arg_types; - struct acpi_walk_state *next; /* Next Walk_state in list */ + + u8 *aml_last_while; + struct acpi_node arguments[MTH_NUM_ARGS]; /* Control method arguments */ + union acpi_operand_obj **caller_return_desc; + acpi_generic_state *control_state; /* List of control states (nested IFs) */ + struct acpi_node local_variables[MTH_NUM_LOCALS]; /* Control method locals */ + struct acpi_node *method_call_node; /* Called method Node*/ + acpi_parse_object *method_call_op; /* Method_call Op if running a method */ + union acpi_operand_obj *method_desc; /* Method descriptor if running a method */ + struct acpi_node *method_node; /* Method Node if running a method */ + acpi_parse_object *op; /* Current parser op */ + union acpi_operand_obj *operands[OBJ_NUM_OPERANDS+1]; /* Operands passed to the interpreter (+1 for NULL terminator) */ + const acpi_opcode_info *op_info; /* Info on current opcode */ acpi_parse_object *origin; /* Start of walk [Obsolete] */ + union acpi_operand_obj **params; + acpi_parse_state parser_state; /* Current state of parser */ + union acpi_operand_obj *result_obj; + acpi_generic_state *results; /* Stack of accumulated results */ + union acpi_operand_obj *return_desc; /* Return object, if any */ + acpi_generic_state *scope_info; /* Stack of nested scopes */ /* TBD: Obsolete with removal of WALK procedure ? */ acpi_parse_object *prev_op; /* Last op that was processed */ acpi_parse_object *next_op; /* next op to be processed */ - acpi_generic_state *results; /* Stack of accumulated results */ - acpi_generic_state *control_state; /* List of control states (nested IFs) */ - acpi_generic_state *scope_info; /* Stack of nested scopes */ - acpi_parse_state *parser_state; /* Current state of parser */ - u8 *aml_last_while; - const acpi_opcode_info *op_info; /* Info on current opcode */ acpi_parse_downwards descending_callback; acpi_parse_upwards ascending_callback; - - union acpi_operand_obj *return_desc; /* Return object, if any */ - union acpi_operand_obj *method_desc; /* Method descriptor if running a method */ - struct acpi_node *method_node; /* Method Node if running a method */ - acpi_parse_object *method_call_op; /* Method_call Op if running a method */ - struct acpi_node *method_call_node; /* Called method Node*/ - union acpi_operand_obj *operands[OBJ_NUM_OPERANDS]; /* Operands passed to the interpreter */ - struct acpi_node arguments[MTH_NUM_ARGS]; /* Control method arguments */ - struct acpi_node local_variables[MTH_NUM_LOCALS]; /* Control method locals */ struct acpi_walk_list *walk_list; - u32 parse_flags; - u8 walk_type; - u8 return_used; - u16 opcode; /* Current AML opcode */ - u32 prev_arg_types; - u16 current_sync_level; /* Mutex Sync (nested acquire) level */ - - /* Debug support */ - - u32 method_breakpoint; + struct acpi_walk_state *next; /* Next Walk_state in list */ } acpi_walk_state; @@ -121,7 +125,7 @@ u16 object_count; acpi_table_desc *table_desc; -} ACPI_INIT_WALK_INFO; +} acpi_init_walk_info; /* Info used by TBD */ @@ -133,7 +137,7 @@ u16 num_INI; acpi_table_desc *table_desc; -} ACPI_DEVICE_WALK_INFO; +} acpi_device_walk_info; /* TBD: [Restructure] Merge with struct above */ @@ -142,16 +146,54 @@ { u32 debug_level; u32 owner_id; + u8 display_type; + +} acpi_walk_info; + +/* Display Types */ -} ACPI_WALK_INFO; +#define ACPI_DISPLAY_SUMMARY 0 +#define ACPI_DISPLAY_OBJECTS 1 typedef struct acpi_get_devices_info { - ACPI_WALK_CALLBACK user_function; + acpi_walk_callback user_function; void *context; NATIVE_CHAR *hid; -} ACPI_GET_DEVICES_INFO; +} acpi_get_devices_info; + + +typedef union acpi_aml_operands +{ + acpi_operand_object *operands[7]; + + struct + { + ACPI_OBJECT_INTEGER *type; + ACPI_OBJECT_INTEGER *code; + ACPI_OBJECT_INTEGER *argument; + + } fatal; + + struct + { + acpi_operand_object *source; + ACPI_OBJECT_INTEGER *index; + acpi_operand_object *target; + + } index; + + struct + { + acpi_operand_object *source; + ACPI_OBJECT_INTEGER *index; + ACPI_OBJECT_INTEGER *length; + acpi_operand_object *target; + + } mid; + +} ACPI_AML_OPERANDS; #endif diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actables.h linux/drivers/acpi/include/actables.h --- v2.4.13/linux/drivers/acpi/include/actables.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actables.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: actables.h - ACPI table management - * $Revision: 31 $ + * $Revision: 32 $ * *****************************************************************************/ @@ -176,10 +176,6 @@ /* * tbutils - common table utilities */ - -u8 -acpi_tb_system_table_pointer ( - void *where); acpi_status acpi_tb_map_acpi_table ( diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actbl.h linux/drivers/acpi/include/actbl.h --- v2.4.13/linux/drivers/acpi/include/actbl.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actbl.h Wed Oct 24 14:06:22 2001 @@ -84,7 +84,7 @@ u8 revision; /* Must be 0 for 1.0, 2 for 2.0 */ u32 rsdt_physical_address; /* 32-bit physical address of RSDT */ u32 length; /* XSDT Length in bytes including hdr */ - UINT64 xsdt_physical_address; /* 64-bit physical address of XSDT */ + u64 xsdt_physical_address; /* 64-bit physical address of XSDT */ u8 extended_checksum; /* Checksum of entire table */ NATIVE_CHAR reserved [3]; /* reserved field must be 0 */ @@ -110,7 +110,7 @@ typedef struct /* Common FACS for internal use */ { u32 *global_lock; - UINT64 *firmware_waking_vector; + u64 *firmware_waking_vector; u8 vector_width; } acpi_common_facs; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actbl1.h linux/drivers/acpi/include/actbl1.h --- v2.4.13/linux/drivers/acpi/include/actbl1.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actbl1.h Wed Oct 24 14:06:22 2001 @@ -51,7 +51,7 @@ u32 hardware_signature; /* hardware configuration signature */ u32 firmware_waking_vector; /* ACPI OS waking vector */ u32 global_lock; /* Global Lock */ - u32 S4_bios_f : 1; /* Indicates if S4_bIOS support is present */ + u32 S4bios_f : 1; /* Indicates if S4BIOS support is present */ u32 reserved1 : 31; /* must be 0 */ u8 resverved3 [40]; /* reserved - must be zero */ @@ -73,7 +73,7 @@ u32 smi_cmd; /* Port address of SMI command port */ u8 acpi_enable; /* value to write to smi_cmd to enable ACPI */ u8 acpi_disable; /* value to write to smi_cmd to disable ACPI */ - u8 S4_bios_req; /* Value to write to SMI CMD to enter S4_bIOS state */ + u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ u8 reserved2; /* reserved - must be zero */ u32 pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ u32 pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actbl2.h linux/drivers/acpi/include/actbl2.h --- v2.4.13/linux/drivers/acpi/include/actbl2.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actbl2.h Wed Oct 24 14:06:22 2001 @@ -65,7 +65,7 @@ typedef struct { acpi_table_header header; /* Table header */ - UINT64 table_offset_entry [1]; /* Array of pointers to */ + u64 table_offset_entry [1]; /* Array of pointers to */ /* other tables' headers */ } XSDT_DESCRIPTOR_REV2; @@ -80,9 +80,9 @@ u32 hardware_signature; /* hardware configuration signature */ u32 firmware_waking_vector; /* 32bit physical address of the Firmware Waking Vector. */ u32 global_lock; /* Global Lock used to synchronize access to shared hardware resources */ - u32 S4_bios_f : 1; /* Indicates if S4_bIOS support is present */ + u32 S4bios_f : 1; /* Indicates if S4BIOS support is present */ u32 reserved1 : 31; /* must be 0 */ - UINT64 Xfirmware_waking_vector; /* 64bit physical address of the Firmware Waking Vector. */ + u64 Xfirmware_waking_vector; /* 64bit physical address of the Firmware Waking Vector. */ u8 version; /* Version of this table */ u8 reserved3 [31]; /* reserved - must be zero */ @@ -98,7 +98,7 @@ u8 register_bit_width; /* Size in bits of given register */ u8 register_bit_offset; /* Bit offset within the register */ u8 reserved; /* Must be 0 */ - UINT64 address; /* 64-bit address of struct or register */ + u64 address; /* 64-bit address of struct or register */ } acpi_generic_address; @@ -117,7 +117,7 @@ u32 smi_cmd; /* Port address of SMI command port */ u8 acpi_enable; /* value to write to smi_cmd to enable ACPI */ u8 acpi_disable; /* value to write to smi_cmd to disable ACPI */ - u8 S4_bios_req; /* Value to write to SMI CMD to enter S4_bIOS state */ + u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ u8 pstate_cnt; /* processor performance state control*/ u32 V1_pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ u32 V1_pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ @@ -139,8 +139,8 @@ u16 plvl3_lat; /* worst case HW latency to enter/exit C3 state */ u16 flush_size; /* number of flush strides that need to be read */ u16 flush_stride; /* Processor's memory cache line width, in bytes */ - u8 duty_offset; /* Processor’s duty cycle index in processor's P_CNT reg*/ - u8 duty_width; /* Processor’s duty cycle value bit width in P_CNT register.*/ + u8 duty_offset; /* Processor_’s duty cycle index in processor's P_CNT reg*/ + u8 duty_width; /* Processor_’s duty cycle value bit width in P_CNT register.*/ u8 day_alrm; /* index to day-of-month alarm in RTC CMOS RAM */ u8 mon_alrm; /* index to month-of-year alarm in RTC CMOS RAM */ u8 century; /* index to century in RTC CMOS RAM */ @@ -166,8 +166,8 @@ acpi_generic_address reset_register; /* Reset register address in GAS format */ u8 reset_value; /* Value to write to the Reset_register port to reset the system. */ u8 reserved7[3]; /* These three bytes must be zero */ - UINT64 Xfirmware_ctrl; /* 64-bit physical address of FACS */ - UINT64 Xdsdt; /* 64-bit physical address of DSDT */ + u64 Xfirmware_ctrl; /* 64-bit physical address of FACS */ + u64 Xdsdt; /* 64-bit physical address of DSDT */ acpi_generic_address Xpm1a_evt_blk; /* Extended Power Mgt 1a Acpi_event Reg Blk address */ acpi_generic_address Xpm1b_evt_blk; /* Extended Power Mgt 1b Acpi_event Reg Blk address */ acpi_generic_address Xpm1a_cnt_blk; /* Extended Power Mgt 1a Control Reg Blk address */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actbl71.h linux/drivers/acpi/include/actbl71.h --- v2.4.13/linux/drivers/acpi/include/actbl71.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actbl71.h Wed Oct 24 14:06:22 2001 @@ -41,7 +41,7 @@ /* Only for clarity in declarations */ -typedef UINT64 IO_ADDRESS; +typedef u64 IO_ADDRESS; #pragma pack(1) @@ -51,7 +51,7 @@ u8 checksum; /* to make sum of struct == 0 */ NATIVE_CHAR oem_id [6]; /* OEM identification */ u8 reserved; /* Must be 0 for 1.0, 2 for 2.0 */ - UINT64 rsdt_physical_address; /* 64-bit physical address of RSDT */ + u64 rsdt_physical_address; /* 64-bit physical address of RSDT */ } RSDP_DESCRIPTOR_REV071; @@ -63,7 +63,7 @@ { acpi_table_header header; /* Table header */ u32 reserved_pad; /* IA64 alignment, must be 0 */ - UINT64 table_offset_entry [1]; /* Array of pointers to other */ + u64 table_offset_entry [1]; /* Array of pointers to other */ /* tables' headers */ } RSDT_DESCRIPTOR_REV071; @@ -78,9 +78,9 @@ u32 length; /* length of structure, in bytes */ u32 hardware_signature; /* hardware configuration signature */ u32 reserved4; /* must be 0 */ - UINT64 firmware_waking_vector; /* ACPI OS waking vector */ - UINT64 global_lock; /* Global Lock */ - u32 S4_bios_f : 1; /* Indicates if S4_bIOS support is present */ + u64 firmware_waking_vector; /* ACPI OS waking vector */ + u64 global_lock; /* Global Lock */ + u32 S4bios_f : 1; /* Indicates if S4BIOS support is present */ u32 reserved1 : 31; /* must be 0 */ u8 reserved3 [28]; /* reserved - must be zero */ @@ -95,24 +95,24 @@ { acpi_table_header header; /* table header */ u32 reserved_pad; /* IA64 alignment, must be 0 */ - UINT64 firmware_ctrl; /* 64-bit Physical address of FACS */ - UINT64 dsdt; /* 64-bit Physical address of DSDT */ + u64 firmware_ctrl; /* 64-bit Physical address of FACS */ + u64 dsdt; /* 64-bit Physical address of DSDT */ u8 model; /* System Interrupt Model */ u8 address_space; /* Address Space Bitmask */ u16 sci_int; /* System vector of SCI interrupt */ u8 acpi_enable; /* value to write to smi_cmd to enable ACPI */ u8 acpi_disable; /* value to write to smi_cmd to disable ACPI */ - u8 S4_bios_req; /* Value to write to SMI CMD to enter S4_bIOS state */ + u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ u8 reserved2; /* reserved - must be zero */ - UINT64 smi_cmd; /* Port address of SMI command port */ - UINT64 pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ - UINT64 pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ - UINT64 pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ - UINT64 pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ - UINT64 pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ - UINT64 pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ - UINT64 gpe0blk; /* Port addr of General Purpose Acpi_event 0 Reg Blk */ - UINT64 gpe1_blk; /* Port addr of General Purpose Acpi_event 1 Reg Blk */ + u64 smi_cmd; /* Port address of SMI command port */ + u64 pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ + u64 pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ + u64 pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ + u64 pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ + u64 pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ + u64 pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ + u64 gpe0blk; /* Port addr of General Purpose Acpi_event 0 Reg Blk */ + u64 gpe1_blk; /* Port addr of General Purpose Acpi_event 1 Reg Blk */ u8 pm1_evt_len; /* Byte Length of ports at pm1_x_evt_blk */ u8 pm1_cnt_len; /* Byte Length of ports at pm1_x_cnt_blk */ u8 pm2_cnt_len; /* Byte Length of ports at pm2_cnt_blk */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actypes.h linux/drivers/acpi/include/actypes.h --- v2.4.13/linux/drivers/acpi/include/actypes.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actypes.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: actypes.h - Common data types for the entire ACPI subsystem - * $Revision: 188 $ + * $Revision: 193 $ * *****************************************************************************/ @@ -68,9 +68,8 @@ typedef UINT64 ACPI_IO_ADDRESS; typedef UINT64 ACPI_PHYSICAL_ADDRESS; -#define ALIGNED_ADDRESS_BOUNDARY 0x00000008 - -/* (No hardware alignment support in IA64) */ +#define ALIGNED_ADDRESS_BOUNDARY 0x00000008 /* No hardware alignment support in IA64 */ +#define ACPI_USE_NATIVE_DIVIDE /* Native 64-bit integer support */ #elif _IA16 @@ -101,6 +100,7 @@ #define ALIGNED_ADDRESS_BOUNDARY 0x00000002 #define _HW_ALIGNMENT_SUPPORT +#define ACPI_USE_NATIVE_DIVIDE /* No 64-bit integers, ok to use native divide */ /* * (16-bit only) internal integers must be 32-bits, so @@ -196,11 +196,18 @@ typedef struct { - u32 lo; - u32 hi; + u32 lo; + u32 hi; } uint64_struct; +typedef union +{ + u64 full; + uint64_struct part; + +} uint64_overlay; + /* * Acpi integer width. In ACPI version 1, integers are @@ -220,17 +227,23 @@ #define ACPI_MAX_BCD_DIGITS 8 #define ACPI_MAX_DECIMAL_DIGITS 10 +#define ACPI_USE_NATIVE_DIVIDE /* Use compiler native 32-bit divide */ + + #else /* 64-bit integers */ -typedef UINT64 acpi_integer; +typedef u64 acpi_integer; #define ACPI_INTEGER_MAX ACPI_UINT64_MAX #define ACPI_INTEGER_BIT_SIZE 64 #define ACPI_MAX_BCD_VALUE 9999999999999999 #define ACPI_MAX_BCD_DIGITS 16 #define ACPI_MAX_DECIMAL_DIGITS 19 +#ifdef _IA64 +#define ACPI_USE_NATIVE_DIVIDE /* Use compiler native 64-bit divide */ +#endif #endif @@ -453,24 +466,36 @@ #define ACPI_EVENT_EDGE_TRIGGERED (acpi_event_type) 2 /* + * GPEs + */ +#define ACPI_EVENT_ENABLE 0x1 +#define ACPI_EVENT_WAKE_ENABLE 0x2 + +#define ACPI_EVENT_DISABLE 0x1 +#define ACPI_EVENT_WAKE_DISABLE 0x2 + + +/* * Acpi_event Status: * ------------- * The encoding of acpi_event_status is illustrated below. * Note that a set bit (1) indicates the property is TRUE * (e.g. if bit 0 is set then the event is enabled). - * +---------------+-+-+ - * | Bits 31:2 |1|0| - * +---------------+-+-+ - * | | | - * | | +- Enabled? - * | +--- Set? + * +-------------+-+-+-+ + * | Bits 31:3 |2|1|0| + * +-------------+-+-+-+ + * | | | | + * | | | +- Enabled? + * | | +--- Enabled for wake? + * | +----- Set? * +----------- */ typedef u32 acpi_event_status; #define ACPI_EVENT_FLAG_DISABLED (acpi_event_status) 0x00 #define ACPI_EVENT_FLAG_ENABLED (acpi_event_status) 0x01 -#define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x02 +#define ACPI_EVENT_FLAG_WAKE_ENABLED (acpi_event_status) 0x02 +#define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x04 /* Notify types */ @@ -604,7 +629,7 @@ { u32 count; -} ACPI_TABLE_INFO; +} acpi_table_info; /* @@ -621,7 +646,7 @@ u32 debug_level; u32 debug_layer; u32 num_table_types; - ACPI_TABLE_INFO table_info [NUM_ACPI_TABLES]; + acpi_table_info table_info [NUM_ACPI_TABLES]; } acpi_system_info; @@ -631,15 +656,15 @@ */ typedef -u32 (*ACPI_EVENT_HANDLER) ( +u32 (*acpi_event_handler) ( void *context); typedef -void (*ACPI_GPE_HANDLER) ( +void (*acpi_gpe_handler) ( void *context); typedef -void (*ACPI_NOTIFY_HANDLER) ( +void (*acpi_notify_handler) ( acpi_handle device, u32 value, void *context); @@ -651,7 +676,7 @@ #define ACPI_WRITE_ADR_SPACE 2 typedef -acpi_status (*ACPI_ADR_SPACE_HANDLER) ( +acpi_status (*acpi_adr_space_handler) ( u32 function, ACPI_PHYSICAL_ADDRESS address, u32 bit_width, @@ -659,11 +684,11 @@ void *handler_context, void *region_context); -#define ACPI_DEFAULT_HANDLER ((ACPI_ADR_SPACE_HANDLER) NULL) +#define ACPI_DEFAULT_HANDLER ((acpi_adr_space_handler) NULL) typedef -acpi_status (*ACPI_ADR_SPACE_SETUP) ( +acpi_status (*acpi_adr_space_setup) ( acpi_handle region_handle, u32 function, void *handler_context, @@ -673,7 +698,7 @@ #define ACPI_REGION_DEACTIVATE 1 typedef -acpi_status (*ACPI_WALK_CALLBACK) ( +acpi_status (*acpi_walk_callback) ( acpi_handle obj_handle, u32 nesting_level, void *context, @@ -758,7 +783,7 @@ /* * IO Attributes - * The ISA IO ranges are: n000-n0FFh, n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh. + * The ISA IO ranges are: n000-n0FFh, n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh. * The non-ISA IO ranges are: n100-n3_fFh, n500-n7_fFh, n900-n_bFFh, n_cD0-n_fFFh. */ #define NON_ISA_ONLY_RANGES (u8) 0x01 @@ -988,11 +1013,11 @@ u32 min_address_fixed; u32 max_address_fixed; acpi_resource_attribute attribute; - UINT64 granularity; - UINT64 min_address_range; - UINT64 max_address_range; - UINT64 address_translation_offset; - UINT64 address_length; + u64 granularity; + u64 min_address_range; + u64 max_address_range; + u64 address_translation_offset; + u64 address_length; acpi_resource_source resource_source; } acpi_resource_address64; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acutils.h linux/drivers/acpi/include/acutils.h --- v2.4.13/linux/drivers/acpi/include/acutils.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acutils.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acutils.h -- prototypes for the common (subsystem-wide) procedures - * $Revision: 113 $ + * $Revision: 117 $ * *****************************************************************************/ @@ -270,47 +270,47 @@ void acpi_ut_trace ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info); + acpi_debug_print_info *dbg_info); void acpi_ut_trace_ptr ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, void *pointer); void acpi_ut_trace_u32 ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, u32 integer); void acpi_ut_trace_str ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, NATIVE_CHAR *string); void acpi_ut_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info); + acpi_debug_print_info *dbg_info); void acpi_ut_status_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, acpi_status status); void acpi_ut_value_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, acpi_integer value); void acpi_ut_ptr_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, u8 *ptr); void @@ -342,17 +342,17 @@ acpi_ut_debug_print ( u32 requested_debug_level, u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, char *format, - ...); + ...) ACPI_PRINTF_LIKE_FUNC; void acpi_ut_debug_print_raw ( u32 requested_debug_level, u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, char *format, - ...); + ...) ACPI_PRINTF_LIKE_FUNC; /* @@ -389,6 +389,7 @@ #define METHOD_NAME__REG "_REG" #define METHOD_NAME__SEG "_SEG" #define METHOD_NAME__BBN "_BBN" +#define METHOD_NAME__PRT "_PRT" acpi_status @@ -400,7 +401,7 @@ acpi_status acpi_ut_execute_HID ( acpi_namespace_node *device_node, - ACPI_DEVICE_ID *hid); + acpi_device_id *hid); acpi_status acpi_ut_execute_STA ( @@ -410,7 +411,7 @@ acpi_status acpi_ut_execute_UID ( acpi_namespace_node *device_node, - ACPI_DEVICE_ID *uid); + acpi_device_id *uid); /* @@ -562,9 +563,23 @@ void); /* - * Ututils + * utmisc */ +acpi_status +acpi_ut_divide ( + acpi_integer *in_dividend, + acpi_integer *in_divisor, + acpi_integer *out_quotient, + acpi_integer *out_remainder); + +acpi_status +acpi_ut_short_divide ( + acpi_integer *in_dividend, + u32 divisor, + acpi_integer *out_quotient, + u32 *out_remainder); + u8 acpi_ut_valid_acpi_name ( u32 name); @@ -638,7 +653,7 @@ void); void -acpi_ut_dump_current_allocations ( +acpi_ut_dump_allocations ( u32 component, NATIVE_CHAR *module); #endif diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/amlcode.h linux/drivers/acpi/include/amlcode.h --- v2.4.13/linux/drivers/acpi/include/amlcode.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/amlcode.h Wed Oct 24 14:06:22 2001 @@ -3,7 +3,7 @@ * Name: amlcode.h - Definitions for AML, as included in "definition blocks" * Declarations and definitions contained herein are derived * directly from the ACPI specification. - * $Revision: 53 $ + * $Revision: 58 $ * *****************************************************************************/ @@ -266,47 +266,96 @@ #define OPGRP_FIELD 0x02 #define OPGRP_BYTELIST 0x04 -#define OPTYPE_UNDEFINED 0 +/* + * Opcode information + */ -#define OPTYPE_LITERAL 1 -#define OPTYPE_CONSTANT 2 -#define OPTYPE_METHOD_ARGUMENT 3 -#define OPTYPE_LOCAL_VARIABLE 4 -#define OPTYPE_DATA_TERM 5 - -/* Type 1 opcodes */ - -#define OPTYPE_MONADIC1 6 -#define OPTYPE_DYADIC1 7 - -/* Type 2 opcodes */ +/* Opcode flags */ -#define OPTYPE_MONADIC2 8 -#define OPTYPE_MONADIC2_r 9 -#define OPTYPE_DYADIC2 10 -#define OPTYPE_DYADIC2_r 11 -#define OPTYPE_DYADIC2_s 12 +#define AML_HAS_ARGS 0x0800 +#define AML_HAS_TARGET 0x0400 +#define AML_HAS_RETVAL 0x0200 +#define AML_NSOBJECT 0x0100 +#define AML_NSOPCODE 0x0080 +#define AML_NSNODE 0x0040 +#define AML_NAMED 0x0020 +#define AML_DEFER 0x0010 +#define AML_FIELD 0x0008 +#define AML_CREATE 0x0004 +#define AML_MATH 0x0002 +#define AML_LOGICAL 0x0001 + +/* Convenient flag groupings */ + +#define AML_FLAGS_EXEC_1A_0T_0R AML_HAS_ARGS /* Monadic1 */ +#define AML_FLAGS_EXEC_1A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL /* Monadic2 */ +#define AML_FLAGS_EXEC_1A_1T_0R AML_HAS_ARGS | AML_HAS_TARGET +#define AML_FLAGS_EXEC_1A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL /* Monadic2_r */ +#define AML_FLAGS_EXEC_2A_0T_0R AML_HAS_ARGS /* Dyadic1 */ +#define AML_FLAGS_EXEC_2A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL /* Dyadic2 */ +#define AML_FLAGS_EXEC_2A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL /* Dyadic2_r */ +#define AML_FLAGS_EXEC_2A_2T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL +#define AML_FLAGS_EXEC_3A_0T_0R AML_HAS_ARGS +#define AML_FLAGS_EXEC_3A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL +#define AML_FLAGS_EXEC_6A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL -/* Multi-operand (>=3) opcodes */ -#define OPTYPE_TRIADIC 13 -#define OPTYPE_QUADRADIC 14 -#define OPTYPE_HEXADIC 15 +/* + * The opcode Type is used in a dispatch table, do not change + * without updating the table. + */ +#define AML_TYPE_EXEC_1A_0T_0R 0x00 /* Monadic1 */ +#define AML_TYPE_EXEC_1A_0T_1R 0x01 /* Monadic2 */ +#define AML_TYPE_EXEC_1A_1T_0R 0x02 +#define AML_TYPE_EXEC_1A_1T_1R 0x03 /* Monadic2_r */ +#define AML_TYPE_EXEC_2A_0T_0R 0x04 /* Dyadic1 */ +#define AML_TYPE_EXEC_2A_0T_1R 0x05 /* Dyadic2 */ +#define AML_TYPE_EXEC_2A_1T_1R 0x06 /* Dyadic2_r */ +#define AML_TYPE_EXEC_2A_2T_1R 0x07 +#define AML_TYPE_EXEC_3A_0T_0R 0x08 +#define AML_TYPE_EXEC_3A_1T_1R 0x09 +#define AML_TYPE_EXEC_6A_0T_1R 0x0A +/* End of types used in dispatch table */ + +#define AML_TYPE_LITERAL 0x0B +#define AML_TYPE_CONSTANT 0x0C +#define AML_TYPE_METHOD_ARGUMENT 0x0D +#define AML_TYPE_LOCAL_VARIABLE 0x0E +#define AML_TYPE_DATA_TERM 0x0F /* Generic for an op that returns a value */ -#define OPTYPE_METHOD_CALL 16 +#define AML_TYPE_METHOD_CALL 0x10 /* Misc */ -#define OPTYPE_CREATE_FIELD 17 -#define OPTYPE_CONTROL 18 -#define OPTYPE_RECONFIGURATION 19 -#define OPTYPE_NAMED_OBJECT 20 -#define OPTYPE_RETURN 21 +#define AML_TYPE_CREATE_FIELD 0x11 +#define AML_TYPE_CONTROL 0x12 +#define AML_TYPE_NAMED_NO_OBJ 0x13 +#define AML_TYPE_NAMED_FIELD 0x14 +#define AML_TYPE_NAMED_SIMPLE 0x15 +#define AML_TYPE_NAMED_COMPLEX 0x16 +#define AML_TYPE_RETURN 0x17 + +#define AML_TYPE_UNDEFINED 0x18 +#define AML_TYPE_BOGUS 0x19 + -#define OPTYPE_BOGUS 22 +/* + * Opcode classes + */ +#define AML_CLASS_EXECUTE 0x00 +#define AML_CLASS_CREATE 0x01 +#define AML_CLASS_ARGUMENT 0x02 +#define AML_CLASS_NAMED_OBJECT 0x03 +#define AML_CLASS_CONTROL 0x04 +#define AML_CLASS_ASCII 0x05 +#define AML_CLASS_PREFIX 0x06 +#define AML_CLASS_INTERNAL 0x07 +#define AML_CLASS_RETURN_VALUE 0x08 +#define AML_CLASS_METHOD_CALL 0x09 +#define AML_CLASS_UNKNOWN 0x0A /* Predefined Operation Region Space_iDs */ @@ -406,18 +455,5 @@ #define USER_REGION_BEGIN 0x80 -/* - * AML tables - */ - -#ifdef DEFINE_AML_GLOBALS - -/* External declarations for the AML tables */ - -extern u8 acpi_gbl_aml [NUM_OPCODES]; -extern u16 acpi_gbl_pfx [NUM_OPCODES]; - - -#endif /* DEFINE_AML_GLOBALS */ #endif /* __AMLCODE_H__ */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/platform/acenv.h linux/drivers/acpi/include/platform/acenv.h --- v2.4.13/linux/drivers/acpi/include/platform/acenv.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/platform/acenv.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acenv.h - Generation environment specific items - * $Revision: 76 $ + * $Revision: 77 $ * *****************************************************************************/ @@ -126,6 +126,12 @@ /* Name of host operating system (returned by the _OS_ namespace object) */ #define ACPI_OS_NAME "Intel ACPI/CA Core Subsystem" + +/* 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 diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/platform/acgcc.h linux/drivers/acpi/include/platform/acgcc.h --- v2.4.13/linux/drivers/acpi/include/platform/acgcc.h Tue Oct 23 22:48:50 2001 +++ linux/drivers/acpi/include/platform/acgcc.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acgcc.h - GCC specific defines, etc. - * $Revision: 9 $ + * $Revision: 14 $ * *****************************************************************************/ @@ -93,6 +93,7 @@ #else /* DO IA32 */ + #define COMPILER_DEPENDENT_UINT64 unsigned long long #define ACPI_ASM_MACROS #define causeinterrupt(level) @@ -100,7 +101,6 @@ #define disable() __cli() #define enable() __sti() #define halt() __asm__ __volatile__ ("sti; hlt":::"memory") -#define wbinvd() __asm__ __volatile__ ("wbinvd":::"memory") /*! [Begin] no source code translation * @@ -139,8 +139,30 @@ :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \ } while(0) + +/* + * Math helper asm macros + */ +#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ + asm("divl %2;" \ + :"=a"(q32), "=d"(r32) \ + :"r"(d32), \ + "0"(n_lo), "1"(n_hi)) + + +#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ + asm("shrl $1,%2;" \ + "rcrl $1,%3;" \ + :"=r"(n_hi), "=r"(n_lo) \ + :"0"(n_hi), "1"(n_lo)) + /*! [End] no source code translation !*/ #endif /* IA 32 */ + +/* 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__, 4, 5))) #endif /* __ACGCC_H__ */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/platform/aclinux.h linux/drivers/acpi/include/platform/aclinux.h --- v2.4.13/linux/drivers/acpi/include/platform/aclinux.h Tue Jul 3 17:08:19 2001 +++ linux/drivers/acpi/include/platform/aclinux.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: aclinux.h - OS specific defines, etc. - * $Revision: 13 $ + * $Revision: 14 $ * *****************************************************************************/ @@ -57,15 +57,6 @@ #undef DEBUGGER_THREADING #define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED - -#ifndef _IA64 -/* Linux ia32 can't do int64 well */ -#define ACPI_NO_INTEGER64_SUPPORT -/* And the ia32 kernel doesn't include 64-bit divide support */ -#define ACPI_DIV64(dividend, divisor) do_div(dividend, divisor) -#else -#define ACPI_DIV64(dividend, divisor) ACPI_DIVIDE(dividend, divisor) -#endif #endif /* __ACLINUX_H__ */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsaccess.c linux/drivers/acpi/namespace/nsaccess.c --- v2.4.13/linux/drivers/acpi/namespace/nsaccess.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsaccess.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsaccess - Top-level functions for accessing ACPI namespace - * $Revision: 133 $ + * $Revision: 135 $ * ******************************************************************************/ @@ -185,6 +185,10 @@ /* Store pointer to value descriptor in the Node */ acpi_ns_attach_object (new_node, obj_desc, obj_desc->common.type); + + /* Remove local reference to the object */ + + acpi_ut_remove_reference (obj_desc); } } @@ -434,7 +438,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[")); for (i = 0; i < num_segments; i++) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "%4.4s/", &pathname[i * 4])); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "%4.4s/", (char*)&pathname[i * 4])); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "]\n")); #endif @@ -474,8 +478,8 @@ /* Name not found in ACPI namespace */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Name [%4.4s] not found in scope %X\n", - &simple_name, current_node)); + "Name [%4.4s] not found in scope %p\n", + (char*)&simple_name, current_node)); } return_ACPI_STATUS (status); @@ -507,7 +511,7 @@ REPORT_WARNING ( ("Ns_lookup: %4.4s, type %X, checking for type %X\n", - &simple_name, this_node->type, type_to_check_for)); + (char*)&simple_name, this_node->type, type_to_check_for)); } /* @@ -525,7 +529,7 @@ * More segments or the type implies enclosed scope, * and the next scope has not been allocated. */ - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Load mode=%X This_node=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Load mode=%X This_node=%p\n", interpreter_mode, this_node)); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsalloc.c linux/drivers/acpi/namespace/nsalloc.c --- v2.4.13/linux/drivers/acpi/namespace/nsalloc.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsalloc.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsalloc - Namespace allocation and deletion utilities - * $Revision: 56 $ + * $Revision: 60 $ * ******************************************************************************/ @@ -210,7 +210,7 @@ * real definition is found later. */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "[%4.4s] is a forward reference\n", - &node->name)); + (char*)&node->name)); } /* @@ -235,7 +235,7 @@ } ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s added to %p at %p\n", - &node->name, parent_node, node)); + (char*)&node->name, parent_node, node)); /* * Increment the reference count(s) of all parents up to @@ -297,7 +297,7 @@ /* Grandchildren should have all been deleted already */ if (child_node->child) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Found a grandchild! P=%X C=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Found a grandchild! P=%p C=%p\n", parent_node, child_node)); } @@ -309,12 +309,9 @@ child_node, acpi_gbl_current_node_count)); /* - * Detach an object if there is one + * Detach an object if there is one, then free the child node */ - if (child_node->object) { - acpi_ns_detach_object (child_node); - } - + acpi_ns_detach_object (child_node); ACPI_MEM_FREE (child_node); /* And move on to the next child in the list */ @@ -349,9 +346,8 @@ acpi_ns_delete_namespace_subtree ( acpi_namespace_node *parent_node) { - acpi_namespace_node *child_node; - acpi_operand_object *obj_desc; - u32 level; + acpi_namespace_node *child_node = NULL; + u32 level = 1; FUNCTION_TRACE ("Ns_delete_namespace_subtree"); @@ -361,39 +357,26 @@ return_ACPI_STATUS (AE_OK); } - - child_node = 0; - level = 1; - /* * Traverse the tree of objects until we bubble back up * to where we started. */ while (level > 0) { - /* - * Get the next typed object in this scope. - * Null returned if not found - */ - child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, parent_node, + /* Get the next node in this scope (NULL if none) */ + + child_node = acpi_ns_get_next_node (ACPI_TYPE_ANY, parent_node, child_node); if (child_node) { - /* - * Found an object - delete the object within - * the Value field - */ - obj_desc = acpi_ns_get_attached_object (child_node); - if (obj_desc) { - acpi_ns_detach_object (child_node); - acpi_ut_remove_reference (obj_desc); - } + /* Found a child node - detach any attached object */ + acpi_ns_detach_object (child_node); - /* Check if this object has any children */ + /* Check if this node has any children */ - if (acpi_ns_get_next_object (ACPI_TYPE_ANY, child_node, 0)) { + if (acpi_ns_get_next_node (ACPI_TYPE_ANY, child_node, 0)) { /* - * There is at least one child of this object, - * visit the object + * There is at least one child of this node, + * visit the node */ level++; parent_node = child_node; @@ -403,8 +386,8 @@ else { /* - * No more children in this object. - * We will move up to the grandparent. + * No more children of this parent node. + * Move up to the grandparent. */ level--; @@ -414,17 +397,16 @@ */ acpi_ns_delete_children (parent_node); - /* New "last child" is this parent object */ + /* New "last child" is this parent node */ child_node = parent_node; - /* Now we can move up the tree to the grandparent */ + /* Move up the tree to the grandparent */ parent_node = acpi_ns_get_parent_object (parent_node); } } - return_ACPI_STATUS (AE_OK); } @@ -433,13 +415,13 @@ * * FUNCTION: Acpi_ns_remove_reference * - * PARAMETERS: Node - Named object whose reference count is to be + * PARAMETERS: Node - Named node whose reference count is to be * decremented * * RETURN: None. * * DESCRIPTION: Remove a Node reference. Decrements the reference count - * of all parent Nodes up to the root. Any object along + * of all parent Nodes up to the root. Any node along * the way that reaches zero references is freed. * ******************************************************************************/ @@ -455,19 +437,19 @@ /* - * Decrement the reference count(s) of this object and all - * objects up to the root, Delete anything with zero remaining references. + * Decrement the reference count(s) of this node and all + * nodes up to the root, Delete anything with zero remaining references. */ next_node = node; while (next_node) { - /* Decrement the reference count on this object*/ + /* Decrement the reference count on this node*/ next_node->reference_count--; - /* Delete the object if no more references */ + /* Delete the node if no more references */ if (!next_node->reference_count) { - /* Delete all children and delete the object */ + /* Delete all children and delete the node */ acpi_ns_delete_children (next_node); acpi_ns_delete_node (next_node); @@ -500,7 +482,6 @@ { acpi_namespace_node *child_node; u32 level; - acpi_operand_object *obj_desc; acpi_namespace_node *parent_node; @@ -512,38 +493,28 @@ level = 1; /* - * Traverse the tree of objects until we bubble back up + * Traverse the tree of nodes until we bubble back up * to where we started. */ while (level > 0) { - /* - * Get the next typed object in this scope. - * Null returned if not found - */ - child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, parent_node, - child_node); + /* Get the next node in this scope (NULL if none) */ + child_node = acpi_ns_get_next_node (ACPI_TYPE_ANY, parent_node, + child_node); if (child_node) { if (child_node->owner_id == owner_id) { - /* - * Found an object - delete the object within - * the Value field - */ - obj_desc = acpi_ns_get_attached_object (child_node); - if (obj_desc) { - acpi_ns_detach_object (child_node); - acpi_ut_remove_reference (obj_desc); - } + /* Found a child node - detach any attached object */ + + acpi_ns_detach_object (child_node); } - /* Check if this object has any children */ + /* Check if this node has any children */ - if (acpi_ns_get_next_object (ACPI_TYPE_ANY, child_node, 0)) { + if (acpi_ns_get_next_node (ACPI_TYPE_ANY, child_node, 0)) { /* - * There is at least one child of this object, - * visit the object + * There is at least one child of this node, + * visit the node */ - level++; parent_node = child_node; child_node = 0; @@ -556,7 +527,8 @@ else { /* - * No more children in this object. Move up to grandparent. + * No more children of this parent node. + * Move up to the grandparent. */ level--; @@ -566,16 +538,15 @@ } } - /* New "last child" is this parent object */ + /* New "last child" is this parent node */ child_node = parent_node; - /* Now we can move up the tree to the grandparent */ + /* Move up the tree to the grandparent */ parent_node = acpi_ns_get_parent_object (parent_node); } } - return_ACPI_STATUS (AE_OK); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsdump.c linux/drivers/acpi/namespace/nsdump.c --- v2.4.13/linux/drivers/acpi/namespace/nsdump.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsdump.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsdump - table dumping routines for debug - * $Revision: 99 $ + * $Revision: 105 $ * *****************************************************************************/ @@ -28,6 +28,7 @@ #include "acinterp.h" #include "acnamesp.h" #include "actables.h" +#include "acparser.h" #define _COMPONENT ACPI_NAMESPACE @@ -108,9 +109,8 @@ void *context, void **return_value) { - ACPI_WALK_INFO *info = (ACPI_WALK_INFO *) context; + acpi_walk_info *info = (acpi_walk_info *) context; acpi_namespace_node *this_node; - u8 *value; acpi_operand_object *obj_desc = NULL; acpi_object_type8 obj_type; acpi_object_type8 type; @@ -118,12 +118,13 @@ u32 downstream_sibling_mask = 0; u32 level_tmp; u32 which_bit; + u32 i; PROC_NAME ("Ns_dump_one_object"); - this_node = acpi_ns_convert_handle_to_entry (obj_handle); + this_node = acpi_ns_map_handle_to_node (obj_handle); level_tmp = level; type = this_node->type; @@ -204,56 +205,198 @@ /* * Now we can print out the pertinent information */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " %4.4s %-9s ", &this_node->name, acpi_ut_get_type_name (type))); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "%p S:%p O:%p", this_node, this_node->child, this_node->object)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " %4.4s %-12s %p", + (char*)&this_node->name, acpi_ut_get_type_name (type), this_node)); + obj_desc = this_node->object; - if (!this_node->object) { - /* No attached object, we are done */ + switch (info->display_type) { + case ACPI_DISPLAY_SUMMARY: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); - return (AE_OK); - } + if (!obj_desc) { + /* No attached object, we are done */ - switch (type) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + return (AE_OK); + } - case ACPI_TYPE_METHOD: - /* Name is a Method and its AML offset/length are set */ + switch (type) { + case ACPI_TYPE_PROCESSOR: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " ID %d Addr %.4X Len %.4X\n", + obj_desc->processor.proc_id, + obj_desc->processor.address, + obj_desc->processor.length)); + break; - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " M:%p-%X\n", - ((acpi_operand_object *) this_node->object)->method.pcode, - ((acpi_operand_object *) this_node->object)->method.pcode_length)); + case ACPI_TYPE_DEVICE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Notification object: %p", obj_desc)); + break; - break; + case ACPI_TYPE_METHOD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Args %d Len %.4X Aml %p \n", + obj_desc->method.param_count, + obj_desc->method.aml_length, + obj_desc->method.aml_start)); + break; + case ACPI_TYPE_INTEGER: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " = %8.8X%8.8X\n", + HIDWORD (obj_desc->integer.value), + LODWORD (obj_desc->integer.value))); + break; - case ACPI_TYPE_INTEGER: + case ACPI_TYPE_PACKAGE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Elements %.2X\n", + obj_desc->package.count)); + break; - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " N:%X\n", - ((acpi_operand_object *) this_node->object)->integer.value)); - break; + case ACPI_TYPE_BUFFER: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Len %.2X", + obj_desc->buffer.length)); + /* Dump some of the buffer */ - case ACPI_TYPE_STRING: + if (obj_desc->buffer.length > 0) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " =")); + for (i = 0; (i < obj_desc->buffer.length && i < 12); i++) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " %.2X", + obj_desc->buffer.pointer[i])); + } + } + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + break; - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " S:%p-%X\n", - ((acpi_operand_object *) this_node->object)->string.pointer, - ((acpi_operand_object *) this_node->object)->string.length)); - break; + case ACPI_TYPE_STRING: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Len %.2X", + obj_desc->string.length)); + if (obj_desc->string.length > 0) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " = \"%.32s\"...", + obj_desc->string.pointer)); + } + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + break; - case ACPI_TYPE_BUFFER: + case ACPI_TYPE_REGION: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " [%s]", + acpi_ut_get_region_name (obj_desc->region.space_id))); + if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Addr %8.8X%8.8X Len %.4X\n", + HIDWORD(obj_desc->region.address), + LODWORD(obj_desc->region.address), + obj_desc->region.length)); + } + else { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " [Address/Length not evaluated]\n")); + } + break; + + case INTERNAL_TYPE_REFERENCE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " [%s]\n", + acpi_ps_get_opcode_name (obj_desc->reference.opcode))); + break; + + case ACPI_TYPE_BUFFER_FIELD: + + /* TBD: print Buffer name when we can easily get it */ + break; + + case INTERNAL_TYPE_REGION_FIELD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Rgn [%4.4s]", + (char *) &obj_desc->common_field.region_obj->region.node->name)); + break; + + case INTERNAL_TYPE_BANK_FIELD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Rgn [%4.4s]", + (char *) &obj_desc->common_field.region_obj->region.node->name)); + break; + + case INTERNAL_TYPE_INDEX_FIELD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Rgn [%4.4s]", + (char *) &obj_desc->index_field.index_obj->common_field.region_obj->region.node->name)); + break; + + default: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Object %p\n", obj_desc)); + break; + } + + /* Common field handling */ + + switch (type) { + case ACPI_TYPE_BUFFER_FIELD: + case INTERNAL_TYPE_REGION_FIELD: + case INTERNAL_TYPE_BANK_FIELD: + case INTERNAL_TYPE_INDEX_FIELD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Off %.2X Len %.2X Acc %.2d\n", + (obj_desc->common_field.base_byte_offset * 8) + obj_desc->common_field.start_field_bit_offset, + obj_desc->common_field.bit_length, + obj_desc->common_field.access_bit_width)); + break; + } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " B:%p-%X\n", - ((acpi_operand_object *) this_node->object)->buffer.pointer, - ((acpi_operand_object *) this_node->object)->buffer.length)); break; - default: + case ACPI_DISPLAY_OBJECTS: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "%p O:%p", + this_node, obj_desc)); + + if (!obj_desc) { + /* No attached object, we are done */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + return (AE_OK); + } + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(R%d)", + obj_desc->common.reference_count)); + + switch (type) { + + case ACPI_TYPE_METHOD: + + /* Name is a Method and its AML offset/length are set */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " M:%p-%X\n", + obj_desc->method.aml_start, + obj_desc->method.aml_length)); + + break; + + + case ACPI_TYPE_INTEGER: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " N:%X%X\n", + HIDWORD(obj_desc->integer.value), + LODWORD(obj_desc->integer.value))); + break; + + + case ACPI_TYPE_STRING: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " S:%p-%X\n", + obj_desc->string.pointer, + obj_desc->string.length)); + break; + + + case ACPI_TYPE_BUFFER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " B:%p-%X\n", + obj_desc->buffer.pointer, + obj_desc->buffer.length)); + break; + + + default: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + break; + } break; } @@ -266,30 +409,24 @@ /* If there is an attached object, display it */ - value = this_node->object; + obj_desc = this_node->object; /* Dump attached objects */ - while (value) { + while (obj_desc) { obj_type = INTERNAL_TYPE_INVALID; /* Decode the type of attached object and dump the contents */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Attached Object %p: ", value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Attached Object %p: ", obj_desc)); - if (acpi_tb_system_table_pointer (value)) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to AML Code)\n")); - bytes_to_dump = 16; - } - - else if (VALID_DESCRIPTOR_TYPE (value, ACPI_DESC_TYPE_NAMED)) { + if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to Node)\n")); bytes_to_dump = sizeof (acpi_namespace_node); } - else if (VALID_DESCRIPTOR_TYPE (value, ACPI_DESC_TYPE_INTERNAL)) { - obj_desc = (acpi_operand_object *) value; + else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) { obj_type = obj_desc->common.type; if (obj_type > INTERNAL_TYPE_MAX) { @@ -298,23 +435,22 @@ } else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to ACPI Object type %X [%s])\n", + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to ACPI Object type %2.2X [%s])\n", obj_type, acpi_ut_get_type_name (obj_type))); bytes_to_dump = sizeof (acpi_operand_object); } } else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(String or Buffer - not descriptor)\n", value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(String or Buffer - not descriptor)\n")); bytes_to_dump = 16; } - DUMP_BUFFER (value, bytes_to_dump); + DUMP_BUFFER (obj_desc, bytes_to_dump); /* If value is NOT an internal object, we are done */ - if ((acpi_tb_system_table_pointer (value)) || - (VALID_DESCRIPTOR_TYPE (value, ACPI_DESC_TYPE_NAMED))) { + if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { goto cleanup; } @@ -323,35 +459,35 @@ */ switch (obj_type) { case ACPI_TYPE_STRING: - value = (u8 *) obj_desc->string.pointer; + obj_desc = (acpi_operand_object *) obj_desc->string.pointer; break; case ACPI_TYPE_BUFFER: - value = (u8 *) obj_desc->buffer.pointer; + obj_desc = (acpi_operand_object *) obj_desc->buffer.pointer; break; case ACPI_TYPE_BUFFER_FIELD: - value = (u8 *) obj_desc->buffer_field.buffer_obj; + obj_desc = (acpi_operand_object *) obj_desc->buffer_field.buffer_obj; break; case ACPI_TYPE_PACKAGE: - value = (u8 *) obj_desc->package.elements; + obj_desc = (acpi_operand_object *) obj_desc->package.elements; break; case ACPI_TYPE_METHOD: - value = (u8 *) obj_desc->method.pcode; + obj_desc = (acpi_operand_object *) obj_desc->method.aml_start; break; case INTERNAL_TYPE_REGION_FIELD: - value = (u8 *) obj_desc->field.region_obj; + obj_desc = (acpi_operand_object *) obj_desc->field.region_obj; break; case INTERNAL_TYPE_BANK_FIELD: - value = (u8 *) obj_desc->bank_field.region_obj; + obj_desc = (acpi_operand_object *) obj_desc->bank_field.region_obj; break; case INTERNAL_TYPE_INDEX_FIELD: - value = (u8 *) obj_desc->index_field.index_obj; + obj_desc = (acpi_operand_object *) obj_desc->index_field.index_obj; break; default: @@ -386,11 +522,12 @@ void acpi_ns_dump_objects ( acpi_object_type8 type, + u8 display_type, u32 max_depth, u32 owner_id, acpi_handle start_handle) { - ACPI_WALK_INFO info; + acpi_walk_info info; FUNCTION_ENTRY (); @@ -398,6 +535,8 @@ info.debug_level = ACPI_LV_TABLES; info.owner_id = owner_id; + info.display_type = display_type; + acpi_ns_walk_namespace (type, start_handle, max_depth, NS_WALK_NO_UNLOCK, acpi_ns_dump_one_object, (void *) &info, NULL); @@ -441,8 +580,8 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " ")); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " HID: %.8X, ADR: %.8X, Status: %x\n", - info.hardware_id, info.address, info.current_status)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " HID: %s, ADR: %8.8X%8.8X, Status: %x\n", + info.hardware_id, HIDWORD(info.address), LODWORD(info.address), info.current_status)); } return (status); @@ -524,7 +663,8 @@ } - acpi_ns_dump_objects (ACPI_TYPE_ANY, max_depth, ACPI_UINT32_MAX, search_handle); + acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, max_depth, + ACPI_UINT32_MAX, search_handle); return_VOID; } @@ -545,7 +685,7 @@ acpi_handle handle, u32 debug_level) { - ACPI_WALK_INFO info; + acpi_walk_info info; FUNCTION_ENTRY (); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nseval.c linux/drivers/acpi/namespace/nseval.c --- v2.4.13/linux/drivers/acpi/namespace/nseval.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nseval.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nseval - Object evaluation interfaces -- includes control * method lookup and execution. - * $Revision: 97 $ + * $Revision: 102 $ * ******************************************************************************/ @@ -93,7 +93,7 @@ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - prefix_node = acpi_ns_convert_handle_to_entry (handle); + prefix_node = acpi_ns_map_handle_to_node (handle); if (!prefix_node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); status = AE_BAD_PARAMETER; @@ -271,7 +271,7 @@ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return_ACPI_STATUS (AE_BAD_PARAMETER); @@ -378,17 +378,18 @@ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No attached method object\n")); acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); - return_ACPI_STATUS (AE_ERROR); + return_ACPI_STATUS (AE_NULL_OBJECT); } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Control method at Offset %x Length %lx]\n", - obj_desc->method.pcode + 1, obj_desc->method.pcode_length - 1)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Control method at Offset %p Length %x]\n", + obj_desc->method.aml_start + 1, obj_desc->method.aml_length - 1)); DUMP_PATHNAME (method_node, "Ns_execute_control_method: Executing", ACPI_LV_NAMES, _COMPONENT); - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "At offset %8XH\n", obj_desc->method.pcode + 1)); + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "At offset %p\n", + obj_desc->method.aml_start + 1)); /* @@ -437,7 +438,7 @@ { acpi_status status = AE_OK; acpi_operand_object *obj_desc; - acpi_operand_object *val_desc; + acpi_operand_object *source_desc; FUNCTION_TRACE ("Ns_get_object_value"); @@ -460,8 +461,8 @@ /* * Get the attached object */ - val_desc = acpi_ns_get_attached_object (node); - if (!val_desc) { + source_desc = acpi_ns_get_attached_object (node); + if (!source_desc) { status = AE_NULL_OBJECT; goto unlock_and_exit; } @@ -472,7 +473,7 @@ * TBD: [Future] - need a low-level object copy that handles * the reference count automatically. (Don't want to copy it) */ - MEMCPY (obj_desc, val_desc, sizeof (acpi_operand_object)); + MEMCPY (obj_desc, source_desc, sizeof (acpi_operand_object)); obj_desc->common.reference_count = 1; acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsinit.c linux/drivers/acpi/namespace/nsinit.c --- v2.4.13/linux/drivers/acpi/namespace/nsinit.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsinit.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsinit - namespace initialization - * $Revision: 31 $ + * $Revision: 33 $ * *****************************************************************************/ @@ -51,7 +51,7 @@ void) { acpi_status status; - ACPI_INIT_WALK_INFO info; + acpi_init_walk_info info; FUNCTION_TRACE ("Ns_initialize_objects"); @@ -112,7 +112,7 @@ void) { acpi_status status; - ACPI_DEVICE_WALK_INFO info; + acpi_device_walk_info info; FUNCTION_TRACE ("Ns_initialize_devices"); @@ -170,7 +170,7 @@ { acpi_object_type8 type; acpi_status status; - ACPI_INIT_WALK_INFO *info = (ACPI_INIT_WALK_INFO *) context; + acpi_init_walk_info *info = (acpi_init_walk_info *) context; acpi_namespace_node *node = (acpi_namespace_node *) obj_handle; acpi_operand_object *obj_desc; @@ -218,7 +218,7 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n")); ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s while getting region arguments [%4.4s]\n", - acpi_format_exception (status), &node->name)); + acpi_format_exception (status), (char*)&node->name)); } if (!(acpi_dbg_level & ACPI_LV_INIT)) { @@ -241,7 +241,7 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n")); ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s while getting buffer field arguments [%4.4s]\n", - acpi_format_exception (status), &node->name)); + acpi_format_exception (status), (char*)&node->name)); } if (!(acpi_dbg_level & ACPI_LV_INIT)) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, ".")); @@ -268,7 +268,7 @@ * * FUNCTION: Acpi_ns_init_one_device * - * PARAMETERS: ACPI_WALK_CALLBACK + * PARAMETERS: acpi_walk_callback * * RETURN: acpi_status * @@ -288,7 +288,7 @@ acpi_status status; acpi_namespace_node *node; u32 flags; - ACPI_DEVICE_WALK_INFO *info = (ACPI_DEVICE_WALK_INFO *) context; + acpi_device_walk_info *info = (acpi_device_walk_info *) context; FUNCTION_TRACE ("Ns_init_one_device"); @@ -302,7 +302,7 @@ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (obj_handle); + node = acpi_ns_map_handle_to_node (obj_handle); if (!node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return (AE_BAD_PARAMETER); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsload.c linux/drivers/acpi/namespace/nsload.c --- v2.4.13/linux/drivers/acpi/namespace/nsload.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsload.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsload - namespace loading/expanding/contracting procedures - * $Revision: 43 $ + * $Revision: 47 $ * *****************************************************************************/ @@ -109,35 +109,14 @@ u32 pass_number, acpi_table_desc *table_desc) { - acpi_parse_downwards descending_callback; - acpi_parse_upwards ascending_callback; acpi_parse_object *parse_root; acpi_status status; + acpi_walk_state *walk_state; FUNCTION_TRACE ("Ns_one_complete_parse"); - switch (pass_number) { - case 1: - descending_callback = acpi_ds_load1_begin_op; - ascending_callback = acpi_ds_load1_end_op; - break; - - case 2: - descending_callback = acpi_ds_load2_begin_op; - ascending_callback = acpi_ds_load2_end_op; - break; - - case 3: - descending_callback = acpi_ds_exec_begin_op; - ascending_callback = acpi_ds_exec_end_op; - break; - - default: - return (AE_BAD_PARAMETER); - } - /* Create and init a Root Node */ parse_root = acpi_ps_alloc_op (AML_SCOPE_OP); @@ -148,15 +127,26 @@ ((acpi_parse2_object *) parse_root)->name = ACPI_ROOT_NAME; - /* Pass 1: Parse everything except control method bodies */ + /* Create and initialize a new walk state */ - ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "*PARSE* pass %d parse\n", pass_number)); + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + acpi_ps_free_op (parse_root); + return_ACPI_STATUS (AE_NO_MEMORY); + } - status = acpi_ps_parse_aml (parse_root, table_desc->aml_pointer, - table_desc->aml_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - NULL, NULL, NULL, descending_callback, - ascending_callback); + status = acpi_ds_init_aml_walk (walk_state, parse_root, NULL, table_desc->aml_start, + table_desc->aml_length, NULL, NULL, pass_number); + if (ACPI_FAILURE (status)) { + acpi_ds_delete_walk_state (walk_state); + return_ACPI_STATUS (status); + } + + /* Parse the AML */ + + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "*PARSE* pass %d parse\n", pass_number)); + status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (parse_root); return_ACPI_STATUS (status); @@ -225,8 +215,8 @@ * * FUNCTION: Acpi_ns_load_table * - * PARAMETERS: *Pcode_addr - Address of pcode block - * Pcode_length - Length of pcode block + * PARAMETERS: Table_desc - Descriptor for table to be loaded + * Node - Owning NS node * * RETURN: Status * @@ -245,12 +235,12 @@ FUNCTION_TRACE ("Ns_load_table"); - if (!table_desc->aml_pointer) { + if (!table_desc->aml_start) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null AML pointer\n")); return_ACPI_STATUS (AE_BAD_PARAMETER); } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AML block at %p\n", table_desc->aml_pointer)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AML block at %p\n", table_desc->aml_start)); if (!table_desc->aml_length) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsnames.c linux/drivers/acpi/namespace/nsnames.c --- v2.4.13/linux/drivers/acpi/namespace/nsnames.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsnames.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsnames - Name manipulation and search - * $Revision: 63 $ + * $Revision: 64 $ * ******************************************************************************/ @@ -203,7 +203,7 @@ return_ACPI_STATUS (AE_NO_NAMESPACE); } - node = acpi_ns_convert_handle_to_entry (target_handle); + node = acpi_ns_map_handle_to_node (target_handle); if (!node) { return_ACPI_STATUS (AE_BAD_PARAMETER); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsobject.c linux/drivers/acpi/namespace/nsobject.c --- v2.4.13/linux/drivers/acpi/namespace/nsobject.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsobject.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nsobject - Utilities for objects attached to namespace * table entries - * $Revision: 65 $ + * $Revision: 67 $ * ******************************************************************************/ @@ -63,7 +63,6 @@ acpi_operand_object *previous_obj_desc; acpi_object_type8 obj_type = ACPI_TYPE_ANY; u8 flags; - u16 opcode; FUNCTION_TRACE ("Ns_attach_object"); @@ -158,87 +157,6 @@ obj_type = type; } - /* - * Type is TYPE_Any, we must try to determinte the - * actual type of the object. - * Check if value points into the AML code - */ - else if (acpi_tb_system_table_pointer (object)) { - /* - * Object points into the AML stream. - * Set a flag bit in the Node to indicate this - */ - flags |= ANOBJ_AML_ATTACHMENT; - - /* - * The next byte (perhaps the next two bytes) - * will be the AML opcode - */ - MOVE_UNALIGNED16_TO_16 (&opcode, object); - - /* Check for a recognized Opcode */ - - switch ((u8) opcode) { - - case AML_OP_PREFIX: - - if (opcode != AML_REVISION_OP) { - /* - * Op_prefix is unrecognized unless part - * of Revision_op - */ - break; - } - - /* case AML_REVISION_OP: fall through and set the type to Integer */ - - case AML_ZERO_OP: - case AML_ONES_OP: - case AML_ONE_OP: - case AML_BYTE_OP: - case AML_WORD_OP: - case AML_DWORD_OP: - case AML_QWORD_OP: - - obj_type = ACPI_TYPE_INTEGER; - break; - - - case AML_STRING_OP: - - obj_type = ACPI_TYPE_STRING; - break; - - - case AML_BUFFER_OP: - - obj_type = ACPI_TYPE_BUFFER; - break; - - - case AML_MUTEX_OP: - - obj_type = ACPI_TYPE_MUTEX; - break; - - - case AML_PACKAGE_OP: - - obj_type = ACPI_TYPE_PACKAGE; - break; - - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "AML Opcode/Type [%x] not supported in attach\n", - (u8) opcode)); - - return_ACPI_STATUS (AE_TYPE); - break; - } - } - else { /* * Cannot figure out the type -- set to Def_any which @@ -249,12 +167,7 @@ "Ns_attach_object confused: setting bogus type for ", ACPI_LV_INFO, _COMPONENT); - if (acpi_tb_system_table_pointer (object)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "AML-stream code %02x\n", *(u8 *) object)); - } - - else if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED)) { + if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED)) { DUMP_PATHNAME (object, "name ", ACPI_LV_INFO, _COMPONENT); } @@ -270,7 +183,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n", - obj_desc, node, &node->name)); + obj_desc, node, (char*)&node->name)); /* @@ -340,21 +253,12 @@ node->object = NULL; - /* Found a valid value */ - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Object=%p Value=%p Name %4.4s\n", - node, obj_desc, &node->name)); + node, obj_desc, (char*)&node->name)); - /* - * Not every value is an object allocated via ACPI_MEM_CALLOCATE, - * - must check - */ - if (!acpi_tb_system_table_pointer (obj_desc)) { - /* Attempt to delete the object (and all subobjects) */ - - acpi_ut_remove_reference (obj_desc); - } + /* Remove one reference on the object (and all subobjects) */ + acpi_ut_remove_reference (obj_desc); return_VOID; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nssearch.c linux/drivers/acpi/namespace/nssearch.c --- v2.4.13/linux/drivers/acpi/namespace/nssearch.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nssearch.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nssearch - Namespace search - * $Revision: 74 $ + * $Revision: 75 $ * ******************************************************************************/ @@ -80,7 +80,7 @@ scope_name = acpi_ns_get_table_pathname (node); if (scope_name) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s [%p] For %4.4s (type %X)\n", - scope_name, node, &target_name, type)); + scope_name, node, (char*)&target_name, type)); ACPI_MEM_FREE (scope_name); } @@ -124,7 +124,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Name %4.4s (actual type %X) found at %p\n", - &target_name, next_node->type, next_node)); + (char*)&target_name, next_node->type, next_node)); *return_node = next_node; return_ACPI_STATUS (AE_OK); @@ -150,7 +150,7 @@ /* Searched entire table, not found */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Name %4.4s (type %X) not found at %p\n", - &target_name, type, next_node)); + (char*)&target_name, type, next_node)); return_ACPI_STATUS (AE_NOT_FOUND); } @@ -205,12 +205,12 @@ (!parent_node)) { if (!parent_node) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n", - &target_name)); + (char*)&target_name)); } if (acpi_ns_local (type)) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] type %X is local(no search)\n", - &target_name, type)); + (char*)&target_name, type)); } return_ACPI_STATUS (AE_NOT_FOUND); @@ -219,7 +219,7 @@ /* Search the parent tree */ - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching parent for %4.4s\n", &target_name)); + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching parent for %4.4s\n", (char*)&target_name)); /* * Search parents until found the target or we have backed up to @@ -295,7 +295,7 @@ /* Parameter validation */ if (!node || !target_name || !return_node) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null param- Table %p Name %p Return %p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null param- Table %p Name %X Return %p\n", node, target_name, return_node)); REPORT_ERROR (("Ns_search_and_enter: bad (null) parameter\n")); @@ -306,7 +306,7 @@ /* Name must consist of printable characters */ if (!acpi_ut_valid_acpi_name (target_name)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "*** Bad character in name: %08lx *** \n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "*** Bad character in name: %08x *** \n", target_name)); REPORT_ERROR (("Ns_search_and_enter: Bad character in ACPI Name\n")); @@ -364,7 +364,7 @@ */ if (interpreter_mode == IMODE_EXECUTE) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s Not found in %p [Not adding]\n", - &target_name, node)); + (char*)&target_name, node)); return_ACPI_STATUS (AE_NOT_FOUND); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsutils.c linux/drivers/acpi/namespace/nsutils.c --- v2.4.13/linux/drivers/acpi/namespace/nsutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsutils.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nsutils - Utilities for accessing ACPI namespace, accessing * parents and siblings and Scope manipulation - * $Revision: 89 $ + * $Revision: 92 $ * *****************************************************************************/ @@ -148,7 +148,7 @@ acpi_status acpi_ns_get_internal_name_length ( - ACPI_NAMESTRING_INFO *info) + acpi_namestring_info *info) { NATIVE_CHAR *next_external_char; u32 i; @@ -225,7 +225,7 @@ acpi_status acpi_ns_build_internal_name ( - ACPI_NAMESTRING_INFO *info) + acpi_namestring_info *info) { u32 num_segments = info->num_segments; NATIVE_CHAR *internal_name = info->internal_name; @@ -356,7 +356,7 @@ NATIVE_CHAR **converted_name) { NATIVE_CHAR *internal_name; - ACPI_NAMESTRING_INFO info; + acpi_namestring_info info; acpi_status status; @@ -549,7 +549,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ns_convert_handle_to_entry + * FUNCTION: Acpi_ns_map_handle_to_node * * PARAMETERS: Handle - Handle to be converted to an Node * @@ -560,7 +560,7 @@ ******************************************************************************/ acpi_namespace_node * -acpi_ns_convert_handle_to_entry ( +acpi_ns_map_handle_to_node ( acpi_handle handle) { @@ -829,7 +829,7 @@ parent_node = acpi_ns_get_parent_object (child_node); if (parent_node) { ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Parent of %p [%4.4s] is %p [%4.4s]\n", - child_node, &child_node->name, parent_node, &parent_node->name)); + child_node, (char*)&child_node->name, parent_node, (char*)&parent_node->name)); if (parent_node->name) { return_VALUE (parent_node->name); @@ -837,7 +837,7 @@ } ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "unable to find parent of %p (%4.4s)\n", - child_node, &child_node->name)); + child_node, (char*)&child_node->name)); } return_VALUE (ACPI_UNKNOWN_NAME); @@ -925,21 +925,21 @@ /******************************************************************************* * - * FUNCTION: Acpi_ns_get_next_valid_object + * FUNCTION: Acpi_ns_get_next_valid_node * * PARAMETERS: Node - Current table entry * - * RETURN: Next valid object in the table. NULL if no more valid - * objects + * RETURN: Next valid Node in the linked node list. NULL if no more valid + * nodess * - * DESCRIPTION: Find the next valid object within a name table. + * DESCRIPTION: Find the next valid node within a name table. * Useful for implementing NULL-end-of-list loops. * ******************************************************************************/ acpi_namespace_node * -acpi_ns_get_next_valid_object ( +acpi_ns_get_next_valid_node ( acpi_namespace_node *node) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nswalk.c linux/drivers/acpi/namespace/nswalk.c --- v2.4.13/linux/drivers/acpi/namespace/nswalk.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nswalk.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nswalk - Functions for walking the ACPI namespace - * $Revision: 24 $ + * $Revision: 26 $ * *****************************************************************************/ @@ -33,27 +33,27 @@ MODULE_NAME ("nswalk") -/**************************************************************************** +/******************************************************************************* * - * FUNCTION: Acpi_get_next_object + * FUNCTION: Acpi_ns_get_next_node * - * PARAMETERS: Type - Type of object to be searched for - * Parent - Parent object whose children we are - * getting - * Last_child - Previous child that was found. + * PARAMETERS: Type - Type of node to be searched for + * Parent_node - Parent node whose children we are + * getting + * Child_node - Previous child that was found. * The NEXT child will be returned * * RETURN: acpi_namespace_node - Pointer to the NEXT child or NULL if - * none is found. + * none is found. * - * DESCRIPTION: Return the next peer object within the namespace. If Handle - * is valid, Scope is ignored. Otherwise, the first object + * DESCRIPTION: Return the next peer node within the namespace. If Handle + * is valid, Scope is ignored. Otherwise, the first node * within Scope is returned. * - ****************************************************************************/ + ******************************************************************************/ acpi_namespace_node * -acpi_ns_get_next_object ( +acpi_ns_get_next_node ( acpi_object_type8 type, acpi_namespace_node *parent_node, acpi_namespace_node *child_node) @@ -73,12 +73,11 @@ } else { - /* Start search at the NEXT object */ + /* Start search at the NEXT node */ - next_node = acpi_ns_get_next_valid_object (child_node); + next_node = acpi_ns_get_next_valid_node (child_node); } - /* If any type is OK, we are done */ if (type == ACPI_TYPE_ANY) { @@ -87,8 +86,7 @@ return (next_node); } - - /* Must search for the object -- but within this scope only */ + /* Must search for the node -- but within this scope only */ while (next_node) { /* If type matches, we are done */ @@ -97,19 +95,18 @@ return (next_node); } - /* Otherwise, move on to the next object */ + /* Otherwise, move on to the next node */ - next_node = acpi_ns_get_next_valid_object (next_node); + next_node = acpi_ns_get_next_valid_node (next_node); } - /* Not found */ return (NULL); } -/****************************************************************************** +/******************************************************************************* * * FUNCTION: Acpi_ns_walk_namespace * @@ -120,13 +117,13 @@ * the callback routine * User_function - Called when an object of "Type" is found * Context - Passed to user function - * - * RETURNS Return value from the User_function if terminated early. - * Otherwise, returns NULL. + * Return_value - from the User_function if terminated early. + * Otherwise, returns NULL. + * RETURNS: Status * * DESCRIPTION: Performs a modified depth-first walk of the namespace tree, - * starting (and ending) at the object specified by Start_handle. - * The User_function is called whenever an object that matches + * starting (and ending) at the node specified by Start_handle. + * The User_function is called whenever a node that matches * the type parameter is found. If the user function returns * a non-zero value, the search is terminated immediately and this * value is returned to the caller. @@ -145,7 +142,7 @@ acpi_handle start_node, u32 max_depth, u8 unlock_before_callback, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value) { @@ -165,32 +162,26 @@ start_node = acpi_gbl_root_node; } - - /* Null child means "get first object" */ + /* Null child means "get first node" */ parent_node = start_node; - child_node = 0; + child_node = 0; child_type = ACPI_TYPE_ANY; level = 1; /* - * Traverse the tree of objects until we bubble back up to where we + * Traverse the tree of nodes until we bubble back up to where we * started. When Level is zero, the loop is done because we have * bubbled up to (and passed) the original parent handle (Start_entry) */ while (level > 0) { - /* - * Get the next typed object in this scope. Null returned - * if not found - */ - status = AE_OK; - child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, - parent_node, - child_node); + /* Get the next node in this scope. Null if not found */ + status = AE_OK; + child_node = acpi_ns_get_next_node (ACPI_TYPE_ANY, parent_node, child_node); if (child_node) { /* - * Found an object, Get the type if we are not + * Found node, Get the type if we are not * searching for ANY */ if (type != ACPI_TYPE_ANY) { @@ -199,7 +190,7 @@ if (child_type == type) { /* - * Found a matching object, invoke the user + * Found a matching node, invoke the user * callback function */ if (unlock_before_callback) { @@ -245,11 +236,10 @@ * maximum depth has been reached. */ if ((level < max_depth) && (status != AE_CTRL_DEPTH)) { - if (acpi_ns_get_next_object (ACPI_TYPE_ANY, - child_node, 0)) { + if (acpi_ns_get_next_node (ACPI_TYPE_ANY, child_node, 0)) { /* * There is at least one child of this - * object, visit the object + * node, visit the onde */ level++; parent_node = child_node; @@ -260,9 +250,9 @@ else { /* - * No more children in this object (Acpi_ns_get_next_object + * No more children of this node (Acpi_ns_get_next_node * failed), go back upwards in the namespace tree to - * the object's parent. + * the node's parent. */ level--; child_node = parent_node; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsxfname.c linux/drivers/acpi/namespace/nsxfname.c --- v2.4.13/linux/drivers/acpi/namespace/nsxfname.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsxfname.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nsxfname - Public interfaces to the ACPI subsystem * ACPI Namespace oriented interfaces - * $Revision: 80 $ + * $Revision: 82 $ * *****************************************************************************/ @@ -70,13 +70,6 @@ FUNCTION_ENTRY (); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - /* Parameter Validation */ if (!ret_handle || !pathname) { @@ -88,7 +81,7 @@ if (parent) { acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - prefix_node = acpi_ns_convert_handle_to_entry (parent); + prefix_node = acpi_ns_map_handle_to_node (parent); if (!prefix_node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return (AE_BAD_PARAMETER); @@ -144,13 +137,6 @@ acpi_namespace_node *node; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - /* Buffer pointer must be valid always */ if (!ret_path_ptr || (name_type > ACPI_NAME_TYPE_MAX)) { @@ -177,7 +163,7 @@ * Validate handle and convert to an Node */ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -226,21 +212,14 @@ acpi_handle handle, acpi_device_info *info) { - ACPI_DEVICE_ID hid; - ACPI_DEVICE_ID uid; + acpi_device_id hid; + acpi_device_id uid; acpi_status status; u32 device_status = 0; acpi_integer address = 0; acpi_namespace_node *node; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - /* Parameter validation */ if (!handle || !info) { @@ -249,7 +228,7 @@ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return (AE_BAD_PARAMETER); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsxfobj.c linux/drivers/acpi/namespace/nsxfobj.c --- v2.4.13/linux/drivers/acpi/namespace/nsxfobj.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsxfobj.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nsxfobj - Public interfaces to the ACPI subsystem * ACPI Object oriented interfaces - * $Revision: 90 $ + * $Revision: 95 $ * ******************************************************************************/ @@ -41,12 +41,10 @@ * * PARAMETERS: Handle - Object handle (optional) * *Pathname - Object pathname (optional) - * **Params - List of parameters to pass to - * method, terminated by NULL. - * Params itself may be NULL - * if no parameters are being - * passed. - * *Return_object - Where to put method's return value (if + * **External_params - List of parameters to pass to method, + * terminated by NULL. May be NULL + * if no parameters are being passed. + * *Return_buffer - Where to put method's return value (if * any). If NULL, no value is returned. * * RETURN: Status @@ -61,12 +59,12 @@ acpi_evaluate_object ( acpi_handle handle, acpi_string pathname, - acpi_object_list *param_objects, + acpi_object_list *external_params, acpi_buffer *return_buffer) { acpi_status status; - acpi_operand_object **param_ptr = NULL; - acpi_operand_object *return_obj = NULL; + acpi_operand_object **internal_params = NULL; + acpi_operand_object *internal_return_obj = NULL; u32 buffer_space_needed; u32 user_buffer_length; u32 i; @@ -75,25 +73,18 @@ FUNCTION_TRACE ("Acpi_evaluate_object"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* * If there are parameters to be passed to the object * (which must be a control method), the external objects * must be converted to internal objects */ - if (param_objects && param_objects->count) { + if (external_params && external_params->count) { /* * Allocate a new parameter block for the internal objects * Add 1 to count to allow for null terminated internal list */ - param_ptr = ACPI_MEM_CALLOCATE ((param_objects->count + 1) * sizeof (void *)); - if (!param_ptr) { + internal_params = ACPI_MEM_CALLOCATE ((external_params->count + 1) * sizeof (void *)); + if (!internal_params) { return_ACPI_STATUS (AE_NO_MEMORY); } @@ -102,16 +93,16 @@ * Convert each external object in the list to an * internal object */ - for (i = 0; i < param_objects->count; i++) { - status = acpi_ut_copy_eobject_to_iobject (¶m_objects->pointer[i], - ¶m_ptr[i]); + for (i = 0; i < external_params->count; i++) { + status = acpi_ut_copy_eobject_to_iobject (&external_params->pointer[i], + &internal_params[i]); if (ACPI_FAILURE (status)) { - acpi_ut_delete_internal_object_list (param_ptr); + acpi_ut_delete_internal_object_list (internal_params); return_ACPI_STATUS (status); } } - param_ptr[param_objects->count] = NULL; + internal_params[external_params->count] = NULL; } @@ -126,7 +117,7 @@ /* * The path is fully qualified, just evaluate by name */ - status = acpi_ns_evaluate_by_name (pathname, param_ptr, &return_obj); + status = acpi_ns_evaluate_by_name (pathname, internal_params, &internal_return_obj); } else if (!handle) { @@ -157,15 +148,15 @@ * The null pathname case means the handle is for * the actual object to be evaluated */ - status = acpi_ns_evaluate_by_handle (handle, param_ptr, &return_obj); + status = acpi_ns_evaluate_by_handle (handle, internal_params, &internal_return_obj); } else { /* * Both a Handle and a relative Pathname */ - status = acpi_ns_evaluate_relative (handle, pathname, param_ptr, - &return_obj); + status = acpi_ns_evaluate_relative (handle, pathname, internal_params, + &internal_return_obj); } } @@ -179,8 +170,8 @@ user_buffer_length = return_buffer->length; return_buffer->length = 0; - if (return_obj) { - if (VALID_DESCRIPTOR_TYPE (return_obj, ACPI_DESC_TYPE_NAMED)) { + if (internal_return_obj) { + if (VALID_DESCRIPTOR_TYPE (internal_return_obj, ACPI_DESC_TYPE_NAMED)) { /* * If we got an Node as a return object, * this means the object we are evaluating @@ -193,7 +184,7 @@ * types at a later date if necessary. */ status = AE_TYPE; - return_obj = NULL; /* No need to delete an Node */ + internal_return_obj = NULL; /* No need to delete an Node */ } if (ACPI_SUCCESS (status)) { @@ -201,7 +192,7 @@ * Find out how large a buffer is needed * to contain the returned object */ - status = acpi_ut_get_object_size (return_obj, + status = acpi_ut_get_object_size (internal_return_obj, &buffer_space_needed); if (ACPI_SUCCESS (status)) { /* @@ -226,7 +217,7 @@ /* * We have enough space for the object, build it */ - status = acpi_ut_copy_iobject_to_eobject (return_obj, + status = acpi_ut_copy_iobject_to_eobject (internal_return_obj, return_buffer); return_buffer->length = buffer_space_needed; } @@ -238,21 +229,21 @@ /* Delete the return and parameter objects */ - if (return_obj) { + if (internal_return_obj) { /* * Delete the internal return object. (Or at least * decrement the reference count by one) */ - acpi_ut_remove_reference (return_obj); + acpi_ut_remove_reference (internal_return_obj); } /* * Free the input parameter list (if we created one), */ - if (param_ptr) { + if (internal_params) { /* Free the allocated parameter block */ - acpi_ut_delete_internal_object_list (param_ptr); + acpi_ut_delete_internal_object_list (internal_params); } return_ACPI_STATUS (status); @@ -290,13 +281,6 @@ acpi_namespace_node *child_node = NULL; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - /* Parameter validation */ if (type > ACPI_TYPE_MAX) { @@ -310,7 +294,7 @@ if (!child) { /* Start search at the beginning of the specified scope */ - parent_node = acpi_ns_convert_handle_to_entry (parent); + parent_node = acpi_ns_map_handle_to_node (parent); if (!parent_node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -322,7 +306,7 @@ else { /* Convert and validate the handle */ - child_node = acpi_ns_convert_handle_to_entry (child); + child_node = acpi_ns_map_handle_to_node (child); if (!child_node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -332,7 +316,7 @@ /* Internal function does the real work */ - node = acpi_ns_get_next_object ((acpi_object_type8) type, + node = acpi_ns_get_next_node ((acpi_object_type8) type, parent_node, child_node); if (!node) { status = AE_NOT_FOUND; @@ -370,15 +354,7 @@ acpi_object_type *ret_type) { acpi_namespace_node *node; - acpi_status status; - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } /* Parameter Validation */ @@ -399,7 +375,7 @@ /* Convert and validate the handle */ - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return (AE_BAD_PARAMETER); @@ -436,13 +412,6 @@ acpi_status status = AE_OK; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - if (!ret_handle) { return (AE_BAD_PARAMETER); } @@ -458,7 +427,7 @@ /* Convert and validate the handle */ - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -519,7 +488,7 @@ acpi_object_type type, acpi_handle start_object, u32 max_depth, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value) { @@ -529,13 +498,6 @@ FUNCTION_TRACE ("Acpi_walk_namespace"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((type > ACPI_TYPE_MAX) || @@ -551,11 +513,9 @@ * must be allowed to make Acpi calls itself. */ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - status = acpi_ns_walk_namespace ((acpi_object_type8) type, - start_object, max_depth, - NS_WALK_UNLOCK, - user_function, context, - return_value); + status = acpi_ns_walk_namespace ((acpi_object_type8) type, start_object, + max_depth, NS_WALK_UNLOCK, user_function, context, + return_value); acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); @@ -587,14 +547,14 @@ acpi_status status; acpi_namespace_node *node; u32 flags; - ACPI_DEVICE_ID device_id; - ACPI_GET_DEVICES_INFO *info; + acpi_device_id device_id; + acpi_get_devices_info *info; info = context; acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (obj_handle); + node = acpi_ns_map_handle_to_node (obj_handle); acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); if (!node) { @@ -665,23 +625,16 @@ acpi_status acpi_get_devices ( NATIVE_CHAR *HID, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value) { acpi_status status; - ACPI_GET_DEVICES_INFO info; + acpi_get_devices_info info; FUNCTION_TRACE ("Acpi_get_devices"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } /* Parameter validation */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/os.c linux/drivers/acpi/os.c --- v2.4.13/linux/drivers/acpi/os.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/os.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: os.c - Linux OSL functions - * $Revision: 46 $ + * $Revision: 49 $ * *****************************************************************************/ @@ -40,7 +40,6 @@ #include #include #include -#include "driver.h" #ifdef CONFIG_ACPI_EFI #include @@ -191,14 +190,7 @@ } if ((unsigned long) phys < virt_to_phys(high_memory)) { - struct page *page; *virt = phys_to_virt((unsigned long) phys); - - /* Check for stamping */ - page = virt_to_page(*virt); - if(page && !test_bit(PG_reserved, &page->flags)) - printk(KERN_WARNING "ACPI attempting to access kernel owned memory at %08lX.\n", (unsigned long)phys); - return AE_OK; } @@ -322,7 +314,7 @@ acpi_status acpi_os_write_port( ACPI_IO_ADDRESS port, - u32 value, + NATIVE_UINT value, u32 width) { switch (width) diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ac_adapter/ac.c linux/drivers/acpi/ospm/ac_adapter/ac.c --- v2.4.13/linux/drivers/acpi/ospm/ac_adapter/ac.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ac_adapter/ac.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ac.c - * $Revision: 22 $ + * $Revision: 23 $ * *****************************************************************************/ @@ -76,7 +76,7 @@ * Print out basic adapter information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| AC Adapter[%02x]:[%p] %s\n", ac_adapter->device_handle, ac_adapter->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| AC Adapter[%02x]:[%p] %s\n", ac_adapter->device_handle, ac_adapter->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); acpi_os_free(buffer.pointer); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ac_adapter/ac_osl.c linux/drivers/acpi/ospm/ac_adapter/ac_osl.c --- v2.4.13/linux/drivers/acpi/ospm/ac_adapter/ac_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ac_adapter/ac_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ac_osl.c - * $Revision: 9 $ + * $Revision: 10 $ * *****************************************************************************/ @@ -35,7 +35,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - AC Adapter Driver"); -MODULE_LICENSE("GPL"); #define AC_PROC_ROOT "ac_adapter" @@ -122,7 +121,7 @@ return(AE_BAD_PARAMETER); } - printk(KERN_INFO "AC Adapter: found\n"); + printk(KERN_INFO "ACPI: AC Adapter found\n"); proc_entry = proc_mkdir(ac_adapter->uid, ac_proc_root); if (!proc_entry) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/battery/bt.c linux/drivers/acpi/ospm/battery/bt.c --- v2.4.13/linux/drivers/acpi/ospm/battery/bt.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/battery/bt.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: bt.c - * $Revision: 27 $ + * $Revision: 29 $ * *****************************************************************************/ @@ -76,7 +76,7 @@ */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Battery[%02x]:[%p] %s\n", battery->device_handle, battery->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Battery[%02x]:[%p] %s\n", battery->device_handle, battery->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| uid[%s] is_present[%d] power_units[%s]\n", battery->uid, battery->is_present, battery->power_units)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); @@ -116,7 +116,7 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - MEMSET(&bif_buffer, 0, sizeof(acpi_buffer)); + memset(&bif_buffer, 0, sizeof(acpi_buffer)); /* * Evalute _BIF: @@ -147,7 +147,7 @@ package_format.length = sizeof("NNNNNNNNNSSSS"); package_format.pointer = "NNNNNNNNNSSSS"; - MEMSET(&package_data, 0, sizeof(acpi_buffer)); + memset(&package_data, 0, sizeof(acpi_buffer)); status = bm_extract_package_data(package, &package_format, &package_data); @@ -206,7 +206,7 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - MEMSET(&bst_buffer, 0, sizeof(acpi_buffer)); + memset(&bst_buffer, 0, sizeof(acpi_buffer)); /* * Evalute _BST: @@ -237,7 +237,7 @@ package_format.length = sizeof("NNNN"); package_format.pointer = "NNNN"; - MEMSET(&package_data, 0, sizeof(acpi_buffer)); + memset(&package_data, 0, sizeof(acpi_buffer)); status = bm_extract_package_data(package, &package_format, &package_data); @@ -495,8 +495,8 @@ FUNCTION_TRACE("bt_initialize"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Register driver for driver method battery devices. @@ -533,8 +533,8 @@ FUNCTION_TRACE("bt_terminate"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Unregister driver for driver method battery devices. diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/battery/bt_osl.c linux/drivers/acpi/ospm/battery/bt_osl.c --- v2.4.13/linux/drivers/acpi/ospm/battery/bt_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/battery/bt_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bt_osl.c - * $Revision: 22 $ + * $Revision: 24 $ * *****************************************************************************/ @@ -44,7 +44,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - Control Method Battery Driver"); -MODULE_LICENSE("GPL"); #define BT_PROC_ROOT "battery" @@ -107,7 +106,7 @@ } else { p += sprintf(p, "Design Capacity: %d %sh\n", - battery_info->design_capacity, + (u32)battery_info->design_capacity, battery->power_units); } @@ -116,7 +115,7 @@ } else { p += sprintf(p, "Last Full Capacity: %d %sh\n", - battery_info->last_full_capacity, + (u32)battery_info->last_full_capacity, battery->power_units); } @@ -135,20 +134,20 @@ } else { p += sprintf(p, "Design Voltage: %d mV\n", - battery_info->design_voltage); + (u32)battery_info->design_voltage); } p += sprintf(p, "Design Capacity Warning: %d %sh\n", - battery_info->design_capacity_warning, + (u32)battery_info->design_capacity_warning, battery->power_units); p += sprintf(p, "Design Capacity Low: %d %sh\n", - battery_info->design_capacity_low, + (u32)battery_info->design_capacity_low, battery->power_units); p += sprintf(p, "Capacity Granularity 1: %d %sh\n", - battery_info->battery_capacity_granularity_1, + (u32)battery_info->battery_capacity_granularity_1, battery->power_units); p += sprintf(p, "Capacity Granularity 2: %d %sh\n", - battery_info->battery_capacity_granularity_2, + (u32)battery_info->battery_capacity_granularity_2, battery->power_units); p += sprintf(p, "Model Number: %s\n", battery_info->model_number); @@ -242,7 +241,7 @@ } else { p += sprintf(p, "Present Rate: %d %s\n", - battery_status->present_rate, + (u32)battery_status->present_rate, battery->power_units); } @@ -251,7 +250,7 @@ } else { p += sprintf(p, "Remaining Capacity: %d %sh\n", - battery_status->remaining_capacity, + (u32)battery_status->remaining_capacity, battery->power_units); } @@ -260,7 +259,7 @@ } else { p += sprintf(p, "Battery Voltage: %d mV\n", - battery_status->present_voltage); + (u32)battery_status->present_voltage); } end: @@ -294,10 +293,10 @@ } if (battery->is_present) { - printk("Battery: socket found, battery present\n"); + printk("ACPI: Battery socket found, battery present\n"); } else { - printk("Battery: socket found, battery absent\n"); + printk("ACPI: Battery socket found, battery absent\n"); } proc_entry = proc_mkdir(battery->uid, bt_proc_root); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/busmgr/bm.c linux/drivers/acpi/ospm/busmgr/bm.c --- v2.4.13/linux/drivers/acpi/ospm/busmgr/bm.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/busmgr/bm.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bm.c - * $Revision: 47 $ + * $Revision: 48 $ * *****************************************************************************/ @@ -223,7 +223,7 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+-------------------------------------------------------------------------------\n")); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| %s[%02x]:[%p] flags[%02x] hid[%s] %s\n", type_string, device->handle, device->acpi_handle, device->flags, (device->id.hid[0] ? device->id.hid : " "), buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| %s[%02x]:[%p] flags[%02x] hid[%s] %s\n", type_string, device->handle, device->acpi_handle, device->flags, (device->id.hid[0] ? device->id.hid : " "), (char*)buffer.pointer)); if (flags & BM_PRINT_IDENTIFICATION) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| identification: uid[%s] adr[%08x]\n", device->id.uid, device->id.adr)); @@ -919,7 +919,7 @@ for (i=0; idevice_handle, pr->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Power_resource[%02x]:[%p] %s\n", pr->device_handle, pr->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| system_level[S%d] resource_order[%d]\n", pr->system_level, pr->resource_order)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| state[D%d] reference_count[%d]\n", pr->state, pr->reference_count)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/busmgr/bmutils.c linux/drivers/acpi/ospm/busmgr/bmutils.c --- v2.4.13/linux/drivers/acpi/ospm/busmgr/bmutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/busmgr/bmutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: bmutils.c - * $Revision: 38 $ + * $Revision: 43 $ * *****************************************************************************/ @@ -81,11 +81,11 @@ } if (pathname) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Evaluate object [%s.%s], %s\n", buffer.pointer, pathname, + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluate object [%s.%s], %s\n", (char*)buffer.pointer, pathname, acpi_format_exception(status))); } else { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Evaluate object [%s], %s\n", buffer.pointer, + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluate object [%s], %s\n", (char*)buffer.pointer, acpi_format_exception(status))); } @@ -175,68 +175,70 @@ * ****************************************************************************/ -/* - * TBD: Don't assume numbers (in ASL) are 32-bit values!!!! (IA64) - * TBD: Issue with 'assumed' types coming out of interpreter... - * (e.g. toshiba _BIF) - */ - acpi_status bm_extract_package_data ( acpi_object *package, - acpi_buffer *package_format, + acpi_buffer *format, acpi_buffer *buffer) { - acpi_status status = AE_OK; - u8 *head = NULL; - u8 *tail = NULL; - u8 **pointer = NULL; u32 tail_offset = 0; - acpi_object *element = NULL; u32 size_required = 0; - char* format = NULL; + char *format_string = NULL; u32 format_count = 0; u32 i = 0; + u8 *head = NULL; + u8 *tail = NULL; FUNCTION_TRACE("bm_extract_package_data"); - if (!package || (package->type != ACPI_TYPE_PACKAGE) || - (package->package.count == 0) || !package_format || - (package_format->length < 1) || - (!package_format->pointer) || !buffer) { + if (!package || (package->type != ACPI_TYPE_PACKAGE) || (package->package.count < 1)) { + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid 'package' argument\n")); return_ACPI_STATUS(AE_BAD_PARAMETER); } - format_count = package_format->length - 1; + if (!format || !format->pointer || (format->length < 1)) { + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid 'format' argument\n")); + return_ACPI_STATUS(AE_BAD_PARAMETER); + } + + if (!buffer) { + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid 'buffer' argument\n")); + return_ACPI_STATUS(AE_BAD_PARAMETER); + } + format_count = (format->length/sizeof(char)) - 1; if (format_count > package->package.count) { - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Format specifies more objects [%d] than exist in package [%d].", format_count, package->package.count)); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Format specifies more objects [%d] than exist in package [%d].", format_count, package->package.count)); return_ACPI_STATUS(AE_BAD_DATA); } - format = (char*)package_format->pointer; + format_string = (char*)format->pointer; /* * Calculate size_required. */ for (i=0; ipackage.elements[i]); + + acpi_object *element = &(package->package.elements[i]); + + if (!element) { + return_ACPI_STATUS(AE_BAD_DATA); + } switch (element->type) { case ACPI_TYPE_INTEGER: - switch (format[i]) { + switch (format_string[i]) { case 'N': size_required += sizeof(acpi_integer); tail_offset += sizeof(acpi_integer); break; case 'S': - size_required += sizeof(u8*) + - sizeof(acpi_integer) + 1; - tail_offset += sizeof(acpi_integer); + size_required += sizeof(char*) + sizeof(acpi_integer) + sizeof(char); + tail_offset += sizeof(char*); break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Invalid package element [%d]: got number, expecing [%c].\n", i, format[i])); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid package element [%d]: got number, expecing [%c].\n", i, format_string[i])); return_ACPI_STATUS(AE_BAD_DATA); break; } @@ -244,19 +246,17 @@ case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: - switch (format[i]) { + switch (format_string[i]) { case 'S': - size_required += sizeof(u8*) + - element->string.length + 1; - tail_offset += sizeof(u8*); + size_required += sizeof(char*) + (element->string.length * sizeof(char)) + sizeof(char); + tail_offset += sizeof(char*); break; case 'B': - size_required += sizeof(u8*) + - element->buffer.length; + size_required += sizeof(u8*) + (element->buffer.length * sizeof(u8)); tail_offset += sizeof(u8*); break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Invalid package element [%d] got string/buffer, expecing [%c].\n", i, format[i])); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid package element [%d] got string/buffer, expecing [%c].\n", i, format_string[i])); return_ACPI_STATUS(AE_BAD_DATA); break; } @@ -264,52 +264,52 @@ case ACPI_TYPE_PACKAGE: default: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unsupported element at index=%d\n", i)); /* TBD: handle nested packages... */ return_ACPI_STATUS(AE_SUPPORT); break; } } - if (size_required > buffer->length) { + /* + * Validate output buffer. + */ + if (buffer->length < size_required) { buffer->length = size_required; return_ACPI_STATUS(AE_BUFFER_OVERFLOW); } - - buffer->length = size_required; - - if (!buffer->pointer) { + else if (buffer->length != size_required || !buffer->pointer) { return_ACPI_STATUS(AE_BAD_PARAMETER); } head = buffer->pointer; tail = buffer->pointer + tail_offset; - /* - * Extract package data: + /* + * Extract package data. */ for (i=0; ipackage.elements[i]); + u8 **pointer = NULL; + acpi_object *element = &(package->package.elements[i]); switch (element->type) { case ACPI_TYPE_INTEGER: - switch (format[i]) { + switch (format_string[i]) { case 'N': - *((acpi_integer*)head) = - element->integer.value; + *((acpi_integer*)head) = element->integer.value; head += sizeof(acpi_integer); break; case 'S': pointer = (u8**)head; *pointer = tail; - *((acpi_integer*)tail) = - element->integer.value; + *((acpi_integer*)tail) = element->integer.value; head += sizeof(acpi_integer*); tail += sizeof(acpi_integer); /* NULL terminate string */ - *tail = 0; - tail++; + *tail = (char)0; + tail += sizeof(char); break; default: /* Should never get here */ @@ -319,25 +319,23 @@ case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: - switch (format[i]) { + switch (format_string[i]) { case 'S': pointer = (u8**)head; *pointer = tail; - memcpy(tail, element->string.pointer, - element->string.length); - head += sizeof(u8*); - tail += element->string.length; + memcpy(tail, element->string.pointer, element->string.length); + head += sizeof(char*); + tail += element->string.length * sizeof(char); /* NULL terminate string */ - *tail = 0; - tail++; + *tail = (char)0; + tail += sizeof(char); break; case 'B': pointer = (u8**)head; *pointer = tail; - memcpy(tail, element->buffer.pointer, - element->buffer.length); + memcpy(tail, element->buffer.pointer, element->buffer.length); head += sizeof(u8*); - tail += element->buffer.length; + tail += element->buffer.length * sizeof(u8); break; default: /* Should never get here */ @@ -353,7 +351,7 @@ } } - return_ACPI_STATUS(status); + return_ACPI_STATUS(AE_OK); } @@ -465,7 +463,7 @@ */ status = bm_evaluate_object(handle, pathname, NULL, &buffer); if (ACPI_FAILURE(status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "failed to evaluate object (%s)\n", + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "failed to evaluate object (%s)\n", acpi_format_exception(status))); goto end; } @@ -569,7 +567,7 @@ if (!element || (element->type != ACPI_TYPE_STRING)) { status = AE_BAD_DATA; - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Invalid element in package (not a device reference).\n")); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid element in package (not a device reference).\n")); DEBUG_EVAL_ERROR (ACPI_LV_WARN, handle, pathname, status); break; } @@ -582,7 +580,7 @@ element->string.pointer, &reference_handle); if (ACPI_FAILURE(status)) { status = AE_BAD_DATA; - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to resolve device reference [%s].\n", element->string.pointer)); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Unable to resolve device reference [%s].\n", element->string.pointer)); DEBUG_EVAL_ERROR (ACPI_LV_WARN, handle, pathname, status); break; } @@ -594,12 +592,12 @@ &(reference_list->handles[i])); if (ACPI_FAILURE(status)) { status = AE_BAD_DATA; - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to resolve device reference for [%p].\n", reference_handle)); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Unable to resolve device reference for [%p].\n", reference_handle)); DEBUG_EVAL_ERROR (ACPI_LV_WARN, handle, pathname, status); break; } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Resolved reference [%s]->[%p]->[%02x]\n", element->string.pointer, reference_handle, reference_list->handles[i])); + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resolved reference [%s]->[%p]->[%02x]\n", element->string.pointer, reference_handle, reference_list->handles[i])); (reference_list->count)++; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/button/bn.c linux/drivers/acpi/ospm/button/bn.c --- v2.4.13/linux/drivers/acpi/ospm/button/bn.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/button/bn.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: bn.c - * $Revision: 25 $ + * $Revision: 27 $ * *****************************************************************************/ @@ -81,16 +81,16 @@ case BN_TYPE_POWER_BUTTON: case BN_TYPE_POWER_BUTTON_FIXED: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Power_button[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Power_button[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, (char*)buffer.pointer)); break; case BN_TYPE_SLEEP_BUTTON: case BN_TYPE_SLEEP_BUTTON_FIXED: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Sleep_button[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Sleep_button[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, (char*)buffer.pointer)); break; case BN_TYPE_LID_SWITCH: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Lid_switch[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Lid_switch[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, (char*)buffer.pointer)); break; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/button/bn_osl.c linux/drivers/acpi/ospm/button/bn_osl.c --- v2.4.13/linux/drivers/acpi/ospm/button/bn_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/button/bn_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bn_osl.c - * $Revision: 14 $ + * $Revision: 16 $ * *****************************************************************************/ @@ -35,7 +35,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - Button Driver"); -MODULE_LICENSE("GPL"); #define BN_PROC_ROOT "button" @@ -47,6 +46,15 @@ static struct proc_dir_entry *bn_proc_root = NULL; +#define BN_TYPE_UNKNOWN 0 +#define BN_TYPE_FIXED 1 +#define BN_TYPE_GENERIC 2 + +static int bn_power_button = BN_TYPE_UNKNOWN; +static int bn_sleep_button = BN_TYPE_UNKNOWN; +static int bn_lid_switch = BN_TYPE_UNKNOWN; + + /**************************************************************************** * * FUNCTION: bn_osl_add_device @@ -65,24 +73,77 @@ switch (button->type) { - case BN_TYPE_POWER_BUTTON: case BN_TYPE_POWER_BUTTON_FIXED: - printk(KERN_INFO "Power Button: found\n"); + bn_power_button = BN_TYPE_FIXED; + printk(KERN_INFO "ACPI: Power Button (FF) found\n"); if (!proc_mkdir(BN_PROC_POWER_BUTTON, bn_proc_root)) { status = AE_ERROR; } break; - case BN_TYPE_SLEEP_BUTTON: + case BN_TYPE_POWER_BUTTON: + /* + * Avoid creating multiple /proc entries when (buggy) ACPI + * BIOS tables erroneously list both fixed- and generic- + * feature buttons. Note that fixed-feature buttons are + * always enumerated first (and there can only be one) so + * we only need to check here. + */ + switch (bn_power_button) { + case BN_TYPE_GENERIC: + printk(KERN_WARNING "ACPI: Multiple generic-space power buttons detected, using first\n"); + break; + case BN_TYPE_FIXED: + printk(KERN_WARNING "ACPI: Multiple power buttons detected, ignoring fixed-feature\n"); + default: + printk(KERN_INFO "ACPI: Power Button (CM) found\n"); + bn_power_button = BN_TYPE_GENERIC; + if (!proc_mkdir(BN_PROC_POWER_BUTTON, bn_proc_root)) { + status = AE_ERROR; + } + break; + } + break; + case BN_TYPE_SLEEP_BUTTON_FIXED: - printk(KERN_INFO "Sleep Button: found\n"); + bn_sleep_button = BN_TYPE_FIXED; + printk(KERN_INFO "ACPI: Sleep Button (FF) found\n"); if (!proc_mkdir(BN_PROC_SLEEP_BUTTON, bn_proc_root)) { status = AE_ERROR; } break; + case BN_TYPE_SLEEP_BUTTON: + /* + * Avoid creating multiple /proc entries when (buggy) ACPI + * BIOS tables erroneously list both fixed- and generic- + * feature buttons. Note that fixed-feature buttons are + * always enumerated first (and there can only be one) so + * we only need to check here. + */ + switch (bn_sleep_button) { + case BN_TYPE_GENERIC: + printk(KERN_WARNING "ACPI: Multiple generic-space sleep buttons detected, using first\n"); + break; + case BN_TYPE_FIXED: + printk(KERN_WARNING "ACPI: Multiple sleep buttons detected, ignoring fixed-feature\n"); + default: + bn_sleep_button = BN_TYPE_GENERIC; + printk(KERN_INFO "ACPI: Sleep Button (CM) found\n"); + if (!proc_mkdir(BN_PROC_SLEEP_BUTTON, bn_proc_root)) { + status = AE_ERROR; + } + break; + } + break; + case BN_TYPE_LID_SWITCH: - printk(KERN_INFO "Lid Switch: found\n"); + if (bn_lid_switch) { + printk(KERN_WARNING "ACPI: Multiple generic-space lid switches detected, using first\n"); + break; + } + bn_lid_switch = BN_TYPE_GENERIC; + printk(KERN_INFO "ACPI: Lid Switch (CM) found\n"); if (!proc_mkdir(BN_PROC_LID_SWITCH, bn_proc_root)) { status = AE_ERROR; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ec/ec_osl.c linux/drivers/acpi/ospm/ec/ec_osl.c --- v2.4.13/linux/drivers/acpi/ospm/ec/ec_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ec/ec_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ec_osl.c - * $Revision: 10 $ + * $Revision: 11 $ * *****************************************************************************/ @@ -36,25 +36,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - Embedded Controller Driver"); -MODULE_LICENSE("GPL"); - -#ifdef ACPI_DEBUG - -static int dbg_layer = ACPI_COMPONENT_DEFAULT; -MODULE_PARM(dbg_layer, "i"); -MODULE_PARM_DESC(dbg_layer, "Controls debug output (see acpi_dbg_layer).\n"); - -static int dbg_level = DEBUG_DEFAULT; -MODULE_PARM(dbg_level, "i"); -MODULE_PARM_DESC(dbg_level, "Controls debug output (see acpi_dbg_level).\n"); - -#endif /*ACPI_DEBUG*/ - - -#ifdef ACPI_DEBUG -static u32 save_dbg_layer; -static u32 save_dbg_level; -#endif /*ACPI_DEBUG*/ extern struct proc_dir_entry *bm_proc_root; @@ -80,14 +61,6 @@ if (!bm_proc_root) return -ENODEV; -#ifdef ACPI_DEBUG - save_dbg_layer = acpi_dbg_layer; - acpi_dbg_layer = dbg_layer; - - save_dbg_level = acpi_dbg_level; - acpi_dbg_level = dbg_level; -#endif /*ACPI_DEBUG*/ - status = ec_initialize(); return (ACPI_SUCCESS(status)) ? 0 : -ENODEV; @@ -109,11 +82,6 @@ ec_osl_cleanup(void) { ec_terminate(); - -#ifdef ACPI_DEBUG - acpi_dbg_layer = save_dbg_layer; - acpi_dbg_level = save_dbg_level; -#endif /*ACPI_DEBUG*/ return; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ec/ecmain.c linux/drivers/acpi/ospm/ec/ecmain.c --- v2.4.13/linux/drivers/acpi/ospm/ec/ecmain.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ec/ecmain.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ecmain.c - * $Revision: 28 $ + * $Revision: 29 $ * *****************************************************************************/ @@ -79,7 +79,7 @@ * Print out basic thermal zone information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Embedded_controller[%02x]:[%p] %s\n", ec->device_handle, ec->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Embedded_controller[%02x]:[%p] %s\n", ec->device_handle, ec->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| gpe_bit[%02x] status/command_port[%02x] data_port[%02x]\n", ec->gpe_bit, ec->status_port, ec->data_port)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ec/ecspace.c linux/drivers/acpi/ospm/ec/ecspace.c --- v2.4.13/linux/drivers/acpi/ospm/ec/ecspace.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ec/ecspace.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ecspace.c - * $Revision: 22 $ + * $Revision: 23 $ * *****************************************************************************/ @@ -113,7 +113,7 @@ break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Received request with invalid function [%p].\n", function)); + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Received request with invalid function [%X].\n", function)); return_ACPI_STATUS(AE_BAD_PARAMETER); break; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/include/bn.h linux/drivers/acpi/ospm/include/bn.h --- v2.4.13/linux/drivers/acpi/ospm/include/bn.h Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/include/bn.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bn.h - * $Revision: 10 $ + * $Revision: 12 $ * *****************************************************************************/ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/include/bt.h linux/drivers/acpi/ospm/include/bt.h --- v2.4.13/linux/drivers/acpi/ospm/include/bt.h Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/include/bt.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bt.h - * $Revision: 16 $ + * $Revision: 18 $ * *****************************************************************************/ @@ -66,15 +66,15 @@ */ typedef struct { - u32 power_unit; - u32 design_capacity; - u32 last_full_capacity; - u32 battery_technology; - u32 design_voltage; - u32 design_capacity_warning; - u32 design_capacity_low; - u32 battery_capacity_granularity_1; - u32 battery_capacity_granularity_2; + acpi_integer power_unit; + acpi_integer design_capacity; + acpi_integer last_full_capacity; + acpi_integer battery_technology; + acpi_integer design_voltage; + acpi_integer design_capacity_warning; + acpi_integer design_capacity_low; + acpi_integer battery_capacity_granularity_1; + acpi_integer battery_capacity_granularity_2; acpi_string model_number; acpi_string serial_number; acpi_string battery_type; @@ -89,10 +89,10 @@ */ typedef struct { - u32 state; - u32 present_rate; - u32 remaining_capacity; - u32 present_voltage; + acpi_integer state; + acpi_integer present_rate; + acpi_integer remaining_capacity; + acpi_integer present_voltage; } BT_BATTERY_STATUS; @@ -137,7 +137,7 @@ acpi_status bt_get_status ( - BT_CONTEXT *battery, + BT_CONTEXT *battery, BT_BATTERY_STATUS **battery_status); acpi_status diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/include/pr.h linux/drivers/acpi/ospm/include/pr.h --- v2.4.13/linux/drivers/acpi/ospm/include/pr.h Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/include/pr.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: processor.h - * $Revision: 9 $ + * $Revision: 13 $ * *****************************************************************************/ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/include/tz.h linux/drivers/acpi/ospm/include/tz.h --- v2.4.13/linux/drivers/acpi/ospm/include/tz.h Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/include/tz.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: tz.h - * $Revision: 21 $ + * $Revision: 24 $ * *****************************************************************************/ @@ -116,68 +116,42 @@ typedef u32 TZ_STATE; #define TZ_STATE_OK ((TZ_STATE) 0x00000000) +#define TZ_STATE_HOT ((TZ_STATE) 0x10000000) #define TZ_STATE_ACTIVE ((TZ_STATE) 0x20000000) #define TZ_STATE_PASSIVE ((TZ_STATE) 0x40000000) #define TZ_STATE_CRITICAL ((TZ_STATE) 0x80000000) - -/* - * TZ_THRESHOLD: - * ------------- - * Information on an individual threshold. - */ typedef struct { - TZ_THRESHOLD_TYPE type; - u32 index; u32 temperature; - TZ_COOLING_STATE cooling_state; - BM_HANDLE_LIST cooling_devices; -} TZ_THRESHOLD; - - -/* - * TZ_THRESHOLD_LIST: - * ------------------ - * Container for the thresholds of a given thermal zone. - * Note that thresholds are always ordered by increasing - * temperature value to simplify use by thermal policy. - */ -typedef struct { - u32 count; - TZ_THRESHOLD thresholds[TZ_MAX_THRESHOLDS]; -} TZ_THRESHOLD_LIST; - +} TZ_CRITICAL_THRESHOLD; -/* - * TZ_CRITICAL_POLICY: - * ------------------- - */ typedef struct { - TZ_THRESHOLD *threshold; -} TZ_CRITICAL_POLICY; - + u8 is_valid; + u32 temperature; +} TZ_HOT_THRESHOLD; -/* - * TZ_PASSIVE_POLICY: - * ------------------ - */ typedef struct { + u8 is_valid; + u32 temperature; u32 tc1; u32 tc2; u32 tsp; - TZ_THRESHOLD *threshold; -} TZ_PASSIVE_POLICY; - + BM_HANDLE_LIST devices; +} TZ_PASSIVE_THRESHOLD; -/* - * TZ_ACTIVE_POLICY: - * ----------------- - */ typedef struct { - u32 threshold_count; - TZ_THRESHOLD *threshold[TZ_MAX_ACTIVE_THRESHOLDS]; -} TZ_ACTIVE_POLICY; + u8 is_valid; + u32 temperature; + TZ_COOLING_STATE cooling_state; + BM_HANDLE_LIST devices; +} TZ_ACTIVE_THRESHOLD; +typedef struct { + TZ_CRITICAL_THRESHOLD critical; + TZ_HOT_THRESHOLD hot; + TZ_PASSIVE_THRESHOLD passive; + TZ_ACTIVE_THRESHOLD active[TZ_MAX_ACTIVE_THRESHOLDS]; +} TZ_THRESHOLDS; /* * TZ_POLICY: @@ -188,11 +162,7 @@ TZ_STATE state; TZ_COOLING_MODE cooling_mode; u32 polling_freq; - TZ_THRESHOLD_LIST threshold_list; - TZ_CRITICAL_POLICY critical; - TZ_PASSIVE_POLICY passive; - TZ_ACTIVE_POLICY active; - /* TBD: Linux-specific */ + TZ_THRESHOLDS thresholds; struct timer_list timer; } TZ_POLICY; @@ -213,7 +183,7 @@ * Function Prototypes *****************************************************************************/ -/* thermal_zone.c */ +/* tz.c */ acpi_status tz_initialize (void); @@ -234,46 +204,49 @@ acpi_status tz_get_temperature ( - TZ_CONTEXT *thermal_zone, - u32 *temperature); + TZ_CONTEXT *tz); acpi_status tz_get_thresholds ( - TZ_CONTEXT *thermal_zone, - TZ_THRESHOLD_LIST *threshold_list); + TZ_CONTEXT *tz); + +acpi_status +tz_set_cooling_preference ( + TZ_CONTEXT *tz, + TZ_COOLING_MODE cooling_mode); void tz_print ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); /* tzpolicy.c */ acpi_status tz_policy_add_device ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); acpi_status tz_policy_remove_device ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); void tz_policy_check ( void *context); -/* Thermal Zone Driver OSL */ +/* tz_osl.c */ acpi_status tz_osl_add_device ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); acpi_status tz_osl_remove_device ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); acpi_status tz_osl_generate_event ( u32 event, - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); #endif /* __TZ_H__ */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/processor/pr.c linux/drivers/acpi/ospm/processor/pr.c --- v2.4.13/linux/drivers/acpi/ospm/processor/pr.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/processor/pr.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: pr.c - * $Revision: 32 $ + * $Revision: 34 $ * *****************************************************************************/ @@ -63,7 +63,7 @@ #ifdef ACPI_DEBUG acpi_buffer buffer; - PROC_NAME("pr_print"); + FUNCTION_TRACE("pr_print"); buffer.length = 256; buffer.pointer = acpi_os_callocate(buffer.length); @@ -80,7 +80,7 @@ * Print out basic processor information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Processor[%02x]:[%p] uid[%02x] %s\n", processor->device_handle, processor->acpi_handle, processor->uid, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Processor[%02x]:[%p] uid[%02x] %s\n", processor->device_handle, processor->acpi_handle, processor->uid, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| power: %cC0 %cC1 %cC2[%d] %cC3[%d]\n", (processor->power.state[0].is_valid?'+':'-'), (processor->power.state[1].is_valid?'+':'-'), (processor->power.state[2].is_valid?'+':'-'), processor->power.state[2].latency, (processor->power.state[3].is_valid?'+':'-'), processor->power.state[3].latency)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| performance: states[%d]\n", processor->performance.state_count)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); @@ -140,7 +140,7 @@ * Processor Block: * ---------------- */ - MEMSET(&acpi_object, 0, sizeof(acpi_object)); + memset(&acpi_object, 0, sizeof(acpi_object)); buffer.length = sizeof(acpi_object); buffer.pointer = &acpi_object; @@ -261,8 +261,8 @@ FUNCTION_TRACE("pr_initialize"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Initialize power (Cx state) policy. @@ -307,8 +307,8 @@ FUNCTION_TRACE("pr_terminate"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Terminate power (Cx state) policy. diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/processor/pr_osl.c linux/drivers/acpi/ospm/processor/pr_osl.c --- v2.4.13/linux/drivers/acpi/ospm/processor/pr_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/processor/pr_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: pr_osl.c - * $Revision: 18 $ + * $Revision: 21 $ * *****************************************************************************/ @@ -37,7 +37,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - IA32 Processor Driver"); -MODULE_LICENSE("GPL"); #define PR_PROC_ROOT "processor" @@ -157,14 +156,10 @@ printk(" C%d", i); } } - - if (processor->performance.state_count > 1) { - printk(", throttling states: %d", processor->performance.state_count); - } - - if (acpi_piix4_bmisx) - printk(", PIIX workaround active"); - + if (processor->performance.state_count > 1) + printk(", %d throttling states", processor->performance.state_count); + if (acpi_piix4_bmisx && processor->power.state[3].is_valid) + printk(" (PIIX errata enabled)"); printk("\n"); sprintf(processor_uid, "%d", processor->uid); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/processor/prperf.c linux/drivers/acpi/ospm/processor/prperf.c --- v2.4.13/linux/drivers/acpi/ospm/processor/prperf.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/processor/prperf.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: prperf.c - * $Revision: 19 $ + * $Revision: 21 $ * *****************************************************************************/ @@ -179,7 +179,8 @@ return_ACPI_STATUS(AE_BAD_DATA); } - if (processor->performance.state_count == 1) { + if ((state == processor->performance.active_state) || + (processor->performance.state_count == 1)) { return_ACPI_STATUS(AE_OK); } @@ -233,6 +234,8 @@ acpi_os_write_port(processor->pblk.address, pblk_value, 32); } + processor->performance.active_state = state; + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Processor [%02x] set to performance state [%d%%].\n", processor->device_handle, processor->performance.state[state].performance)); return_ACPI_STATUS(AE_OK); @@ -279,14 +282,14 @@ if (performance->active_state < (performance->state_count-1)) { status = pr_perf_set_state(processor, - (performance->active_state-1)); + (performance->active_state+1)); } break; case PR_PERF_INC: if (performance->active_state > 0) { status = pr_perf_set_state(processor, - (performance->active_state+1)); + (performance->active_state-1)); } break; @@ -302,7 +305,7 @@ } if (ACPI_SUCCESS(status)) { - performance->thermal_limit = limit; + performance->thermal_limit = performance->active_state; } ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Processor [%02x] thermal performance limit set to [%d%%].\n", processor->device_handle, processor->performance.state[performance->active_state].performance)); @@ -403,8 +406,20 @@ * Get Current State: * ------------------ */ - status = pr_perf_get_state(processor, - &(processor->performance.active_state)); + status = pr_perf_get_state(processor, &(processor->performance.active_state)); + if (ACPI_FAILURE(status)) { + return_ACPI_STATUS(status); + } + + /* + * Set to Maximum Performance: + * --------------------------- + * We'll let subsequent policy (e.g. thermal/power) decide to lower + * performance if it so chooses, but for now crank up the speed. + */ + if (0 != processor->performance.active_state) { + status = pr_perf_set_state(processor, 0); + } return_ACPI_STATUS(status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/processor/prpower.c linux/drivers/acpi/ospm/processor/prpower.c --- v2.4.13/linux/drivers/acpi/ospm/processor/prpower.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/processor/prpower.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: prpower.c - * $Revision: 30 $ + * $Revision: 32 $ * *****************************************************************************/ @@ -41,7 +41,7 @@ * Globals ****************************************************************************/ -extern fadt_descriptor_rev2 acpi_fadt; +extern FADT_DESCRIPTOR acpi_fadt; static u32 last_idle_jiffies = 0; static PR_CONTEXT *processor_list[NR_CPUS]; static void (*pr_pm_idle_save)(void) = NULL; @@ -207,7 +207,10 @@ case PR_C1: /* Invoke C1 */ enable(); halt(); - /* no C1 time measurement, so just enter some number of times */ + /* + * TBD: Can't get time duration while in C1, as resumes + * go to an ISR rather than here. + */ time_elapsed = 0xFFFFFFFF; break; @@ -217,8 +220,7 @@ /* Invoke C2 */ acpi_os_read_port(processor->power.p_lvl2, NULL, 8); /* Dummy op - must do something useless after P_LVL2 read */ - acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, - BM_STS); + acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, BM_STS); /* Compute time elapsed */ acpi_get_timer(&end_ticks); /* Re-enable interrupts */ @@ -228,15 +230,13 @@ case PR_C3: /* Disable bus master arbitration */ - acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK, - ARB_DIS, 1); + acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK, ARB_DIS, 1); /* See how long we're asleep for */ acpi_get_timer(&start_ticks); /* Invoke C3 */ acpi_os_read_port(processor->power.p_lvl3, NULL, 8); /* Dummy op - must do something useless after P_LVL3 read */ - acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, - BM_STS); + acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, BM_STS); /* Compute time elapsed */ acpi_get_timer(&end_ticks); /* Enable bus master arbitration */ @@ -266,18 +266,14 @@ c_state->promotion.count++; c_state->demotion.count = 0; - if (c_state->promotion.count >= - c_state->promotion.count_threshold) { - + if (c_state->promotion.count >= c_state->promotion.count_threshold) { /* * Bus Mastering Activity, if active and used * by this state's promotion policy, prevents * promotions from occuring. */ - if (bm_control && !(processor->power.bm_activity & - c_state->promotion.bm_threshold)) { + if (!bm_control || !(processor->power.bm_activity & c_state->promotion.bm_threshold)) next_state = c_state->promotion.target_state; - } } } @@ -305,10 +301,8 @@ * state's promotion policy, causes an immediate demotion * to occur. */ - if (bm_control && (processor->power.bm_activity & - c_state->demotion.bm_threshold)) { + if (bm_control && (processor->power.bm_activity & c_state->demotion.bm_threshold)) next_state = c_state->demotion.target_state; - } } /* @@ -627,7 +621,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Max CPUs[%d], this CPU[%d].\n", NR_CPUS, smp_processor_id())); - /* only use C3 if we can control busmastering */ + /* Only use C3 if we can control bus mastering. */ if (acpi_fadt.V1_pm2_cnt_blk && acpi_fadt.pm2_cnt_len) bm_control = 1; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/system/sm.c linux/drivers/acpi/ospm/system/sm.c --- v2.4.13/linux/drivers/acpi/ospm/system/sm.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/system/sm.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: sm.c - * $Revision: 19 $ + * $Revision: 20 $ * *****************************************************************************/ @@ -71,7 +71,7 @@ * Print out basic system information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| System[%02x]:[%p] %s\n", system->device_handle, system->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| System[%02x]:[%p] %s\n", system->device_handle, system->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| states: %cS0 %cS1 %cS2 %cS3 %cS4 %cS5\n", (system->states[0]?'+':'-'), (system->states[1]?'+':'-'), (system->states[2]?'+':'-'), (system->states[3]?'+':'-'), (system->states[4]?'+':'-'), (system->states[5]?'+':'-'))); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/system/sm_osl.c linux/drivers/acpi/ospm/system/sm_osl.c --- v2.4.13/linux/drivers/acpi/ospm/system/sm_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/system/sm_osl.c Wed Oct 24 14:06:22 2001 @@ -42,7 +42,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - ACPI System Driver"); -MODULE_LICENSE("GPL"); #define SM_PROC_INFO "info" diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/thermal/tz.c linux/drivers/acpi/ospm/thermal/tz.c --- v2.4.13/linux/drivers/acpi/ospm/thermal/tz.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/thermal/tz.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: tz.c - * $Revision: 40 $ + * $Revision: 44 $ * *****************************************************************************/ @@ -23,22 +23,24 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* - * TBD: 1. Finish /proc interface (threshold values, _SCP changes, etc.) - * 2. Update policy for ACPI 2.0 compliance - * 3. Check for all required methods prior to enabling a threshold - * 4. Support for multiple processors in a zone (passive cooling devices) - */ #include #include #include "tz.h" + #define _COMPONENT ACPI_THERMAL MODULE_NAME ("tz") /**************************************************************************** + * Globals + ****************************************************************************/ + +extern int TZP; + + +/**************************************************************************** * Internal Functions ****************************************************************************/ @@ -46,73 +48,63 @@ * * FUNCTION: tz_print * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: Prints out information on a specific thermal zone. - * ****************************************************************************/ void tz_print ( - TZ_CONTEXT *thermal_zone) + TZ_CONTEXT *tz) { #ifdef ACPI_DEBUG acpi_buffer buffer; u32 i,j = 0; - TZ_THRESHOLD *threshold = NULL; + TZ_THRESHOLDS *thresholds = NULL; - PROC_NAME("tz_print"); + FUNCTION_TRACE("tz_print"); - if (!thermal_zone) { + if (!tz) return; - } + + thresholds = &(tz->policy.thresholds); buffer.length = 256; buffer.pointer = acpi_os_callocate(buffer.length); - if (!buffer.pointer) { + if (!buffer.pointer) return; - } /* * Get the full pathname for this ACPI object. */ - acpi_get_name(thermal_zone->acpi_handle, ACPI_FULL_PATHNAME, &buffer); + acpi_get_name(tz->acpi_handle, ACPI_FULL_PATHNAME, &buffer); /* * Print out basic thermal zone information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Thermal_zone[%02x]:[%p] %s\n", thermal_zone->device_handle, thermal_zone->acpi_handle, buffer.pointer)); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| temperature[%d] state[%08x]\n", thermal_zone->policy.temperature, thermal_zone->policy.state)); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| cooling_mode[%08x] polling_freq[%d]\n", thermal_zone->policy.cooling_mode, thermal_zone->policy.polling_freq)); - - for (i=0; ipolicy.threshold_list.count; i++) { - - threshold = &(thermal_zone->policy.threshold_list.thresholds[i]); - - switch (threshold->type) { - case TZ_THRESHOLD_CRITICAL: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| critical[%d]\n", threshold->temperature)); - break; - case TZ_THRESHOLD_PASSIVE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| passive[%d]: tc1[%d] tc2[%d] tsp[%d]\n", threshold->temperature, thermal_zone->policy.passive.tc1, thermal_zone->policy.passive.tc2, thermal_zone->policy.passive.tsp)); - break; - case TZ_THRESHOLD_ACTIVE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| active[%d]: index[%d]\n", threshold->temperature, threshold->index)); - break; - default: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| unknown[%d]\n", threshold->temperature)); - break; + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Thermal_zone[%02x]:[%p] %s\n", tz->device_handle, tz->acpi_handle, (char*)buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| temperature[%d] state[%08x]\n", tz->policy.temperature, tz->policy.state)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| cooling_mode[%08x] polling_freq[%d]\n", tz->policy.cooling_mode, tz->policy.polling_freq)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| critical[%d]\n", thresholds->critical.temperature)); + if (thresholds->hot.is_valid) + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| hot[%d]\n", thresholds->hot.temperature)); + if (thresholds->passive.is_valid) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| passive[%d]: tc1[%d] tc2[%d] tsp[%d]\n", thresholds->passive.temperature, thresholds->passive.tc1, thresholds->passive.tc2, thresholds->passive.tsp)); + if (thresholds->passive.devices.count > 0) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| devices")); + for (j=0; (jpassive.devices.count && j<10); j++) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "[%02x]", thresholds->passive.devices.handles[j])); + } + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); } - - if (threshold->cooling_devices.count > 0) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| cooling_devices")); - for (j=0; (jcooling_devices.count && j<10); j++) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "[%02x]", threshold->cooling_devices.handles[j])); + } + for (i=0; iactive[i].is_valid) + break; + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| active[%d]: index[%d]\n", thresholds->active[i].temperature, i)); + if (thresholds->active[i].devices.count > 0) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| devices")); + for (j=0; (jactive[i].devices.count && j<10); j++) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "[%02x]", thresholds->active[i].devices.handles[j])); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); } } @@ -130,32 +122,29 @@ * * FUNCTION: tz_get_temperaturee * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status tz_get_temperature ( - TZ_CONTEXT *thermal_zone, - u32 *temperature) + TZ_CONTEXT *tz) { acpi_status status = AE_OK; FUNCTION_TRACE("tz_get_temperature"); - if (!thermal_zone || !temperature) { + if (!tz) { return_ACPI_STATUS(AE_BAD_PARAMETER); } /* - * Evaluate the _TMP driver method to get the current temperature. + * Evaluate the _TMP method to get the current temperature. */ - status = bm_evaluate_simple_integer(thermal_zone->acpi_handle, - "_TMP", temperature); + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TMP", &(tz->policy.temperature)); + if (ACPI_FAILURE(status)) { + return_ACPI_STATUS(status); + } + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Temperature is %d d_k\n", tz->policy.temperature)); return_ACPI_STATUS(status); } @@ -165,17 +154,11 @@ * * FUNCTION: tz_set_cooling_preference * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status tz_set_cooling_preference ( - TZ_CONTEXT *thermal_zone, + TZ_CONTEXT *tz, TZ_COOLING_MODE cooling_mode) { acpi_status status = AE_OK; @@ -184,8 +167,7 @@ FUNCTION_TRACE("tz_set_cooling_preference"); - if (!thermal_zone || ((cooling_mode != TZ_COOLING_MODE_ACTIVE) && - (cooling_mode != TZ_COOLING_MODE_PASSIVE))) { + if (!tz || ((cooling_mode != TZ_COOLING_MODE_ACTIVE) && (cooling_mode != TZ_COOLING_MODE_PASSIVE))) { return_ACPI_STATUS(AE_BAD_PARAMETER); } @@ -193,204 +175,143 @@ * Build the argument list, which simply consists of the current * cooling preference. */ - MEMSET(&arg_list, 0, sizeof(acpi_object)); + memset(&arg_list, 0, sizeof(acpi_object)); arg_list.count = 1; arg_list.pointer = &arg0; - MEMSET(&arg0, 0, sizeof(acpi_object)); + memset(&arg0, 0, sizeof(acpi_object)); arg0.type = ACPI_TYPE_INTEGER; arg0.integer.value = cooling_mode; /* * Evaluate "_SCP" - setting the new cooling preference. */ - status = acpi_evaluate_object(thermal_zone->acpi_handle, "_SCP", - &arg_list, NULL); + status = acpi_evaluate_object(tz->acpi_handle, "_SCP", &arg_list, NULL); + if (ACPI_FAILURE(status)) { + tz->policy.cooling_mode = -1; + return_ACPI_STATUS(status); + } + + tz->policy.cooling_mode = cooling_mode; return_ACPI_STATUS(status); } -/*************************************************************************** - * - * FUNCTION: tz_get_single_threshold - * - * PARAMETERS: - * - * RETURN: +/**************************************************************************** * - * DESCRIPTION: + * FUNCTION: tz_get_thresholds * ****************************************************************************/ acpi_status -tz_get_single_threshold ( - TZ_CONTEXT *thermal_zone, - TZ_THRESHOLD *threshold) +tz_get_thresholds ( + TZ_CONTEXT *tz) { - acpi_status status = AE_OK; + acpi_status status = AE_OK; + TZ_THRESHOLDS *thresholds = NULL; + u32 value = 0; + u32 i = 0; - FUNCTION_TRACE("tz_get_single_threshold"); + FUNCTION_TRACE("acpi_tz_get_thresholds"); - if (!thermal_zone || !threshold) { + if (!tz) { return_ACPI_STATUS(AE_BAD_PARAMETER); } - switch (threshold->type) { + thresholds = &(tz->policy.thresholds); - /* - * Critical Threshold: - * ------------------- - */ - case TZ_THRESHOLD_CRITICAL: - threshold->index = 0; - threshold->cooling_devices.count = 0; - status = bm_evaluate_simple_integer( - thermal_zone->acpi_handle, "_CRT", - &(threshold->temperature)); - break; - - /* - * Passive Threshold: - * ------------------ - * Evaluate _PSV to get the threshold temperature and _PSL to get - * references to all passive cooling devices. - */ - case TZ_THRESHOLD_PASSIVE: - threshold->index = 0; - threshold->cooling_devices.count = 0; - status = bm_evaluate_simple_integer( - thermal_zone->acpi_handle, "_PSV", - &(threshold->temperature)); - if (ACPI_SUCCESS(status)) { - status = bm_evaluate_reference_list( - thermal_zone->acpi_handle, "_PSL", - &(threshold->cooling_devices)); - } + /* Critical Shutdown (required) */ - break; - - /* - * Active Thresholds: - * ------------------ - * Evaluate _ACx to get all threshold temperatures, and _ALx to get - * references to all passive cooling devices. - */ - case TZ_THRESHOLD_ACTIVE: - { - char object_name[5] = {'_','A', 'C', - ('0'+threshold->index),'\0'}; - status = bm_evaluate_simple_integer( - thermal_zone->acpi_handle, object_name, - &(threshold->temperature)); - if (ACPI_SUCCESS(status)) { - object_name[2] = 'L'; - status = bm_evaluate_reference_list( - thermal_zone->acpi_handle, - object_name, - &(threshold->cooling_devices)); - } - } - break; + status = bm_evaluate_simple_integer(tz->acpi_handle, "_CRT", &value); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No critical threshold\n")); + return_ACPI_STATUS(status); + } + else { + thresholds->critical.temperature = value; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found critical threshold [%d]\n", thresholds->critical.temperature)); - default: - status = AE_SUPPORT; - break; } - return_ACPI_STATUS(status); -} + /* Critical Sleep (optional) */ + status = bm_evaluate_simple_integer(tz->acpi_handle, "_HOT", &value); + if (ACPI_FAILURE(status)) { + thresholds->hot.is_valid = 0; + thresholds->hot.temperature = 0; + } + else { + thresholds->hot.is_valid = 1; + thresholds->hot.temperature = value; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found hot threshold [%d]\n", thresholds->hot.temperature)); + } -/**************************************************************************** - * - * FUNCTION: tz_get_thresholds - * - * PARAMETERS: thermal_zone - Identifies the thermal zone to parse. - * buffer - Output buffer. - * - * RETURN: acpi_status result code. - * - * DESCRIPTION: Builds a TZ_THRESHOLD_LIST structure containing information - * on all thresholds for a given thermal zone. - * - * NOTES: The current design limits the number of cooling devices - * per theshold to the value specified by BM_MAX_HANDLES. - * This simplifies parsing of thresholds by allowing a maximum - * threshold list size to be computed (and enforced) -- which - * allows all thresholds to be parsed in a single pass (since - * memory must be contiguous when returned in the acpi_buffer). - * - ****************************************************************************/ + /* Passive: Processors (optional) */ -acpi_status -tz_get_thresholds ( - TZ_CONTEXT *thermal_zone, - TZ_THRESHOLD_LIST *threshold_list) -{ - acpi_status status = AE_OK; - TZ_THRESHOLD *threshold = NULL; - u32 i = 0; + status = bm_evaluate_simple_integer(tz->acpi_handle, "_PSV", &value); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + thresholds->passive.temperature = 0; + } + else { + thresholds->passive.is_valid = 1; + thresholds->passive.temperature = value; - FUNCTION_TRACE("tz_get_thresholds"); + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TC1", &value); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + } + thresholds->passive.tc1 = value; - if (!thermal_zone || !threshold_list) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TC2", &value); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + } + thresholds->passive.tc2 = value; - threshold_list->count = 0; + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TSP", &value); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + } + thresholds->passive.tsp = value; - /* - * Critical threshold: - * ------------------- - * Every thermal zone must have one! - */ - threshold = &(threshold_list->thresholds[threshold_list->count]); - threshold->type = TZ_THRESHOLD_CRITICAL; + status = bm_evaluate_reference_list(tz->acpi_handle, "_PSL", &(thresholds->passive.devices)); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + } - status = tz_get_single_threshold(thermal_zone, threshold); - if (ACPI_SUCCESS(status)) { - (threshold_list->count)++; - } - else { - return_ACPI_STATUS(status); + if (thresholds->passive.is_valid) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found passive threshold [%d]\n", thresholds->passive.temperature)); + } + else { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid passive threshold\n")); + } } + /* Active: Fans, etc. (optional) */ - /* - * Passive threshold: - * ------------------ - */ - threshold = &(threshold_list->thresholds[threshold_list->count]); - threshold->type = TZ_THRESHOLD_PASSIVE; + for (i=0; icount)++; - } + char name[5] = {'_','A','C',('0'+i),'\0'}; - /* - * Active threshold: - * ----------------- - * Note that active thresholds are sorted by index (e.g. _AC0, - * _AC1, ...), and thus from highest (_AC0) to lowest (_AC9) - * temperature. - */ - for (i = 0; i < TZ_MAX_ACTIVE_THRESHOLDS; i++) { + status = bm_evaluate_simple_integer(tz->acpi_handle, name, &value); + if (ACPI_FAILURE(status)) { + thresholds->active[i].is_valid = 0; + thresholds->active[i].temperature = 0; + break; + } - threshold = &(threshold_list->thresholds[threshold_list->count]); - threshold->type = TZ_THRESHOLD_ACTIVE; - threshold->index = i; + thresholds->active[i].temperature = value; + name[2] = 'L'; - status = tz_get_single_threshold(thermal_zone, threshold); + status = bm_evaluate_reference_list(tz->acpi_handle, name, &(thresholds->active[i].devices)); if (ACPI_SUCCESS(status)) { - (threshold_list->count)++; + thresholds->active[i].is_valid = 1; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found active threshold [%d]:[%d]\n", i, thresholds->active[i].temperature)); } else { - threshold->type = TZ_THRESHOLD_UNKNOWN; - threshold->index = 0; - thermal_zone->policy.active.threshold_count = i; - break; + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid active threshold [%d]\n", i)); } } @@ -402,12 +323,6 @@ * * FUNCTION: tz_add_device * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -416,7 +331,7 @@ void **context) { acpi_status status = AE_OK; - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; BM_DEVICE *device = NULL; acpi_handle tmp_handle = NULL; static u32 zone_count = 0; @@ -441,50 +356,67 @@ /* * Allocate a new Thermal Zone device. */ - thermal_zone = acpi_os_callocate(sizeof(TZ_CONTEXT)); - if (!thermal_zone) { - return AE_NO_MEMORY; + tz = acpi_os_callocate(sizeof(TZ_CONTEXT)); + if (!tz) { + return_ACPI_STATUS(AE_NO_MEMORY); } - thermal_zone->device_handle = device->handle; - thermal_zone->acpi_handle = device->acpi_handle; + tz->device_handle = device->handle; + tz->acpi_handle = device->acpi_handle; /* TBD: How to manage 'uid' when zones are Pn_p? */ - sprintf(thermal_zone->uid, "%d", zone_count++); + sprintf(tz->uid, "%d", zone_count++); /* - * _TMP? - * ----- + * Temperature: + * ------------ + * Make sure we can read the zone's current temperature (_TMP). + * If we can't, there's no use in doing any policy (abort). */ - status = acpi_get_handle(thermal_zone->acpi_handle, "_TMP", - &tmp_handle); - if (ACPI_FAILURE(status)) { + status = tz_get_temperature(tz); + if (ACPI_FAILURE(status)) goto end; - } /* - * Initialize Policy: + * Polling Frequency: * ------------------ - * TBD: Move all thermal zone policy to user-mode daemon... + * If _TZP doesn't exist use the OS default polling frequency. */ - status = tz_policy_add_device(thermal_zone); + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TZP", &(tz->policy.polling_freq)); if (ACPI_FAILURE(status)) { - goto end; + tz->policy.polling_freq = TZP; } + status = AE_OK; - status = tz_osl_add_device(thermal_zone); - if (ACPI_FAILURE(status)) { + /* + * Cooling Preference: + * ------------------- + * Default to ACTIVE (noisy) cooling until policy decides otherwise. + * Note that _SCP is optional. + */ + tz_set_cooling_preference(tz, TZ_COOLING_MODE_ACTIVE); + + /* + * Start Policy: + * ------------- + * Thermal policy is included in the kernel (this driver) because + * of the critical role it plays in avoiding nuclear meltdown. =O + */ + status = tz_policy_add_device(tz); + if (ACPI_FAILURE(status)) goto end; - } - *context = thermal_zone; + status = tz_osl_add_device(tz); + if (ACPI_FAILURE(status)) + goto end; - tz_print(thermal_zone); + *context = tz; + + tz_print(tz); end: - if (ACPI_FAILURE(status)) { - acpi_os_free(thermal_zone); - } + if (ACPI_FAILURE(status)) + acpi_os_free(tz); return_ACPI_STATUS(status); } @@ -494,12 +426,6 @@ * * FUNCTION: tz_remove_device * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -507,7 +433,7 @@ void **context) { acpi_status status = AE_OK; - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; FUNCTION_TRACE("tz_remove_device"); @@ -515,23 +441,23 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - thermal_zone = (TZ_CONTEXT*)(*context); + tz = (TZ_CONTEXT*)(*context); - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing thermal zone [%02x].\n", thermal_zone->device_handle)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing thermal zone [%02x].\n", tz->device_handle)); - status = tz_osl_remove_device(thermal_zone); + status = tz_osl_remove_device(tz); /* * Remove Policy: * -------------- * TBD: Move all thermal zone policy to user-mode daemon... */ - status = tz_policy_remove_device(thermal_zone); + status = tz_policy_remove_device(tz); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } - acpi_os_free(thermal_zone); + acpi_os_free(tz); return_ACPI_STATUS(status); } @@ -545,12 +471,6 @@ * * FUNCTION: tz_initialize * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -562,8 +482,8 @@ FUNCTION_TRACE("tz_initialize"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Register driver for thermal zone devices. @@ -583,12 +503,6 @@ * * FUNCTION: tz_terminate * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -600,8 +514,8 @@ FUNCTION_TRACE("tz_terminate"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Unregister driver for thermal zone devices. @@ -621,13 +535,8 @@ * * FUNCTION: tz_notify * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ + acpi_status tz_notify ( BM_NOTIFY notify_type, @@ -635,7 +544,7 @@ void **context) { acpi_status status = AE_OK; - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; FUNCTION_TRACE("tz_notify"); @@ -643,7 +552,7 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - thermal_zone = (TZ_CONTEXT*)*context; + tz = (TZ_CONTEXT*)*context; switch (notify_type) { @@ -657,40 +566,29 @@ case TZ_NOTIFY_TEMPERATURE_CHANGE: ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Temperature (_TMP) change event detected.\n")); - /* -------------------------------------------- */ - /* TBD: Remove when policy moves to user-mode. */ tz_policy_check(*context); - /* -------------------------------------------- */ - status = tz_get_temperature(thermal_zone, - &(thermal_zone->policy.temperature)); + status = tz_get_temperature(tz); if (ACPI_SUCCESS(status)) { - status = tz_osl_generate_event(notify_type, - thermal_zone); + status = tz_osl_generate_event(notify_type, tz); } break; case TZ_NOTIFY_THRESHOLD_CHANGE: ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Threshold (_SCP) change event detected.\n")); - /* -------------------------------------------- */ - /* TBD: Remove when policy moves to user-mode. */ - status = tz_policy_remove_device(thermal_zone); + status = tz_policy_remove_device(tz); if (ACPI_SUCCESS(status)) { - status = tz_policy_add_device(thermal_zone); + status = tz_policy_add_device(tz); } - /* -------------------------------------------- */ - status = tz_osl_generate_event(notify_type, thermal_zone); + status = tz_osl_generate_event(notify_type, tz); break; case TZ_NOTIFY_DEVICE_LISTS_CHANGE: ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Device lists (_ALx, _PSL, _TZD) change event detected.\n")); - /* -------------------------------------------- */ - /* TBD: Remove when policy moves to user-mode. */ - status = tz_policy_remove_device(thermal_zone); + status = tz_policy_remove_device(tz); if (ACPI_SUCCESS(status)) { - status = tz_policy_add_device(thermal_zone); + status = tz_policy_add_device(tz); } - /* -------------------------------------------- */ - status = tz_osl_generate_event(notify_type, thermal_zone); + status = tz_osl_generate_event(notify_type, tz); break; default: @@ -706,12 +604,6 @@ * * FUNCTION: tz_request * - * PARAMETERS: - * - * RETURN: Exception code. - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -720,7 +612,7 @@ void *context) { acpi_status status = AE_OK; - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; FUNCTION_TRACE("tz_request"); @@ -731,7 +623,7 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - thermal_zone = (TZ_CONTEXT*)context; + tz = (TZ_CONTEXT*)context; /* * Handle request: diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/thermal/tz_osl.c linux/drivers/acpi/ospm/thermal/tz_osl.c --- v2.4.13/linux/drivers/acpi/ospm/thermal/tz_osl.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/acpi/ospm/thermal/tz_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tz_osl.c - * $Revision: 21 $ + * $Revision: 25 $ * *****************************************************************************/ @@ -35,7 +35,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - Thermal Zone Driver"); -MODULE_LICENSE("GPL"); int TZP = 0; MODULE_PARM(TZP, "i"); @@ -65,17 +64,64 @@ int *eof, void *context) { - TZ_CONTEXT *thermal_zone = NULL; + acpi_status status = AE_OK; + char name[5]; + acpi_buffer buffer = {sizeof(name), &name}; + TZ_CONTEXT *tz = NULL; + TZ_THRESHOLDS *thresholds = NULL; char *p = page; int len = 0; + u32 i,j; + u32 t = 0; - if (!context || (off != 0)) { + if (!context || (off != 0)) goto end; + + tz = (TZ_CONTEXT*)context; + + thresholds = &(tz->policy.thresholds); + + p += sprintf(p, "critical (S5): trip=%d\n", thresholds->critical.temperature); + + if (thresholds->hot.is_valid) + p += sprintf(p, "critical (S4): trip=%d\n", thresholds->hot.temperature); + + if (thresholds->passive.is_valid) { + p += sprintf(p, "passive: trip=%d tc1=%d tc2=%d tsp=%d devices=", thresholds->passive.temperature, thresholds->passive.tc1, thresholds->passive.tc2, thresholds->passive.tsp); + for (j=0; jpassive.devices.count; j++) + p += sprintf(p, "%08x%c", thresholds->passive.devices.handles[j], (j==thresholds->passive.devices.count-1)?'\n':','); } - thermal_zone = (TZ_CONTEXT*)context; + for (i=0; iactive[i].is_valid)) + break; + p += sprintf(p, "active[%d]: trip=%d devices=", i, thresholds->active[i].temperature); + for (j=0; jactive[i].devices.count; j++) + p += sprintf(p, "%08x%c", thresholds->active[i].devices.handles[j], (j==thresholds->passive.devices.count-1)?'\n':','); + } - p += sprintf(p, "\n"); + p += sprintf(p, "cooling mode: "); + switch (tz->policy.cooling_mode) { + case TZ_COOLING_MODE_ACTIVE: + p += sprintf(p, "active (noisy)\n"); + break; + case TZ_COOLING_MODE_PASSIVE: + p += sprintf(p, "passive (quiet)\n"); + break; + default: + p += sprintf(p, "unknown\n"); + break; + } + + p += sprintf(p, "polling: "); + switch (tz->policy.polling_freq) { + case 0: + p += sprintf(p, "disabled\n"); + break; + default: + p += sprintf(p, "%d dS\n", tz->policy.polling_freq); + break; + } end: len = (p - page); @@ -85,7 +131,49 @@ if (len>count) len = count; if (len<0) len = 0; - return(len); + return len; +} + + +/**************************************************************************** + * + * FUNCTION: tz_osl_proc_write_info + * + ****************************************************************************/ + +static int tz_osl_proc_write_info ( + struct file *file, + const char *buffer, + unsigned long count, + void *data) +{ + TZ_CONTEXT *tz = NULL; + u32 state = 0; + u32 size = 0; + + if (!buffer || (count==0) || !data) { + goto end; + } + + tz = (TZ_CONTEXT*)data; + + size = strlen(buffer); + if (size < 4) + goto end; + + /* Cooling preference: "scp=0" (active) or "scp=1" (passive) */ + if (0 == strncmp(buffer, "scp=", 4)) { + tz_set_cooling_preference(tz, (buffer[4] - '0')); + } + + /* Polling frequency: "tzp=X" (poll every X [0-9] seconds) */ + else if (0 == strncmp(buffer, "tzp=", 4)) { + tz->policy.polling_freq = (buffer[4] - '0') * 10; + tz_policy_check(tz); + } + +end: + return count; } @@ -104,7 +192,7 @@ int *eof, void *context) { - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; char *p = page; int len = 0; @@ -112,47 +200,27 @@ goto end; } - thermal_zone = (TZ_CONTEXT*)context; + tz = (TZ_CONTEXT*)context; - p += sprintf(p, "Temperature: %d (1/10th degrees Kelvin)\n", - thermal_zone->policy.temperature); + /* Temperature */ - p += sprintf(p, "State: "); - if (thermal_zone->policy.state & TZ_STATE_ACTIVE) { - p += sprintf(p, "active[%d] ", thermal_zone->policy.state & 0x07); - } - if (thermal_zone->policy.state & TZ_STATE_PASSIVE) { - p += sprintf(p, "passive "); - } - if (thermal_zone->policy.state & TZ_STATE_CRITICAL) { - p += sprintf(p, "critical "); - } - if (thermal_zone->policy.state == 0) { - p += sprintf(p, "ok "); - } - p += sprintf(p, "\n"); + tz_get_temperature(tz); - p += sprintf(p, "Cooling Mode: "); - switch (thermal_zone->policy.cooling_mode) { - case TZ_COOLING_MODE_ACTIVE: - p += sprintf(p, "active (noisy)\n"); - break; - case TZ_COOLING_MODE_PASSIVE: - p += sprintf(p, "passive (quiet)\n"); - break; - default: - p += sprintf(p, "unknown\n"); - break; - } + p += sprintf(p, "temperature: %d dK\n", tz->policy.temperature); - p += sprintf(p, "Polling Frequency: "); - switch (thermal_zone->policy.polling_freq) { - case 0: - p += sprintf(p, "n/a\n"); - break; - default: - p += sprintf(p, "%d (1/10th seconds)\n", thermal_zone->policy.polling_freq); - break; + p += sprintf(p, "state: "); + if (tz->policy.state == 0) + p += sprintf(p, "ok\n"); + else if (tz->policy.state & TZ_STATE_CRITICAL) + p += sprintf(p, "critical\n"); + else if (tz->policy.state & TZ_STATE_HOT) + p += sprintf(p, "hot\n"); + else { + if (tz->policy.state & TZ_STATE_ACTIVE) + p += sprintf(p, "active[%d] ", tz->policy.state & 0x07); + if (tz->policy.state & TZ_STATE_PASSIVE) + p += sprintf(p, "passive "); + p += sprintf(p, "\n"); } end: @@ -175,30 +243,33 @@ acpi_status tz_osl_add_device( - TZ_CONTEXT *thermal_zone) + TZ_CONTEXT *tz) { - struct proc_dir_entry *proc_entry = NULL, *proc; + struct proc_dir_entry *proc_entry = NULL; + struct proc_dir_entry *proc_child_entry = NULL; - if (!thermal_zone) { + if (!tz) { return(AE_BAD_PARAMETER); } - printk("Thermal Zone: found\n"); + printk("ACPI: Thermal Zone found\n"); - proc_entry = proc_mkdir(thermal_zone->uid, tz_proc_root); - if (!proc_entry) + proc_entry = proc_mkdir(tz->uid, tz_proc_root); + if (!proc_entry) return(AE_ERROR); - proc = create_proc_read_entry(TZ_PROC_STATUS, S_IFREG | S_IRUGO, - proc_entry, tz_osl_proc_read_status, (void*)thermal_zone); - if (!proc) + proc_child_entry = create_proc_read_entry(TZ_PROC_STATUS, S_IFREG | S_IRUGO, proc_entry, tz_osl_proc_read_status, (void*)tz); + if (!proc_child_entry) return(AE_ERROR); - proc = create_proc_read_entry(TZ_PROC_INFO, S_IFREG | S_IRUGO, - proc_entry, tz_osl_proc_read_info, (void*)thermal_zone); - if (!proc) + proc_child_entry = create_proc_entry(TZ_PROC_INFO, S_IFREG | 0644, proc_entry); + if (!proc_child_entry) return(AE_ERROR); + proc_child_entry->read_proc = tz_osl_proc_read_info; + proc_child_entry->write_proc = tz_osl_proc_write_info; + proc_child_entry->data = (void*)tz; + return(AE_OK); } @@ -211,21 +282,21 @@ acpi_status tz_osl_remove_device ( - TZ_CONTEXT *thermal_zone) + TZ_CONTEXT *tz) { char proc_entry[64]; - if (!thermal_zone) { + if (!tz) { return(AE_BAD_PARAMETER); } - sprintf(proc_entry, "%s/%s", thermal_zone->uid, TZ_PROC_INFO); + sprintf(proc_entry, "%s/%s", tz->uid, TZ_PROC_INFO); remove_proc_entry(proc_entry, tz_proc_root); - sprintf(proc_entry, "%s/%s", thermal_zone->uid, TZ_PROC_STATUS); + sprintf(proc_entry, "%s/%s", tz->uid, TZ_PROC_STATUS); remove_proc_entry(proc_entry, tz_proc_root); - sprintf(proc_entry, "%s", thermal_zone->uid); + sprintf(proc_entry, "%s", tz->uid); remove_proc_entry(proc_entry, tz_proc_root); return(AE_OK); @@ -241,26 +312,26 @@ acpi_status tz_osl_generate_event ( u32 event, - TZ_CONTEXT *thermal_zone) + TZ_CONTEXT *tz) { acpi_status status = AE_OK; - if (!thermal_zone) { + if (!tz) { return(AE_BAD_PARAMETER); } switch (event) { case TZ_NOTIFY_TEMPERATURE_CHANGE: - status = bm_osl_generate_event(thermal_zone->device_handle, - TZ_PROC_ROOT, thermal_zone->uid, event, - thermal_zone->policy.temperature); + status = bm_osl_generate_event(tz->device_handle, + TZ_PROC_ROOT, tz->uid, event, + tz->policy.temperature); break; case TZ_NOTIFY_THRESHOLD_CHANGE: case TZ_NOTIFY_DEVICE_LISTS_CHANGE: - status = bm_osl_generate_event(thermal_zone->device_handle, - TZ_PROC_ROOT, thermal_zone->uid, event, 0); + status = bm_osl_generate_event(tz->device_handle, + TZ_PROC_ROOT, tz->uid, event, 0); break; default: @@ -276,12 +347,6 @@ * * FUNCTION: tz_osl_init * - * PARAMETERS: - * - * RETURN: 0: Success - * - * DESCRIPTION: Module initialization. - * ****************************************************************************/ static int __init @@ -312,12 +377,6 @@ /**************************************************************************** * * FUNCTION: tz_osl_cleanup - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: Module cleanup. * ****************************************************************************/ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/thermal/tzpolicy.c linux/drivers/acpi/ospm/thermal/tzpolicy.c --- v2.4.13/linux/drivers/acpi/ospm/thermal/tzpolicy.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/thermal/tzpolicy.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /**************************************************************************** * * Module Name: tzpolicy.c - - * $Revision: 28 $ + * $Revision: 30 $ * ****************************************************************************/ @@ -24,13 +24,10 @@ */ /* - * TBD: 1. Move to user-space! - * 2. Support ACPI 2.0 items (e.g. _TZD, _HOT). - * 3. Support performance-limit control for non-processor devices + * TBD: 1. Support performance-limit control for non-processor devices * (those listed in _TZD, e.g. graphics). */ -/* TBD: Linux specific */ #include #include #include @@ -48,8 +45,6 @@ * Globals ****************************************************************************/ -extern int TZP; - void tz_policy_run ( unsigned long data); @@ -75,12 +70,10 @@ status = bm_request(&request); - if (ACPI_FAILURE(status)) { + if (ACPI_FAILURE(status)) return status; - } - else { + else return request.status; - } } @@ -102,14 +95,44 @@ { FUNCTION_TRACE("tz_policy_critical"); - if (!tz || !tz->policy.critical.threshold) { + if (!tz) { return_ACPI_STATUS(AE_BAD_PARAMETER); } - if (tz->policy.temperature >= - tz->policy.critical.threshold->temperature) { - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Critical threshold reached - shutting down system.\n")); - /* TBD: Need method for calling 'halt' - OSL function? */ + if (tz->policy.temperature >= tz->policy.thresholds.critical.temperature) { + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Critical (S5) threshold reached.\n")); + /* TBD: Need method for shutting down system. */ + } + + return_ACPI_STATUS(AE_OK); +} + + +/**************************************************************************** + * + * FUNCTION: tz_policy_hot + * + * PARAMETERS: + * + * RETURN: + * + * DESCRIPTION: + * + ****************************************************************************/ + +acpi_status +tz_policy_hot( + TZ_CONTEXT *tz) +{ + FUNCTION_TRACE("tz_policy_hot"); + + if (!tz || !tz->policy.thresholds.hot.is_valid) { + return_ACPI_STATUS(AE_BAD_PARAMETER); + } + + if (tz->policy.temperature >= tz->policy.thresholds.hot.temperature) { + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Critical (S4) threshold reached.\n")); + /* TBD: Need method for invoking OS-level critical suspend. */ } return_ACPI_STATUS(AE_OK); @@ -132,20 +155,20 @@ tz_policy_passive( TZ_CONTEXT *tz) { - TZ_PASSIVE_POLICY *passive = NULL; + TZ_PASSIVE_THRESHOLD *passive = NULL; static u32 last_temperature = 0; s32 trend = 0; u32 i = 0; FUNCTION_TRACE("tz_policy_passive"); - if (!tz || !tz->policy.passive.threshold) { + if (!tz || !tz->policy.thresholds.passive.is_valid) { return_ACPI_STATUS(AE_BAD_PARAMETER); } - passive = &(tz->policy.passive); + passive = &(tz->policy.thresholds.passive); - if (tz->policy.temperature >= passive->threshold->temperature) { + if (tz->policy.temperature >= passive->temperature) { /* * Thermal trend? * -------------- @@ -153,15 +176,8 @@ * Specification), calculate the current thermal trend * (a.k.a. performance delta). */ - trend = passive->tc1 * - (tz->policy.temperature - last_temperature) + - passive->tc2 * - (tz->policy.temperature - passive->threshold->temperature); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "trend[%d] = TC1[%d]*(temp[%d]-last[%d]) + TC2[%d]*(temp[%d]-passive[%d])\n", - trend, passive->tc1, tz->policy.temperature, - last_temperature, passive->tc2, tz->policy.temperature, - passive->threshold->temperature)); + trend = passive->tc1 * (tz->policy.temperature - last_temperature) + passive->tc2 * (tz->policy.temperature - passive->temperature); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "trend[%d] = TC1[%d]*(temp[%d]-last[%d]) + TC2[%d]*(temp[%d]-passive[%d])\n", trend, passive->tc1, tz->policy.temperature, last_temperature, passive->tc2, tz->policy.temperature, passive->temperature)); last_temperature = tz->policy.temperature; @@ -172,11 +188,8 @@ * cooling devices (processors). */ if (trend > 0) { - for (i=0; ithreshold->cooling_devices.count; i++) { - set_performance_limit( - passive->threshold->cooling_devices.handles[i], - PR_PERF_DEC); - } + for (i=0; idevices.count; i++) + set_performance_limit(passive->devices.handles[i], PR_PERF_DEC); } /* * Cooling Off? @@ -185,11 +198,8 @@ * cooling devices (processors). */ else if (trend < 0) { - for (i=0; ithreshold->cooling_devices.count; i++) { - set_performance_limit( - passive->threshold->cooling_devices.handles[i], - PR_PERF_INC); - } + for (i=0; idevices.count; i++) + set_performance_limit(passive->devices.handles[i], PR_PERF_INC); } } @@ -214,21 +224,20 @@ TZ_CONTEXT *tz) { acpi_status status = AE_OK; - TZ_THRESHOLD *active = NULL; + TZ_ACTIVE_THRESHOLD *active = NULL; u32 i,j = 0; FUNCTION_TRACE("tz_policy_active"); - if (!tz || !tz->policy.active.threshold) { + if (!tz || !tz->policy.thresholds.active[0].is_valid) { return_ACPI_STATUS(AE_BAD_PARAMETER); } - for (i = 0; i < TZ_MAX_ACTIVE_THRESHOLDS; i++) { + for (i=0; ipolicy.active.threshold[i]; - if (!active) { + active = &(tz->policy.thresholds.active[i]); + if (!active || !active->is_valid) break; - } /* * Above Threshold? @@ -236,24 +245,17 @@ * If not already enabled, turn ON all cooling devices * associated with this active threshold. */ - if ((tz->policy.temperature >= active->temperature) && - (active->cooling_state != TZ_COOLING_ENABLED)) { - - for (j = 0; j < active->cooling_devices.count; j++) { - - status = bm_set_device_power_state( - active->cooling_devices.handles[j], - ACPI_STATE_D0); - + if ((tz->policy.temperature >= active->temperature) && (active->cooling_state != TZ_COOLING_ENABLED)) { + for (j = 0; j < active->devices.count; j++) { + status = bm_set_device_power_state(active->devices.handles[j], ACPI_STATE_D0); if (ACPI_SUCCESS(status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Cooling device [%02x] now ON.\n", active->cooling_devices.handles[j])); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Cooling device [%02x] now ON.\n", active->devices.handles[j])); } else { - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to turn ON cooling device [%02x].\n", active->cooling_devices.handles[j])); + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to turn ON cooling device [%02x].\n", active->devices.handles[j])); } } - - active->cooling_state = TZ_COOLING_ENABLED; + active->cooling_state = TZ_COOLING_ENABLED; } /* * Below Threshold? @@ -265,21 +267,15 @@ * during the first pass. */ else if (active->cooling_state != TZ_COOLING_DISABLED) { - - for (j = 0; j < active->cooling_devices.count; j++) { - - status = bm_set_device_power_state( - active->cooling_devices.handles[j], - ACPI_STATE_D3); - + for (j = 0; j < active->devices.count; j++) { + status = bm_set_device_power_state(active->devices.handles[j], ACPI_STATE_D3); if (ACPI_SUCCESS(status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Cooling device [%02x] now OFF.\n", active->cooling_devices.handles[j])); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Cooling device [%02x] now OFF.\n", active->devices.handles[j])); } else { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Unable to turn OFF cooling device [%02x].\n", active->cooling_devices.handles[j])); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Unable to turn OFF cooling device [%02x].\n", active->devices.handles[j])); } } - active->cooling_state = TZ_COOLING_DISABLED; } } @@ -308,6 +304,8 @@ { acpi_status status = AE_OK; TZ_CONTEXT *tz = NULL; + TZ_POLICY *policy = NULL; + TZ_THRESHOLDS *thresholds = NULL; u32 previous_temperature = 0; u32 previous_state = 0; u32 active_index = 0; @@ -322,6 +320,8 @@ } tz = (TZ_CONTEXT*)context; + policy = &(tz->policy); + thresholds = &(tz->policy.thresholds); /* * Preserve Previous State: @@ -334,7 +334,7 @@ * Get Temperature: * ---------------- */ - status = tz_get_temperature(tz, &(tz->policy.temperature)); + status = tz_get_temperature(tz); if (ACPI_FAILURE(status)) { return_VOID; } @@ -343,32 +343,30 @@ * Calculate State: * ---------------- */ - tz->policy.state = TZ_STATE_OK; + policy->state = TZ_STATE_OK; /* Critical? */ - if ((tz->policy.critical.threshold) && - (tz->policy.temperature >= tz->policy.critical.threshold->temperature)) { - tz->policy.state |= TZ_STATE_CRITICAL; - } + if (policy->temperature >= thresholds->critical.temperature) + policy->state |= TZ_STATE_CRITICAL; + + /* Hot? */ + if ((thresholds->hot.is_valid) && (policy->temperature >= thresholds->hot.temperature)) + policy->state |= TZ_STATE_CRITICAL; /* Passive? */ - if ((tz->policy.passive.threshold) && - (tz->policy.temperature >= tz->policy.passive.threshold->temperature)) { - tz->policy.state |= TZ_STATE_PASSIVE; - } + if ((thresholds->passive.is_valid) && (policy->temperature >= thresholds->passive.temperature)) + policy->state |= TZ_STATE_PASSIVE; /* Active? */ - if (tz->policy.active.threshold[0]) { - for (i=0; ipolicy.active.threshold_count; i++) { - if ((tz->policy.active.threshold[i]) && - (tz->policy.temperature >= tz->policy.active.threshold[i]->temperature)) { - tz->policy.state |= TZ_STATE_ACTIVE; - if (tz->policy.active.threshold[i]->index > active_index) { - active_index = tz->policy.active.threshold[i]->index; - } + if (thresholds->active[0].is_valid) { + for (i=0; iactive[i].is_valid) && (policy->temperature >= thresholds->active[i].temperature)) { + policy->state |= TZ_STATE_ACTIVE; + if (i > active_index) + active_index = i; } } - tz->policy.state |= active_index; + policy->state |= active_index; } /* @@ -379,17 +377,14 @@ * out of' a policy state (e.g. to allow fans to be turned off); * thus we must preserve the previous state. */ - if (tz->policy.state & TZ_STATE_CRITICAL) { + if (policy->state & TZ_STATE_CRITICAL) tz_policy_critical(tz); - } - if ((tz->policy.state & TZ_STATE_PASSIVE) || - (previous_state & TZ_STATE_PASSIVE)) { + if (policy->state & TZ_STATE_HOT) + tz_policy_hot(tz); + if ((policy->state & TZ_STATE_PASSIVE) || (previous_state & TZ_STATE_PASSIVE)) tz_policy_passive(tz); - } - if ((tz->policy.state & TZ_STATE_ACTIVE) || - (previous_state & TZ_STATE_ACTIVE)) { + if ((policy->state & TZ_STATE_ACTIVE) || (previous_state & TZ_STATE_ACTIVE)) tz_policy_active(tz); - } /* * Calculate Sleep Time: @@ -400,42 +395,33 @@ * a thermal event occurs -- e.g. never poll). Note that _TSP * and _TZD values are given in 1/10th seconds. */ - if (tz->policy.state & TZ_STATE_PASSIVE) { - sleep_time = tz->policy.passive.tsp * 100; - } - else if (tz->policy.polling_freq > 0) { - sleep_time = tz->policy.polling_freq * 100; - } - else { + if (policy->state & TZ_STATE_PASSIVE) + sleep_time = thresholds->passive.tsp * 100; + else if (policy->polling_freq > 0) + sleep_time = policy->polling_freq * 100; + else sleep_time = WAIT_FOREVER; - } -#ifdef ACPI_DEBUG - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Thermal_zone[%02x]: temperature[%d] state[%08x]\n", tz->device_handle, tz->policy.temperature, tz->policy.state)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Thermal_zone[%02x]: temperature[%d] state[%08x]\n", tz->device_handle, policy->temperature, policy->state)); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Scheduling next poll in [%d]ms.\n", sleep_time)); -#endif /*ACPI_DEBUG*/ /* * Schedule Next Poll: * ------------------- */ if (sleep_time < WAIT_FOREVER) { - if (timer_pending(&(tz->policy.timer))) { - mod_timer(&(tz->policy.timer), - (HZ*sleep_time)/1000); - } + if (timer_pending(&(policy->timer))) + mod_timer(&(policy->timer), (HZ*sleep_time)/1000); else { - tz->policy.timer.data = (u32)tz; - tz->policy.timer.function = tz_policy_run; - tz->policy.timer.expires = - jiffies + (HZ*sleep_time)/1000; - add_timer(&(tz->policy.timer)); + policy->timer.data = (u32)tz; + policy->timer.function = tz_policy_run; + policy->timer.expires = jiffies + (HZ*sleep_time)/1000; + add_timer(&(policy->timer)); } } else { - if (timer_pending(&(tz->policy.timer))) { - del_timer(&(tz->policy.timer)); - } + if (timer_pending(&(policy->timer))) + del_timer(&(policy->timer)); } return_VOID; @@ -454,6 +440,7 @@ * ****************************************************************************/ + void tz_policy_run ( unsigned long data) @@ -472,8 +459,7 @@ * ----------------------------- * Note that all Linux kernel timers run at interrupt-level (ack!). */ - status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, - tz_policy_check, (void*)data); + status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, tz_policy_check, (void*)data); if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Error invoking thermal policy.\n")); } @@ -499,7 +485,7 @@ TZ_CONTEXT *tz) { acpi_status status = AE_OK; - TZ_THRESHOLD *threshold = NULL; + TZ_THRESHOLDS *thresholds = NULL; u32 i,j = 0; FUNCTION_TRACE("tz_policy_add_device"); @@ -511,36 +497,10 @@ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Adding policy for thermal zone [%02x].\n", tz->device_handle)); /* - * Temperature: - * ------------ - * Make sure we can read the zone's current temperature (_TMP). - * If we can't, there's no use in doing any policy (abort). - */ - status = tz_get_temperature(tz, &(tz->policy.temperature)); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Polling Frequency: - * ------------------ - * If a _TZP object doesn't exist, use the OS default polling - * frequency. - */ - status = bm_evaluate_simple_integer(tz->acpi_handle, "_TZP", - &(tz->policy.polling_freq)); - if (ACPI_FAILURE(status)) { - tz->policy.polling_freq = TZP; - } - status = AE_OK; - - /* * Get Thresholds: * --------------- - * Get all of the zone's thresholds, parse, and organize for - * later use. */ - status = tz_get_thresholds(tz, &(tz->policy.threshold_list)); + status = tz_get_thresholds(tz); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } @@ -549,70 +509,17 @@ * Initialize Policies: * -------------------- */ - for (i = 0; i < tz->policy.threshold_list.count; i++) { - - threshold = &(tz->policy.threshold_list.thresholds[i]); - - switch (threshold->type) { - - case TZ_THRESHOLD_CRITICAL: - tz->policy.critical.threshold = threshold; - break; - - case TZ_THRESHOLD_PASSIVE: - - /* - * Set thermal performance limit on all processors - * to max. - */ - for (j=0; jcooling_devices.count; j++) { - set_performance_limit( - threshold->cooling_devices.handles[j], - PR_PERF_MAX); - } - - /* - * Get passive cooling constants. - */ - status = bm_evaluate_simple_integer(tz->acpi_handle, - "_TC1", &(tz->policy.passive.tc1)); - if (ACPI_FAILURE(status)) { - break; - } - - status = bm_evaluate_simple_integer(tz->acpi_handle, - "_TC2", &(tz->policy.passive.tc2)); - if (ACPI_FAILURE(status)) { - break; - } - - status = bm_evaluate_simple_integer(tz->acpi_handle, - "_TSP", &(tz->policy.passive.tsp)); - if (ACPI_FAILURE(status)) { - break; - } - - tz->policy.passive.threshold = threshold; - - tz_policy_passive(tz); - - break; - - case TZ_THRESHOLD_ACTIVE: - tz->policy.active.threshold[threshold->index] = threshold; - tz_policy_active(tz); - break; - } - } - - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); + if (tz->policy.thresholds.passive.is_valid) { + for (i=0; ipolicy.thresholds.passive.devices.count; i++) + set_performance_limit(tz->policy.thresholds.passive.devices.handles[i], PR_PERF_MAX); + tz_policy_passive(tz); } + if (tz->policy.thresholds.active[0].is_valid) + tz_policy_active(tz); /* * Initialize Policy Timer: * ------------------------ - * TBD: Linux-specific - remove when policy moves to user-space. */ init_timer(&(tz->policy.timer)); @@ -623,7 +530,7 @@ */ tz_policy_check(tz); - return_ACPI_STATUS(status); + return_ACPI_STATUS(AE_OK); } @@ -656,19 +563,15 @@ /* * Delete the thermal zone policy timer entry, if exists. */ - if (timer_pending(&(tz->policy.timer))) { + if (timer_pending(&(tz->policy.timer))) del_timer(&(tz->policy.timer)); - } /* * Reset thermal performance limit on all processors back to max. */ - if (tz->policy.passive.threshold) { - for (i=0; ipolicy.passive.threshold->cooling_devices.count; i++) { - set_performance_limit( - tz->policy.passive.threshold->cooling_devices.handles[i], - PR_PERF_MAX); - } + if (tz->policy.thresholds.passive.is_valid) { + for (i=0; ipolicy.thresholds.passive.devices.count; i++) + set_performance_limit(tz->policy.thresholds.passive.devices.handles[i], PR_PERF_MAX); } return_ACPI_STATUS(AE_OK); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psargs.c linux/drivers/acpi/parser/psargs.c --- v2.4.13/linux/drivers/acpi/parser/psargs.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psargs.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psargs - Parse AML opcode arguments - * $Revision: 51 $ + * $Revision: 52 $ * *****************************************************************************/ @@ -391,11 +391,11 @@ name_op->node = method_node; acpi_ps_append_arg (arg, name_op); - if (!(acpi_operand_object *) method_node->object) { + if (!method_node->object) { return_VOID; } - *arg_count = ((acpi_operand_object *) method_node->object)->method.param_count; + *arg_count = (method_node->object)->method.param_count; } return_VOID; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psopcode.c linux/drivers/acpi/parser/psopcode.c --- v2.4.13/linux/drivers/acpi/parser/psopcode.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psopcode.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * - * Module Name: psopcode - Parser opcode information table - * $Revision: 41 $ + * Module Name: psopcode - Parser/Interpreter opcode information table + * $Revision: 49 $ * *****************************************************************************/ @@ -67,28 +67,11 @@ * into a 32-bit number and stored in the master opcode table at the end of this file. */ -#define ARGP_ZERO_OP ARG_NONE -#define ARGP_ONE_OP ARG_NONE + +#define ARGP_ACCESSFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_ACQUIRE_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_WORDDATA) +#define ARGP_ADD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_ALIAS_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_NAME) -#define ARGP_NAME_OP ARGP_LIST2 (ARGP_NAME, ARGP_DATAOBJ) -#define ARGP_BYTE_OP ARGP_LIST1 (ARGP_BYTEDATA) -#define ARGP_WORD_OP ARGP_LIST1 (ARGP_WORDDATA) -#define ARGP_DWORD_OP ARGP_LIST1 (ARGP_DWORDDATA) -#define ARGP_STRING_OP ARGP_LIST1 (ARGP_CHARLIST) -#define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA) -#define ARGP_SCOPE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_TERMLIST) -#define ARGP_BUFFER_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_BYTELIST) -#define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) -#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) -#define ARGP_METHOD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMLIST) -#define ARGP_LOCAL0 ARG_NONE -#define ARGP_LOCAL1 ARG_NONE -#define ARGP_LOCAL2 ARG_NONE -#define ARGP_LOCAL3 ARG_NONE -#define ARGP_LOCAL4 ARG_NONE -#define ARGP_LOCAL5 ARG_NONE -#define ARGP_LOCAL6 ARG_NONE -#define ARGP_LOCAL7 ARG_NONE #define ARGP_ARG0 ARG_NONE #define ARGP_ARG1 ARG_NONE #define ARGP_ARG2 ARG_NONE @@ -96,98 +79,116 @@ #define ARGP_ARG4 ARG_NONE #define ARGP_ARG5 ARG_NONE #define ARGP_ARG6 ARG_NONE -#define ARGP_STORE_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SUPERNAME) -#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_ADD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_SUBTRACT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_INCREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_DECREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_MULTIPLY_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_DIVIDE_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET, ARGP_TARGET) -#define ARGP_SHIFT_LEFT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_SHIFT_RIGHT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_BANK_FIELD_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_TERMARG, ARGP_BYTEDATA, ARGP_FIELDLIST) #define ARGP_BIT_AND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_BIT_NAND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_OR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_BIT_NOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_XOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_BIT_NOT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_FIND_SET_LEFT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_FIND_SET_RIGHT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_DEREF_OF_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_BIT_OR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_BIT_XOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_BREAK_OP ARG_NONE +#define ARGP_BREAK_POINT_OP ARG_NONE +#define ARGP_BUFFER_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_BYTELIST) +#define ARGP_BYTE_OP ARGP_LIST1 (ARGP_BYTEDATA) +#define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_MOD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) -#define ARGP_SIZE_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_INDEX_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_MATCH_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_CREATE_DWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_CREATE_WORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_CREATE_BYTE_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) +#define ARGP_CONTINUE_OP ARG_NONE +#define ARGP_COPY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SIMPLENAME) #define ARGP_CREATE_BIT_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_CREATE_BYTE_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_CREATE_DWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_CREATE_FIELD_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) #define ARGP_CREATE_QWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_CREATE_WORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_DATA_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_DEBUG_OP ARG_NONE +#define ARGP_DECREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_DEREF_OF_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_DEVICE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) +#define ARGP_DIVIDE_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET, ARGP_TARGET) +#define ARGP_DWORD_OP ARGP_LIST1 (ARGP_DWORDDATA) +#define ARGP_ELSE_OP ARGP_LIST2 (ARGP_PKGLENGTH, ARGP_TERMLIST) +#define ARGP_EVENT_OP ARGP_LIST1 (ARGP_NAME) +#define ARGP_FATAL_OP ARGP_LIST3 (ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_TERMARG) +#define ARGP_FIELD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_FIELDLIST) +#define ARGP_FIND_SET_LEFT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_FIND_SET_RIGHT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_FROM_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_IF_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) +#define ARGP_INCREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_INDEX_FIELD_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_BYTEDATA, ARGP_FIELDLIST) +#define ARGP_INDEX_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_LAND_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LOR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LNOT_OP ARGP_LIST1 (ARGP_TERMARG) #define ARGP_LEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) #define ARGP_LGREATER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_LGREATEREQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) #define ARGP_LLESS_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_TO_BUFFER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_DEC_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_COPY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SIMPLENAME) +#define ARGP_LLESSEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_LNOT_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_LNOTEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_LOAD_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_SUPERNAME) +#define ARGP_LOAD_TABLE_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_LOCAL0 ARG_NONE +#define ARGP_LOCAL1 ARG_NONE +#define ARGP_LOCAL2 ARG_NONE +#define ARGP_LOCAL3 ARG_NONE +#define ARGP_LOCAL4 ARG_NONE +#define ARGP_LOCAL5 ARG_NONE +#define ARGP_LOCAL6 ARG_NONE +#define ARGP_LOCAL7 ARG_NONE +#define ARGP_LOR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_MATCH_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_METHOD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMLIST) +#define ARGP_METHODCALL_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_MID_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_CONTINUE_OP ARG_NONE -#define ARGP_IF_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) -#define ARGP_ELSE_OP ARGP_LIST2 (ARGP_PKGLENGTH, ARGP_TERMLIST) -#define ARGP_WHILE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) +#define ARGP_MOD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_MULTIPLY_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_MUTEX_OP ARGP_LIST2 (ARGP_NAME, ARGP_BYTEDATA) +#define ARGP_NAME_OP ARGP_LIST2 (ARGP_NAME, ARGP_DATAOBJ) +#define ARGP_NAMEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_NOOP_OP ARG_NONE -#define ARGP_RETURN_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_BREAK_OP ARG_NONE -#define ARGP_BREAK_POINT_OP ARG_NONE +#define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) +#define ARGP_ONE_OP ARG_NONE #define ARGP_ONES_OP ARG_NONE -#define ARGP_MUTEX_OP ARGP_LIST2 (ARGP_NAME, ARGP_BYTEDATA) -#define ARGP_EVENT_OP ARGP_LIST1 (ARGP_NAME) -#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) -#define ARGP_CREATE_FIELD_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_LOAD_TABLE_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LOAD_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_SUPERNAME) -#define ARGP_STALL_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_SLEEP_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_ACQUIRE_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_WORDDATA) -#define ARGP_SIGNAL_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) -#define ARGP_RESET_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_FROM_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_REVISION_OP ARG_NONE -#define ARGP_DEBUG_OP ARG_NONE -#define ARGP_FATAL_OP ARGP_LIST3 (ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_TERMARG) -#define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_FIELD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_FIELDLIST) -#define ARGP_DEVICE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) -#define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST) +#define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) #define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST) -#define ARGP_THERMAL_ZONE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) -#define ARGP_INDEX_FIELD_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_BYTEDATA, ARGP_FIELDLIST) -#define ARGP_BANK_FIELD_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_TERMARG, ARGP_BYTEDATA, ARGP_FIELDLIST) -#define ARGP_DATA_REGION_OP ARGP_LIST4 (ARGP_NAMESTRING, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LNOTEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LLESSEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LGREATEREQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_METHODCALL_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST) +#define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA) +#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME) #define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_NAMEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_ACCESSFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_RESET_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_RETURN_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_REVISION_OP ARG_NONE +#define ARGP_SCOPE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_TERMLIST) +#define ARGP_SHIFT_LEFT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_SHIFT_RIGHT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_SIGNAL_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_SIZE_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_SLEEP_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_STALL_OP ARGP_LIST1 (ARGP_TERMARG) #define ARGP_STATICSTRING_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_STORE_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SUPERNAME) +#define ARGP_STRING_OP ARGP_LIST1 (ARGP_CHARLIST) +#define ARGP_SUBTRACT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_THERMAL_ZONE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) +#define ARGP_TO_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_BUFFER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_DEC_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) +#define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) +#define ARGP_WHILE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) +#define ARGP_WORD_OP ARGP_LIST1 (ARGP_WORDDATA) +#define ARGP_ZERO_OP ARG_NONE /* @@ -197,28 +198,11 @@ * (Used by Prep_operands procedure and the ASL Compiler) */ -#define ARGI_ZERO_OP ARG_NONE -#define ARGI_ONE_OP ARG_NONE + +#define ARGI_ACCESSFIELD_OP ARGI_INVALID_OPCODE +#define ARGI_ACQUIRE_OP ARGI_LIST2 (ARGI_MUTEX, ARGI_INTEGER) +#define ARGI_ADD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_ALIAS_OP ARGI_INVALID_OPCODE -#define ARGI_NAME_OP ARGI_INVALID_OPCODE -#define ARGI_BYTE_OP ARGI_INVALID_OPCODE -#define ARGI_WORD_OP ARGI_INVALID_OPCODE -#define ARGI_DWORD_OP ARGI_INVALID_OPCODE -#define ARGI_STRING_OP ARGI_INVALID_OPCODE -#define ARGI_QWORD_OP ARGI_INVALID_OPCODE -#define ARGI_SCOPE_OP ARGI_INVALID_OPCODE -#define ARGI_BUFFER_OP ARGI_INVALID_OPCODE -#define ARGI_PACKAGE_OP ARGI_INVALID_OPCODE -#define ARGI_VAR_PACKAGE_OP ARGI_INVALID_OPCODE -#define ARGI_METHOD_OP ARGI_INVALID_OPCODE -#define ARGI_LOCAL0 ARG_NONE -#define ARGI_LOCAL1 ARG_NONE -#define ARGI_LOCAL2 ARG_NONE -#define ARGI_LOCAL3 ARG_NONE -#define ARGI_LOCAL4 ARG_NONE -#define ARGI_LOCAL5 ARG_NONE -#define ARGI_LOCAL6 ARG_NONE -#define ARGI_LOCAL7 ARG_NONE #define ARGI_ARG0 ARG_NONE #define ARGI_ARG1 ARG_NONE #define ARGI_ARG2 ARG_NONE @@ -226,98 +210,116 @@ #define ARGI_ARG4 ARG_NONE #define ARGI_ARG5 ARG_NONE #define ARGI_ARG6 ARG_NONE -#define ARGI_STORE_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_TARGETREF) -#define ARGI_REF_OF_OP ARGI_LIST1 (ARGI_OBJECT_REF) -#define ARGI_ADD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF) -#define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_INCREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) -#define ARGI_DECREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) -#define ARGI_MULTIPLY_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_DIVIDE_OP ARGI_LIST4 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF, ARGI_TARGETREF) -#define ARGI_SHIFT_LEFT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_SHIFT_RIGHT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_BANK_FIELD_OP ARGI_INVALID_OPCODE #define ARGI_BIT_AND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_BIT_NAND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_OR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_BIT_NOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_XOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_BIT_NOT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_FIND_SET_LEFT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_FIND_SET_RIGHT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_DEREF_OF_OP ARGI_LIST1 (ARGI_REFERENCE) +#define ARGI_BIT_OR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_BIT_XOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_BREAK_OP ARG_NONE +#define ARGI_BREAK_POINT_OP ARG_NONE +#define ARGI_BUFFER_OP ARGI_INVALID_OPCODE +#define ARGI_BYTE_OP ARGI_INVALID_OPCODE +#define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE +#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF) #define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF) -#define ARGI_MOD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER) -#define ARGI_SIZE_OF_OP ARGI_LIST1 (ARGI_DATAOBJECT) -#define ARGI_INDEX_OP ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_MATCH_OP ARGI_LIST6 (ARGI_PACKAGE, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_CREATE_DWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_CREATE_WORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_CREATE_BYTE_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF) +#define ARGI_CONTINUE_OP ARGI_INVALID_OPCODE +#define ARGI_COPY_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_SIMPLE_TARGET) #define ARGI_CREATE_BIT_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE) +#define ARGI_CREATE_BYTE_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_CREATE_DWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_CREATE_FIELD_OP ARGI_LIST4 (ARGI_BUFFER, ARGI_INTEGER, ARGI_INTEGER, ARGI_REFERENCE) #define ARGI_CREATE_QWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_CREATE_WORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING) +#define ARGI_DEBUG_OP ARG_NONE +#define ARGI_DECREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) +#define ARGI_DEREF_OF_OP ARGI_LIST1 (ARGI_REFERENCE) +#define ARGI_DEVICE_OP ARGI_INVALID_OPCODE +#define ARGI_DIVIDE_OP ARGI_LIST4 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF, ARGI_TARGETREF) +#define ARGI_DWORD_OP ARGI_INVALID_OPCODE +#define ARGI_ELSE_OP ARGI_INVALID_OPCODE +#define ARGI_EVENT_OP ARGI_INVALID_OPCODE +#define ARGI_FATAL_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_FIELD_OP ARGI_INVALID_OPCODE +#define ARGI_FIND_SET_LEFT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_FIND_SET_RIGHT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_FROM_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_IF_OP ARGI_INVALID_OPCODE +#define ARGI_INCREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) +#define ARGI_INDEX_FIELD_OP ARGI_INVALID_OPCODE +#define ARGI_INDEX_OP ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_LAND_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_LOR_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_LEQUAL_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) #define ARGI_LGREATER_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_LGREATEREQUAL_OP ARGI_INVALID_OPCODE #define ARGI_LLESS_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_TO_BUFFER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_DEC_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET) -#define ARGI_COPY_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_SIMPLE_TARGET) +#define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE +#define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER) +#define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE +#define ARGI_LOAD_OP ARGI_LIST2 (ARGI_REGION, ARGI_TARGETREF) +#define ARGI_LOAD_TABLE_OP ARGI_LIST6 (ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_TARGETREF) +#define ARGI_LOCAL0 ARG_NONE +#define ARGI_LOCAL1 ARG_NONE +#define ARGI_LOCAL2 ARG_NONE +#define ARGI_LOCAL3 ARG_NONE +#define ARGI_LOCAL4 ARG_NONE +#define ARGI_LOCAL5 ARG_NONE +#define ARGI_LOCAL6 ARG_NONE +#define ARGI_LOCAL7 ARG_NONE +#define ARGI_LOR_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_MATCH_OP ARGI_LIST6 (ARGI_PACKAGE, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_METHOD_OP ARGI_INVALID_OPCODE +#define ARGI_METHODCALL_OP ARGI_INVALID_OPCODE #define ARGI_MID_OP ARGI_LIST4 (ARGI_BUFFERSTRING,ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_CONTINUE_OP ARGI_INVALID_OPCODE -#define ARGI_IF_OP ARGI_INVALID_OPCODE -#define ARGI_ELSE_OP ARGI_INVALID_OPCODE -#define ARGI_WHILE_OP ARGI_INVALID_OPCODE +#define ARGI_MOD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_MULTIPLY_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_MUTEX_OP ARGI_INVALID_OPCODE +#define ARGI_NAME_OP ARGI_INVALID_OPCODE +#define ARGI_NAMEDFIELD_OP ARGI_INVALID_OPCODE +#define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE #define ARGI_NOOP_OP ARG_NONE -#define ARGI_RETURN_OP ARGI_INVALID_OPCODE -#define ARGI_BREAK_OP ARG_NONE -#define ARGI_BREAK_POINT_OP ARG_NONE +#define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER) +#define ARGI_ONE_OP ARG_NONE #define ARGI_ONES_OP ARG_NONE -#define ARGI_MUTEX_OP ARGI_INVALID_OPCODE -#define ARGI_EVENT_OP ARGI_INVALID_OPCODE -#define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF) -#define ARGI_CREATE_FIELD_OP ARGI_LIST4 (ARGI_BUFFER, ARGI_INTEGER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_LOAD_TABLE_OP ARGI_LIST6 (ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_TARGETREF) -#define ARGI_LOAD_OP ARGI_LIST2 (ARGI_REGION, ARGI_TARGETREF) -#define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER) -#define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER) -#define ARGI_ACQUIRE_OP ARGI_LIST2 (ARGI_MUTEX, ARGI_INTEGER) -#define ARGI_SIGNAL_OP ARGI_LIST1 (ARGI_EVENT) -#define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER) -#define ARGI_RESET_OP ARGI_LIST1 (ARGI_EVENT) -#define ARGI_RELEASE_OP ARGI_LIST1 (ARGI_MUTEX) -#define ARGI_FROM_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_TO_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET) -#define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE) -#define ARGI_REVISION_OP ARG_NONE -#define ARGI_DEBUG_OP ARG_NONE -#define ARGI_FATAL_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_REGION_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_FIELD_OP ARGI_INVALID_OPCODE -#define ARGI_DEVICE_OP ARGI_INVALID_OPCODE -#define ARGI_PROCESSOR_OP ARGI_INVALID_OPCODE +#define ARGI_PACKAGE_OP ARGI_INVALID_OPCODE #define ARGI_POWER_RES_OP ARGI_INVALID_OPCODE -#define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE -#define ARGI_INDEX_FIELD_OP ARGI_INVALID_OPCODE -#define ARGI_BANK_FIELD_OP ARGI_INVALID_OPCODE -#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING) -#define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_LGREATEREQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE -#define ARGI_METHODCALL_OP ARGI_INVALID_OPCODE -#define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE +#define ARGI_PROCESSOR_OP ARGI_INVALID_OPCODE +#define ARGI_QWORD_OP ARGI_INVALID_OPCODE +#define ARGI_REF_OF_OP ARGI_LIST1 (ARGI_OBJECT_REF) +#define ARGI_REGION_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_RELEASE_OP ARGI_LIST1 (ARGI_MUTEX) #define ARGI_RESERVEDFIELD_OP ARGI_INVALID_OPCODE -#define ARGI_NAMEDFIELD_OP ARGI_INVALID_OPCODE -#define ARGI_ACCESSFIELD_OP ARGI_INVALID_OPCODE +#define ARGI_RESET_OP ARGI_LIST1 (ARGI_EVENT) +#define ARGI_RETURN_OP ARGI_INVALID_OPCODE +#define ARGI_REVISION_OP ARG_NONE +#define ARGI_SCOPE_OP ARGI_INVALID_OPCODE +#define ARGI_SHIFT_LEFT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_SHIFT_RIGHT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_SIGNAL_OP ARGI_LIST1 (ARGI_EVENT) +#define ARGI_SIZE_OF_OP ARGI_LIST1 (ARGI_DATAOBJECT) +#define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER) +#define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_STATICSTRING_OP ARGI_INVALID_OPCODE +#define ARGI_STORE_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_TARGETREF) +#define ARGI_STRING_OP ARGI_INVALID_OPCODE +#define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE +#define ARGI_TO_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET) +#define ARGI_TO_BUFFER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) +#define ARGI_TO_DEC_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) +#define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) +#define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) +#define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET) +#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE) +#define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE) +#define ARGI_VAR_PACKAGE_OP ARGI_INVALID_OPCODE +#define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER) +#define ARGI_WHILE_OP ARGI_INVALID_OPCODE +#define ARGI_WORD_OP ARGI_INVALID_OPCODE +#define ARGI_ZERO_OP ARG_NONE /* @@ -447,143 +449,143 @@ static const acpi_opcode_info aml_op_info[] = { -/* Index Name Parser Args Interpreter Args Flags */ +/* Index Name Parser Args Interpreter Args Class Type Flags */ -/* 00 */ ACPI_OP ("Zero", ARGP_ZERO_OP, ARGI_ZERO_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), -/* 01 */ ACPI_OP ("One", ARGP_ONE_OP, ARGI_ONE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), -/* 02 */ ACPI_OP ("Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 03 */ ACPI_OP ("Name", ARGP_NAME_OP, ARGI_NAME_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 04 */ ACPI_OP ("Byte_const", ARGP_BYTE_OP, ARGI_BYTE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 05 */ ACPI_OP ("Word_const", ARGP_WORD_OP, ARGI_WORD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 06 */ ACPI_OP ("Dword_const", ARGP_DWORD_OP, ARGI_DWORD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 07 */ ACPI_OP ("String", ARGP_STRING_OP, ARGI_STRING_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 08 */ ACPI_OP ("Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 09 */ ACPI_OP ("Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM| AML_HAS_ARGS), -/* 0A */ ACPI_OP ("Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM| AML_HAS_ARGS), -/* 0B */ ACPI_OP ("Method", ARGP_METHOD_OP, ARGI_METHOD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED|AML_DEFER), -/* 0C */ ACPI_OP ("Local0", ARGP_LOCAL0, ARGI_LOCAL0, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 0D */ ACPI_OP ("Local1", ARGP_LOCAL1, ARGI_LOCAL1, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 0E */ ACPI_OP ("Local2", ARGP_LOCAL2, ARGI_LOCAL2, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 0F */ ACPI_OP ("Local3", ARGP_LOCAL3, ARGI_LOCAL3, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 10 */ ACPI_OP ("Local4", ARGP_LOCAL4, ARGI_LOCAL4, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 11 */ ACPI_OP ("Local5", ARGP_LOCAL5, ARGI_LOCAL5, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 12 */ ACPI_OP ("Local6", ARGP_LOCAL6, ARGI_LOCAL6, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 13 */ ACPI_OP ("Local7", ARGP_LOCAL7, ARGI_LOCAL7, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 14 */ ACPI_OP ("Arg0", ARGP_ARG0, ARGI_ARG0, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 15 */ ACPI_OP ("Arg1", ARGP_ARG1, ARGI_ARG1, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 16 */ ACPI_OP ("Arg2", ARGP_ARG2, ARGI_ARG2, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 17 */ ACPI_OP ("Arg3", ARGP_ARG3, ARGI_ARG3, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 18 */ ACPI_OP ("Arg4", ARGP_ARG4, ARGI_ARG4, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 19 */ ACPI_OP ("Arg5", ARGP_ARG5, ARGI_ARG5, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 1_a */ ACPI_OP ("Arg6", ARGP_ARG6, ARGI_ARG6, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 1_b */ ACPI_OP ("Store", ARGP_STORE_OP, ARGI_STORE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 1_c */ ACPI_OP ("Ref_of", ARGP_REF_OF_OP, ARGI_REF_OF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 1_d */ ACPI_OP ("Add", ARGP_ADD_OP, ARGI_ADD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 1_e */ ACPI_OP ("Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 1_f */ ACPI_OP ("Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 20 */ ACPI_OP ("Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 21 */ ACPI_OP ("Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 22 */ ACPI_OP ("Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 23 */ ACPI_OP ("Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 24 */ ACPI_OP ("Shift_left", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 25 */ ACPI_OP ("Shift_right", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 26 */ ACPI_OP ("And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 27 */ ACPI_OP ("NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 28 */ ACPI_OP ("Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 29 */ ACPI_OP ("NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 2_a */ ACPI_OP ("XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 2_b */ ACPI_OP ("Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 2_c */ ACPI_OP ("Find_set_left_bit", ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 2_d */ ACPI_OP ("Find_set_right_bit", ARGP_FIND_SET_RIGHT_BIT_OP,ARGI_FIND_SET_RIGHT_BIT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 2_e */ ACPI_OP ("Deref_of", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 2_f */ ACPI_OP ("Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC1| AML_HAS_ARGS), -/* 30 */ ACPI_OP ("Size_of", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 31 */ ACPI_OP ("Index", ARGP_INDEX_OP, ARGI_INDEX_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_TRIADIC| AML_HAS_ARGS), -/* 32 */ ACPI_OP ("Match", ARGP_MATCH_OP, ARGI_MATCH_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_HEXADIC| AML_HAS_ARGS), -/* 33 */ ACPI_OP ("Create_dWord_field", ARGP_CREATE_DWORD_FIELD_OP,ARGI_CREATE_DWORD_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 34 */ ACPI_OP ("Create_word_field", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 35 */ ACPI_OP ("Create_byte_field", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 36 */ ACPI_OP ("Create_bit_field", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 37 */ ACPI_OP ("Object_type", ARGP_TYPE_OP, ARGI_TYPE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 3_a */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 3_b */ ACPI_OP ("LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 3_c */ ACPI_OP ("LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 3_d */ ACPI_OP ("LLess", ARGP_LLESS_OP, ARGI_LLESS_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 3_e */ ACPI_OP ("If", ARGP_IF_OP, ARGI_IF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS), -/* 3_f */ ACPI_OP ("Else", ARGP_ELSE_OP, ARGI_ELSE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS), -/* 40 */ ACPI_OP ("While", ARGP_WHILE_OP, ARGI_WHILE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS), -/* 41 */ ACPI_OP ("Noop", ARGP_NOOP_OP, ARGI_NOOP_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS ), -/* 42 */ ACPI_OP ("Return", ARGP_RETURN_OP, ARGI_RETURN_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS), -/* 43 */ ACPI_OP ("Break", ARGP_BREAK_OP, ARGI_BREAK_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS ), -/* 44 */ ACPI_OP ("Break_point", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS ), -/* 45 */ ACPI_OP ("Ones", ARGP_ONES_OP, ARGI_ONES_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), +/* 00 */ ACPI_OP ("Zero", ARGP_ZERO_OP, ARGI_ZERO_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 01 */ ACPI_OP ("One", ARGP_ONE_OP, ARGI_ONE_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 02 */ ACPI_OP ("Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 03 */ ACPI_OP ("Name", ARGP_NAME_OP, ARGI_NAME_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 04 */ ACPI_OP ("Byte_const", ARGP_BYTE_OP, ARGI_BYTE_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 05 */ ACPI_OP ("Word_const", ARGP_WORD_OP, ARGI_WORD_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 06 */ ACPI_OP ("Dword_const", ARGP_DWORD_OP, ARGI_DWORD_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 07 */ ACPI_OP ("String", ARGP_STRING_OP, ARGI_STRING_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 08 */ ACPI_OP ("Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 09 */ ACPI_OP ("Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS), +/* 0A */ ACPI_OP ("Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS), +/* 0B */ ACPI_OP ("Method", ARGP_METHOD_OP, ARGI_METHOD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), +/* 0C */ ACPI_OP ("Local0", ARGP_LOCAL0, ARGI_LOCAL0, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0D */ ACPI_OP ("Local1", ARGP_LOCAL1, ARGI_LOCAL1, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0E */ ACPI_OP ("Local2", ARGP_LOCAL2, ARGI_LOCAL2, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0F */ ACPI_OP ("Local3", ARGP_LOCAL3, ARGI_LOCAL3, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 10 */ ACPI_OP ("Local4", ARGP_LOCAL4, ARGI_LOCAL4, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 11 */ ACPI_OP ("Local5", ARGP_LOCAL5, ARGI_LOCAL5, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 12 */ ACPI_OP ("Local6", ARGP_LOCAL6, ARGI_LOCAL6, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 13 */ ACPI_OP ("Local7", ARGP_LOCAL7, ARGI_LOCAL7, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 14 */ ACPI_OP ("Arg0", ARGP_ARG0, ARGI_ARG0, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 15 */ ACPI_OP ("Arg1", ARGP_ARG1, ARGI_ARG1, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 16 */ ACPI_OP ("Arg2", ARGP_ARG2, ARGI_ARG2, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 17 */ ACPI_OP ("Arg3", ARGP_ARG3, ARGI_ARG3, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 18 */ ACPI_OP ("Arg4", ARGP_ARG4, ARGI_ARG4, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 19 */ ACPI_OP ("Arg5", ARGP_ARG5, ARGI_ARG5, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 1_a */ ACPI_OP ("Arg6", ARGP_ARG6, ARGI_ARG6, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 1_b */ ACPI_OP ("Store", ARGP_STORE_OP, ARGI_STORE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 1_c */ ACPI_OP ("Ref_of", ARGP_REF_OF_OP, ARGI_REF_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 1_d */ ACPI_OP ("Add", ARGP_ADD_OP, ARGI_ADD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 1_e */ ACPI_OP ("Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 1_f */ ACPI_OP ("Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 20 */ ACPI_OP ("Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 21 */ ACPI_OP ("Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 22 */ ACPI_OP ("Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 23 */ ACPI_OP ("Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_2T_1R, AML_FLAGS_EXEC_2A_2T_1R), +/* 24 */ ACPI_OP ("Shift_left", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 25 */ ACPI_OP ("Shift_right", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 26 */ ACPI_OP ("And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 27 */ ACPI_OP ("NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 28 */ ACPI_OP ("Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 29 */ ACPI_OP ("NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 2_a */ ACPI_OP ("XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 2_b */ ACPI_OP ("Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 2_c */ ACPI_OP ("Find_set_left_bit", ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 2_d */ ACPI_OP ("Find_set_right_bit", ARGP_FIND_SET_RIGHT_BIT_OP,ARGI_FIND_SET_RIGHT_BIT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 2_e */ ACPI_OP ("Deref_of", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 2_f */ ACPI_OP ("Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_0R, AML_FLAGS_EXEC_2A_0T_0R), +/* 30 */ ACPI_OP ("Size_of", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 31 */ ACPI_OP ("Index", ARGP_INDEX_OP, ARGI_INDEX_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 32 */ ACPI_OP ("Match", ARGP_MATCH_OP, ARGI_MATCH_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R), +/* 33 */ ACPI_OP ("Create_dWord_field", ARGP_CREATE_DWORD_FIELD_OP,ARGI_CREATE_DWORD_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 34 */ ACPI_OP ("Create_word_field", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 35 */ ACPI_OP ("Create_byte_field", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 36 */ ACPI_OP ("Create_bit_field", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 37 */ ACPI_OP ("Object_type", ARGP_TYPE_OP, ARGI_TYPE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 3_a */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 3_b */ ACPI_OP ("LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 3_c */ ACPI_OP ("LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 3_d */ ACPI_OP ("LLess", ARGP_LLESS_OP, ARGI_LLESS_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 3_e */ ACPI_OP ("If", ARGP_IF_OP, ARGI_IF_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 3_f */ ACPI_OP ("Else", ARGP_ELSE_OP, ARGI_ELSE_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 40 */ ACPI_OP ("While", ARGP_WHILE_OP, ARGI_WHILE_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 41 */ ACPI_OP ("Noop", ARGP_NOOP_OP, ARGI_NOOP_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 42 */ ACPI_OP ("Return", ARGP_RETURN_OP, ARGI_RETURN_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 43 */ ACPI_OP ("Break", ARGP_BREAK_OP, ARGI_BREAK_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 44 */ ACPI_OP ("Break_point", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 45 */ ACPI_OP ("Ones", ARGP_ONES_OP, ARGI_ONES_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), /* Prefixed opcodes (Two-byte opcodes with a prefix op) */ -/* 46 */ ACPI_OP ("Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 47 */ ACPI_OP ("Event", ARGP_EVENT_OP, ARGI_EVENT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_NO_ARGS |AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED ), -/* 48 */ ACPI_OP ("Cond_ref_of", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 49 */ ACPI_OP ("Create_field", ARGP_CREATE_FIELD_OP, ARGI_CREATE_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_FIELD|AML_CREATE), -/* 4_a */ ACPI_OP ("Load", ARGP_LOAD_OP, ARGI_LOAD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_RECONFIGURATION| AML_HAS_ARGS), -/* 4_b */ ACPI_OP ("Stall", ARGP_STALL_OP, ARGI_STALL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 4_c */ ACPI_OP ("Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 4_d */ ACPI_OP ("Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_s| AML_HAS_ARGS), -/* 4_e */ ACPI_OP ("Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 4_f */ ACPI_OP ("Wait", ARGP_WAIT_OP, ARGI_WAIT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_s| AML_HAS_ARGS), -/* 50 */ ACPI_OP ("Reset", ARGP_RESET_OP, ARGI_RESET_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 51 */ ACPI_OP ("Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 52 */ ACPI_OP ("From_bCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 53 */ ACPI_OP ("To_bCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 54 */ ACPI_OP ("Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_RECONFIGURATION| AML_HAS_ARGS), -/* 55 */ ACPI_OP ("Revision", ARGP_REVISION_OP, ARGI_REVISION_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), -/* 56 */ ACPI_OP ("Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), -/* 57 */ ACPI_OP ("Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_TRIADIC| AML_HAS_ARGS), -/* 58 */ ACPI_OP ("Op_region", ARGP_REGION_OP, ARGI_REGION_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED|AML_DEFER), -/* 59 */ ACPI_OP ("Field", ARGP_FIELD_OP, ARGI_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_FIELD), -/* 5_a */ ACPI_OP ("Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 5_b */ ACPI_OP ("Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 5_c */ ACPI_OP ("Power_resource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 5_d */ ACPI_OP ("Thermal_zone", ARGP_THERMAL_ZONE_OP, ARGI_THERMAL_ZONE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 5_e */ ACPI_OP ("Index_field", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_FIELD), -/* 5_f */ ACPI_OP ("Bank_field", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_FIELD), +/* 46 */ ACPI_OP ("Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 47 */ ACPI_OP ("Event", ARGP_EVENT_OP, ARGI_EVENT_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), +/* 48 */ ACPI_OP ("Cond_ref_of", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 49 */ ACPI_OP ("Create_field", ARGP_CREATE_FIELD_OP, ARGI_CREATE_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_FIELD | AML_CREATE), +/* 4_a */ ACPI_OP ("Load", ARGP_LOAD_OP, ARGI_LOAD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_0R, AML_FLAGS_EXEC_1A_1T_0R), +/* 4_b */ ACPI_OP ("Stall", ARGP_STALL_OP, ARGI_STALL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4_c */ ACPI_OP ("Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4_d */ ACPI_OP ("Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), +/* 4_e */ ACPI_OP ("Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4_f */ ACPI_OP ("Wait", ARGP_WAIT_OP, ARGI_WAIT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), +/* 50 */ ACPI_OP ("Reset", ARGP_RESET_OP, ARGI_RESET_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 51 */ ACPI_OP ("Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 52 */ ACPI_OP ("From_bCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 53 */ ACPI_OP ("To_bCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 54 */ ACPI_OP ("Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 55 */ ACPI_OP ("Revision", ARGP_REVISION_OP, ARGI_REVISION_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 56 */ ACPI_OP ("Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 57 */ ACPI_OP ("Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_0T_0R, AML_FLAGS_EXEC_3A_0T_0R), +/* 58 */ ACPI_OP ("Op_region", ARGP_REGION_OP, ARGI_REGION_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), +/* 59 */ ACPI_OP ("Field", ARGP_FIELD_OP, ARGI_FIELD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 5_a */ ACPI_OP ("Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5_b */ ACPI_OP ("Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5_c */ ACPI_OP ("Power_resource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5_d */ ACPI_OP ("Thermal_zone", ARGP_THERMAL_ZONE_OP, ARGI_THERMAL_ZONE_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5_e */ ACPI_OP ("Index_field", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 5_f */ ACPI_OP ("Bank_field", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), /* Internal opcodes that map to invalid AML opcodes */ -/* 60 */ ACPI_OP ("LNot_equal", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 61 */ ACPI_OP ("LLess_equal", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 62 */ ACPI_OP ("LGreater_equal", ARGP_LGREATEREQUAL_OP, ARGI_LGREATEREQUAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 63 */ ACPI_OP ("[Name_path]", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS|AML_NSOBJECT|AML_NSNODE ), -/* 64 */ ACPI_OP ("[Method_call]", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_CALL| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE), -/* 65 */ ACPI_OP ("[Byte_list]", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 66 */ ACPI_OP ("[Reserved_field]", ARGP_RESERVEDFIELD_OP, ARGI_RESERVEDFIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS ), -/* 67 */ ACPI_OP ("[Named_field]", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED ), -/* 68 */ ACPI_OP ("[Access_field]", ARGP_ACCESSFIELD_OP, ARGI_ACCESSFIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS ), -/* 69 */ ACPI_OP ("[Static_string", ARGP_STATICSTRING_OP, ARGI_STATICSTRING_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS ), -/* 6_a */ ACPI_OP ("[Return Value]", ARG_NONE, ARG_NONE, ACPI_OP_TYPE_OPCODE | OPTYPE_RETURN| AML_HAS_ARGS), -/* 6_b */ ACPI_OP ("UNKNOWN_OP!", ARG_NONE, ARG_NONE, ACPI_OP_TYPE_UNKNOWN | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 6_c */ ACPI_OP ("ASCII_ONLY!", ARG_NONE, ARG_NONE, ACPI_OP_TYPE_ASCII | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 6_d */ ACPI_OP ("PREFIX_ONLY!", ARG_NONE, ARG_NONE, ACPI_OP_TYPE_PREFIX | OPTYPE_BOGUS| AML_HAS_ARGS), - - -/* ACPI 2.0 (new) opcodes */ - -/* 6_e */ ACPI_OP ("Qword_const", ARGP_QWORD_OP, ARGI_QWORD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 6_f */ ACPI_OP ("Var_package", ARGP_VAR_PACKAGE_OP, ARGI_VAR_PACKAGE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM| AML_HAS_ARGS|AML_DEFER), -/* 70 */ ACPI_OP ("Concat_res", ARGP_CONCAT_RES_OP, ARGI_CONCAT_RES_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 71 */ ACPI_OP ("Mod", ARGP_MOD_OP, ARGI_MOD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 72 */ ACPI_OP ("Create_qWord_field", ARGP_CREATE_QWORD_FIELD_OP,ARGI_CREATE_QWORD_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 73 */ ACPI_OP ("To_buffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 74 */ ACPI_OP ("To_decimal_string", ARGP_TO_DEC_STR_OP, ARGI_TO_DEC_STR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 75 */ ACPI_OP ("To_hex_string", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 76 */ ACPI_OP ("To_integer", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 77 */ ACPI_OP ("To_string", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 78 */ ACPI_OP ("Copy_object", ARGP_COPY_OP, ARGI_COPY_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 79 */ ACPI_OP ("Mid", ARGP_MID_OP, ARGI_MID_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 7_a */ ACPI_OP ("Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS ), -/* 7_b */ ACPI_OP ("Load_table", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 7_c */ ACPI_OP ("Data_op_region", ARGP_DATA_REGION_OP, ARGI_DATA_REGION_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), +/* 60 */ ACPI_OP ("LNot_equal", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 61 */ ACPI_OP ("LLess_equal", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 62 */ ACPI_OP ("LGreater_equal", ARGP_LGREATEREQUAL_OP, ARGI_LGREATEREQUAL_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 63 */ ACPI_OP ("[Name_path]", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_NSOBJECT | AML_NSNODE ), +/* 64 */ ACPI_OP ("[Method_call]", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP, AML_CLASS_METHOD_CALL, AML_TYPE_METHOD_CALL, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE), +/* 65 */ ACPI_OP ("[Byte_list]", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 66 */ ACPI_OP ("[Reserved_field]", ARGP_RESERVEDFIELD_OP, ARGI_RESERVEDFIELD_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 67 */ ACPI_OP ("[Named_field]", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), +/* 68 */ ACPI_OP ("[Access_field]", ARGP_ACCESSFIELD_OP, ARGI_ACCESSFIELD_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 69 */ ACPI_OP ("[Static_string", ARGP_STATICSTRING_OP, ARGI_STATICSTRING_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 6_a */ ACPI_OP ("[Return Value]", ARG_NONE, ARG_NONE, AML_CLASS_RETURN_VALUE, AML_TYPE_RETURN, AML_HAS_ARGS | AML_HAS_RETVAL), +/* 6_b */ ACPI_OP ("UNKNOWN_OP!", ARG_NONE, ARG_NONE, AML_CLASS_UNKNOWN, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 6_c */ ACPI_OP ("ASCII_ONLY!", ARG_NONE, ARG_NONE, AML_CLASS_ASCII, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 6_d */ ACPI_OP ("PREFIX_ONLY!", ARG_NONE, ARG_NONE, AML_CLASS_PREFIX, AML_TYPE_BOGUS, AML_HAS_ARGS), + + +/* ACPI 2.0 opcodes */ + +/* 6_e */ ACPI_OP ("Qword_const", ARGP_QWORD_OP, ARGI_QWORD_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 6_f */ ACPI_OP ("Var_package", ARGP_VAR_PACKAGE_OP, ARGI_VAR_PACKAGE_OP, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS | AML_DEFER), +/* 70 */ ACPI_OP ("Concat_res", ARGP_CONCAT_RES_OP, ARGI_CONCAT_RES_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 71 */ ACPI_OP ("Mod", ARGP_MOD_OP, ARGI_MOD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 72 */ ACPI_OP ("Create_qWord_field", ARGP_CREATE_QWORD_FIELD_OP,ARGI_CREATE_QWORD_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 73 */ ACPI_OP ("To_buffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 74 */ ACPI_OP ("To_decimal_string", ARGP_TO_DEC_STR_OP, ARGI_TO_DEC_STR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 75 */ ACPI_OP ("To_hex_string", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 76 */ ACPI_OP ("To_integer", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 77 */ ACPI_OP ("To_string", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 78 */ ACPI_OP ("Copy_object", ARGP_COPY_OP, ARGI_COPY_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 79 */ ACPI_OP ("Mid", ARGP_MID_OP, ARGI_MID_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_1T_1R, AML_FLAGS_EXEC_3A_1T_1R), +/* 7_a */ ACPI_OP ("Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 7_b */ ACPI_OP ("Load_table", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R), +/* 7_c */ ACPI_OP ("Data_op_region", ARGP_DATA_REGION_OP, ARGI_DATA_REGION_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), }; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psparse.c linux/drivers/acpi/parser/psparse.c --- v2.4.13/linux/drivers/acpi/parser/psparse.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psparse.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psparse - Parser top level AML parse routines - * $Revision: 96 $ + * $Revision: 104 $ * *****************************************************************************/ @@ -122,10 +122,8 @@ /* Extended opcode */ opcode = (u16) ((opcode << 8) | GET8 (aml)); - aml++; } - /* don't convert bare name to a namepath */ return (opcode); } @@ -133,45 +131,6 @@ /******************************************************************************* * - * FUNCTION: Acpi_ps_create_state - * - * PARAMETERS: Aml - Aml code pointer - * Aml_size - Length of AML code - * - * RETURN: A new parser state object - * - * DESCRIPTION: Create and initialize a new parser state object - * - ******************************************************************************/ - -acpi_parse_state * -acpi_ps_create_state ( - u8 *aml, - u32 aml_size) -{ - acpi_parse_state *parser_state; - - - FUNCTION_TRACE ("Ps_create_state"); - - - parser_state = ACPI_MEM_CALLOCATE (sizeof (acpi_parse_state)); - if (!parser_state) { - return_PTR (NULL); - } - - parser_state->aml = aml; - parser_state->aml_end = aml + aml_size; - parser_state->pkg_end = parser_state->aml_end; - parser_state->aml_start = aml; - - - return_PTR (parser_state); -} - - -/******************************************************************************* - * * FUNCTION: Acpi_ps_find_object * * PARAMETERS: Opcode - Current opcode @@ -192,29 +151,25 @@ acpi_status acpi_ps_find_object ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op) { NATIVE_CHAR *path; - const acpi_opcode_info *op_info; /* We are only interested in opcodes that have an associated name */ - op_info = acpi_ps_get_opcode_info (opcode); - if (!(op_info->flags & AML_NAMED)) { - *out_op = op; + if (!(walk_state->op_info->flags & AML_NAMED)) { + *out_op = walk_state->op; return (AE_OK); } /* Find the name in the parse tree */ - path = acpi_ps_get_next_namestring (walk_state->parser_state); + path = acpi_ps_get_next_namestring (&walk_state->parser_state); - *out_op = acpi_ps_find (acpi_ps_get_parent_scope (walk_state->parser_state), - path, opcode, 1); + *out_op = acpi_ps_find (acpi_ps_get_parent_scope (&walk_state->parser_state), + path, walk_state->opcode, 1); if (!(*out_op)) { return (AE_NOT_FOUND); @@ -247,28 +202,17 @@ #ifndef PARSER_ONLY acpi_parse_object *prev; acpi_parse_object *next; - const acpi_opcode_info *op_info; const acpi_opcode_info *parent_info; - u32 opcode_class; acpi_parse_object *replacement_op = NULL; FUNCTION_TRACE_PTR ("Ps_complete_this_op", op); - op_info = acpi_ps_get_opcode_info (op->opcode); - opcode_class = ACPI_GET_OP_CLASS (op_info); - - /* Delete this op and the subtree below it if asked to */ if (((walk_state->parse_flags & ACPI_PARSE_TREE_MASK) == ACPI_PARSE_DELETE_TREE) && - (opcode_class != OPTYPE_CONSTANT) && - (opcode_class != OPTYPE_LITERAL) && - (opcode_class != OPTYPE_LOCAL_VARIABLE) && - (opcode_class != OPTYPE_METHOD_ARGUMENT) && - (opcode_class != OPTYPE_DATA_TERM) && - (op->opcode != AML_INT_NAMEPATH_OP)) { + (walk_state->op_info->class != AML_CLASS_ARGUMENT)) { /* Make sure that we only delete this subtree */ if (op->parent) { @@ -278,11 +222,12 @@ */ parent_info = acpi_ps_get_opcode_info (op->parent->opcode); - switch (ACPI_GET_OP_CLASS (parent_info)) { - case OPTYPE_CONTROL: /* IF, ELSE, WHILE only */ + switch (parent_info->class) { + case AML_CLASS_CONTROL: /* IF, ELSE, WHILE only */ break; - case OPTYPE_NAMED_OBJECT: /* Scope, method, etc. */ + case AML_CLASS_NAMED_OBJECT: /* Scope, method, etc. */ + case AML_CLASS_CREATE: /* * These opcodes contain Term_arg operands. The current @@ -385,7 +330,7 @@ acpi_parse_object *op, acpi_status callback_status) { - acpi_parse_state *parser_state = walk_state->parser_state; + acpi_parse_state *parser_state = &walk_state->parser_state; acpi_status status = AE_CTRL_PENDING; u8 *start; u32 package_length; @@ -500,13 +445,7 @@ { acpi_status status = AE_OK; acpi_parse_object *op = NULL; /* current op */ - const acpi_opcode_info *op_info; acpi_parse_object *arg = NULL; - acpi_parse2_object *deferred_op; - u32 arg_count; /* push for fixed or var args */ - u32 arg_types = 0; - u32 aml_offset; - u16 opcode; acpi_parse_object pre_op; acpi_parse_state *parser_state; u8 *aml_op_start; @@ -515,7 +454,8 @@ FUNCTION_TRACE_PTR ("Ps_parse_loop", walk_state); - parser_state = walk_state->parser_state; + parser_state = &walk_state->parser_state; + walk_state->arg_types = 0; #ifndef PARSER_ONLY if (walk_state->walk_type & WALK_METHOD_RESTART) { @@ -527,7 +467,7 @@ * was just completed */ if ((parser_state->scope->parse_scope.op) && - ((parser_state->scope->parse_scope.op->opcode == AML_IF_OP) || + ((parser_state->scope->parse_scope.op->opcode == AML_IF_OP) || (parser_state->scope->parse_scope.op->opcode == AML_WHILE_OP)) && (walk_state->control_state) && (walk_state->control_state->common.state == @@ -537,7 +477,8 @@ * A predicate was just completed, get the value of the * predicate and branch based on that value */ - status = acpi_ds_get_predicate_value (walk_state, NULL, TRUE); + walk_state->op = NULL; + status = acpi_ds_get_predicate_value (walk_state, TRUE); if (ACPI_FAILURE (status) && ((status & AE_CODE_MASK) != AE_CODE_CONTROL)) { if (status == AE_AML_NO_RETURN_VALUE) { @@ -554,7 +495,7 @@ status = acpi_ps_next_parse_state (walk_state, op, status); } - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", op)); } @@ -562,7 +503,7 @@ /* We were in the middle of an op */ op = walk_state->prev_op; - arg_types = walk_state->prev_arg_types; + walk_state->arg_types = walk_state->prev_arg_types; } } #endif @@ -575,8 +516,8 @@ /* Get the next opcode from the AML stream */ aml_op_start = parser_state->aml; - aml_offset = parser_state->aml - parser_state->aml_start; - opcode = acpi_ps_peek_opcode (parser_state); + walk_state->aml_offset = parser_state->aml - parser_state->aml_start; + walk_state->opcode = acpi_ps_peek_opcode (parser_state); /* * First cut to determine what we have found: @@ -584,33 +525,25 @@ * 2) A name string * 3) An unknown/invalid opcode */ - op_info = acpi_ps_get_opcode_info (opcode); - switch (ACPI_GET_OP_TYPE (op_info)) { - case ACPI_OP_TYPE_OPCODE: - - /* Found opcode info, this is a normal opcode */ - - parser_state->aml += acpi_ps_get_opcode_size (opcode); - arg_types = op_info->parse_args; - break; - - case ACPI_OP_TYPE_ASCII: - case ACPI_OP_TYPE_PREFIX: + walk_state->op_info = acpi_ps_get_opcode_info (walk_state->opcode); + switch (walk_state->op_info->class) { + case AML_CLASS_ASCII: + case AML_CLASS_PREFIX: /* * Starts with a valid prefix or ASCII char, this is a name * string. Convert the bare name string to a namepath. */ - opcode = AML_INT_NAMEPATH_OP; - arg_types = ARGP_NAMESTRING; + walk_state->opcode = AML_INT_NAMEPATH_OP; + walk_state->arg_types = ARGP_NAMESTRING; break; - case ACPI_OP_TYPE_UNKNOWN: + case AML_CLASS_UNKNOWN: /* The opcode is unrecognized. Just skip unknown opcodes */ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Found unknown opcode %lX at AML offset %X, ignoring\n", - opcode, aml_offset)); + "Found unknown opcode %X at AML offset %X, ignoring\n", + walk_state->opcode, walk_state->aml_offset)); DUMP_BUFFER (parser_state->aml, 128); @@ -618,34 +551,54 @@ parser_state->aml++; continue; + + default: + + /* Found opcode info, this is a normal opcode */ + + parser_state->aml += acpi_ps_get_opcode_size (walk_state->opcode); + walk_state->arg_types = walk_state->op_info->parse_args; + break; + } /* Create Op structure and append to parent's argument list */ - if (op_info->flags & AML_NAMED) { + if (walk_state->op_info->flags & AML_NAMED) { pre_op.value.arg = NULL; - pre_op.opcode = opcode; + pre_op.opcode = walk_state->opcode; - while (GET_CURRENT_ARG_TYPE (arg_types) != ARGP_NAME) { + while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) != ARGP_NAME) { arg = acpi_ps_get_next_arg (parser_state, - GET_CURRENT_ARG_TYPE (arg_types), - &arg_count); + GET_CURRENT_ARG_TYPE (walk_state->arg_types), + &walk_state->arg_count); acpi_ps_append_arg (&pre_op, arg); - INCREMENT_ARG_LIST (arg_types); + INCREMENT_ARG_LIST (walk_state->arg_types); } /* We know that this arg is a name, move to next arg */ - INCREMENT_ARG_LIST (arg_types); + INCREMENT_ARG_LIST (walk_state->arg_types); if (walk_state->descending_callback != NULL) { /* * Find the object. This will either insert the object into * the namespace or simply look it up */ - status = walk_state->descending_callback (opcode, NULL, walk_state, &op); + walk_state->op = NULL; + + status = walk_state->descending_callback (walk_state, &op); + + /* TBD: check status here? */ + + if (ACPI_FAILURE (status)) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "During name lookup/catalog, %s\n", + acpi_format_exception (status))); + goto close_this_op; + } + if (op == NULL) { continue; } @@ -665,8 +618,6 @@ if (op->opcode == AML_REGION_OP) { - deferred_op = (acpi_parse2_object *) op; - /* * Defer final parsing of an Operation_region body, * because we don't have enough info in the first pass @@ -679,8 +630,8 @@ * * (Length is unknown until parse of the body complete) */ - deferred_op->data = aml_op_start; - deferred_op->length = 0; + ((acpi_parse2_object * ) op)->data = aml_op_start; + ((acpi_parse2_object * ) op)->length = 0; } } @@ -688,22 +639,20 @@ else { /* Not a named opcode, just allocate Op and append to parent */ - op_info = acpi_ps_get_opcode_info (opcode); - op = acpi_ps_alloc_op (opcode); + walk_state->op_info = acpi_ps_get_opcode_info (walk_state->opcode); + op = acpi_ps_alloc_op (walk_state->opcode); if (!op) { return_ACPI_STATUS (AE_NO_MEMORY); } - if (op_info->flags & AML_CREATE) { + if (walk_state->op_info->flags & AML_CREATE) { /* * Backup to beginning of Create_xXXfield declaration * Body_length is unknown until we parse the body */ - deferred_op = (acpi_parse2_object *) op; - - deferred_op->data = aml_op_start; - deferred_op->length = 0; + ((acpi_parse2_object * ) op)->data = aml_op_start; + ((acpi_parse2_object * ) op)->length = 0; } acpi_ps_append_arg (acpi_ps_get_parent_scope (parser_state), op); @@ -713,7 +662,9 @@ * Find the object. This will either insert the object into * the namespace or simply look it up */ - status = walk_state->descending_callback (opcode, op, walk_state, &op); + walk_state->op = op; + + status = walk_state->descending_callback (walk_state, &op); status = acpi_ps_next_parse_state (walk_state, op, status); if (status == AE_CTRL_PENDING) { status = AE_OK; @@ -726,11 +677,11 @@ } } - op->aml_offset = aml_offset; + op->aml_offset = walk_state->aml_offset; - if (op_info) { + if (walk_state->op_info) { ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, - "Op=%p Opcode=%4.4lX Aml %p Oft=%5.5lX\n", + "Op=%p Opcode=%4.4X Aml %p Oft=%5.5X\n", op, op->opcode, parser_state->aml, op->aml_offset)); } } @@ -738,10 +689,10 @@ /* Start Arg_count at zero because we don't know if there are any args yet */ - arg_count = 0; + walk_state->arg_count = 0; - if (arg_types) /* Are there any arguments that must be processed? */ { + if (walk_state->arg_types) /* Are there any arguments that must be processed? */ { /* get arguments */ switch (op->opcode) { @@ -754,13 +705,13 @@ /* fill in constant or string argument directly */ acpi_ps_get_next_simple_arg (parser_state, - GET_CURRENT_ARG_TYPE (arg_types), op); + GET_CURRENT_ARG_TYPE (walk_state->arg_types), op); break; case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */ - acpi_ps_get_next_namepath (parser_state, op, &arg_count, 1); - arg_types = 0; + acpi_ps_get_next_namepath (parser_state, op, &walk_state->arg_count, 1); + walk_state->arg_types = 0; break; @@ -768,32 +719,30 @@ /* Op is not a constant or string, append each argument */ - while (GET_CURRENT_ARG_TYPE (arg_types) && !arg_count) { - aml_offset = parser_state->aml - parser_state->aml_start; + while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) && !walk_state->arg_count) { + walk_state->aml_offset = parser_state->aml - parser_state->aml_start; arg = acpi_ps_get_next_arg (parser_state, - GET_CURRENT_ARG_TYPE (arg_types), - &arg_count); + GET_CURRENT_ARG_TYPE (walk_state->arg_types), + &walk_state->arg_count); if (arg) { - arg->aml_offset = aml_offset; + arg->aml_offset = walk_state->aml_offset; acpi_ps_append_arg (op, arg); } - INCREMENT_ARG_LIST (arg_types); + INCREMENT_ARG_LIST (walk_state->arg_types); } /* For a method, save the length and address of the body */ if (op->opcode == AML_METHOD_OP) { - deferred_op = (acpi_parse2_object *) op; - /* * Skip parsing of control method or opregion body, * because we don't have enough info in the first pass * to parse them correctly. */ - deferred_op->data = parser_state->aml; - deferred_op->length = (u32) (parser_state->pkg_end - + ((acpi_parse2_object * ) op)->data = parser_state->aml; + ((acpi_parse2_object * ) op)->length = (u32) (parser_state->pkg_end - parser_state->aml); /* @@ -802,7 +751,7 @@ * package (We don't know where the end is). */ parser_state->aml = parser_state->pkg_end; - arg_count = 0; + walk_state->arg_count = 0; } break; @@ -813,18 +762,16 @@ /* * Zero Arg_count means that all arguments for this op have been processed */ - if (!arg_count) { + if (!walk_state->arg_count) { /* completed Op, prepare for next */ - op_info = acpi_ps_get_opcode_info (op->opcode); - if (op_info->flags & AML_NAMED) { + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + if (walk_state->op_info->flags & AML_NAMED) { if (acpi_gbl_depth) { acpi_gbl_depth--; } if (op->opcode == AML_REGION_OP) { - deferred_op = (acpi_parse2_object *) op; - /* * Skip parsing of control method or opregion body, * because we don't have enough info in the first pass @@ -833,27 +780,29 @@ * Completed parsing an Op_region declaration, we now * know the length. */ - deferred_op->length = (u32) (parser_state->aml - - deferred_op->data); + ((acpi_parse2_object * ) op)->length = (u32) (parser_state->aml - + ((acpi_parse2_object * ) op)->data); } } - if (op_info->flags & AML_CREATE) { + if (walk_state->op_info->flags & AML_CREATE) { /* * Backup to beginning of Create_xXXfield declaration (1 for * Opcode) * * Body_length is unknown until we parse the body */ - deferred_op = (acpi_parse2_object *) op; - deferred_op->length = (u32) (parser_state->aml - - deferred_op->data); + ((acpi_parse2_object * ) op)->length = (u32) (parser_state->aml - + ((acpi_parse2_object * ) op)->data); } /* This op complete, notify the dispatcher */ if (walk_state->ascending_callback != NULL) { - status = walk_state->ascending_callback (walk_state, op); + walk_state->op = op; + walk_state->opcode = op->opcode; + + status = walk_state->ascending_callback (walk_state); status = acpi_ps_next_parse_state (walk_state, op, status); if (status == AE_CTRL_PENDING) { status = AE_OK; @@ -887,16 +836,20 @@ * We are about to transfer to a called method. */ walk_state->prev_op = op; - walk_state->prev_arg_types = arg_types; + walk_state->prev_arg_types = walk_state->arg_types; return_ACPI_STATUS (status); break; case AE_CTRL_END: - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); + + walk_state->op = op; + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + walk_state->opcode = op->opcode; - status = walk_state->ascending_callback (walk_state, op); + status = walk_state->ascending_callback (walk_state); status = acpi_ps_next_parse_state (walk_state, op, status); acpi_ps_complete_this_op (walk_state, op); @@ -915,7 +868,7 @@ acpi_ps_complete_this_op (walk_state, op); } - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); } while (op); return_ACPI_STATUS (status); @@ -925,10 +878,10 @@ default: /* All other non-AE_OK status */ if (op == NULL) { - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); } walk_state->prev_op = op; - walk_state->prev_arg_types = arg_types; + walk_state->prev_arg_types = walk_state->arg_types; /* * TEMP: @@ -941,7 +894,7 @@ /* This scope complete? */ if (acpi_ps_has_completed_scope (parser_state)) { - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", op)); } @@ -957,7 +910,7 @@ else { /* complex argument, push Op and prepare for argument */ - acpi_ps_push_scope (parser_state, op, arg_types, arg_count); + acpi_ps_push_scope (parser_state, op, walk_state->arg_types, walk_state->arg_count); op = NULL; } @@ -967,14 +920,18 @@ /* * Complete the last Op (if not completed), and clear the scope stack. * It is easily possible to end an AML "package" with an unbounded number - * of open scopes (such as when several AML blocks are closed with + * of open scopes (such as when several ASL blocks are closed with * sequential closing braces). We want to terminate each one cleanly. */ - ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Package complete at Op %p\n", op)); + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", op)); do { if (op) { if (walk_state->ascending_callback != NULL) { - status = walk_state->ascending_callback (walk_state, op); + walk_state->op = op; + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + walk_state->opcode = op->opcode; + + status = walk_state->ascending_callback (walk_state); status = acpi_ps_next_parse_state (walk_state, op, status); if (status == AE_CTRL_PENDING) { status = AE_OK; @@ -990,7 +947,7 @@ acpi_ps_complete_this_op (walk_state, op); } - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); } while (op); @@ -1006,7 +963,7 @@ acpi_ps_complete_this_op (walk_state, op); } - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); } while (op); @@ -1032,101 +989,34 @@ acpi_status acpi_ps_parse_aml ( - acpi_parse_object *start_scope, - u8 *aml, - u32 aml_size, - u32 parse_flags, - acpi_namespace_node *method_node, - acpi_operand_object **params, - acpi_operand_object **caller_return_desc, - acpi_parse_downwards descending_callback, - acpi_parse_upwards ascending_callback) + acpi_walk_state *walk_state) { acpi_status status; - acpi_parse_state *parser_state; - acpi_walk_state *walk_state; acpi_walk_list walk_list; acpi_walk_list *prev_walk_list = acpi_gbl_current_walk_list; - acpi_operand_object *return_desc; - acpi_operand_object *mth_desc = NULL; + acpi_walk_state *previous_walk_state; FUNCTION_TRACE ("Ps_parse_aml"); - ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Entered with Scope=%p Aml=%p size=%lX\n", - start_scope, aml, aml_size)); - + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Entered with Walk_state=%p Aml=%p size=%X\n", + walk_state, walk_state->parser_state.aml, walk_state->parser_state.aml_size)); - /* Create and initialize a new parser state */ - - parser_state = acpi_ps_create_state (aml, aml_size); - if (!parser_state) { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - acpi_ps_init_scope (parser_state, start_scope); - - if (method_node) { - mth_desc = acpi_ns_get_attached_object (method_node); - } /* Create and initialize a new walk list */ - walk_list.walk_state = NULL; + walk_list.walk_state = NULL; walk_list.acquired_mutex_list.prev = NULL; walk_list.acquired_mutex_list.next = NULL; - walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, parser_state->start_op, - mth_desc, &walk_list); - if (!walk_state) { - status = AE_NO_MEMORY; - goto cleanup; - } + walk_state->walk_list = &walk_list; + acpi_ds_push_walk_state (walk_state, &walk_list); - walk_state->method_node = method_node; - walk_state->parser_state = parser_state; - walk_state->parse_flags = parse_flags; - walk_state->descending_callback = descending_callback; - walk_state->ascending_callback = ascending_callback; /* TBD: [Restructure] TEMP until we pass Walk_state to the interpreter */ acpi_gbl_current_walk_list = &walk_list; - - if (method_node) { - parser_state->start_node = method_node; - walk_state->walk_type = WALK_METHOD; - - /* Push start scope on scope stack and make it current */ - - status = acpi_ds_scope_stack_push (method_node, ACPI_TYPE_METHOD, walk_state); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* Init arguments if this is a control method */ - /* TBD: [Restructure] add walkstate as a param */ - - acpi_ds_method_data_init_args (params, MTH_NUM_ARGS, walk_state); - } - - else { - /* Setup the current scope */ - - parser_state->start_node = parser_state->start_op->node; - if (parser_state->start_node) { - /* Push start scope on scope stack and make it current */ - - status = acpi_ds_scope_stack_push (parser_state->start_node, - parser_state->start_node->type, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - } - } - /* * Execute the walk loop as long as there is a valid Walk State. This * handles nested control method invocations without recursion. @@ -1136,6 +1026,10 @@ status = AE_OK; while (walk_state) { if (ACPI_SUCCESS (status)) { + /* + * The Parse_loop executes AML until the method terminates + * or calls another method. + */ status = acpi_ps_parse_loop (walk_state); } @@ -1165,13 +1059,6 @@ walk_state = acpi_ds_pop_walk_state (&walk_list); - /* Extract return value before we delete Walk_state */ - - return_desc = walk_state->return_desc; - - ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Return_value=%p, State=%p\n", - walk_state->return_desc, walk_state)); - /* Reset the current scope to the beginning of scope stack */ acpi_ds_scope_stack_clear (walk_state); @@ -1186,38 +1073,44 @@ /* Delete this walk state and all linked control states */ - acpi_ps_cleanup_scope (walk_state->parser_state); - ACPI_MEM_FREE (walk_state->parser_state); - acpi_ds_delete_walk_state (walk_state); + acpi_ps_cleanup_scope (&walk_state->parser_state); + + previous_walk_state = walk_state; + + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Return_value=%p, State=%p\n", + walk_state->return_desc, walk_state)); /* Check if we have restarted a preempted walk */ walk_state = acpi_ds_get_current_walk_state (&walk_list); - if (walk_state && - ACPI_SUCCESS (status)) { - /* There is another walk state, restart it */ + if (walk_state) { + if (ACPI_SUCCESS (status)) { + /* There is another walk state, restart it */ - /* - * If the method returned value is not used by the parent, - * The object is deleted - */ - acpi_ds_restart_control_method (walk_state, return_desc); - walk_state->walk_type |= WALK_METHOD_RESTART; + /* + * If the method returned value is not used by the parent, + * The object is deleted + */ + acpi_ds_restart_control_method (walk_state, previous_walk_state->return_desc); + walk_state->walk_type |= WALK_METHOD_RESTART; + } } /* * Just completed a 1st-level method, save the final internal return * value (if any) */ - else if (caller_return_desc) { - *caller_return_desc = return_desc; /* NULL if no return value */ + else if (previous_walk_state->caller_return_desc) { + *(previous_walk_state->caller_return_desc) = previous_walk_state->return_desc; /* NULL if no return value */ } - else if (return_desc) { + else if (previous_walk_state->return_desc) { /* Caller doesn't want it, must delete it */ - acpi_ut_remove_reference (return_desc); + acpi_ut_remove_reference (previous_walk_state->return_desc); } + + acpi_ds_delete_walk_state (previous_walk_state); } @@ -1225,20 +1118,6 @@ acpi_ex_release_all_mutexes ((acpi_operand_object *) &walk_list.acquired_mutex_list); acpi_gbl_current_walk_list = prev_walk_list; - return_ACPI_STATUS (status); - - -cleanup: - - /* Cleanup */ - - acpi_ds_delete_walk_state (walk_state); - acpi_ps_cleanup_scope (parser_state); - ACPI_MEM_FREE (parser_state); - - acpi_ex_release_all_mutexes ((acpi_operand_object *)&walk_list.acquired_mutex_list); - acpi_gbl_current_walk_list = prev_walk_list; - return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psscope.c linux/drivers/acpi/parser/psscope.c --- v2.4.13/linux/drivers/acpi/parser/psscope.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psscope.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psscope - Parser scope stack management routines - * $Revision: 29 $ + * $Revision: 30 $ * *****************************************************************************/ @@ -103,6 +103,7 @@ return_ACPI_STATUS (AE_NO_MEMORY); } + scope->common.data_type = ACPI_DESC_TYPE_STATE_RPSCOPE; scope->parse_scope.op = root_op; scope->parse_scope.arg_count = ACPI_VAR_ARGS; scope->parse_scope.arg_end = parser_state->aml_end; @@ -149,6 +150,7 @@ } + scope->common.data_type = ACPI_DESC_TYPE_STATE_PSCOPE; scope->parse_scope.op = op; scope->parse_scope.arg_list = remaining_args; scope->parse_scope.arg_count = arg_count; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/pstree.c linux/drivers/acpi/parser/pstree.c --- v2.4.13/linux/drivers/acpi/parser/pstree.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/pstree.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: pstree - Parser op tree manipulation/traversal/search - * $Revision: 32 $ + * $Revision: 35 $ * *****************************************************************************/ @@ -60,7 +60,7 @@ /* Get the info structure for this opcode */ op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { /* Invalid opcode or ASCII character */ return (NULL); @@ -68,7 +68,7 @@ /* Check if this opcode requires argument sub-objects */ - if (!(ACPI_GET_OP_ARGS (op_info))) { + if (!(op_info->flags & AML_HAS_ARGS)) { /* Has no linked argument objects */ return (NULL); @@ -118,15 +118,16 @@ /* Get the info structure for this opcode */ op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { /* Invalid opcode */ + REPORT_ERROR (("Ps_append_arg: Invalid AML Opcode: 0x%2.2X\n", op->opcode)); return; } /* Check if this opcode requires argument sub-objects */ - if (!(ACPI_GET_OP_ARGS (op_info))) { + if (!(op_info->flags & AML_HAS_ARGS)) { /* Has no linked argument objects */ return; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psutils.c linux/drivers/acpi/parser/psutils.c --- v2.4.13/linux/drivers/acpi/parser/psutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psutils - Parser miscellaneous utilities (Parser only) - * $Revision: 43 $ + * $Revision: 44 $ * *****************************************************************************/ @@ -34,8 +34,8 @@ #define PARSEOP_GENERIC 0x01 #define PARSEOP_NAMED 0x02 -#define PARSEOP_DEFERRED 0x03 -#define PARSEOP_BYTELIST 0x04 +#define PARSEOP_DEFERRED 0x04 +#define PARSEOP_BYTELIST 0x08 #define PARSEOP_IN_CACHE 0x80 diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/pswalk.c linux/drivers/acpi/parser/pswalk.c --- v2.4.13/linux/drivers/acpi/parser/pswalk.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/pswalk.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: pswalk - Parser routines to walk parsed op tree(s) - * $Revision: 56 $ + * $Revision: 58 $ * *****************************************************************************/ @@ -88,7 +88,11 @@ next = op->next; parent = op->parent; - status = ascending_callback (walk_state, op); + walk_state->op = op; + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + walk_state->opcode = op->opcode; + + status = ascending_callback (walk_state); /* * If we are back to the starting point, the walk is complete. @@ -144,7 +148,11 @@ grand_parent = parent->parent; next = parent->next; - status = ascending_callback (walk_state, parent); + walk_state->op = parent; + walk_state->op_info = acpi_ps_get_opcode_info (parent->opcode); + walk_state->opcode = parent->opcode; + + status = ascending_callback (walk_state); /* * If we are back to the starting point, the walk is complete. @@ -206,11 +214,10 @@ static acpi_status acpi_ps_delete_completed_op ( - acpi_walk_state *state, - acpi_parse_object *op) + acpi_walk_state *walk_state) { - acpi_ps_free_op (op); + acpi_ps_free_op (walk_state->op); return (AE_OK); } @@ -253,7 +260,6 @@ return_VOID; } - walk_state->parser_state = NULL; walk_state->parse_flags = 0; walk_state->descending_callback = NULL; walk_state->ascending_callback = NULL; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psxface.c linux/drivers/acpi/parser/psxface.c --- v2.4.13/linux/drivers/acpi/parser/psxface.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psxface - Parser external interfaces - * $Revision: 47 $ + * $Revision: 52 $ * *****************************************************************************/ @@ -64,6 +64,7 @@ acpi_operand_object *obj_desc; u32 i; acpi_parse_object *op; + acpi_walk_state *walk_state; FUNCTION_TRACE ("Psx_execute"); @@ -98,11 +99,11 @@ } /* - * Perform the first pass parse of the method to enter any + * 1) Perform the first pass parse of the method to enter any * named objects that it creates into the namespace */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "**** Begin Method Execution **** Entry=%p obj=%p\n", + "**** Begin Method Parse **** Entry=%p obj=%p\n", method_node, obj_desc)); /* Create and init a Root Node */ @@ -112,13 +113,34 @@ return_ACPI_STATUS (AE_NO_MEMORY); } - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - method_node, params, return_obj_desc, - acpi_ds_load1_begin_op, acpi_ds_load1_end_op); + /* Create and initialize a new walk state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start, + obj_desc->method.aml_length, NULL, NULL, 1); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + + /* Parse the AML */ + + status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (op); + + /* + * 2) Execute the method. Performs second pass parse simultaneously + */ + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "**** Begin Method Execution **** Entry=%p obj=%p\n", + method_node, obj_desc)); + /* Create and init a Root Node */ op = acpi_ps_alloc_op (AML_SCOPE_OP); @@ -126,20 +148,30 @@ return_ACPI_STATUS (AE_NO_MEMORY); } - /* Init new op with the method name and pointer back to the NS node */ acpi_ps_set_name (op, method_node->name); op->node = method_node; + /* Create and initialize a new walk state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start, + obj_desc->method.aml_length, params, return_obj_desc, 3); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + /* * The walk of the parse tree is where we actually execute the method */ - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE, - method_node, params, return_obj_desc, - acpi_ds_exec_begin_op, acpi_ds_exec_end_op); + status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (op); if (params) { @@ -151,12 +183,18 @@ } + if (ACPI_FAILURE (status)) { + DUMP_PATHNAME (method_node, "Ps_execute: method failed -", + ACPI_LV_ERROR, _COMPONENT); + } + + /* * If the method has returned an object, signal this to the caller with * a control exception code */ if (*return_obj_desc) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Method returned Obj_desc=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Method returned Obj_desc=%p\n", *return_obj_desc)); DUMP_STACK_ENTRY (*return_obj_desc); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/resources/rsutils.c linux/drivers/acpi/resources/rsutils.c --- v2.4.13/linux/drivers/acpi/resources/rsutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/resources/rsutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rsutils - Utilities for the resource manager - * $Revision: 22 $ + * $Revision: 23 $ * ******************************************************************************/ @@ -384,7 +384,6 @@ */ cleanup: - ACPI_MEM_FREE (byte_stream); return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/resources/rsxface.c linux/drivers/acpi/resources/rsxface.c --- v2.4.13/linux/drivers/acpi/resources/rsxface.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/resources/rsxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rsxface - Public interfaces to the resource manager - * $Revision: 14 $ + * $Revision: 15 $ * ******************************************************************************/ @@ -67,13 +67,6 @@ FUNCTION_TRACE ("Acpi_get_irq_routing_table "); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* * Must have a valid handle and buffer, So we have to have a handle * and a return buffer structure, and if there is a non-zero buffer length @@ -126,13 +119,6 @@ FUNCTION_TRACE ("Acpi_get_current_resources"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* * Must have a valid handle and buffer, So we have to have a handle * and a return buffer structure, and if there is a non-zero buffer length @@ -182,13 +168,6 @@ FUNCTION_TRACE ("Acpi_get_possible_resources"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* * Must have a valid handle and buffer, So we have to have a handle * and a return buffer structure, and if there is a non-zero buffer length @@ -234,13 +213,6 @@ FUNCTION_TRACE ("Acpi_set_current_resources"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } /* * Must have a valid handle and buffer diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbconvrt.c linux/drivers/acpi/tables/tbconvrt.c --- v2.4.13/linux/drivers/acpi/tables/tbconvrt.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbconvrt.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbconvrt - ACPI Table conversion utilities - * $Revision: 27 $ + * $Revision: 28 $ * *****************************************************************************/ @@ -66,7 +66,7 @@ else #endif { - pointer_size = sizeof (UINT64); + pointer_size = sizeof (u64); } /* @@ -109,7 +109,7 @@ /* Compute size of the converted XSDT */ - table_size = (*number_of_tables * sizeof (UINT64)) + sizeof (acpi_table_header); + table_size = (*number_of_tables * sizeof (u64)) + sizeof (acpi_table_header); /* Allocate an XSDT */ @@ -239,7 +239,7 @@ FADT2->sci_int = FADT71->sci_int; FADT2->acpi_enable = FADT71->acpi_enable; FADT2->acpi_disable = FADT71->acpi_disable; - FADT2->S4_bios_req = FADT71->S4_bios_req; + FADT2->S4bios_req = FADT71->S4bios_req; FADT2->plvl2_lat = FADT71->plvl2_lat; FADT2->plvl3_lat = FADT71->plvl3_lat; FADT2->day_alrm = FADT71->day_alrm; @@ -476,7 +476,7 @@ /* Dump the entire FADT */ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, - "Hex dump of common internal FADT, size %ld (%lX)\n", + "Hex dump of common internal FADT, size %d (%X)\n", acpi_gbl_FADT->header.length, acpi_gbl_FADT->header.length)); DUMP_BUFFER ((u8 *) (acpi_gbl_FADT), acpi_gbl_FADT->header.length); @@ -540,7 +540,7 @@ FACS1 = (facs_descriptor_rev1 *) acpi_gbl_FACS; common_facs->global_lock = &(FACS1->global_lock); - common_facs->firmware_waking_vector = (UINT64 *) &FACS1->firmware_waking_vector; + common_facs->firmware_waking_vector = (u64 *) &FACS1->firmware_waking_vector; common_facs->vector_width = 32; #endif diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbget.c linux/drivers/acpi/tables/tbget.c --- v2.4.13/linux/drivers/acpi/tables/tbget.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbget.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbget - ACPI Table get* routines - * $Revision: 55 $ + * $Revision: 56 $ * *****************************************************************************/ @@ -617,7 +617,7 @@ * Get the RSDT from the RSDP */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "RSDP located at %p, RSDT physical=%8.8lX%8.8lX \n", + "RSDP located at %p, RSDT physical=%8.8X%8.8X \n", acpi_gbl_RSDP, HIDWORD(acpi_gbl_RSDP->rsdt_physical_address), LODWORD(acpi_gbl_RSDP->rsdt_physical_address))); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbinstal.c linux/drivers/acpi/tables/tbinstal.c --- v2.4.13/linux/drivers/acpi/tables/tbinstal.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbinstal.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbinstal - ACPI table installation and removal - * $Revision: 42 $ + * $Revision: 45 $ * *****************************************************************************/ @@ -142,7 +142,7 @@ status = acpi_gbl_acpi_table_data[i].status; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Found %4.4s\n", - acpi_gbl_acpi_table_data[i].signature)); + (char*)acpi_gbl_acpi_table_data[i].signature)); break; } } @@ -266,7 +266,7 @@ table_desc->base_pointer = table_info->base_pointer; table_desc->length = table_info->length; table_desc->allocation = table_info->allocation; - table_desc->aml_pointer = (u8 *) (table_desc->pointer + 1), + table_desc->aml_start = (u8 *) (table_desc->pointer + 1), table_desc->aml_length = (u32) (table_desc->length - (u32) sizeof (acpi_table_header)); table_desc->table_id = acpi_ut_allocate_owner_id (OWNER_TYPE_TABLE); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbutils.c linux/drivers/acpi/tables/tbutils.c --- v2.4.13/linux/drivers/acpi/tables/tbutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbutils - Table manipulation utilities - * $Revision: 40 $ + * $Revision: 42 $ * *****************************************************************************/ @@ -196,10 +196,10 @@ MOVE_UNALIGNED32_TO_32 (&signature, &table_header->signature); if (!acpi_ut_valid_acpi_name (signature)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Table signature at %p [%X] has invalid characters\n", + "Table signature at %p [%p] has invalid characters\n", table_header, &signature)); - REPORT_WARNING (("Invalid table signature %4.4s found\n", &signature)); + REPORT_WARNING (("Invalid table signature %4.4s found\n", (char*)&signature)); DUMP_BUFFER (table_header, sizeof (acpi_table_header)); return (AE_BAD_SIGNATURE); } @@ -210,7 +210,7 @@ if (table_header->length < sizeof (acpi_table_header)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid length in table header %p name %4.4s\n", - table_header, &signature)); + table_header, (char*)&signature)); REPORT_WARNING (("Invalid table header length found\n")); DUMP_BUFFER (table_header, sizeof (acpi_table_header)); @@ -334,7 +334,7 @@ if (checksum) { REPORT_WARNING (("Invalid checksum (%X) in table %4.4s\n", - checksum, &table_header->signature)); + checksum, (char*)&table_header->signature)); status = AE_BAD_CHECKSUM; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbxface.c linux/drivers/acpi/tables/tbxface.c --- v2.4.13/linux/drivers/acpi/tables/tbxface.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbxface.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: tbxface - Public interfaces to the ACPI subsystem * ACPI table oriented interfaces - * $Revision: 43 $ + * $Revision: 45 $ * *****************************************************************************/ @@ -59,14 +59,6 @@ FUNCTION_TRACE ("Acpi_load_tables"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* Get the RSDP */ status = acpi_os_get_root_pointer (ACPI_LOGICAL_ADDRESSING, @@ -154,13 +146,6 @@ FUNCTION_TRACE ("Acpi_load_table"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - if (!table_ptr) { return_ACPI_STATUS (AE_BAD_PARAMETER); } @@ -213,19 +198,11 @@ acpi_table_type table_type) { acpi_table_desc *list_head; - acpi_status status; FUNCTION_TRACE ("Acpi_unload_table"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (table_type > ACPI_TABLE_MAX) { @@ -289,13 +266,6 @@ FUNCTION_TRACE ("Acpi_get_table_header"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - if ((instance == 0) || (table_type == ACPI_TABLE_RSDP) || (!out_table_header)) { @@ -371,13 +341,6 @@ FUNCTION_TRACE ("Acpi_get_table"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } /* * If we have a buffer, we must have a length too diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbxfroot.c linux/drivers/acpi/tables/tbxfroot.c --- v2.4.13/linux/drivers/acpi/tables/tbxfroot.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbxfroot.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbxfroot - Find the root ACPI table (RSDT) - * $Revision: 49 $ + * $Revision: 52 $ * *****************************************************************************/ @@ -152,7 +152,7 @@ { u8 *table_ptr; u8 *mem_rover; - UINT64 phys_addr; + u64 phys_addr; acpi_status status = AE_OK; @@ -277,10 +277,10 @@ acpi_table_header **table_pointer) { ACPI_PHYSICAL_ADDRESS physical_address; - acpi_table_header *rsdt_ptr; + acpi_table_header *rsdt_ptr = NULL; acpi_table_header *table_ptr; acpi_status status; - u32 rsdt_size; + u32 rsdt_size = 0; u32 table_size; u32 table_count; u32 i; @@ -304,18 +304,49 @@ return_ACPI_STATUS (AE_BAD_PARAMETER); } - /* Get the RSDP */ + if (!acpi_gbl_RSDP) { + /* Get the RSDP */ - status = acpi_os_get_root_pointer (flags, &physical_address); - if (ACPI_FAILURE (status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RSDP not found\n")); - return_ACPI_STATUS (AE_NO_ACPI_TABLES); + status = acpi_os_get_root_pointer (flags, &physical_address); + if (ACPI_FAILURE (status)) { + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RSDP not found\n")); + return_ACPI_STATUS (AE_NO_ACPI_TABLES); + } + + /* Map and validate the RSDP */ + + if ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) { + status = acpi_os_map_memory (physical_address, sizeof (RSDP_DESCRIPTOR), + (void **) &acpi_gbl_RSDP); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } + else { + acpi_gbl_RSDP = (void *) (NATIVE_UINT) physical_address; + } + + /* + * The signature and checksum must both be correct + */ + if (STRNCMP ((NATIVE_CHAR *) acpi_gbl_RSDP, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) { + /* Nope, BAD Signature */ + + status = AE_BAD_SIGNATURE; + goto cleanup; + } + + if (acpi_tb_checksum (acpi_gbl_RSDP, RSDP_CHECKSUM_LENGTH) != 0) { + /* Nope, BAD Checksum */ + + status = AE_BAD_CHECKSUM; + goto cleanup; + } } - acpi_gbl_RSDP = (RSDP_DESCRIPTOR *) (ACPI_TBLPTR) physical_address; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "RSDP located at %p, RSDT physical=%8.8lX%8.8lX \n", + "RSDP located at %p, RSDT physical=%8.8X%8.8X \n", acpi_gbl_RSDP, HIDWORD(acpi_gbl_RSDP->rsdt_physical_address), LODWORD(acpi_gbl_RSDP->rsdt_physical_address))); @@ -377,7 +408,8 @@ /* Delete table mapping if using virtual addressing */ - if (table_size) { + if ((table_size) && + ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING)) { acpi_os_unmap_memory (table_ptr, table_size); } } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utalloc.c linux/drivers/acpi/utilities/utalloc.c --- v2.4.13/linux/drivers/acpi/utilities/utalloc.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utalloc.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utalloc - local cache and memory allocation routines - * $Revision: 100 $ + * $Revision: 106 $ * *****************************************************************************/ @@ -75,6 +75,7 @@ /* Mark the object as cached */ MEMSET (object, 0xCA, cache_info->object_size); + ((acpi_operand_object *) object)->common.data_type = ACPI_CACHED_OBJECT; /* Put the object at the head of the cache list */ @@ -200,14 +201,14 @@ * Each memory allocation is tracked via a doubly linked list. Each * element contains the caller's component, module name, function name, and * line number. Acpi_ut_allocate and Acpi_ut_callocate call - * Acpi_ut_add_element_to_alloc_list to add an element to the list; deletion + * Acpi_ut_track_allocation to add an element to the list; deletion * occurs in the body of Acpi_ut_free. */ /******************************************************************************* * - * FUNCTION: Acpi_ut_search_alloc_list + * FUNCTION: Acpi_ut_find_allocation * * PARAMETERS: Address - Address of allocated memory * @@ -217,12 +218,12 @@ * ******************************************************************************/ -ACPI_DEBUG_MEM_BLOCK * -acpi_ut_search_alloc_list ( +acpi_debug_mem_block * +acpi_ut_find_allocation ( u32 list_id, void *address) { - ACPI_DEBUG_MEM_BLOCK *element; + acpi_debug_mem_block *element; FUNCTION_ENTRY (); @@ -250,7 +251,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ut_add_element_to_alloc_list + * FUNCTION: Acpi_ut_track_allocation * * PARAMETERS: Address - Address of allocated memory * Size - Size of the allocation @@ -266,9 +267,9 @@ ******************************************************************************/ acpi_status -acpi_ut_add_element_to_alloc_list ( +acpi_ut_track_allocation ( u32 list_id, - ACPI_DEBUG_MEM_BLOCK *address, + acpi_debug_mem_block *address, u32 size, u8 alloc_type, u32 component, @@ -276,11 +277,11 @@ u32 line) { ACPI_MEMORY_LIST *mem_list; - ACPI_DEBUG_MEM_BLOCK *element; + acpi_debug_mem_block *element; acpi_status status = AE_OK; - FUNCTION_TRACE_PTR ("Ut_add_element_to_alloc_list", address); + FUNCTION_TRACE_PTR ("Ut_track_allocation", address); if (list_id > ACPI_MEM_LIST_MAX) { @@ -295,9 +296,9 @@ * This will catch several kinds of problems. */ - element = acpi_ut_search_alloc_list (list_id, address); + element = acpi_ut_find_allocation (list_id, address); if (element) { - REPORT_ERROR (("Ut_add_element_to_alloc_list: Address already present in list! (%p)\n", + REPORT_ERROR (("Ut_track_allocation: Address already present in list! (%p)\n", address)); ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Element %p Address %p\n", element, address)); @@ -317,7 +318,7 @@ /* Insert at list head */ if (mem_list->list_head) { - ((ACPI_DEBUG_MEM_BLOCK *)(mem_list->list_head))->previous = address; + ((acpi_debug_mem_block *)(mem_list->list_head))->previous = address; } address->next = mem_list->list_head; @@ -334,7 +335,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ut_delete_element_from_alloc_list + * FUNCTION: Acpi_ut_remove_allocation * * PARAMETERS: Address - Address of allocated memory * Component - Component type of caller @@ -348,9 +349,9 @@ ******************************************************************************/ acpi_status -acpi_ut_delete_element_from_alloc_list ( +acpi_ut_remove_allocation ( u32 list_id, - ACPI_DEBUG_MEM_BLOCK *address, + acpi_debug_mem_block *address, u32 component, NATIVE_CHAR *module, u32 line) @@ -358,7 +359,7 @@ ACPI_MEMORY_LIST *mem_list; - FUNCTION_TRACE ("Ut_delete_element_from_alloc_list"); + FUNCTION_TRACE ("Ut_remove_allocation"); if (list_id > ACPI_MEM_LIST_MAX) { @@ -370,7 +371,7 @@ /* No allocations! */ _REPORT_ERROR (module, line, component, - ("Ut_delete_element_from_alloc_list: Empty allocation list, nothing to free!\n")); + ("Ut_remove_allocation: Empty allocation list, nothing to free!\n")); return_ACPI_STATUS (AE_OK); } @@ -429,34 +430,34 @@ ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Current allocations", Mem_list->Current_count, - ROUND_UP_TO_1_k (Mem_list->Current_size))); + ROUND_UP_TO_1K (Mem_list->Current_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Max concurrent allocations", Mem_list->Max_concurrent_count, - ROUND_UP_TO_1_k (Mem_list->Max_concurrent_size))); + ROUND_UP_TO_1K (Mem_list->Max_concurrent_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Total (all) internal objects", Running_object_count, - ROUND_UP_TO_1_k (Running_object_size))); + ROUND_UP_TO_1K (Running_object_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Total (all) allocations", Running_alloc_count, - ROUND_UP_TO_1_k (Running_alloc_size))); + ROUND_UP_TO_1K (Running_alloc_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Current Nodes", Acpi_gbl_Current_node_count, - ROUND_UP_TO_1_k (Acpi_gbl_Current_node_size))); + ROUND_UP_TO_1K (Acpi_gbl_Current_node_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Max Nodes", Acpi_gbl_Max_concurrent_node_count, - ROUND_UP_TO_1_k ((Acpi_gbl_Max_concurrent_node_count * sizeof (acpi_namespace_node))))); + ROUND_UP_TO_1K ((Acpi_gbl_Max_concurrent_node_count * sizeof (acpi_namespace_node))))); */ return_VOID; } @@ -464,7 +465,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ut_dump_current_allocations + * FUNCTION: Acpi_ut_dump_allocations * * PARAMETERS: Component - Component(s) to dump info for. * Module - Module to dump info for. NULL means all. @@ -476,20 +477,20 @@ ******************************************************************************/ void -acpi_ut_dump_current_allocations ( +acpi_ut_dump_allocations ( u32 component, NATIVE_CHAR *module) { - ACPI_DEBUG_MEM_BLOCK *element; + acpi_debug_mem_block *element; u32 i; - FUNCTION_TRACE ("Ut_dump_current_allocations"); + FUNCTION_TRACE ("Ut_dump_allocations"); element = acpi_gbl_memory_lists[0].list_head; if (element == NULL) { - ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, + ACPI_DEBUG_PRINT ((ACPI_DB_OK, "No outstanding allocations.\n")); return_VOID; } @@ -500,46 +501,89 @@ */ acpi_ut_acquire_mutex (ACPI_MTX_MEMORY); - ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, + ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Outstanding allocations:\n")); for (i = 1; ; i++) /* Just a counter */ { if ((element->component & component) && ((module == NULL) || (0 == STRCMP (module, element->module)))) { - ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, - "%p Len %04lX %9.9s-%ld", - &element->user_space, element->size, element->module, - element->line)); - - /* Most of the elements will be internal objects. */ - - switch (((acpi_operand_object *) - (&element->user_space))->common.data_type) { - case ACPI_DESC_TYPE_INTERNAL: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, - " Obj_type %s", - acpi_ut_get_type_name (((acpi_operand_object *)(&element->user_space))->common.type))); - break; - - case ACPI_DESC_TYPE_PARSER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, - " Parse_obj Opcode %04X", - ((acpi_parse_object *)(&element->user_space))->opcode)); - break; - - case ACPI_DESC_TYPE_NAMED: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, - " Node %4.4s", - &((acpi_namespace_node *)(&element->user_space))->name)); - break; - - case ACPI_DESC_TYPE_STATE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, - " State_obj")); - break; - } + if (((acpi_operand_object *)(&element->user_space))->common.type != ACPI_CACHED_OBJECT) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + "%p Len %04X %9.9s-%d", + &element->user_space, element->size, element->module, + element->line)); + + /* Most of the elements will be internal objects. */ + + switch (((acpi_operand_object *) + (&element->user_space))->common.data_type) { + case ACPI_DESC_TYPE_INTERNAL: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " Obj_type %12.12s R%d", + acpi_ut_get_type_name (((acpi_operand_object *)(&element->user_space))->common.type), + ((acpi_operand_object *)(&element->user_space))->common.reference_count)); + break; + + case ACPI_DESC_TYPE_PARSER: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " Parse_obj Opcode %04X", + ((acpi_parse_object *)(&element->user_space))->opcode)); + break; + + case ACPI_DESC_TYPE_NAMED: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " Node %4.4s", + (char*)&((acpi_namespace_node *)(&element->user_space))->name)); + break; + + case ACPI_DESC_TYPE_STATE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " Untyped State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_UPDATE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " UPDATE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_PACKAGE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " PACKAGE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_CONTROL: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " CONTROL State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_RPSCOPE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " ROOT-PARSE-SCOPE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_PSCOPE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " PARSE-SCOPE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_WSCOPE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " WALK-SCOPE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_RESULT: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " RESULT State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_NOTIFY: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " NOTIFY State_obj")); + break; + } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, "\n")); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "\n")); + } } if (element->next == NULL) { @@ -551,7 +595,7 @@ acpi_ut_release_mutex (ACPI_MTX_MEMORY); - ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, + ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Total number of unfreed allocations = %d(%X)\n", i,i)); @@ -582,7 +626,7 @@ NATIVE_CHAR *module, u32 line) { - ACPI_DEBUG_MEM_BLOCK *address; + acpi_debug_mem_block *address; acpi_status status; @@ -597,7 +641,7 @@ size = 1; } - address = acpi_os_allocate (size + sizeof (ACPI_DEBUG_MEM_BLOCK)); + address = acpi_os_allocate (size + sizeof (acpi_debug_mem_block)); if (!address) { /* Report allocation error */ @@ -607,7 +651,7 @@ return_PTR (NULL); } - status = acpi_ut_add_element_to_alloc_list (ACPI_MEM_LIST_GLOBAL, address, size, + status = acpi_ut_track_allocation (ACPI_MEM_LIST_GLOBAL, address, size, MEM_MALLOC, component, module, line); if (ACPI_FAILURE (status)) { acpi_os_free (address); @@ -645,7 +689,7 @@ NATIVE_CHAR *module, u32 line) { - ACPI_DEBUG_MEM_BLOCK *address; + acpi_debug_mem_block *address; acpi_status status; @@ -661,7 +705,7 @@ } - address = acpi_os_callocate (size + sizeof (ACPI_DEBUG_MEM_BLOCK)); + address = acpi_os_callocate (size + sizeof (acpi_debug_mem_block)); if (!address) { /* Report allocation error */ @@ -670,7 +714,7 @@ return_PTR (NULL); } - status = acpi_ut_add_element_to_alloc_list (ACPI_MEM_LIST_GLOBAL, address, size, + status = acpi_ut_track_allocation (ACPI_MEM_LIST_GLOBAL, address, size, MEM_CALLOC, component, module, line); if (ACPI_FAILURE (status)) { acpi_os_free (address); @@ -707,7 +751,7 @@ NATIVE_CHAR *module, u32 line) { - ACPI_DEBUG_MEM_BLOCK *debug_block; + acpi_debug_mem_block *debug_block; FUNCTION_TRACE_PTR ("Ut_free", address); @@ -720,13 +764,13 @@ return_VOID; } - debug_block = (ACPI_DEBUG_MEM_BLOCK *) - (((char *) address) - sizeof (ACPI_DEBUG_MEM_HEADER)); + debug_block = (acpi_debug_mem_block *) + (((char *) address) - sizeof (acpi_debug_mem_header)); acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].total_freed++; acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].current_total_size -= debug_block->size; - acpi_ut_delete_element_from_alloc_list (ACPI_MEM_LIST_GLOBAL, debug_block, + acpi_ut_remove_allocation (ACPI_MEM_LIST_GLOBAL, debug_block, component, module, line); acpi_os_free (debug_block); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utcopy.c linux/drivers/acpi/utilities/utcopy.c --- v2.4.13/linux/drivers/acpi/utilities/utcopy.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utcopy.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utcopy - Internal to external object translation utilities - * $Revision: 82 $ + * $Revision: 83 $ * *****************************************************************************/ @@ -135,7 +135,7 @@ case AML_REVISION_OP: external_object->type = ACPI_TYPE_INTEGER; - external_object->integer.value = ACPI_CA_VERSION; + external_object->integer.value = ACPI_CA_SUPPORT_LEVEL; break; case AML_INT_NAMEPATH_OP: diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utdebug.c linux/drivers/acpi/utilities/utdebug.c --- v2.4.13/linux/drivers/acpi/utilities/utdebug.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utdebug.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utdebug - Debug print routines - * $Revision: 87 $ + * $Revision: 90 $ * *****************************************************************************/ @@ -87,10 +87,6 @@ if (acpi_gbl_nesting_level > acpi_gbl_deepest_nesting) { acpi_gbl_deepest_nesting = acpi_gbl_nesting_level; - - if (acpi_gbl_deepest_nesting == 34) { - acpi_os_printf ("hit deepest nesting\n"); - } } } @@ -119,7 +115,7 @@ acpi_ut_debug_print ( u32 requested_debug_level, u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, char *format, ...) { @@ -192,7 +188,7 @@ acpi_ut_debug_print_raw ( u32 requested_debug_level, u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, char *format, ...) { @@ -230,7 +226,7 @@ void acpi_ut_trace ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info) + acpi_debug_print_info *dbg_info) { acpi_gbl_nesting_level++; @@ -262,7 +258,7 @@ void acpi_ut_trace_ptr ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, void *pointer) { acpi_gbl_nesting_level++; @@ -294,7 +290,7 @@ void acpi_ut_trace_str ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, NATIVE_CHAR *string) { @@ -327,7 +323,7 @@ void acpi_ut_trace_u32 ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, u32 integer) { @@ -359,7 +355,7 @@ void acpi_ut_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info) + acpi_debug_print_info *dbg_info) { acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info, @@ -390,7 +386,7 @@ void acpi_ut_status_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, acpi_status status) { @@ -430,12 +426,12 @@ void acpi_ut_value_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, acpi_integer value) { acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info, - "%s %08X\n", acpi_gbl_fn_exit_str, value); + "%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str, HIDWORD(value), LODWORD(value)); acpi_gbl_nesting_level--; } @@ -462,7 +458,7 @@ void acpi_ut_ptr_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, u8 *ptr) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utdelete.c linux/drivers/acpi/utilities/utdelete.c --- v2.4.13/linux/drivers/acpi/utilities/utdelete.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utdelete.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: utdelete - object deletion and reference count utilities - * $Revision: 76 $ + * $Revision: 81 $ * ******************************************************************************/ @@ -183,14 +183,10 @@ * Delete any allocated memory found above */ if (obj_pointer) { - if (!acpi_tb_system_table_pointer (obj_pointer)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Deleting Obj Ptr %p \n", obj_pointer)); - - ACPI_MEM_FREE (obj_pointer); - } + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Deleting Obj Ptr %p \n", obj_pointer)); + ACPI_MEM_FREE (obj_pointer); } - /* Only delete the object if it was dynamically allocated */ if (object->common.flags & AOPOBJ_STATIC_ALLOCATION) { @@ -346,8 +342,8 @@ */ if (count > MAX_REFERENCE_COUNT) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "**** AE_ERROR **** Invalid Reference Count (%X) in object %p\n\n", + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, + "**** Warning **** Large Reference Count (%X) in object %p\n\n", count, object)); } @@ -408,11 +404,6 @@ return_ACPI_STATUS (AE_OK); } - if (acpi_tb_system_table_pointer (object)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Object %p is Pcode Ptr\n", object)); - return_ACPI_STATUS (AE_OK); - } - state = acpi_ut_create_update_state (object, action); @@ -529,24 +520,9 @@ case ACPI_TYPE_REGION: - - /* TBD: [Investigate] - Acpi_ut_update_ref_count (Object->Region.Addr_handler, Action); - */ -/* - Status = - Acpi_ut_create_update_state_and_push (Object->Region.Addr_handler, - Action, &State_list); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } -*/ - break; - - case INTERNAL_TYPE_REFERENCE: + /* No subobjects */ break; } @@ -625,6 +601,15 @@ FUNCTION_TRACE_PTR ("Ut_remove_reference", object); + /* + * Allow a NULL pointer to be passed in, just ignore it. This saves + * each caller from having to check. Also, ignore NS nodes. + * + */ + if (!object || + (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED))) { + return_VOID; + } /* * Ensure that we have a valid object diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/uteval.c linux/drivers/acpi/utilities/uteval.c --- v2.4.13/linux/drivers/acpi/utilities/uteval.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/uteval.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: uteval - Object evaluation - * $Revision: 30 $ + * $Revision: 31 $ * *****************************************************************************/ @@ -69,11 +69,11 @@ if (ACPI_FAILURE (status)) { if (status == AE_NOT_FOUND) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s on %4.4s was not found\n", - object_name, &device_node->name)); + object_name, (char*)&device_node->name)); } else { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s on %4.4s failed with status %s\n", - object_name, &device_node->name, + object_name, (char*)&device_node->name, acpi_format_exception (status))); } @@ -132,7 +132,7 @@ acpi_status acpi_ut_execute_HID ( acpi_namespace_node *device_node, - ACPI_DEVICE_ID *hid) + acpi_device_id *hid) { acpi_operand_object *obj_desc; acpi_status status; @@ -148,12 +148,12 @@ if (ACPI_FAILURE (status)) { if (status == AE_NOT_FOUND) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_HID on %4.4s was not found\n", - &device_node->name)); + (char*)&device_node->name)); } else { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_HID on %4.4s failed %s\n", - &device_node->name, acpi_format_exception (status))); + (char*)&device_node->name, acpi_format_exception (status))); } return_ACPI_STATUS (status); @@ -220,7 +220,7 @@ acpi_status acpi_ut_execute_UID ( acpi_namespace_node *device_node, - ACPI_DEVICE_ID *uid) + acpi_device_id *uid) { acpi_operand_object *obj_desc; acpi_status status; @@ -236,13 +236,13 @@ if (ACPI_FAILURE (status)) { if (status == AE_NOT_FOUND) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_UID on %4.4s was not found\n", - &device_node->name)); + (char*)&device_node->name)); } else { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_UID on %4.4s failed %s\n", - &device_node->name, acpi_format_exception (status))); + (char*)&device_node->name, acpi_format_exception (status))); } return (status); @@ -325,7 +325,7 @@ if (AE_NOT_FOUND == status) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_STA on %4.4s was not found, assuming present.\n", - &device_node->name)); + (char*)&device_node->name)); *flags = 0x0F; status = AE_OK; @@ -333,7 +333,7 @@ else if (ACPI_FAILURE (status)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_STA on %4.4s failed %s\n", - &device_node->name, + (char*)&device_node->name, acpi_format_exception (status))); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utglobal.c linux/drivers/acpi/utilities/utglobal.c --- v2.4.13/linux/drivers/acpi/utilities/utglobal.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utglobal.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utglobal - Global variables for the ACPI subsystem - * $Revision: 131 $ + * $Revision: 133 $ * *****************************************************************************/ @@ -147,7 +147,7 @@ const NATIVE_CHAR *acpi_gbl_db_sleep_states[ACPI_NUM_SLEEP_STATES] = { "\\_S0_","\\_S1_","\\_S2_","\\_S3_", - "\\_S4_","\\_S5_","\\_S4_b"}; + "\\_S4_","\\_S5_","\\_S4B"}; /****************************************************************************** @@ -331,7 +331,7 @@ */ static const NATIVE_CHAR acpi_gbl_bad_type[] = "UNDEFINED"; -#define TYPE_NAME_LENGTH 9 /* Maximum length of each string */ +#define TYPE_NAME_LENGTH 12 /* Maximum length of each string */ static const NATIVE_CHAR *acpi_gbl_ns_type_names[] = /* printable names of ACPI types */ { @@ -349,21 +349,21 @@ /* 11 */ "Power", /* 12 */ "Processor", /* 13 */ "Thermal", - /* 14 */ "Buff_field", + /* 14 */ "Buffer_field", /* 15 */ "Ddb_handle", - /* 16 */ "Debug_obj", - /* 17 */ "Regn_field", + /* 16 */ "Debug_object", + /* 17 */ "Region_field", /* 18 */ "Bank_field", - /* 19 */ "Indx_field", + /* 19 */ "Index_field", /* 20 */ "Reference", /* 21 */ "Alias", /* 22 */ "Notify", - /* 23 */ "Addr_hndlr", - /* 24 */ "Rsrc_desc", - /* 25 */ "Rsrc_field", - /* 26 */ "Rgn_fld_dfn", - /* 27 */ "Bnk_fld_dfn", - /* 28 */ "Idx_fld_dfn", + /* 23 */ "Addr_handler", + /* 24 */ "Resource_desc", + /* 25 */ "Resource_fld", + /* 26 */ "Region_fld_dfn", + /* 27 */ "Bank_fld_dfn", + /* 28 */ "Index_fld_dfn", /* 29 */ "If", /* 30 */ "Else", /* 31 */ "While", diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utinit.c linux/drivers/acpi/utilities/utinit.c --- v2.4.13/linux/drivers/acpi/utilities/utinit.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utinit.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utinit - Common ACPI subsystem initialization - * $Revision: 101 $ + * $Revision: 102 $ * *****************************************************************************/ @@ -245,7 +245,7 @@ /* Debug only - display leftover memory allocation, if any */ #ifdef ACPI_DBG_TRACK_ALLOCATIONS - acpi_ut_dump_current_allocations (ACPI_UINT32_MAX, NULL); + acpi_ut_dump_allocations (ACPI_UINT32_MAX, NULL); #endif return_ACPI_STATUS (AE_OK); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utmath.c linux/drivers/acpi/utilities/utmath.c --- v2.4.13/linux/drivers/acpi/utilities/utmath.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/utilities/utmath.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,314 @@ +/******************************************************************************* + * + * Module Name: utmath - Integer math support routines + * $Revision: 7 $ + * + ******************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * 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. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" + + +#define _COMPONENT ACPI_UTILITIES + MODULE_NAME ("utmath") + +/* + * Support for double-precision integer divide. This code is included here + * in order to support kernel environments where the double-precision math + * library is not available. + */ + +#ifndef ACPI_USE_NATIVE_DIVIDE +/******************************************************************************* + * + * FUNCTION: Acpi_ut_short_divide + * + * PARAMETERS: In_dividend - Pointer to the dividend + * Divisor - 32-bit divisor + * Out_quotient - Pointer to where the quotient is returned + * Out_remainder - Pointer to where the remainder is returned + * + * RETURN: Status (Checks for divide-by-zero) + * + * DESCRIPTION: Perform a short (maximum 64 bits divided by 32 bits) + * divide and modulo. The result is a 64-bit quotient and a + * 32-bit remainder. + * + ******************************************************************************/ + +acpi_status +acpi_ut_short_divide ( + acpi_integer *in_dividend, + u32 divisor, + acpi_integer *out_quotient, + u32 *out_remainder) +{ + uint64_overlay dividend; + uint64_overlay quotient; + u32 remainder32; + + + FUNCTION_TRACE ("Ut_short_divide"); + + dividend.full = *in_dividend; + + /* Always check for a zero divisor */ + + if (divisor == 0) { + REPORT_ERROR (("Acpi_ut_short_divide: Divide by zero\n")); + return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO); + } + + /* + * The quotient is 64 bits, the remainder is always 32 bits, + * and is generated by the second divide. + */ + ACPI_DIV_64_BY_32 (0, dividend.part.hi, divisor, + quotient.part.hi, remainder32); + ACPI_DIV_64_BY_32 (remainder32, dividend.part.lo, divisor, + quotient.part.lo, remainder32); + + /* Return only what was requested */ + + if (out_quotient) { + *out_quotient = quotient.full; + } + if (out_remainder) { + *out_remainder = remainder32; + } + + return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ut_divide + * + * PARAMETERS: In_dividend - Pointer to the dividend + * In_divisor - Pointer to the divisor + * Out_quotient - Pointer to where the quotient is returned + * Out_remainder - Pointer to where the remainder is returned + * + * RETURN: Status (Checks for divide-by-zero) + * + * DESCRIPTION: Perform a divide and modulo. + * + ******************************************************************************/ + +acpi_status +acpi_ut_divide ( + acpi_integer *in_dividend, + acpi_integer *in_divisor, + acpi_integer *out_quotient, + acpi_integer *out_remainder) +{ + uint64_overlay dividend; + uint64_overlay divisor; + uint64_overlay quotient; + uint64_overlay remainder; + uint64_overlay normalized_dividend; + uint64_overlay normalized_divisor; + u32 partial1; + uint64_overlay partial2; + uint64_overlay partial3; + + + FUNCTION_TRACE ("Ut_divide"); + + + /* Always check for a zero divisor */ + + if (*in_divisor == 0) { + REPORT_ERROR (("Acpi_ut_divide: Divide by zero\n")); + return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO); + } + + divisor.full = *in_divisor; + dividend.full = *in_dividend; + if (divisor.part.hi == 0) { + /* + * 1) Simplest case is where the divisor is 32 bits, we can + * just do two divides + */ + remainder.part.hi = 0; + + /* + * The quotient is 64 bits, the remainder is always 32 bits, + * and is generated by the second divide. + */ + ACPI_DIV_64_BY_32 (0, dividend.part.hi, divisor.part.lo, + quotient.part.hi, partial1); + ACPI_DIV_64_BY_32 (partial1, dividend.part.lo, divisor.part.lo, + quotient.part.lo, remainder.part.lo); + } + + else { + /* + * 2) The general case where the divisor is a full 64 bits + * is more difficult + */ + quotient.part.hi = 0; + normalized_dividend = dividend; + normalized_divisor = divisor; + + /* Normalize the operands (shift until the divisor is < 32 bits) */ + + do { + ACPI_SHIFT_RIGHT_64 (normalized_divisor.part.hi, + normalized_divisor.part.lo); + ACPI_SHIFT_RIGHT_64 (normalized_dividend.part.hi, + normalized_dividend.part.lo); + + } while (normalized_divisor.part.hi != 0); + + /* Partial divide */ + + ACPI_DIV_64_BY_32 (normalized_dividend.part.hi, + normalized_dividend.part.lo, + normalized_divisor.part.lo, + quotient.part.lo, partial1); + + /* + * The quotient is always 32 bits, and simply requires adjustment. + * The 64-bit remainder must be generated. + */ + partial1 = quotient.part.lo * divisor.part.hi; + partial2.full = (acpi_integer) quotient.part.lo * divisor.part.lo; + partial3.full = partial2.part.hi + partial1; + + remainder.part.hi = partial3.part.lo; + remainder.part.lo = partial2.part.lo; + + if (partial3.part.hi == 0) { + if (partial3.part.lo >= dividend.part.hi) { + if (partial3.part.lo == dividend.part.hi) { + if (partial2.part.lo > dividend.part.lo) { + quotient.part.lo--; + remainder.full -= divisor.full; + } + } + else { + quotient.part.lo--; + remainder.full -= divisor.full; + } + } + + remainder.full = remainder.full - dividend.full; + remainder.part.hi = -((s32) remainder.part.hi); + remainder.part.lo = -((s32) remainder.part.lo); + + if (remainder.part.lo) { + remainder.part.hi--; + } + } + } + + /* Return only what was requested */ + + if (out_quotient) { + *out_quotient = quotient.full; + } + if (out_remainder) { + *out_remainder = remainder.full; + } + + return_ACPI_STATUS (AE_OK); +} + +#else + +/******************************************************************************* + * + * FUNCTION: Acpi_ut_short_divide, Acpi_ut_divide + * + * DESCRIPTION: Native versions of the Ut_divide functions. Use these if either + * 1) The target is a 64-bit platform and therefore 64-bit + * integer math is supported directly by the machine. + * 2) The target is a 32-bit or 16-bit platform, and the + * double-precision integer math library is available to + * perform the divide. + * + ******************************************************************************/ + +acpi_status +acpi_ut_short_divide ( + acpi_integer *in_dividend, + u32 divisor, + acpi_integer *out_quotient, + u32 *out_remainder) +{ + + FUNCTION_TRACE ("Ut_short_divide"); + + + /* Always check for a zero divisor */ + + if (divisor == 0) { + REPORT_ERROR (("Acpi_ut_short_divide: Divide by zero\n")); + return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO); + } + + /* Return only what was requested */ + + if (out_quotient) { + *out_quotient = *in_dividend / divisor; + } + if (out_remainder) { + *out_remainder = (u32) *in_dividend % divisor; + } + + return_ACPI_STATUS (AE_OK); +} + +acpi_status +acpi_ut_divide ( + acpi_integer *in_dividend, + acpi_integer *in_divisor, + acpi_integer *out_quotient, + acpi_integer *out_remainder) +{ + FUNCTION_TRACE ("Ut_divide"); + + + /* Always check for a zero divisor */ + + if (*in_divisor == 0) { + REPORT_ERROR (("Acpi_ut_divide: Divide by zero\n")); + return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO); + } + + + /* Return only what was requested */ + + if (out_quotient) { + *out_quotient = *in_dividend / *in_divisor; + } + if (out_remainder) { + *out_remainder = *in_dividend % *in_divisor; + } + + return_ACPI_STATUS (AE_OK); +} + +#endif + + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utmisc.c linux/drivers/acpi/utilities/utmisc.c --- v2.4.13/linux/drivers/acpi/utilities/utmisc.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utmisc.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: utmisc - common utility procedures - * $Revision: 50 $ + * $Revision: 52 $ * ******************************************************************************/ @@ -662,6 +662,7 @@ /* Init fields specific to the update struct */ + state->common.data_type = ACPI_DESC_TYPE_STATE_UPDATE; state->update.object = object; state->update.value = action; @@ -679,9 +680,7 @@ * * RETURN: Status * - * DESCRIPTION: Create an "Update State" - a flavor of the generic state used - * to update reference counts and delete complex objects such - * as packages. + * DESCRIPTION: Create a "Package State" * ******************************************************************************/ @@ -706,6 +705,7 @@ /* Init fields specific to the update struct */ + state->common.data_type = ACPI_DESC_TYPE_STATE_PACKAGE; state->pkg.source_object = (acpi_operand_object *) internal_object; state->pkg.dest_object = external_object; state->pkg.index = index; @@ -748,7 +748,8 @@ /* Init fields specific to the control struct */ - state->common.state = CONTROL_CONDITIONAL_EXECUTING; + state->common.data_type = ACPI_DESC_TYPE_STATE_CONTROL; + state->common.state = CONTROL_CONDITIONAL_EXECUTING; return_PTR (state); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utobject.c linux/drivers/acpi/utilities/utobject.c --- v2.4.13/linux/drivers/acpi/utilities/utobject.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utobject.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utobject - ACPI object create/delete/size/cache routines - * $Revision: 55 $ + * $Revision: 57 $ * *****************************************************************************/ @@ -116,13 +116,6 @@ if (!object) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Null Object Ptr\n")); - return (FALSE); - } - - /* Check for a pointer within one of the ACPI tables */ - - if (acpi_tb_system_table_pointer (object)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Object %p is a Pcode Ptr\n", object)); return (FALSE); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utxface.c linux/drivers/acpi/utilities/utxface.c --- v2.4.13/linux/drivers/acpi/utilities/utxface.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utxface - External interfaces for "global" ACPI functions - * $Revision: 80 $ + * $Revision: 82 $ * *****************************************************************************/ @@ -240,19 +240,9 @@ acpi_status acpi_terminate (void) { - acpi_status status; - - FUNCTION_TRACE ("Acpi_terminate"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Terminate the AML Debugger if present */ DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE); @@ -271,10 +261,18 @@ acpi_ut_mutex_terminate (); +#ifdef ENABLE_DEBUGGER + + /* Shut down the debugger */ + + acpi_db_terminate (); +#endif + /* Now we can shutdown the OS-dependent layer */ acpi_os_terminate (); + return_ACPI_STATUS (AE_OK); } @@ -330,18 +328,10 @@ { acpi_system_info *info_ptr; u32 i; - acpi_status status; FUNCTION_TRACE ("Acpi_get_system_info"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } /* * Must have a valid buffer diff -u --recursive --new-file v2.4.13/linux/drivers/block/loop.c linux/drivers/block/loop.c --- v2.4.13/linux/drivers/block/loop.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/loop.c Wed Oct 24 14:08:01 2001 @@ -951,6 +951,7 @@ */ MODULE_PARM(max_loop, "i"); MODULE_PARM_DESC(max_loop, "Maximum number of loop devices (1-255)"); +MODULE_LICENSE("GPL"); int loop_register_transfer(struct loop_func_table *funcs) { diff -u --recursive --new-file v2.4.13/linux/drivers/block/paride/Config.in linux/drivers/block/paride/Config.in --- v2.4.13/linux/drivers/block/paride/Config.in Fri Apr 6 10:42:55 2001 +++ linux/drivers/block/paride/Config.in Thu Oct 25 00:07:39 2001 @@ -27,6 +27,12 @@ dep_tristate ' FIT TD-2000 protocol' CONFIG_PARIDE_FIT2 $CONFIG_PARIDE dep_tristate ' FIT TD-3000 protocol' CONFIG_PARIDE_FIT3 $CONFIG_PARIDE dep_tristate ' Shuttle EPAT/EPEZ protocol' CONFIG_PARIDE_EPAT $CONFIG_PARIDE +if [ "$CONFIG_PARIDE_EPAT" != "n" ]; then + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + bool ' Support c7/c8 chips (EXPERIMENTAL)' CONFIG_PARIDE_EPATC8 $CONFIG_PARIDE + fi +fi + dep_tristate ' Shuttle EPIA protocol' CONFIG_PARIDE_EPIA $CONFIG_PARIDE dep_tristate ' Freecom IQ ASIC-2 protocol' CONFIG_PARIDE_FRIQ $CONFIG_PARIDE dep_tristate ' FreeCom power protocol' CONFIG_PARIDE_FRPW $CONFIG_PARIDE diff -u --recursive --new-file v2.4.13/linux/drivers/block/paride/epat.c linux/drivers/block/paride/epat.c --- v2.4.13/linux/drivers/block/paride/epat.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/paride/epat.c Thu Oct 25 00:07:39 2001 @@ -12,10 +12,11 @@ /* Changes: 1.01 GRG 1998.05.06 init_proto, release_proto + 1.02 Joshua b. Jore CPP(renamed), epat_connect, epat_disconnect */ -#define EPAT_VERSION "1.01" +#define EPAT_VERSION "1.02" #include #include @@ -197,30 +198,50 @@ #define WRi(r,v) epat_write_regr(pi,0,r,v) #define RRi(r) (epat_read_regr(pi,0,r)) -/* FIXME: the CCP stuff should be fixed to handle multiple EPATs on a chain */ +/* FIXME: the CPP stuff should be fixed to handle multiple EPATs on a chain */ -#define CCP(x) w2(4);w0(0x22);w0(0xaa);w0(0x55);w0(0);w0(0xff);\ +#define CPP(x) w2(4);w0(0x22);w0(0xaa);w0(0x55);w0(0);w0(0xff);\ w0(0x87);w0(0x78);w0(x);w2(4);w2(5);w2(4);w0(0xff); static void epat_connect ( PIA *pi ) { pi->saved_r0 = r0(); pi->saved_r2 = r2(); - CCP(0); CCP(0xe0); + +#ifdef CONFIG_PARIDE_EPATC8 + /* Initialize the chip */ + CPP(0);CPP(0x40);CPP(0xe0); + w0(0);w2(1);w2(4); + WR(0x8,0x12);WR(0xc,0x14);WR(0x12,0x10); + WR(0xe,0xf);WR(0xf,4); + /* WR(0xe,0xa);WR(0xf,4); */ + WR(0xe,0xd);WR(0xf,0); + /* CPP(0x30); */ + + /* Connect to the chip */ + CPP(0xe0); + w0(0);w2(1);w2(4); /* Idle into SPP */ + if (pi->mode >= 3) { + w0(0);w2(1);w2(4);w2(0xc); + /* Request EPP */ + w0(0x40);w2(6);w2(7);w2(4);w2(0xc);w2(4); + } +#else + CPP(0); CPP(0xe0); w0(0); w2(1); w2(4); if (pi->mode >= 3) { w0(0); w2(1); w2(4); w2(0xc); w0(0x40); w2(6); w2(7); w2(4); w2(0xc); w2(4); } WR(8,0x10); WR(0xc,0x14); WR(0xa,0x38); WR(0x12,0x10); +#endif } -static void epat_disconnect ( PIA *pi ) - -{ CCP(0x30); - w0(pi->saved_r0); - w2(pi->saved_r2); -} +static void epat_disconnect (PIA *pi) +{ CPP(0x30); + w0(pi->saved_r0); + w2(pi->saved_r2); +} static int epat_test_proto( PIA *pi, char * scratch, int verbose ) @@ -282,6 +303,7 @@ static void epat_init_proto( PIA *pi) { MOD_INC_USE_COUNT; + printk("epat_init_proto"); } static void epat_release_proto( PIA *pi) diff -u --recursive --new-file v2.4.13/linux/drivers/block/paride/pcd.c linux/drivers/block/paride/pcd.c --- v2.4.13/linux/drivers/block/paride/pcd.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/paride/pcd.c Wed Oct 24 14:04:02 2001 @@ -204,6 +204,8 @@ int pcd_init(void); void cleanup_module( void ); +static int pcd_dev_open(struct inode *inode, struct file *file); +static void pcd_dev_release(struct inode *inode, struct file *file); static int pcd_open(struct cdrom_device_info *cdi, int purpose); static void pcd_release(struct cdrom_device_info *cdi); static int pcd_drive_status(struct cdrom_device_info *cdi, int slot_nr); @@ -265,6 +267,13 @@ /* kernel glue structures */ +struct block_device_operations pcd_bdops = { + open: pcd_dev_open, + release: pcd_dev_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +} + static struct cdrom_device_ops pcd_dops = { pcd_open, pcd_release, @@ -335,13 +344,17 @@ /* get the atapi capabilities page */ pcd_probe_capabilities(); - if (register_blkdev(MAJOR_NR,name,&cdrom_fops)) { + if (register_blkdev(MAJOR_NR,name,&pcd_bdops)) { printk("pcd: unable to get major number %d\n",MAJOR_NR); return -1; } - for (unit=0;unitdev); if ((unit >= PCD_UNITS) || (!PCD.present)) return -ENODEV; - MOD_INC_USE_COUNT; - return 0; } static void pcd_release(struct cdrom_device_info *cdi) -{ MOD_DEC_USE_COUNT; +{ } #ifdef MODULE diff -u --recursive --new-file v2.4.13/linux/drivers/block/rd.c linux/drivers/block/rd.c --- v2.4.13/linux/drivers/block/rd.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/rd.c Wed Oct 24 15:18:55 2001 @@ -203,17 +203,6 @@ return 0; } -/* - * Writing: just make sure the page gets marked dirty, so that - * the page stealer won't grab it. - */ -static int ramdisk_writepage(struct page *page) -{ - SetPageDirty(page); - UnlockPage(page); - return 0; -} - static int ramdisk_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to) { if (!Page_Uptodate(page)) { @@ -233,7 +222,7 @@ static struct address_space_operations ramdisk_aops = { readpage: ramdisk_readpage, - writepage: ramdisk_writepage, + writepage: fail_writepage, prepare_write: ramdisk_prepare_write, commit_write: ramdisk_commit_write, }; diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c --- v2.4.13/linux/drivers/cdrom/cdrom.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/cdrom/cdrom.c Wed Oct 24 14:04:02 2001 @@ -310,11 +310,6 @@ #define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret /* Not-exported routines. */ -static int cdrom_open(struct inode *ip, struct file *fp); -static int cdrom_release(struct inode *ip, struct file *fp); -static int cdrom_ioctl(struct inode *ip, struct file *fp, - unsigned int cmd, unsigned long arg); -static int cdrom_media_changed(kdev_t dev); static int open_for_data(struct cdrom_device_info * cdi); static int check_for_audio_disc(struct cdrom_device_info * cdi, struct cdrom_device_ops * cdo); @@ -333,14 +328,6 @@ static devfs_handle_t devfs_handle; static struct unique_numspace cdrom_numspace = UNIQUE_NUMBERSPACE_INITIALISER; -struct block_device_operations cdrom_fops = -{ - open: cdrom_open, - release: cdrom_release, - ioctl: cdrom_ioctl, - check_media_change: cdrom_media_changed, -}; - /* This macro makes sure we don't have to check on cdrom_device_ops * existence in the run-time routines below. Change_capability is a * hack to have the capability flags defined const, while we can still @@ -354,7 +341,6 @@ int major = MAJOR(cdi->dev); struct cdrom_device_ops *cdo = cdi->ops; int *change_capability = (int *)&cdo->capability; /* hack */ - char vname[16]; cdinfo(CD_OPEN, "entering register_cdrom\n"); @@ -396,7 +382,6 @@ if (!devfs_handle) devfs_handle = devfs_mk_dir (NULL, "cdroms", NULL); cdi->number = devfs_alloc_unique_number (&cdrom_numspace); - sprintf (vname, "cdrom%d", cdi->number); if (cdi->de) { int pos; devfs_handle_t slave; @@ -405,6 +390,8 @@ pos = devfs_generate_path (cdi->de, rname + 3, sizeof rname - 3); if (pos >= 0) { + char vname[16]; + sprintf (vname, "cdrom%d", cdi->number); strncpy (rname + pos, "../", 3); devfs_mk_symlink (devfs_handle, vname, DEVFS_FL_DEFAULT, @@ -412,13 +399,6 @@ devfs_auto_unregister (cdi->de, slave); } } - else { - cdi->de = - devfs_register (devfs_handle, vname, DEVFS_FL_DEFAULT, - MAJOR (cdi->dev), MINOR (cdi->dev), - S_IFBLK | S_IRUGO | S_IWUGO, - &cdrom_fops, NULL); - } cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name); cdi->next = topCdromPtr; topCdromPtr = cdi; @@ -475,7 +455,6 @@ * is in their own interest: device control becomes a lot easier * this way. */ -static int cdrom_open(struct inode *ip, struct file *fp) { struct cdrom_device_info *cdi; @@ -669,7 +648,6 @@ /* Admittedly, the logic below could be performed in a nicer way. */ -static int cdrom_release(struct inode *ip, struct file *fp) { kdev_t dev = ip->i_rdev; @@ -867,7 +845,7 @@ return ret; } -static int cdrom_media_changed(kdev_t dev) +int cdrom_media_changed(kdev_t dev) { struct cdrom_device_info *cdi = cdrom_find_device(dev); /* This talks to the VFS, which doesn't like errors - just 1 or 0. @@ -1480,7 +1458,7 @@ * these days. ATAPI / SCSI specific code now mainly resides in * mmc_ioct(). */ -static int cdrom_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, +int cdrom_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg) { kdev_t dev = ip->i_rdev; @@ -2391,7 +2369,10 @@ EXPORT_SYMBOL(cdrom_count_tracks); EXPORT_SYMBOL(register_cdrom); EXPORT_SYMBOL(unregister_cdrom); -EXPORT_SYMBOL(cdrom_fops); +EXPORT_SYMBOL(cdrom_open); +EXPORT_SYMBOL(cdrom_release); +EXPORT_SYMBOL(cdrom_ioctl); +EXPORT_SYMBOL(cdrom_media_changed); EXPORT_SYMBOL(cdrom_number_of_slots); EXPORT_SYMBOL(cdrom_select_disc); EXPORT_SYMBOL(cdrom_mode_select); diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/cdu31a.c linux/drivers/cdrom/cdu31a.c --- v2.4.13/linux/drivers/cdrom/cdu31a.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/cdu31a.c Wed Oct 24 14:04:02 2001 @@ -3102,6 +3102,23 @@ return 0; } +static int scd_dev_open(struct inode *inode, struct file *file) +{ + int err; + MOD_INC_USE_COUNT; + err = cdrom_open(inode, file); + if (err) + MOD_DEC_USE_COUNT; + return err; +} + +static int scd_dev_release(struct inode *inode, struct file *file) +{ + int err = cdrom_release(inode, file); + MOD_DEC_USE_COUNT; + return err; +} + /* * Open the drive for operations. Spin the drive up and read the table of * contents if these have not already been done. @@ -3112,17 +3129,13 @@ unsigned int res_size; unsigned char params[2]; - MOD_INC_USE_COUNT; if (sony_usage == 0) { - if (scd_spinup() != 0) { - MOD_DEC_USE_COUNT; + if (scd_spinup() != 0) return -EIO; - } sony_get_toc(); if (!sony_toc_read) { do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, &res_size); - MOD_DEC_USE_COUNT; return -EIO; } @@ -3183,9 +3196,16 @@ sony_spun_up = 0; } sony_usage--; - MOD_DEC_USE_COUNT; } +struct block_device_operations scd_bdops = +{ + open: scd_dev_open, + release: scd_dev_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + static struct cdrom_device_ops scd_dops = { open:scd_open, release:scd_release, @@ -3383,7 +3403,7 @@ request_region(cdu31a_port, 4, "cdu31a"); - if (devfs_register_blkdev(MAJOR_NR, "cdu31a", &cdrom_fops)) { + if (devfs_register_blkdev(MAJOR_NR, "cdu31a", &scd_bdops)) { printk("Unable to get major %d for CDU-31a\n", MAJOR_NR); goto errout2; @@ -3465,6 +3485,7 @@ if (register_cdrom(&scd_info)) { goto errout0; } + devfs_plain_cdrom(&scd_info, &scd_bdops); } diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/cm206.c linux/drivers/cdrom/cm206.c --- v2.4.13/linux/drivers/cdrom/cm206.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/cm206.c Wed Oct 24 14:04:02 2001 @@ -765,11 +765,35 @@ } } +static int cm206_dev_open(struct inode *inode, struct file *file) +{ + int err; + MOD_INC_USE_COUNT; + err = cdrom_open(inode, file); + if (err) + MOD_DEC_USE_COUNT; + return err; +} + +static int cm206_dev_release(struct inode *inode, struct file *file) +{ + int err = cdrom_release(inode, file); + MOD_DEC_USE_COUNT; + return err; +} + +struct block_device_operations cm206_bdops = +{ + open: cm206_dev_open, + release: cm206_dev_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + /* The new open. The real opening strategy is defined in cdrom.c. */ static int cm206_open(struct cdrom_device_info *cdi, int purpose) { - MOD_INC_USE_COUNT; if (!cd->openfiles) { /* reset only first time */ cd->background = 0; reset_cm260(); @@ -792,7 +816,6 @@ FIRST_TRACK = 0; /* No valid disc status */ } --cd->openfiles; - MOD_DEC_USE_COUNT; } /* Empty buffer empties $sectors$ sectors of the adapter card buffer, @@ -1478,7 +1501,7 @@ return -EIO; } printk(".\n"); - if (devfs_register_blkdev(MAJOR_NR, "cm206", &cdrom_fops) != 0) { + if (devfs_register_blkdev(MAJOR_NR, "cm206", &cm206_bdops) != 0) { printk(KERN_INFO "Cannot register for major %d!\n", MAJOR_NR); cleanup(3); @@ -1491,6 +1514,7 @@ cleanup(3); return -EIO; } + devfs_plain_cdrom(&cm206_info, &cm206_bdops); blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST); blksize_size[MAJOR_NR] = cm206_blocksizes; read_ahead[MAJOR_NR] = 16; /* reads ahead what? */ diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/mcd.c linux/drivers/cdrom/mcd.c --- v2.4.13/linux/drivers/cdrom/mcd.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/mcd.c Wed Oct 24 14:04:02 2001 @@ -189,6 +189,31 @@ void *arg); int mcd_drive_status(struct cdrom_device_info *cdi, int slot_nr); +static int mcd_dev_open(struct inode *inode, struct file *file) +{ + int err; + MOD_INC_USE_COUNT; + err = cdrom_open(inode, file); + if (err) + MOD_DEC_USE_COUNT; + return err; +} + +static int mcd_dev_release(struct inode *inode, struct file *file) +{ + int err = cdrom_release(inode, file); + MOD_DEC_USE_COUNT; + return err; +} + +struct block_device_operations mcd_bdops = +{ + open: mcd_dev_open, + release: mcd_dev_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + static struct timer_list mcd_timer; static struct cdrom_device_ops mcd_dops = { @@ -978,8 +1003,6 @@ if (mcdPresent == 0) return -ENXIO; /* no hardware */ - MOD_INC_USE_COUNT; - if (mcd_open_count || mcd_state != MCD_S_IDLE) goto bump_count; @@ -1002,7 +1025,6 @@ return 0; err_out: - MOD_DEC_USE_COUNT; return -EIO; } @@ -1015,7 +1037,6 @@ if (!--mcd_open_count) { mcd_invalidate_buffers(); } - MOD_DEC_USE_COUNT; } @@ -1060,7 +1081,7 @@ return -EIO; } - if (devfs_register_blkdev(MAJOR_NR, "mcd", &cdrom_fops) != 0) { + if (devfs_register_blkdev(MAJOR_NR, "mcd", &mcd_bdops) != 0) { printk(KERN_ERR "mcd: Unable to get major %d for Mitsumi CD-ROM\n", MAJOR_NR); return -EIO; } @@ -1152,6 +1173,7 @@ cleanup(3); return -EIO; } + devfs_plain_cdrom(&mcd_info, &mcd_bdops); printk(msg); return 0; diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/mcdx.c linux/drivers/cdrom/mcdx.c --- v2.4.13/linux/drivers/cdrom/mcdx.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/mcdx.c Wed Oct 24 14:04:02 2001 @@ -219,6 +219,31 @@ int mcdx_init(void); void do_mcdx_request(request_queue_t * q); +static int mcdx_dev_open(struct inode *inode, struct file *file) +{ + int err; + MOD_INC_USE_COUNT; + err = cdrom_open(inode, file); + if (err) + MOD_DEC_USE_COUNT; + return err; +} + +static int mcdx_dev_release(struct inode *inode, struct file *file) +{ + int err = cdrom_release(inode, file); + MOD_DEC_USE_COUNT; + return err; +} + +struct block_device_operations mcdx_bdops = +{ + open: mcdx_dev_open, + release: mcdx_dev_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + /* Indirect exported functions. These functions are exported by their addresses, such as mcdx_open and mcdx_close in the @@ -640,13 +665,10 @@ /* Make the modules looking used ... (thanx bjorn). * But we shouldn't forget to decrement the module counter * on error return */ - MOD_INC_USE_COUNT; /* this is only done to test if the drive talks with us */ - if (-1 == mcdx_getstatus(stuffp, 1)) { - MOD_DEC_USE_COUNT; + if (-1 == mcdx_getstatus(stuffp, 1)) return -EIO; - } if (stuffp->xxx) { @@ -705,10 +727,8 @@ } xtrace(OPENCLOSE, "open() init irq generation\n"); - if (-1 == mcdx_config(stuffp, 1)) { - MOD_DEC_USE_COUNT; + if (-1 == mcdx_config(stuffp, 1)) return -EIO; - } #if FALLBACK /* Set the read speed */ xwarn("AAA %x AAA\n", stuffp->readcmd); @@ -745,7 +765,7 @@ MODE2 : MODE1, 1))) { - /* MOD_DEC_USE_COUNT, return -EIO; */ + /* return -EIO; */ stuffp->xa = 0; break; } @@ -765,10 +785,8 @@ /* xa disks will be read in raw mode, others not */ if (-1 == mcdx_setdrivemode(stuffp, stuffp->xa ? RAW : COOKED, - 1)) { - MOD_DEC_USE_COUNT; + 1)) return -EIO; - } if (stuffp->audio) { xinfo("open() audio disk found\n"); } else if (stuffp->lastsector >= 0) { @@ -792,8 +810,6 @@ stuffp = mcdx_stuffp[MINOR(cdi->dev)]; --stuffp->users; - - MOD_DEC_USE_COUNT; } static int mcdx_media_changed(struct cdrom_device_info *cdi, int disc_nr) @@ -1180,7 +1196,7 @@ } xtrace(INIT, "init() register blkdev\n"); - if (devfs_register_blkdev(MAJOR_NR, "mcdx", &cdrom_fops) != 0) { + if (devfs_register_blkdev(MAJOR_NR, "mcdx", &mcdx_bdops) != 0) { xwarn("%s=0x%3p,%d: Init failed. Can't get major %d.\n", MCDX, stuffp->wreg_data, stuffp->irq, MAJOR_NR); kfree(stuffp); @@ -1240,6 +1256,7 @@ blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); return 2; } + devfs_plain_cdrom(&mcdx_info, &mcdx_bdops); printk(msg); return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/sbpcd.c linux/drivers/cdrom/sbpcd.c --- v2.4.13/linux/drivers/cdrom/sbpcd.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/sbpcd.c Wed Oct 24 14:04:02 2001 @@ -5418,6 +5418,31 @@ return (1); } /*==========================================================================*/ + +static int sbpcd_dev_open(struct inode *inode, struct file *file) +{ + int err; + MOD_INC_USE_COUNT; + err = cdrom_open(inode, file); + if (err) + MOD_DEC_USE_COUNT; + return err; +} + +static int sbpcd_dev_release(struct inode *inode, struct file *file) +{ + int err = cdrom_release(inode, file); + MOD_DEC_USE_COUNT; + return err; +} + +static struct block_device_operations sbpcd_bdops = +{ + open: sbpcd_dev_open, + release: sbpcd_dev_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; /*==========================================================================*/ /* * Open the device special file. Check that a disk is in. Read TOC. @@ -5428,7 +5453,6 @@ i = MINOR(cdi->dev); - MOD_INC_USE_COUNT; down(&ioctl_read_sem); switch_drive(i); @@ -5495,7 +5519,6 @@ } } up(&ioctl_read_sem); - MOD_DEC_USE_COUNT; return ; } /*==========================================================================*/ @@ -5848,7 +5871,7 @@ OUT(MIXER_data,0xCC); /* one nibble per channel, max. value: 0xFF */ #endif /* SOUND_BASE */ - if (devfs_register_blkdev(MAJOR_NR, major_name, &cdrom_fops) != 0) + if (devfs_register_blkdev(MAJOR_NR, major_name, &sbpcd_bdops) != 0) { msg(DBG_INF, "Can't get MAJOR %d for Matsushita CDROM\n", MAJOR_NR); #ifdef MODULE @@ -5923,7 +5946,7 @@ sbpcd_infop->de = devfs_register (devfs_handle, nbuff, DEVFS_FL_DEFAULT, MAJOR_NR, j, S_IFBLK | S_IRUGO | S_IWUGO, - &cdrom_fops, NULL); + &sbpcd_bdops, NULL); if (register_cdrom(sbpcd_infop)) { printk(" sbpcd: Unable to register with Uniform CD-ROm driver\n"); diff -u --recursive --new-file v2.4.13/linux/drivers/char/README.computone linux/drivers/char/README.computone --- v2.4.13/linux/drivers/char/README.computone Fri Feb 16 16:02:36 2001 +++ linux/drivers/char/README.computone Wed Oct 24 12:05:18 2001 @@ -1,227 +1,10 @@ - Computone Intelliport II/Plus Multiport Serial Driver ----------------------------------------------------- -Release Notes For Linux Kernel 2.2 -These notes have been tested on Linux kernels 2.0 and 2.2. - -Please refer to Documentation/computone.txt for information on the driver -that is included with the kernel sources. - - -Version: 1.2.9 -Date: 04/12/2000 -Fixes and Updates: Doug McNash -Historical Author: Andrew Manison -Kernel Integration: Mike Warfield - -1. INTRODUCTION - -This driver supports the entire family of Intelliport II/Plus controllers -with the exception of the MicroChannel controllers. - -This driver was developed on the v2.0.x Linux source tree and has been -tested up to v2.2.14; it will probably not work with earlier v1.X kernels, -and has not yet been tested on the v2.1.x tree. The most likely problems -will be in patching the kernel sources to support the driver. For this -reason there are 2 different patch files for 2.0.XX and 2.2.XX kernels. -Make sure you use the right one! -Note that a version (1.2.5) is included in the 2.2.12+ kernels so this -will not be a new install but and upgrade. - - -2. QUICK INSTALLATION - -Hardware - If you have an ISA card, find a free interrupt and io port. - List those in use with `cat /proc/interrupts` and - `cat /proc/ioports`. Set the card dip switches to that free - address. You may need to configure your BIOS to reserve the - irq for the ISA card. PCI and EISA parameters are set - automagically and need only be set to nonzero values. - Insert card into computer with the power off before or after - driver installation. - -Software - New Installation - -Module installation: - -a) Obtain driver-kernel patch file -b) Copy to the linux source tree root, Run ip2build (if not patch) -c) Determine free irq/address to use if any (configure BIOS if need be) -d) Run "make config" or "make menuconfig" or "make xconfig" - Select (m) module for CONFIG_COMPUTONE under character - devices. CONFIG_PCI and CONFIG_MODULES also may need to be set. -e) Set address on ISA cards then: - edit /usr/src/linux/drivers/char/ip2/ip2.h if needed - or - edit /etc/modules.conf if needed (module). - or both to match this setting. -f) Run "make dep" -g) Run "make modules" -h) Run "make modules_install" -i) Run "/sbin/depmod -a" -i) install driver using `modprobe ip2 ` (options listed below) -j) run mkip2dev - - -Kernel installation: - -a) Obtain driver-kernel patch file -b) Copy to the linux source tree root, Run ip2build (if not patch) -c) Determine free irq/address to use if any (configure BIOS if need be) -d) Run "make config" or "make menuconfig" or "make xconfig" - Select (y) kernel for CONFIG_COMPUTONE under character - devices. CONFIG_PCI may need to be set if you have PCI bus. -e) Set address on ISA cards then: - edit /usr/src/linux/drivers/char/ip2/ip2.h -f) Run "make dep" -g) Run "make zImage" or whatever target you prefer. -h) mv /usr/src/linux/arch/i386/boot/zImage to /boot. -i) add new config for this kernel into /etc/lilo.conf, run "lilo" -j) reboot using this kernel -k) make and run ip2/mkip2dev - -Software - Upgrades - -a) Install new sources in proper location, usually /usr/src/linux/drivers/char -b) Follow steps above to create new kernel or modules - -3. INSTALLATION - -Previously, the driver sources were packaged with a set of patch files -to update the character drivers' makefile and configuration file, and other -kernel source files. A build script (ip2build) was included which applies -the patches if needed, and build any utilities needed. -What you receive may be a single patch file in conventional kernel -patch format build script. That form can also be applied by -running patch -p1 < ThePatchFile. Otherwise the drivers source may be -a tar file, then untar and run ip2build if a new installation. - -The driver can be installed as a module (recommended) or built into the -kernel. This is selected as for other drivers through the `make config` -command from the root of the Linux source tree. If the driver is built -into the kernel you will need to edit the file ip2.h to match the boards -you are installing. See that file for instructions. If the driver is -installed as a module the configuration can also be specified on the -modprobe command line as follows: - - modprobe ip2 irq=irq1,irq2,irq3,irq4 io=addr1,addr2,addr3,addr4 - -where irqnum is one of the valid Intelliport II interrupts (3,4,5,7,10,11, -12,15) and addr1-4 are the base addresses for up to four controllers. If -the irqs are not specified the driver uses the default in ip2/ip2.h (which -selects polled mode). The io addresses are set to io=1 for PCI cards,i -io=2 for EISA cards or io=[some valid ISA address] for ISA cards. If no -base addresses are specified the defaults in ip2.h are used. If you are -autoloading the driver module with kerneld or kmod the base addresses and -interrupt number must also be set in ip2/ip2.h and recompile or just insert -an options line in /etc/modules.conf or both. The command line takes -precidence over the options line which takes precidence over the defaults -in ip2.h. - -command line sample: - - modprobe ip2 io=1,0x328 irq=1,10 - -/etc/modules.conf sample: - - options ip2 io=1,0x328 irq=1,10 - alias char-major-71 ip2 - alias char-major-72 ip2 - alias char-major-73 ip2 - -the equivelant ip2.h: - -static ip2config_t ip2config = -{ - {1,10,0,0}, - { - 0x0001, // Board 0, ttyF0 - ttyF63 /* PCI card */ - 0x0328, // Board 1, ttyF64 - ttyF127 /* ISA card */ - 0x0000, // Board 2, ttyF128 - ttyF191 /* empty */ - 0x0000 // Board 3, ttyF192 - ttyF255 /* empty */ - } -}; - -Specifying an invalid or in-use ISA irq will default the driver into -running in polled mode for that card. If all irq entries are 0 then -all cards will operate in polled mode. Note that the PCI will be -assigned it's irq by the BIOS and may not match what you specify. -It must be non-zero otherwise it will be polled. - -Tarball Install: - -The whole tarfile should be untarred in the /usr/src/linux/drivers/char/ -directory. Most files required for the driver are placed in the ip2 -subdirectory. Then execute the script (for a new install only) - - ip2build - -which will patch the files. - -Kernel Patch Install: - - cd to the Linux source root, run patch -p1 < ThePatchFile. - -Now return to the root directory of the Linux -source tree and run make config or make menuconfig. You will be prompted -for the Computone drivers, either as a module or part of the kernel. -If you have a PCI card you many need to select PCI bios support (CONFIG_PCI) -if not enabled already. Ditto for CONFIG_MODULES if you use modules. - -If you select the driver as part of the kernel run : - - make depend - make bzImage(,zlilo or whatever you do to create a bootable kernel) - -If you selected a module run : - - make modules && make modules_install - -The utility ip2mkdev creates all the device nodes required by the driver. -For a device to be created it must be configured in the driver and the -board must be installed. Only devices corresponding to real IntelliPort II -ports are created. With multiple boards and expansion boxes this will -leave gaps in the sequence of device names. ip2mkdev uses Linux tty naming -conventions: ttyF0 - ttyF255 for normal devices, and cuf0 - cuf255 for -callout devices. Note that the callout devices are going away in the -future and that is what the warning messages are trying to tell you. - -4. USING THE DRIVERS - -As noted above, the driver implements the ports in accordance with Linux -conventions, and the devices should be interchangeable with the standard -serial devices. (This is a key point for problem reporting: please make -sure that what you are trying do works on the ttySx/cuax ports first; then -tell us what went wrong with the ip2 ports!) - -Higher speeds can be obtained using the setserial utility which remaps -38,400 bps (extb) to 57,600 bps, 115,200 bps, or a custom speed. -Intelliport II installations using the PowerPort expansion module can -use the custom speed setting to select the highest speeds: 153,600 bps, -230,400 bps, 307,200 bps, 460,800bps and 921,600 bps. The base for -custom baud rate configuration is fixed at 921,600 for cards/expantion -modules with ST654's and 115200 for those with Cirrus CD1400's. This -corresponds to the maximum bit rates those chips are capable. -For example if the baud base is 921600 and the baud divisor is 18 then -the custom rate is 921600/18 = 51200 bps. See the setserial man page for -complete details. Of course, if stty accepts the higher rates now you can -use that as well as the standard ioctls(). - -5. NOTES - -This is a release version of the driver, but it is impossible to test it -in all configurations of Linux. If there is any anomalous behaviour that -does not match the standard serial port's behaviour please let us know. - -Some installations report that characters fail to echo immediatly at a -terminal if the kernel/modules are compiled with the CONFIG_M386 and -the card is run in polling mode on a pentium class machine. Compiling -with a more appropriate processor flag or running on interrupt would be -the fix as well as the wise thing to do. +Release Notes For Linux Kernel 2.2 and higher +This file is now deprecated and will be removed at some point. +Please refer to the file Documentation/computone.txt instead. -Author: dougm@computone.com -Testing: larryg@computone.com -Support: support@computone.com +Michael H. Warfield 08/12/2001 diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/i2cmd.c linux/drivers/char/ip2/i2cmd.c --- v2.4.13/linux/drivers/char/ip2/i2cmd.c Wed Jul 25 17:10:19 2001 +++ linux/drivers/char/ip2/i2cmd.c Wed Oct 24 12:05:18 2001 @@ -139,7 +139,7 @@ //static UCHAR ct86[]={ 2, BTH, 0x56,0 }; // RCV_ENABLE static UCHAR ct87[] = { 1, BYP, 0x57 }; // HW_TEST //static UCHAR ct88[]={ 3, BTH, 0x58,0,0 }; // RCV_THRESHOLD -//static UCHAR ct89[]={ 1, BYP, 0x59 }; // DSS_NOW +static UCHAR ct89[]={ 1, BYP, 0x59 }; // DSS_NOW //static UCHAR ct90[]={ 3, BYP, 0x5A,0,0 }; // Set SILO //static UCHAR ct91[]={ 2, BYP, 0x5B,0 }; // timed break diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/i2ellis.c linux/drivers/char/ip2/i2ellis.c --- v2.4.13/linux/drivers/char/ip2/i2ellis.c Mon Oct 16 12:58:51 2000 +++ linux/drivers/char/ip2/i2ellis.c Wed Oct 24 12:05:18 2001 @@ -552,6 +552,9 @@ pB->i2eStartMail = iiGetMail(pB); + // Throw it away and clear the mailbox structure element + pB->i2eStartMail = NO_MAIL_HERE; + // Everything is ok now, return with good status/ pB->i2eValid = I2E_MAGIC; @@ -592,14 +595,27 @@ static void ii2DelayTimer(unsigned int mseconds) { + wait_queue_t wait; + + init_waitqueue_entry(&wait, current); + init_timer ( pDelayTimer ); + add_wait_queue(&pDelayWait, &wait); + + set_current_state( TASK_INTERRUPTIBLE ); + pDelayTimer->expires = jiffies + ( mseconds + 9 ) / 10; pDelayTimer->function = ii2DelayWakeup; pDelayTimer->data = 0; add_timer ( pDelayTimer ); - interruptible_sleep_on ( &pDelayWait ); + + schedule(); + + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pDelayWait, &wait); + del_timer ( pDelayTimer ); } diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/i2ellis.h linux/drivers/char/ip2/i2ellis.h --- v2.4.13/linux/drivers/char/ip2/i2ellis.h Wed Jul 5 11:00:22 2000 +++ linux/drivers/char/ip2/i2ellis.h Wed Oct 24 12:05:18 2001 @@ -400,6 +400,12 @@ rwlock_t read_fifo_spinlock; rwlock_t write_fifo_spinlock; +// For queuing interupt bottom half handlers. /\/\|=mhw=|\/\/ + struct tq_struct tqueue_interrupt; + + struct timer_list SendPendingTimer; // Used by iiSendPending + unsigned int SendPendingRetry; + #ifdef CONFIG_DEVFS_FS /* Device handles into devfs */ devfs_handle_t devfs_ipl_handle; diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/i2lib.c linux/drivers/char/ip2/i2lib.c --- v2.4.13/linux/drivers/char/ip2/i2lib.c Wed Jul 5 11:00:22 2000 +++ linux/drivers/char/ip2/i2lib.c Wed Oct 24 12:05:18 2001 @@ -174,6 +174,25 @@ pB->i2eWaitingForEmptyFifo |= (pB->i2eOutMailWaiting & MB_OUT_STUFFED); pB->i2eOutMailWaiting = 0; + pB->SendPendingRetry = 0; + } else { +/* The only time we hit this area is when "iiTrySendMail" has + failed. That only occurs when the outbound mailbox is + still busy with the last message. We take a short breather + to let the board catch up with itself and then try again. + 16 Retries is the limit - then we got a borked board. + /\/\|=mhw=|\/\/ */ + + if( ++pB->SendPendingRetry < 16 ) { + + init_timer( &(pB->SendPendingTimer) ); + pB->SendPendingTimer.expires = jiffies + 1; + pB->SendPendingTimer.function = (void*)(unsigned long)iiSendPendingMail; + pB->SendPendingTimer.data = (unsigned long)pB; + add_timer( &(pB->SendPendingTimer) ); + } else { + printk( KERN_ERR "IP2: iiSendPendingMail unable to queue outbound mail\n" ); + } } } } @@ -225,6 +244,8 @@ pB->i2Dbuf_strip = pB->i2Dbuf_stuff = 0; pB->i2Bbuf_strip = pB->i2Bbuf_stuff = 0; + pB->SendPendingRetry = 0; + memset ( pCh, 0, sizeof (i2ChanStr) * nChannels ); for (index = stuffIndex = 0, ppCh = (i2ChanStrPtr *)(pB->i2Fbuf); @@ -311,13 +332,11 @@ pCh->ClosingDelay = 5*HZ/10; pCh->ClosingWaitTime = 30*HZ; -#ifdef USE_IQ // Initialize task queue objects pCh->tqueue_input.routine = (void(*)(void*)) do_input; pCh->tqueue_input.data = pCh; pCh->tqueue_status.routine = (void(*)(void*)) do_status; pCh->tqueue_status.data = pCh; -#endif pCh->trace = ip2trace; @@ -1294,6 +1313,7 @@ static void i2DrainOutput(i2ChanStrPtr pCh, int timeout) { + wait_queue_t wait; i2eBordStrPtr pB; #ifdef IP2DEBUG_TRACE @@ -1323,9 +1343,18 @@ } i2QueueCommands( PTYPE_INLINE, pCh, -1, 1, CMD_BMARK_REQ ); + + init_waitqueue_entry(&wait, current); + add_wait_queue(&(pCh->pBookmarkWait), &wait); + set_current_state( TASK_INTERRUPTIBLE ); + serviceOutgoingFifo( pB ); - interruptible_sleep_on( &(pCh->pBookmarkWait) ); + schedule(); // Now we take our interruptible sleep on + + // Clean up the queue + set_current_state( TASK_RUNNING ); + remove_wait_queue(&(pCh->pBookmarkWait), &wait); // if expires == 0 then timer poped, then do not need to del_timer if ((timeout > 0) && pCh->BookmarkTimer.expires && @@ -2212,7 +2241,11 @@ unsigned long flags; - inmail = iiGetMail(pB); + /* This should be atomic because of the way we are called... */ + if (NO_MAIL_HERE == ( inmail = pB->i2eStartMail ) ) { + inmail = iiGetMail(pB); + } + pB->i2eStartMail = NO_MAIL_HERE; #ifdef IP2DEBUG_TRACE ip2trace (ITRC_NO_PORT, ITRC_INTR, 2, 1, inmail ); diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/ip2.h linux/drivers/char/ip2/ip2.h --- v2.4.13/linux/drivers/char/ip2/ip2.h Sat Nov 6 10:38:40 1999 +++ linux/drivers/char/ip2/ip2.h Wed Oct 24 12:05:18 2001 @@ -94,10 +94,20 @@ * /etc/modules.conf and load with modprobe, kerneld or kmod, the kernel * module loader */ + + /* This structure is NOW always initialized when the driver is initialized. + * Compiled in defaults MUST be added to the io and irq arrays in + * ip2.c. Those values are configurable from insmod parameters in the + * case of modules or from command line parameters (ip2=io,irq) when + * compiled in. + */ + static ip2config_t ip2config = { {0,0,0,0}, // irqs { // Addresses + /* Do NOT set compile time defaults HERE! Use the arrays in + ip2.c! These WILL be overwritten! =mhw= */ 0x0000, // Board 0, ttyF0 - ttyF63 0x0000, // Board 1, ttyF64 - ttyF127 0x0000, // Board 2, ttyF128 - ttyF191 diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2.c linux/drivers/char/ip2.c --- v2.4.13/linux/drivers/char/ip2.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/char/ip2.c Wed Oct 24 12:05:18 2001 @@ -27,10 +27,15 @@ int ip2_loadmain(int *, int *, unsigned char *, int ); // ref into ip2main.c -#ifdef MODULE +/* Note: Add compiled in defaults to these arrays, not to the structure + in ip2/ip2.h any longer. That structure WILL get overridden + by these values, or command line values, or insmod values!!! =mhw= +*/ +static int io[IP2_MAX_BOARDS]= { 0, 0, 0, 0 }; +static int irq[IP2_MAX_BOARDS] = { -1, -1, -1, -1 }; +static int poll_only = 0; -static int io[IP2_MAX_BOARDS]= { 0,}; -static int irq[IP2_MAX_BOARDS] = { 0,}; +#ifdef MODULE # if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) MODULE_AUTHOR("Doug McNash"); @@ -39,6 +44,8 @@ MODULE_PARM_DESC(irq,"Interrupts for IntelliPort Cards"); MODULE_PARM(io,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i"); MODULE_PARM_DESC(io,"I/O ports for IntelliPort Cards"); + MODULE_PARM(poll_only,"1i"); + MODULE_PARM_DESC(poll_only,"Do not use card interrupts"); # endif /* LINUX_VERSION */ @@ -50,6 +57,11 @@ MOD_INC_USE_COUNT; // hold till done + if( poll_only ) { + /* Hard lock the interrupts to zero */ + irq[0] = irq[1] = irq[2] = irq[3] = 0; + } + rc = ip2_loadmain(io,irq,(unsigned char *)fip_firm,sizeof(fip_firm)); // The call to lock and load main, create dep @@ -61,7 +73,7 @@ int ip2_init(void) { - // call to this is int tty_io.c so we need this + // call to this is in tty_io.c so we need this return 0; } @@ -79,9 +91,61 @@ # define NULL ((void *) 0) #endif +/****************************************************************************** + * ip2_setup: + * str: kernel command line string + * + * Can't autoprobe the boards so user must specify configuration on + * kernel command line. Sane people build it modular but the others + * come here. + * + * Alternating pairs of io,irq for up to 4 boards. + * ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3 + * + * io=0 => No board + * io=1 => PCI + * io=2 => EISA + * else => ISA I/O address + * + * irq=0 or invalid for ISA will revert to polling mode + * + * Any value = -1, do not overwrite compiled in value. + * + ******************************************************************************/ +static int __init ip2_setup(char *str) +{ + int ints[10]; /* 4 boards, 2 parameters + 2 */ + int i, j; + + str = get_options (str, ARRAY_SIZE(ints), ints); + + for( i = 0, j = 1; i < 4; i++ ) { + if( j > ints[0] ) { + break; + } + if( ints[j] >= 0 ) { + io[i] = ints[j]; + } + j++; + if( j > ints[0] ) { + break; + } + if( ints[j] >= 0 ) { + irq[i] = ints[j]; + } + j++; + } + return 1; +} + int ip2_init(void) { - return ip2_loadmain(NULL,NULL,(unsigned char *)fip_firm,sizeof(fip_firm)); + return ip2_loadmain(io,irq,(unsigned char *)fip_firm,sizeof(fip_firm)); } + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,13)) +__setup("ip2=", ip2_setup); +__initcall(ip2_init); +#endif #endif /* !MODULE */ diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2main.c linux/drivers/char/ip2main.c --- v2.4.13/linux/drivers/char/ip2main.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/char/ip2main.c Wed Oct 24 12:05:18 2001 @@ -12,8 +12,30 @@ *******************************************************************************/ // ToDo: // +// Fix the immediate DSS_NOW problem. +// // Done: // +// 1.2.12 /\/\|=mhw=|\/\/ +// Cleaned up some remove queue cut and paste errors +// +// 1.2.11 /\/\|=mhw=|\/\/ +// Clean up potential NULL pointer dereferences +// Clean up devfs registration +// Add kernel command line parsing for io and irq +// Compile defaults for io and irq are now set in ip2.c not ip2/ip2.h! +// Reworked poll_only hack for explicit parameter setting +// You must now EXPLICITLY set poll_only = 1 or set all irqs to 0 +// Merged ip2_loadmain and old_ip2_init +// Converted all instances of interruptible_sleep_on into queue calls +// Most of these had no race conditions but better to clean up now +// +// 1.2.10 /\/\|=mhw=|\/\/ +// Fixed the bottom half interrupt handler and enabled USE_IQI +// to split the interrupt handler into a formal top-half / bottom-half +// Fixed timing window on high speed processors that queued messages to +// the outbound mail fifo faster than the board could handle. +// // 1.2.9 // Four box EX was barfing on >128k kmalloc, made structure smaller by // reducing output buffer size @@ -193,7 +215,7 @@ /* String constants to identify ourselves */ static char *pcName = "Computone IntelliPort Plus multiport driver"; -static char *pcVersion = "1.2.9"; +static char *pcVersion = "1.2.11"; /* String constants for port names */ static char *pcDriver_name = "ip2"; @@ -225,8 +247,6 @@ void cleanup_module(void); #endif -int old_ip2_init(void); - /* Private (static) functions */ static int ip2_open(PTTY, struct file *); static void ip2_close(PTTY, struct file *); @@ -246,6 +266,7 @@ static void ip2_hangup(PTTY); static void set_irq(int, int); +static void ip2_interrupt_bh(i2eBordStrPtr pB); static void ip2_interrupt(int irq, void *dev_id, struct pt_regs * regs); static void ip2_poll(unsigned long arg); static inline void service_all_boards(void); @@ -310,11 +331,11 @@ open: ip2_ipl_open, }; -static long irq_counter; -static long bh_counter; +static unsigned long irq_counter = 0; +static unsigned long bh_counter = 0; // Use immediate queue to service interrupts -//#define USE_IQI // PCI&2.2 needs work +#define USE_IQI //#define USE_IQ // PCI&2.2 needs work /* The timer_list entry for our poll routine. If interrupt operation is not @@ -364,7 +385,7 @@ # endif /* LINUX_VERSION */ #endif /* MODULE */ -static int poll_only; +static int poll_only = 0; static int Eisa_irq; static int Eisa_slot; @@ -373,32 +394,6 @@ static char rirqs[IP2_MAX_BOARDS]; static int Valid_Irqs[] = { 3, 4, 5, 7, 10, 11, 12, 15, 0}; -/******************************************************************************/ -/* Initialisation Section */ -/******************************************************************************/ -int -ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) -{ - int i; - /* process command line arguments to modprobe or insmod i.e. iop & irqp */ - /* otherwise ip2config is initialized by what's in ip2/ip2.h */ - /* command line trumps initialization in ip2.h */ - /* first two args are null if builtin to kernel */ - if ((irqp != NULL) || (iop != NULL)) { - for ( i = 0; i < IP2_MAX_BOARDS; ++i ) { - if (irqp && irqp[i]) { - ip2config.irq[i] = irqp[i]; - } - if (iop && iop[i]) { - ip2config.addr[i] = iop[i]; - } - } - } - Fip_firmware = firmware; - Fip_firmware_size = firmsize; - return old_ip2_init(); -} - // Some functions to keep track of what irq's we have static int __init @@ -461,7 +456,6 @@ #ifdef IP2DEBUG_INIT printk (KERN_DEBUG "Loading module ...\n" ); #endif - //was return old_ip2_init(); return 0; } #endif /* MODULE */ @@ -559,8 +553,9 @@ #endif /* MODULE */ /******************************************************************************/ -/* Function: old_ip2_init() */ +/* Function: ip2_loadmain() */ /* Parameters: irq, io from command line of insmod et. al. */ +/* pointer to fip firmware and firmware size for boards */ /* Returns: Success (0) */ /* */ /* Description: */ @@ -575,7 +570,7 @@ #define IP2_SA_FLAGS 0 int __init -old_ip2_init(void) +ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) { #ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_handle; @@ -592,6 +587,39 @@ ip2trace (ITRC_NO_PORT, ITRC_INIT, ITRC_ENTER, 0 ); #endif + /* process command line arguments to modprobe or + insmod i.e. iop & irqp */ + /* irqp and iop should ALWAYS be specified now... But we check + them individually just to be sure, anyways... */ + for ( i = 0; i < IP2_MAX_BOARDS; ++i ) { + if (iop) { + ip2config.addr[i] = iop[i]; + if (irqp) { + if( irqp[i] >= 0 ) { + ip2config.irq[i] = irqp[i]; + } else { + ip2config.irq[i] = 0; + } + // This is a little bit of a hack. If poll_only=1 on command + // line back in ip2.c OR all IRQs on all specified boards are + // explicitly set to 0, then drop to poll only mode and override + // PCI or EISA interrupts. This superceeds the old hack of + // triggering if all interrupts were zero (like da default). + // Still a hack but less prone to random acts of terrorism. + // + // What we really should do, now that the IRQ default is set + // to -1, is to use 0 as a hard coded, do not probe. + // + // /\/\|=mhw=|\/\/ + poll_only |= irqp[i]; + } + } + } + poll_only = !poll_only; + + Fip_firmware = firmware; + Fip_firmware_size = firmsize; + /* Announce our presence */ printk( KERN_INFO "%s version %s\n", pcName, pcVersion ); @@ -604,12 +632,6 @@ } loaded++; - /* if all irq config is zero we shall poll_only */ - for ( i = 0; i < IP2_MAX_BOARDS; ++i ) { - poll_only |= ip2config.irq[i]; - } - poll_only = !poll_only; - /* Initialise the iiEllis subsystem. */ iiEllisInit(); @@ -672,10 +694,13 @@ pcibios_read_config_byte(pci_bus, pci_devfn, PCI_INTERRUPT_LINE, &pci_irq); - if (!is_valid_irq(pci_irq)) { - printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); - pci_irq = 0; - } +// If the PCI BIOS assigned it, lets try and use it. If we +// can't acquire it or it screws up, deal with it then. + +// if (!is_valid_irq(pci_irq)) { +// printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); +// pci_irq = 0; +// } ip2config.irq[i] = pci_irq; } else { // ann error ip2config.addr[i] = 0; @@ -706,10 +731,13 @@ status = pci_read_config_byte(pci_dev_i, PCI_INTERRUPT_LINE, &pci_irq); - if (!is_valid_irq(pci_irq)) { - printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); - pci_irq = 0; - } +// If the PCI BIOS assigned it, lets try and use it. If we +// can't acquire it or it screws up, deal with it then. + +// if (!is_valid_irq(pci_irq)) { +// printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); +// pci_irq = 0; +// } ip2config.irq[i] = pci_irq; } else { // ann error ip2config.addr[i] = 0; @@ -868,41 +896,45 @@ } #ifdef CONFIG_DEVFS_FS - sprintf( name, "ipl%d", i ); - i2BoardPtrTable[i]->devfs_ipl_handle = - devfs_register (devfs_handle, name, - DEVFS_FL_DEFAULT, - IP2_IPL_MAJOR, 4 * i, - S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, - &ip2_ipl, NULL); - - sprintf( name, "stat%d", i ); - i2BoardPtrTable[i]->devfs_stat_handle = - devfs_register (devfs_handle, name, - DEVFS_FL_DEFAULT, - IP2_IPL_MAJOR, 4 * i + 1, - S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, - &ip2_ipl, NULL); - - for ( box = 0; box < ABS_MAX_BOXES; ++box ) - { - for ( j = 0; j < ABS_BIGGEST_BOX; ++j ) + if ( NULL != ( pB = i2BoardPtrTable[i] ) ) { + sprintf( name, "ipl%d", i ); + pB->devfs_ipl_handle = + devfs_register (devfs_handle, name, + DEVFS_FL_DEFAULT, + IP2_IPL_MAJOR, 4 * i, + S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, + &ip2_ipl, NULL); + + sprintf( name, "stat%d", i ); + pB->devfs_stat_handle = + devfs_register (devfs_handle, name, + DEVFS_FL_DEFAULT, + IP2_IPL_MAJOR, 4 * i + 1, + S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, + &ip2_ipl, NULL); + + for ( box = 0; box < ABS_MAX_BOXES; ++box ) { - if ( pB->i2eChannelMap[box] & (1 << j) ) - { - tty_register_devfs(&ip2_tty_driver, - 0, j + ABS_BIGGEST_BOX * - (box+i*ABS_MAX_BOXES)); - tty_register_devfs(&ip2_callout_driver, - 0, j + ABS_BIGGEST_BOX * - (box+i*ABS_MAX_BOXES)); - } + for ( j = 0; j < ABS_BIGGEST_BOX; ++j ) + { + if ( pB->i2eChannelMap[box] & (1 << j) ) + { + tty_register_devfs(&ip2_tty_driver, + 0, j + ABS_BIGGEST_BOX * + (box+i*ABS_MAX_BOXES)); + tty_register_devfs(&ip2_callout_driver, + 0, j + ABS_BIGGEST_BOX * + (box+i*ABS_MAX_BOXES)); + } + } } } #endif if (poll_only) { - ip2config.irq[i] = CIR_POLL; +// Poll only forces driver to only use polling and +// to ignore the probed PCI or EISA interrupts. + ip2config.irq[i] = CIR_POLL; } if ( ip2config.irq[i] == CIR_POLL ) { retry: @@ -963,26 +995,24 @@ if ( !iiInitialize ( pB ) ) { printk ( KERN_ERR "IP2: Failed to initialize board at 0x%x, error %d\n", pB->i2eBase, pB->i2eError ); - kfree ( pB ); - i2BoardPtrTable[boardnum] = NULL; - return; + goto err_initialize; } - printk(KERN_INFO "Board %d: addr=0x%x irq=%d ", boardnum + 1, + printk(KERN_INFO "IP2: Board %d: addr=0x%x irq=%d\n", boardnum + 1, ip2config.addr[boardnum], ip2config.irq[boardnum] ); if (0 != ( rc = check_region( ip2config.addr[boardnum], 8))) { - i2BoardPtrTable[boardnum] = NULL; - printk(KERN_ERR "bad addr=0x%x rc = %d\n", + printk(KERN_ERR "IP2: bad addr=0x%x rc = %d\n", ip2config.addr[boardnum], rc ); - return; + goto err_initialize; } request_region( ip2config.addr[boardnum], 8, pcName ); if ( iiDownloadAll ( pB, (loadHdrStrPtr)Fip_firmware, 1, Fip_firmware_size ) != II_DOWN_GOOD ) { - printk ( KERN_ERR "IP2:failed to download loadware " ); + printk ( KERN_ERR "IP2: failed to download loadware\n" ); + goto err_release_region; } else { - printk ( KERN_INFO "fv=%d.%d.%d lv=%d.%d.%d\n", + printk ( KERN_INFO "IP2: fv=%d.%d.%d lv=%d.%d.%d\n", pB->i2ePom.e.porVersion, pB->i2ePom.e.porRevision, pB->i2ePom.e.porSubRev, pB->i2eLVersion, @@ -992,24 +1022,24 @@ switch ( pB->i2ePom.e.porID & ~POR_ID_RESERVED ) { default: - printk( KERN_ERR "IP2: Unknown board type, ID = %x", + printk( KERN_ERR "IP2: Unknown board type, ID = %x\n", pB->i2ePom.e.porID ); nports = 0; - goto ex_exit; + goto err_release_region; break; case POR_ID_II_4: /* IntelliPort-II, ISA-4 (4xRJ45) */ - printk ( KERN_INFO "ISA-4" ); + printk ( KERN_INFO "IP2: ISA-4\n" ); nports = 4; break; case POR_ID_II_8: /* IntelliPort-II, 8-port using standard brick. */ - printk ( KERN_INFO "ISA-8 std" ); + printk ( KERN_INFO "IP2: ISA-8 std\n" ); nports = 8; break; case POR_ID_II_8R: /* IntelliPort-II, 8-port using RJ11's (no CTS) */ - printk ( KERN_INFO "ISA-8 RJ11" ); + printk ( KERN_INFO "IP2: ISA-8 RJ11\n" ); nports = 8; break; @@ -1030,8 +1060,14 @@ } DevTableMem[boardnum] = pCh = kmalloc( sizeof(i2ChanStr) * nports, GFP_KERNEL ); + if ( !pCh ) { + printk ( KERN_ERR "IP2: (i2_init_channel:) Out of memory.\n"); + goto err_release_region; + } if ( !i2InitChannels( pB, nports, pCh ) ) { - printk(KERN_ERR "i2InitChannels failed: %d\n",pB->i2eError); + printk(KERN_ERR "IP2: i2InitChannels failed: %d\n",pB->i2eError); + kfree ( pCh ); + goto err_release_region; } pB->i2eChannelPtr = &DevTable[portnum]; pB->i2eChannelCnt = ABS_MOST_PORTS; @@ -1045,17 +1081,24 @@ } } } - printk(KERN_INFO "IP2: EX box=%d ports=%d %d bit", + printk(KERN_INFO "IP2: EX box=%d ports=%d %d bit\n", nboxes, nports, pB->i2eDataWidth16 ? 16 : 8 ); } goto ex_exit; - break; } DevTableMem[boardnum] = pCh = kmalloc ( sizeof (i2ChanStr) * nports, GFP_KERNEL ); + if ( !pCh ) { + printk ( KERN_ERR "IP2: (i2_init_channel:) Out of memory.\n"); + goto err_release_region; + } pB->i2eChannelPtr = pCh; pB->i2eChannelCnt = nports; - i2InitChannels ( pB, pB->i2eChannelCnt, pCh ); + if ( !i2InitChannels( pB, nports, pCh ) ) { + printk(KERN_ERR "IP2: i2InitChannels failed: %d\n",pB->i2eError); + kfree ( pCh ); + goto err_release_region; + } pB->i2eChannelPtr = &DevTable[IP2_PORTS_PER_BOARD * boardnum]; for( i = 0; i < pB->i2eChannelCnt; ++i ) { @@ -1064,7 +1107,16 @@ pCh++; } ex_exit: - printk ( KERN_INFO "\n" ); + pB->tqueue_interrupt.routine = (void(*)(void*)) ip2_interrupt_bh; + pB->tqueue_interrupt.data = pB; + return; + +err_release_region: + release_region(ip2config.addr[boardnum], 8); +err_initialize: + kfree ( pB ); + i2BoardPtrTable[boardnum] = NULL; + return; } /******************************************************************************/ @@ -1262,16 +1314,34 @@ } -#ifdef USE_IQI -static struct tq_struct -senior_service = -{ // it's the death that worse than fate - NULL, - 0, - (void(*)(void*)) service_all_boards, - NULL, //later - board address XXX -}; -#endif +/******************************************************************************/ +/* Function: ip2_interrupt_bh(pB) */ +/* Parameters: pB - pointer to the board structure */ +/* Returns: Nothing */ +/* */ +/* Description: */ +/* Service the board in a bottom half interrupt handler and then */ +/* reenable the board's interrupts if it has an IRQ number */ +/* */ +/******************************************************************************/ +static void +ip2_interrupt_bh(i2eBordStrPtr pB) +{ +// pB better well be set or we have a problem! We can only get +// here from the IMMEDIATE queue. Here, we process the boards. +// Checking pB doesn't cost much and it saves us from the sanity checkers. + + bh_counter++; + + if ( pB ) { + i2ServiceBoard( pB ); + if( pB->i2eUsingIrq ) { +// Re-enable his interrupts + iiEnableMailIrq(pB); + } + } +} + /******************************************************************************/ /* Function: ip2_interrupt(int irq, void *dev_id, struct pt_regs * regs) */ @@ -1282,6 +1352,14 @@ /* */ /* Description: */ /* */ +/* Our task here is simply to identify each board which needs servicing. */ +/* If we are queuing then, queue it to be serviced, and disable its irq */ +/* mask otherwise process the board directly. */ +/* */ +/* We could queue by IRQ but that just complicates things on both ends */ +/* with very little gain in performance (how many instructions does */ +/* it take to iterate on the immediate queue). */ +/* */ /* */ /******************************************************************************/ static void @@ -1294,22 +1372,36 @@ ip2trace (ITRC_NO_PORT, ITRC_INTR, 99, 1, irq ); #endif -#ifdef USE_IQI - - queue_task(&senior_service, &tq_immediate); - mark_bh(IMMEDIATE_BH); - -#else /* Service just the boards on the list using this irq */ for( i = 0; i < i2nBoards; ++i ) { pB = i2BoardPtrTable[i]; + +// Only process those boards which match our IRQ. +// IRQ = 0 for polled boards, we won't poll "IRQ" boards + if ( pB && (pB->i2eUsingIrq == irq) ) { +#ifdef USE_IQI + + if (NO_MAIL_HERE != ( pB->i2eStartMail = iiGetMail(pB))) { +// Disable his interrupt (will be enabled when serviced) +// This is mostly to protect from reentrancy. + iiDisableMailIrq(pB); + +// Park the board on the immediate queue for processing. + queue_task(&pB->tqueue_interrupt, &tq_immediate); + +// Make sure the immediate queue is flagged to fire. + mark_bh(IMMEDIATE_BH); + } +#else +// We are using immediate servicing here. This sucks and can +// cause all sorts of havoc with ppp and others. The failsafe +// check on iiSendPendingMail could also throw a hairball. i2ServiceBoard( pB ); +#endif /* USE_IQI */ } } -#endif /* USE_IQI */ - ++irq_counter; #ifdef IP2DEBUG_TRACE @@ -1335,19 +1427,11 @@ #endif TimerOn = 0; // it's the truth but not checked in service - bh_counter++; - -#ifdef USE_IQI - - queue_task(&senior_service, &tq_immediate); - mark_bh(IMMEDIATE_BH); - -#else - // Just polled boards, service_all might be better + // Just polled boards, IRQ = 0 will hit all non-interrupt boards. + // It will NOT poll boards handled by hard interrupts. + // The issue of queued BH interrups is handled in ip2_interrupt(). ip2_interrupt(0, NULL, NULL); -#endif /* USE_IQI */ - PollTimer.expires = POLL_TIMEOUT; add_timer( &PollTimer ); TimerOn = 1; @@ -1515,6 +1599,7 @@ static int ip2_open( PTTY tty, struct file *pFile ) { + wait_queue_t wait; int rc = 0; int do_clocal = 0; i2ChanStrPtr pCh = DevTable[MINOR(tty->device)]; @@ -1548,14 +1633,23 @@ * 1. If the port is in the middle of closing wait for the completion * and then return the appropriate error. */ + init_waitqueue_entry(&wait, current); + add_wait_queue(&pCh->close_wait, &wait); + set_current_state( TASK_INTERRUPTIBLE ); + if ( tty_hung_up_p(pFile) || ( pCh->flags & ASYNC_CLOSING )) { if ( pCh->flags & ASYNC_CLOSING ) { - interruptible_sleep_on( &pCh->close_wait); + schedule(); } if ( tty_hung_up_p(pFile) ) { + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->close_wait, &wait); return( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EAGAIN : -ERESTARTSYS; } } + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->close_wait, &wait); + /* * 2. If this is a callout device, make sure the normal port is not in * use, and that someone else doesn't have the callout device locked. @@ -1608,13 +1702,20 @@ #endif ++pCh->wopen; + + init_waitqueue_entry(&wait, current); + add_wait_queue(&pCh->open_wait, &wait); + for(;;) { if ( !(pCh->flags & ASYNC_CALLOUT_ACTIVE)) { i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_DTRUP, CMD_RTSUP); pCh->dataSetOut |= (I2_DTR | I2_RTS); + set_current_state( TASK_INTERRUPTIBLE ); serviceOutgoingFifo( pCh->pMyBord ); } if ( tty_hung_up_p(pFile) ) { + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->open_wait, &wait); return ( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EBUSY : -ERESTARTSYS; } if ( !(pCh->flags & ASYNC_CALLOUT_ACTIVE) && @@ -1640,8 +1741,11 @@ rc = (( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EAGAIN : -ERESTARTSYS); break; } - interruptible_sleep_on(&pCh->open_wait); + schedule(); } + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->open_wait, &wait); + --pCh->wopen; //why count? #ifdef IP2DEBUG_TRACE ip2trace (CHANN, ITRC_OPEN, 4, 0 ); @@ -1814,6 +1918,10 @@ { i2ChanStrPtr pCh = tty->driver_data; + if( !pCh ) { + return; + } + #ifdef IP2DEBUG_TRACE ip2trace (CHANN, ITRC_HANGUP, ITRC_ENTER, 0 ); #endif @@ -1824,7 +1932,7 @@ i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_DCD_NREP); i2QueueCommands(PTYPE_INLINE, pCh, 0, 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB); - if ( !tty || (tty->termios->c_cflag & HUPCL) ) { + if ( (tty->termios->c_cflag & HUPCL) ) { i2QueueCommands(PTYPE_BYPASS, pCh, 0, 2, CMD_RTSDN, CMD_DTRDN); pCh->dataSetOut &= ~(I2_DTR | I2_RTS); i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_PAUSE(25)); @@ -2173,6 +2281,7 @@ static int ip2_ioctl ( PTTY tty, struct file *pFile, UINT cmd, ULONG arg ) { + wait_queue_t wait; i2ChanStrPtr pCh = DevTable[MINOR(tty->device)]; struct async_icount cprev, cnow; /* kernel counter temps */ struct serial_icounter_struct *p_cuser; /* user space */ @@ -2296,14 +2405,29 @@ to return the DSS signal status immediately. Why doesn't it do the same thing in 2.2.14? */ -/* + +/* This thing is still busted in the 1.2.12 driver on 2.4.x + and even hoses the serial console so the oops can be trapped. + /\/\|=mhw=|\/\/ */ + +#ifdef ENABLE_DSSNOW i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DSS_NOW); + + init_waitqueue_entry(&wait, current); + add_wait_queue(&pCh->dss_now_wait, &wait); + set_current_state( TASK_INTERRUPTIBLE ); + serviceOutgoingFifo( pCh->pMyBord ); - interruptible_sleep_on(&pCh->dss_now_wait); + + schedule(); + + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->dss_now_wait, &wait); + if (signal_pending(current)) { return -EINTR; } -*/ +#endif PUT_USER(rc, ((pCh->dataSetOut & I2_RTS) ? TIOCM_RTS : 0) | ((pCh->dataSetOut & I2_DTR) ? TIOCM_DTR : 0) @@ -2334,12 +2458,16 @@ restore_flags(flags); i2QueueCommands(PTYPE_BYPASS, pCh, 100, 4, CMD_DCD_REP, CMD_CTS_REP, CMD_DSR_REP, CMD_RI_REP); + init_waitqueue_entry(&wait, current); + add_wait_queue(&pCh->delta_msr_wait, &wait); + set_current_state( TASK_INTERRUPTIBLE ); + serviceOutgoingFifo( pCh->pMyBord ); for(;;) { #ifdef IP2DEBUG_TRACE ip2trace (CHANN, ITRC_IOCTL, 10, 0 ); #endif - interruptible_sleep_on(&pCh->delta_msr_wait); + schedule(); #ifdef IP2DEBUG_TRACE ip2trace (CHANN, ITRC_IOCTL, 11, 0 ); #endif @@ -2365,6 +2493,9 @@ } cprev = cnow; } + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->delta_msr_wait, &wait); + i2QueueCommands(PTYPE_BYPASS, pCh, 100, 3, CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP); if ( ! (pCh->flags & ASYNC_CHECK_CD)) { diff -u --recursive --new-file v2.4.13/linux/drivers/char/lp.c linux/drivers/char/lp.c --- v2.4.13/linux/drivers/char/lp.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/char/lp.c Thu Oct 25 00:07:39 2001 @@ -153,6 +153,10 @@ #undef LP_DEBUG +/* Bits used to manage claiming the parport device */ +#define LP_PREEMPT_REQUEST 1 +#define LP_PARPORT_CLAIMED 2 + /* --- low-level port access ----------------------------------- */ #define r_dtr(x) (parport_read_data(lp_table[(x)].dev->port)) @@ -160,15 +164,55 @@ #define w_ctr(x,y) do { parport_write_control(lp_table[(x)].dev->port, (y)); } while (0) #define w_dtr(x,y) do { parport_write_data(lp_table[(x)].dev->port, (y)); } while (0) +/* Claim the parport or block trying unless we've already claimed it */ +static void lp_claim_parport_or_block(struct lp_struct *this_lp) +{ + if (!test_and_set_bit(LP_PARPORT_CLAIMED, &this_lp->bits)) { + parport_claim_or_block (this_lp->dev); + } +} + +/* Claim the parport or block trying unless we've already claimed it */ +static void lp_release_parport(struct lp_struct *this_lp) +{ + if (test_and_clear_bit(LP_PARPORT_CLAIMED, &this_lp->bits)) { + parport_release (this_lp->dev); + } +} + + + +static int lp_preempt(void *handle) +{ + struct lp_struct *this_lp = (struct lp_struct *)handle; + set_bit(LP_PREEMPT_REQUEST, &this_lp->bits); + return (1); +} + + +/* + * Try to negotiate to a new mode; if unsuccessful negotiate to + * compatibility mode. Return the mode we ended up in. + */ +static int lp_negotiate(struct parport * port, int mode) +{ + if (parport_negotiate (port, mode) != 0) { + mode = IEEE1284_MODE_COMPAT; + parport_negotiate (port, mode); + } + + return (mode); +} + static int lp_reset(int minor) { int retval; - parport_claim_or_block (lp_table[minor].dev); + lp_claim_parport_or_block (&lp_table[minor]); w_ctr(minor, LP_PSELECP); udelay (LP_DELAY); w_ctr(minor, LP_PSELECP | LP_PINITP); retval = r_str(minor); - parport_release (lp_table[minor].dev); + lp_release_parport (&lp_table[minor]); return retval; } @@ -180,10 +224,10 @@ return; polling = lp_table[minor].dev->port->irq == PARPORT_IRQ_NONE; - if (polling) parport_release (lp_table[minor].dev); + if (polling) lp_release_parport (&lp_table[minor]); interruptible_sleep_on_timeout (&lp_table[minor].waitq, LP_TIMEOUT_POLLED); - if (polling) parport_claim_or_block (lp_table[minor].dev); + if (polling) lp_claim_parport_or_block (&lp_table[minor]); else parport_yield_blocking (lp_table[minor].dev); } @@ -229,6 +273,12 @@ static int lp_wait_ready(int minor) { int error = 0; + + /* If we're not in compatibility mode, we're ready now! */ + if (lp_table[minor].current_mode != IEEE1284_MODE_COMPAT) { + return (0); + } + do { error = lp_check_status (minor); if (error && (LP_F(minor) & LP_ABORT)) @@ -270,10 +320,10 @@ /* Claim Parport or sleep until it becomes available */ - parport_claim_or_block (lp_table[minor].dev); - - /* Go to compatibility mode. */ - parport_negotiate (port, IEEE1284_MODE_COMPAT); + lp_claim_parport_or_block (&lp_table[minor]); + /* Go to the proper mode. */ + lp_table[minor].current_mode = lp_negotiate (port, + lp_table[minor].best_mode); parport_set_timeout (lp_table[minor].dev, lp_table[minor].timeout); @@ -298,7 +348,13 @@ if (copy_size > 0) { /* incomplete write -> check error ! */ - int error = lp_wait_ready (minor); + int error; + + parport_negotiate (lp_table[minor].dev->port, + IEEE1284_MODE_COMPAT); + lp_table[minor].current_mode = IEEE1284_MODE_COMPAT; + + error = lp_wait_ready (minor); if (error) { if (retv == 0) @@ -307,6 +363,10 @@ } parport_yield_blocking (lp_table[minor].dev); + lp_table[minor].current_mode + = lp_negotiate (port, + lp_table[minor].best_mode); + } else if (current->need_resched) schedule (); @@ -323,7 +383,14 @@ } } while (count > 0); - parport_release (lp_table[minor].dev); + if (test_and_clear_bit(LP_PREEMPT_REQUEST, + &lp_table[minor].bits)) { + printk(KERN_INFO "lp%d releasing parport\n", minor); + parport_negotiate (lp_table[minor].dev->port, + IEEE1284_MODE_COMPAT); + lp_table[minor].current_mode = IEEE1284_MODE_COMPAT; + lp_release_parport (&lp_table[minor]); + } up (&lp_table[minor].port_mutex); @@ -347,9 +414,9 @@ if (down_interruptible (&lp_table[minor].port_mutex)) return -EINTR; - parport_claim_or_block (lp_table[minor].dev); + lp_claim_parport_or_block (&lp_table[minor]); retval = parport_read (port, kbuf, count); - parport_release (lp_table[minor].dev); + lp_release_parport (&lp_table[minor]); if (retval > 0 && copy_to_user (buf, kbuf, retval)) retval = -EFAULT; @@ -379,9 +446,9 @@ should most likely only ever be used by the tunelp application. */ if ((LP_F(minor) & LP_ABORTOPEN) && !(file->f_flags & O_NONBLOCK)) { int status; - parport_claim_or_block (lp_table[minor].dev); + lp_claim_parport_or_block (&lp_table[minor]); status = r_str(minor); - parport_release (lp_table[minor].dev); + lp_release_parport (&lp_table[minor]); if (status & LP_POUTPA) { printk(KERN_INFO "lp%d out of paper\n", minor); LP_F(minor) &= ~LP_BUSY; @@ -401,6 +468,21 @@ LP_F(minor) &= ~LP_BUSY; return -ENOMEM; } + /* Determine if the peripheral supports ECP mode */ + lp_claim_parport_or_block (&lp_table[minor]); + if ( (lp_table[minor].dev->port->modes & PARPORT_MODE_ECP) && + !parport_negotiate (lp_table[minor].dev->port, + IEEE1284_MODE_ECP)) { + printk (KERN_INFO "lp%d: ECP mode\n", minor); + lp_table[minor].best_mode = IEEE1284_MODE_ECP; + } else { + printk (KERN_INFO "lp%d: compatibility mode\n", minor); + lp_table[minor].best_mode = IEEE1284_MODE_COMPAT; + } + /* Leave peripheral in compatibility mode */ + parport_negotiate (lp_table[minor].dev->port, IEEE1284_MODE_COMPAT); + lp_release_parport (&lp_table[minor]); + lp_table[minor].current_mode = IEEE1284_MODE_COMPAT; return 0; } @@ -408,6 +490,10 @@ { unsigned int minor = MINOR(inode->i_rdev); + lp_claim_parport_or_block (&lp_table[minor]); + parport_negotiate (lp_table[minor].dev->port, IEEE1284_MODE_COMPAT); + lp_table[minor].current_mode = IEEE1284_MODE_COMPAT; + lp_release_parport (&lp_table[minor]); lock_kernel(); kfree(lp_table[minor].lp_buffer); lp_table[minor].lp_buffer = NULL; @@ -470,9 +556,9 @@ return -EFAULT; break; case LPGETSTATUS: - parport_claim_or_block (lp_table[minor].dev); + lp_claim_parport_or_block (&lp_table[minor]); status = r_str(minor); - parport_release (lp_table[minor].dev); + lp_release_parport (&lp_table[minor]); if (copy_to_user((int *) arg, &status, sizeof(int))) return -EFAULT; @@ -657,7 +743,7 @@ char name[8]; lp_table[nr].dev = parport_register_device(port, "lp", - NULL, NULL, NULL, 0, + lp_preempt, NULL, NULL, 0, (void *) &lp_table[nr]); if (lp_table[nr].dev == NULL) return 1; diff -u --recursive --new-file v2.4.13/linux/drivers/ide/ide-cd.c linux/drivers/ide/ide-cd.c --- v2.4.13/linux/drivers/ide/ide-cd.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/ide/ide-cd.c Wed Oct 24 23:53:51 2001 @@ -2863,7 +2863,7 @@ struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - return cdrom_fops.ioctl (inode, file, cmd, arg); + return cdrom_ioctl (inode, file, cmd, arg); } static @@ -2875,7 +2875,7 @@ MOD_INC_USE_COUNT; if (info->buffer == NULL) info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL); - if ((info->buffer == NULL) || (rc = cdrom_fops.open(ip, fp))) { + if ((info->buffer == NULL) || (rc = cdrom_open(ip, fp))) { drive->usage--; MOD_DEC_USE_COUNT; } @@ -2886,14 +2886,14 @@ void ide_cdrom_release (struct inode *inode, struct file *file, ide_drive_t *drive) { - cdrom_fops.release (inode, file); + cdrom_release (inode, file); MOD_DEC_USE_COUNT; } static int ide_cdrom_check_media_change (ide_drive_t *drive) { - return cdrom_fops.check_media_change(MKDEV (HWIF (drive)->major, + return cdrom_media_changed(MKDEV (HWIF (drive)->major, (drive->select.b.unit) << PARTN_BITS)); } diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/hisax/md5sums.asc linux/drivers/isdn/hisax/md5sums.asc --- v2.4.13/linux/drivers/isdn/hisax/md5sums.asc Sun Aug 12 13:27:59 2001 +++ linux/drivers/isdn/hisax/md5sums.asc Wed Oct 24 15:34:51 2001 @@ -6,17 +6,17 @@ # in the moment. # Read ../../../Documentation/isdn/HiSax.cert for more informations. # -6f9433a8b696076562562d090e3c420f isac.c -13c3eed869f5139f44c563e3a8fea1f5 isdnl1.c -addcff863b0ff1e366c0f2ae9fa6e81e isdnl2.c -7076deb94a363945c21ea27aca4a720a isdnl3.c -51c603829b6cc4f8421f744ad657ceff tei.c -669050ab5079f02887ed0239d86e5474 callc.c -ecacd146b8f8881ef9349935dab3df4a cert.c -fadeb3b85bb23bc1ac48470c0848d6fa l3dss1.c -cf7dec9fac6283716904d26b99188476 l3_1tr6.c -2f75c8765e1be13d114d5f4433cf364b elsa.c -b4cf8a4dceed9ea6dcba65a85b4eecc7 diva.c -dee3f8f40c6fe78a4b57729804b7e6cd sedlbauer.c -0d79fe6dfc5bfaa4826970c41a6d273d hfc_pci.c +d08b59f56fb9ed1fbd17713342c75081 isac.c +e81e6e96f307e55f8b9777aca2b356d9 isdnl1.c +cfd2527d9fb01885484cba74bfc67121 isdnl2.c +8c6829f11459f9d044b5768803fb646d isdnl3.c +d40f88dff4191d2660240749cbdcb688 tei.c +3bd3bd05ee4cb25ffe046200b569a83a callc.c +d518f52402ebc3f1be84e09af375313c cert.c +c425de1f8be86e84006de63c9bb3cc5f l3dss1.c +4c411e29d4103ba60e9af4e3e1234a99 l3_1tr6.c +68c6cc2784f208e3247a5a555918d014 elsa.c +8d63a85d7222cf7b40e663e543191d8f diva.c +8c8cb4ce621fb84d8e337a696e75b0df sedlbauer.c +ebe5613d535748409407568435b2be97 hfc_pci.c # end of md5sums diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/hisax/niccy.c linux/drivers/isdn/hisax/niccy.c --- v2.4.13/linux/drivers/isdn/hisax/niccy.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/isdn/hisax/niccy.c Wed Oct 24 15:34:51 2001 @@ -1,4 +1,4 @@ -/* $Id: niccy.c,v 1.15.6.5 2001/09/23 22:24:50 kai Exp $ +/* $Id: niccy.c,v 1.15.6.6 2001/10/20 22:08:24 kai Exp $ * * low level stuff for Dr. Neuhaus NICCY PnP and NICCY PCI and * compatible (SAGEM cybermodem) @@ -24,7 +24,7 @@ #include extern const char *CardType[]; -const char *niccy_revision = "$Revision: 1.15.6.5 $"; +const char *niccy_revision = "$Revision: 1.15.6.6 $"; #define byteout(addr,val) outb(val,addr) #define bytein(addr) inb(addr) @@ -197,7 +197,7 @@ val = inl(cs->hw.niccy.cfg_reg + PCI_IRQ_CTRL_REG); val &= PCI_IRQ_DISABLE; outl(val, cs->hw.niccy.cfg_reg + PCI_IRQ_CTRL_REG); - release_region(cs->hw.niccy.cfg_reg, 0x80); + release_region(cs->hw.niccy.cfg_reg, 0x40); release_region(cs->hw.niccy.isac, 4); } else { release_region(cs->hw.niccy.isac, 2); @@ -324,16 +324,16 @@ return (0); } else request_region(cs->hw.niccy.isac, 4, "niccy"); - if (check_region(cs->hw.niccy.cfg_reg, 0x80)) { + if (check_region(cs->hw.niccy.cfg_reg, 0x40)) { printk(KERN_WARNING "HiSax: %s pci port %x-%x already in use\n", CardType[card->typ], cs->hw.niccy.cfg_reg, - cs->hw.niccy.cfg_reg + 0x80); + cs->hw.niccy.cfg_reg + 0x40); release_region(cs->hw.niccy.isac, 4); return (0); } else { - request_region(cs->hw.niccy.cfg_reg, 0x80, "niccy pci"); + request_region(cs->hw.niccy.cfg_reg, 0x40, "niccy pci"); } #else printk(KERN_WARNING "Niccy: io0 0 and NO_PCI_BIOS\n"); diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/hisax/st5481_d.c linux/drivers/isdn/hisax/st5481_d.c --- v2.4.13/linux/drivers/isdn/hisax/st5481_d.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/isdn/hisax/st5481_d.c Wed Oct 24 15:34:51 2001 @@ -174,7 +174,6 @@ va_start(args, fmt); vsprintf(buf, fmt, args); - printk("buf %s\n", buf); DBG(8, "%s", buf); va_end(args); } diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/hisax/st5481_usb.c linux/drivers/isdn/hisax/st5481_usb.c --- v2.4.13/linux/drivers/isdn/hisax/st5481_usb.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/isdn/hisax/st5481_usb.c Wed Oct 24 15:34:51 2001 @@ -427,8 +427,8 @@ // Fill the isochronous URB fill_isoc_urb(urb[j], dev, pipe, buf, - num_packets, packet_size, complete, - context); + num_packets, packet_size, complete, + context); } return 0; diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/isdn_ppp.c linux/drivers/isdn/isdn_ppp.c --- v2.4.13/linux/drivers/isdn/isdn_ppp.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/isdn/isdn_ppp.c Wed Oct 24 15:34:51 2001 @@ -2453,10 +2453,15 @@ /* if we RECEIVE an ackowledge we enable the decompressor */ if(is->debug & 0x10) printk(KERN_DEBUG "Enable decompression here!\n"); - if(proto == PPP_CCP) + if(proto == PPP_CCP) { + if (!mis->decompressor) + break; mis->compflags |= SC_DECOMP_ON; - else + } else { + if (!is->decompressor) + break; is->compflags |= SC_LINK_DECOMP_ON; + } break; case CCP_RESETACK: @@ -2620,10 +2625,15 @@ /* if we SEND an ackowledge we can/must enable the compressor */ if(is->debug & 0x10) printk(KERN_DEBUG "Enable compression here!\n"); - if(proto == PPP_CCP) + if(proto == PPP_CCP) { + if (!is->compressor) + break; is->compflags |= SC_COMP_ON; - else + } else { + if (!is->compressor) + break; is->compflags |= SC_LINK_COMP_ON; + } break; case CCP_RESETACK: /* If we send a ACK we should reset our compressor */ diff -u --recursive --new-file v2.4.13/linux/drivers/mtd/chips/cfi_cmdset_0002.c linux/drivers/mtd/chips/cfi_cmdset_0002.c --- v2.4.13/linux/drivers/mtd/chips/cfi_cmdset_0002.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/mtd/chips/cfi_cmdset_0002.c Thu Oct 25 00:07:09 2001 @@ -8,7 +8,7 @@ * * This code is GPL * - * $Id: cfi_cmdset_0002.c,v 1.51 2001/10/02 15:05:12 dwmw2 Exp $ + * $Id: cfi_cmdset_0002.c,v 1.52 2001/10/24 09:37:30 dwmw2 Exp $ * */ @@ -66,7 +66,7 @@ major = cfi_read_query(map, base + (adr+3)*ofs_factor); minor = cfi_read_query(map, base + (adr+4)*ofs_factor); - printk(" Amd/Fujitsu Extended Query Table v%c.%c at 0x%4.4X\n", + printk(KERN_NOTICE " Amd/Fujitsu Extended Query Table v%c.%c at 0x%4.4X\n", major, minor, adr); cfi_send_gen_cmd(0xf0, 0x55, base, map, cfi, cfi->device_type, NULL); @@ -148,10 +148,10 @@ unsigned long devsize = (1<cfiq->DevSize) * cfi->interleave; mtd = kmalloc(sizeof(*mtd), GFP_KERNEL); - printk("number of %s chips: %d\n", (cfi->cfi_mode)?"JEDEC":"CFI",cfi->numchips); + printk(KERN_NOTICE "number of %s chips: %d\n", (cfi->cfi_mode)?"CFI":"JEDEC",cfi->numchips); if (!mtd) { - printk("Failed to allocate memory for MTD device\n"); + printk(KERN_WARNING "Failed to allocate memory for MTD device\n"); kfree(cfi->cmdset_priv); return NULL; } @@ -172,7 +172,7 @@ mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips; mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info) * mtd->numeraseregions, GFP_KERNEL); if (!mtd->eraseregions) { - printk("Failed to allocate memory for MTD erase region info\n"); + printk(KERN_WARNING "Failed to allocate memory for MTD erase region info\n"); kfree(cfi->cmdset_priv); return NULL; } @@ -194,11 +194,12 @@ } if (offset != devsize) { /* Argh */ - printk("Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize); + printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize); kfree(mtd->eraseregions); kfree(cfi->cmdset_priv); return NULL; } +#if 0 // debug for (i=0; inumeraseregions;i++){ printk("%d: offset=0x%x,size=0x%x,blocks=%d\n", @@ -206,6 +207,7 @@ mtd->eraseregions[i].erasesize, mtd->eraseregions[i].numblocks); } +#endif } switch (CFIDEV_BUSWIDTH) @@ -224,7 +226,7 @@ break; default: - printk("Unsupported buswidth\n"); + printk(KERN_WARNING "Unsupported buswidth\n"); kfree(mtd); kfree(cfi->cmdset_priv); return NULL; @@ -249,7 +251,9 @@ cfi_spin_lock(chip->mutex); if (chip->state != FL_READY){ - printk("Waiting for chip to read, status = %d\n", chip->state); +#if 0 + printk(KERN_DEBUG "Waiting for chip to read, status = %d\n", chip->state); +#endif set_current_state(TASK_UNINTERRUPTIBLE); add_wait_queue(&chip->wq, &wait); @@ -332,7 +336,9 @@ cfi_spin_lock(chip->mutex); if (chip->state != FL_READY){ - printk("Waiting for chip to write, status = %d\n", chip->state); +#if 0 + printk(KERN_DEBUG "Waiting for chip to write, status = %d\n", chip->state); +#endif set_current_state(TASK_UNINTERRUPTIBLE); add_wait_queue(&chip->wq, &wait); @@ -340,8 +346,8 @@ schedule(); remove_wait_queue(&chip->wq, &wait); - printk("Wake up to write:\n"); #if 0 + printk(KERN_DEBUG "Wake up to write:\n"); if(signal_pending(current)) return -EINTR; #endif @@ -386,7 +392,7 @@ } if (Last[(Count - 1) % 4] != datum){ - printk("Last[%ld] is %x, datum is %x\n",(Count - 1) % 4,Last[(Count - 1) % 4],datum); + printk(KERN_WARNING "Last[%ld] is %x, datum is %x\n",(Count - 1) % 4,Last[(Count - 1) % 4],datum); cfi_send_gen_cmd(0xF0, 0, chip->start, map, cfi, cfi->device_type, NULL); DISABLE_VPP(map); ret = -EIO; @@ -600,7 +606,7 @@ add_wait_queue(&chip->wq, &wait); cfi_spin_unlock(chip->mutex); - printk("erase suspended. Sleeping\n"); + printk(KERN_DEBUG "erase suspended. Sleeping\n"); schedule(); remove_wait_queue(&chip->wq, &wait); @@ -617,7 +623,7 @@ if (time_after(jiffies, timeo)) { chip->state = FL_READY; cfi_spin_unlock(chip->mutex); - printk("waiting for erase to complete timed out."); + printk(KERN_WARNING "waiting for erase to complete timed out."); DISABLE_VPP(map); return -EIO; } @@ -627,7 +633,7 @@ z++; if ( 0 && !(z % 100 )) - printk("chip not ready yet after erase. looping\n"); + printk(KERN_WARNING "chip not ready yet after erase. looping\n"); cfi_udelay(1); @@ -914,7 +920,7 @@ wake_up(&chip->wq); } else - printk("Argh. Chip not in PM_SUSPENDED state upon resume()\n"); + printk(KERN_ERR "Argh. Chip not in PM_SUSPENDED state upon resume()\n"); cfi_spin_unlock(chip->mutex); } diff -u --recursive --new-file v2.4.13/linux/drivers/net/acenic.c linux/drivers/net/acenic.c --- v2.4.13/linux/drivers/net/acenic.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/net/acenic.c Wed Oct 24 14:02:56 2001 @@ -1051,7 +1051,8 @@ struct ace_private *ap; struct ace_regs *regs; struct ace_info *info = NULL; - unsigned long tmp_ptr, myjif; + u64 tmp_ptr; + unsigned long myjif; u32 tig_ver, mac1, mac2, tmp, pci_state; int board_idx, ecode = 0; short i; diff -u --recursive --new-file v2.4.13/linux/drivers/parport/ChangeLog linux/drivers/parport/ChangeLog --- v2.4.13/linux/drivers/parport/ChangeLog Thu Oct 11 08:02:26 2001 +++ linux/drivers/parport/ChangeLog Thu Oct 25 00:07:40 2001 @@ -1,3 +1,27 @@ +2001-10-24 Dave Strauss + + * parport_pc.c (parport_pc_compat_write_block_pio, + parport_pc_ecp_write_block_pio): Allow a few seconds for an ECP + transfer to finish up. + +2001-10-11 Tim Waugh + + * parport_pc (sio_ite_8872_probe): New function, submitted by Rich + Liu from ITE. Cleaned up, removed bogus phys_to_virt calls. + +2001-10-24 Tim Waugh + + * parport_pc.c: Support for AKS AladdinCARD. Patch from + Aladdin Knowledge Systems (Christian Groessler). + +2001-10-24 Tim Waugh + + * ieee1284_ops.c (parport_ieee1284_ecp_read_data): Try to minimise + turnaround time. + + * ieee1284.c (parport_poll_peripheral): Try a couple of times + first without delaying. + 2001-10-10 Tim Waugh * parport_pc.c: Support for OX16PCI954 PCI card. diff -u --recursive --new-file v2.4.13/linux/drivers/parport/ieee1284.c linux/drivers/parport/ieee1284.c --- v2.4.13/linux/drivers/parport/ieee1284.c Sat May 19 18:07:04 2001 +++ linux/drivers/parport/ieee1284.c Thu Oct 25 00:07:39 2001 @@ -119,9 +119,10 @@ int usec) { /* Zero return code is success, >0 is timeout. */ - int counter = usec / 5; + int count = usec / 5 + 2; + int i; unsigned char status; - for (; counter > 0; counter--) { + for (i = 0; i < count; i++) { status = parport_read_status (port); if ((status & mask) == result) return 0; @@ -129,7 +130,8 @@ return -EINTR; if (current->need_resched) break; - udelay (5); + if (i >= 2) + udelay (5); } return 1; diff -u --recursive --new-file v2.4.13/linux/drivers/parport/ieee1284_ops.c linux/drivers/parport/ieee1284_ops.c --- v2.4.13/linux/drivers/parport/ieee1284_ops.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/parport/ieee1284_ops.c Thu Oct 25 00:07:39 2001 @@ -500,6 +500,7 @@ struct pardevice *dev = port->cad; unsigned char *buf = buffer; int rle_count = 0; /* shut gcc up */ + unsigned char ctl; int rle = 0; ssize_t count = 0; @@ -512,11 +513,10 @@ port->ieee1284.phase = IEEE1284_PH_REV_DATA; /* Set HostAck low to start accepting data. */ - parport_frob_control (port, - PARPORT_CONTROL_AUTOFD - | PARPORT_CONTROL_STROBE - | PARPORT_CONTROL_INIT, - PARPORT_CONTROL_AUTOFD); + ctl = parport_read_control (port); + ctl &= ~(PARPORT_CONTROL_STROBE | PARPORT_CONTROL_INIT); + parport_write_control (port, + ctl | PARPORT_CONTROL_AUTOFD); while (count < len) { long expire = jiffies + dev->timeout; unsigned char byte; @@ -592,7 +592,7 @@ } /* Event 44: Set HostAck high, acknowledging handshake. */ - parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0); + parport_write_control (port, ctl); /* Event 45: The peripheral has 35ms to set nAck high. */ if (parport_wait_peripheral (port, PARPORT_STATUS_ACK, @@ -610,9 +610,8 @@ } /* Event 46: Set HostAck low and accept the data. */ - parport_frob_control (port, - PARPORT_CONTROL_AUTOFD, - PARPORT_CONTROL_AUTOFD); + parport_write_control (port, + ctl | PARPORT_CONTROL_AUTOFD); /* If we just read a run-length count, fetch the data. */ if (command) diff -u --recursive --new-file v2.4.13/linux/drivers/parport/parport_pc.c linux/drivers/parport/parport_pc.c --- v2.4.13/linux/drivers/parport/parport_pc.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/parport/parport_pc.c Thu Oct 25 00:07:40 2001 @@ -798,6 +798,8 @@ { size_t written; int r; + long int expire; + const struct parport_pc_private *priv = port->physport->private_data; /* Special case: a timeout of zero means we cannot call schedule(). */ if (!port->physport->cad->timeout) @@ -819,9 +821,19 @@ written = parport_pc_fifo_write_block_pio (port, buf, length); /* Finish up. */ - if (change_mode (port, ECR_PS2) == -EBUSY) { - const struct parport_pc_private *priv = - port->physport->private_data; + /* For some hardware we don't want to touch the mode until + * the FIFO is empty, so allow 4 seconds for each position + * in the fifo. + */ + expire = jiffies + (priv->fifo_depth * HZ * 4); + do { + /* Wait for the FIFO to empty */ + r = change_mode (port, ECR_PS2); + if (r != -EBUSY) { + break; + } + } while (time_before (jiffies, expire)); + if (r == -EBUSY) { printk (KERN_DEBUG "%s: FIFO is stuck\n", port->name); @@ -862,6 +874,8 @@ { size_t written; int r; + long int expire; + const struct parport_pc_private *priv = port->physport->private_data; /* Special case: a timeout of zero means we cannot call schedule(). */ if (!port->physport->cad->timeout) @@ -904,9 +918,19 @@ written = parport_pc_fifo_write_block_pio (port, buf, length); /* Finish up. */ - if (change_mode (port, ECR_PS2) == -EBUSY) { - const struct parport_pc_private *priv = - port->physport->private_data; + /* For some hardware we don't want to touch the mode until + * the FIFO is empty, so allow 4 seconds for each position + * in the fifo. + */ + expire = jiffies + (priv->fifo_depth * (HZ * 4)); + do { + /* Wait for the FIFO to empty */ + r = change_mode (port, ECR_PS2); + if (r != -EBUSY) { + break; + } + } while (time_before (jiffies, expire)); + if (r == -EBUSY) { printk (KERN_DEBUG "%s: FIFO is stuck\n", port->name); @@ -2382,6 +2406,105 @@ } #ifdef CONFIG_PCI + +/* ITE support maintained by Rich Liu */ +static int __devinit sio_ite_8872_probe (struct pci_dev *pdev, int autoirq, + int autodma) +{ + short inta_addr[6] = { 0x2A0, 0x2C0, 0x220, 0x240, 0x1E0 }; + u32 ite8872set; + u32 ite8872_lpt, ite8872_lpthi; + u8 ite8872_irq, type; + int irq; + int i; + + DPRINTK (KERN_DEBUG "sio_ite_8872_probe()\n"); + + // make sure which one chip + for(i = 0; i < 5; i++) { + if (check_region (inta_addr[i], 0x8) >= 0) { + int test; + pci_write_config_dword (pdev, 0x60, + 0xe7000000 | inta_addr[i]); + pci_write_config_dword (pdev, 0x78, + 0x00000000 | inta_addr[i]); + test = inb (inta_addr[i]); + if (test != 0xff) break; + } + } + if(i >= 5) { + printk (KERN_INFO "parport_pc: cannot find ITE8872 INTA\n"); + return 0; + } + + type = inb (inta_addr[i] + 0x18); + type &= 0x0f; + + switch (type) { + case 0x2: + printk (KERN_INFO "parport_pc: ITE8871 found (1P)\n"); + ite8872set = 0x64200000; + break; + case 0xa: + printk (KERN_INFO "parport_pc: ITE8875 found (1P)\n"); + ite8872set = 0x64200000; + break; + case 0xe: + printk (KERN_INFO "parport_pc: ITE8872 found (2S1P)\n"); + ite8872set = 0x64e00000; + break; + case 0x6: + printk (KERN_INFO "parport_pc: ITE8873 found (1S1P)\n"); + ite8872set = 0x64a00000; + break; + case 0x8: + DPRINTK (KERN_DEBUG "parport_pc: ITE8874 found (2S)\n"); + return 0; + default: + printk (KERN_INFO "parport_pc: unknown ITE887x\n"); + printk (KERN_INFO "parport_pc: please mail 'lspci -nvv' " + "output to Rich.Liu@ite.com.tw\n"); + return 0; + } + + pci_read_config_byte (pdev, 0x3c, &ite8872_irq); + pci_read_config_dword (pdev, 0x1c, &ite8872_lpt); + ite8872_lpt &= 0x0000ff00; + pci_read_config_dword (pdev, 0x20, &ite8872_lpthi); + ite8872_lpthi &= 0x0000ff00; + pci_write_config_dword (pdev, 0x6c, 0xe3000000 | ite8872_lpt); + pci_write_config_dword (pdev, 0x70, 0xe3000000 | ite8872_lpthi); + pci_write_config_dword (pdev, 0x80, (ite8872_lpthi<<16) | ite8872_lpt); + // SET SPP&EPP , Parallel Port NO DMA , Enable All Function + // SET Parallel IRQ + pci_write_config_dword (pdev, 0x9c, + ite8872set | (ite8872_irq * 0x11111)); + + DPRINTK (KERN_DEBUG "ITE887x: The IRQ is %d.\n", ite8872_irq); + DPRINTK (KERN_DEBUG "ITE887x: The PARALLEL I/O port is 0x%x.\n", + ite8872_lpt); + DPRINTK (KERN_DEBUG "ITE887x: The PARALLEL I/O porthi is 0x%x.\n", + ite8872_lpthi); + + /* Let the user (or defaults) steer us away from interrupts */ + irq = ite8872_irq; + if (autoirq != PARPORT_IRQ_AUTO) + irq = PARPORT_IRQ_NONE; + + if (parport_pc_probe_port (ite8872_lpt, ite8872_lpthi, + irq, PARPORT_DMA_NONE, NULL)) { + printk (KERN_INFO + "parport_pc: ITE 8872 parallel port: io=0x%X", + ite8872_lpt); + if (irq != PARPORT_IRQ_NONE) + printk (", irq=%d", irq); + printk ("\n"); + return 1; + } + + return 0; +} + /* Via support maintained by Jeff Garzik */ static int __devinit sio_via_686a_probe (struct pci_dev *pdev, int autoirq, int autodma) @@ -2492,6 +2615,7 @@ enum parport_pc_sio_types { sio_via_686a = 0, /* Via VT82C686A motherboard Super I/O */ + sio_ite_8872, last_sio }; @@ -2500,6 +2624,7 @@ int (*probe) (struct pci_dev *pdev, int autoirq, int autodma); } parport_pc_superio_info[] __devinitdata = { { sio_via_686a_probe, }, + { sio_ite_8872_probe, }, }; @@ -2559,6 +2684,7 @@ avlab_2p, oxsemi_954, oxsemi_840, + aks_0100, }; @@ -2632,11 +2758,14 @@ * and 840 locks up if you write 1 to bit 2! */ /* oxsemi_954 */ { 1, { { 0, -1 }, } }, /* oxsemi_840 */ { 1, { { 0, -1 }, } }, + /* aks_0100 */ { 1, { { 0, 1 }, } }, }; static struct pci_device_id parport_pc_pci_tbl[] __devinitdata = { /* Super-IO onboard chips */ { 0x1106, 0x0686, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sio_via_686a }, + { PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_8872, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, sio_ite_8872 }, /* PCI cards */ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, @@ -2725,6 +2854,8 @@ PCI_ANY_ID, PCI_ANY_ID, 0, 0, oxsemi_954 }, { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_12PCI840, PCI_ANY_ID, PCI_ANY_ID, 0, 0, oxsemi_840 }, + { PCI_VENDOR_ID_AKS, PCI_DEVICE_ID_AKS_ALADDINCARD, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, aks_0100 }, { 0, } /* terminate list */ }; MODULE_DEVICE_TABLE(pci,parport_pc_pci_tbl); diff -u --recursive --new-file v2.4.13/linux/drivers/pci/pci.ids linux/drivers/pci/pci.ids --- v2.4.13/linux/drivers/pci/pci.ids Tue Oct 23 22:48:51 2001 +++ linux/drivers/pci/pci.ids Thu Oct 25 00:07:39 2001 @@ -4618,6 +4618,8 @@ 4033 Addtron Technology Co, Inc. 4143 Digital Equipment Corp 416c Aladdin Knowledge Systems + 0100 AladdinCARD + 0200 CPC 4444 Internext Compression Inc 4468 Bridgeport machines 4594 Cogetec Informatique Inc diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/sr.c linux/drivers/scsi/sr.c --- v2.4.13/linux/drivers/scsi/sr.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/scsi/sr.c Wed Oct 24 14:04:02 2001 @@ -484,6 +484,31 @@ return 1; } +static int sr_dev_open(struct inode *inode, struct file *file) +{ + int err; + MOD_INC_USE_COUNT; + err = cdrom_open(inode, file); + if (err) + MOD_DEC_USE_COUNT; + return err; +} + +static int sr_dev_release(struct inode *inode, struct file *file) +{ + int err = cdrom_release(inode, file); + MOD_DEC_USE_COUNT; + return err; +} + +struct block_device_operations sr_bdops = +{ + open: sr_dev_open, + release: sr_dev_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + static int sr_open(struct cdrom_device_info *cdi, int purpose) { check_disk_change(cdi->dev); @@ -778,7 +803,7 @@ return 0; if (!sr_registered) { - if (devfs_register_blkdev(MAJOR_NR, "sr", &cdrom_fops)) { + if (devfs_register_blkdev(MAJOR_NR, "sr", &sr_bdops)) { printk("Unable to get major %d for SCSI-CD\n", MAJOR_NR); return 1; } @@ -875,7 +900,7 @@ devfs_register (scsi_CDs[i].device->de, "cd", DEVFS_FL_DEFAULT, MAJOR_NR, i, S_IFBLK | S_IRUGO | S_IWUGO, - &cdrom_fops, NULL); + &sr_bdops, NULL); register_cdrom(&scsi_CDs[i].cdi); } diff -u --recursive --new-file v2.4.13/linux/drivers/usb/usb-ohci.h linux/drivers/usb/usb-ohci.h --- v2.4.13/linux/drivers/usb/usb-ohci.h Mon Aug 27 12:41:45 2001 +++ linux/drivers/usb/usb-ohci.h Wed Oct 24 08:26:12 2001 @@ -373,7 +373,7 @@ typedef struct ohci { struct ohci_hcca *hcca; /* hcca */ - u32 hcca_dma; + dma_addr_t hcca_dma; int irq; int disabled; /* e.g. got a UE, we're hung */ diff -u --recursive --new-file v2.4.13/linux/drivers/usb/usb-uhci-debug.h linux/drivers/usb/usb-uhci-debug.h --- v2.4.13/linux/drivers/usb/usb-uhci-debug.h Wed May 16 10:31:27 2001 +++ linux/drivers/usb/usb-uhci-debug.h Wed Oct 24 08:26:51 2001 @@ -5,7 +5,7 @@ dbg("qh has not QH_TYPE"); return; } - dbg("QH @ %p/%08X:", qh, qh->dma_addr); + dbg("QH @ %p/%08llX:", qh, (u64)qh->dma_addr); if (qh->hw.qh.head & UHCI_PTR_TERM) dbg(" Head Terminate"); diff -u --recursive --new-file v2.4.13/linux/fs/jffs2/background.c linux/fs/jffs2/background.c --- v2.4.13/linux/fs/jffs2/background.c Tue Oct 9 17:06:53 2001 +++ linux/fs/jffs2/background.c Thu Oct 25 00:07:09 2001 @@ -31,7 +31,7 @@ * provisions above, a recipient may use your version of this file * under either the RHEPL or the GPL. * - * $Id: background.c,v 1.15 2001/09/20 08:05:04 dwmw2 Exp $ + * $Id: background.c,v 1.16 2001/10/08 09:22:38 dwmw2 Exp $ * */ @@ -118,6 +118,11 @@ if (!thread_should_wake(c)) { set_current_state (TASK_INTERRUPTIBLE); D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread sleeping...\n")); + /* Yes, there's a race here; we checked thread_should_wake() before + setting current->state to TASK_INTERRUPTIBLE. But it doesn't + matter - We don't care if we miss a wakeup, because the GC thread + is only an optimisation anyway. */ + schedule(); } if (current->need_resched) diff -u --recursive --new-file v2.4.13/linux/fs/ramfs/inode.c linux/fs/ramfs/inode.c --- v2.4.13/linux/fs/ramfs/inode.c Tue Oct 9 17:06:53 2001 +++ linux/fs/ramfs/inode.c Wed Oct 24 15:19:18 2001 @@ -75,17 +75,6 @@ return 0; } -/* - * Writing: just make sure the page gets marked dirty, so that - * the page stealer won't grab it. - */ -static int ramfs_writepage(struct page *page) -{ - SetPageDirty(page); - UnlockPage(page); - return 0; -} - static int ramfs_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to) { void *addr = kmap(page); @@ -278,7 +267,7 @@ static struct address_space_operations ramfs_aops = { readpage: ramfs_readpage, - writepage: ramfs_writepage, + writepage: fail_writepage, prepare_write: ramfs_prepare_write, commit_write: ramfs_commit_write }; diff -u --recursive --new-file v2.4.13/linux/include/linux/cdrom.h linux/include/linux/cdrom.h --- v2.4.13/linux/include/linux/cdrom.h Thu Oct 18 13:49:34 2001 +++ linux/include/linux/cdrom.h Thu Oct 25 00:06:17 2001 @@ -777,10 +777,25 @@ }; /* the general block_device operations structure: */ -extern struct block_device_operations cdrom_fops; +extern int cdrom_open(struct inode *, struct file *); +extern int cdrom_release(struct inode *, struct file *); +extern int cdrom_ioctl(struct inode *, struct file *, unsigned, unsigned long); +extern int cdrom_media_changed(kdev_t); extern int register_cdrom(struct cdrom_device_info *cdi); extern int unregister_cdrom(struct cdrom_device_info *cdi); + +static inline void devfs_plain_cdrom(struct cdrom_device_info *cdi, + struct block_device_operations *ops) +{ + char vname[23]; + + sprintf (vname, "cdroms/cdrom%d", cdi->number); + cdi->de = devfs_register (NULL, vname, DEVFS_FL_DEFAULT, + MAJOR (cdi->dev), MINOR (cdi->dev), + S_IFBLK | S_IRUGO | S_IWUGO, + ops, NULL); +} typedef struct { int data; diff -u --recursive --new-file v2.4.13/linux/include/linux/lp.h linux/include/linux/lp.h --- v2.4.13/linux/include/linux/lp.h Wed Feb 16 08:55:54 2000 +++ linux/include/linux/lp.h Thu Oct 25 00:07:39 2001 @@ -145,6 +145,9 @@ struct semaphore port_mutex; wait_queue_head_t dataq; long timeout; + unsigned int best_mode; + unsigned int current_mode; + unsigned long bits; }; /* diff -u --recursive --new-file v2.4.13/linux/include/linux/mm.h linux/include/linux/mm.h --- v2.4.13/linux/include/linux/mm.h Tue Oct 23 22:48:53 2001 +++ linux/include/linux/mm.h Thu Oct 25 03:31:38 2001 @@ -402,6 +402,7 @@ /* * There is only one 'core' page-freeing function. */ +extern void FASTCALL(free_lru_page(struct page *)); extern void FASTCALL(__free_pages(struct page *page, unsigned int order)); extern void FASTCALL(free_pages(unsigned long addr, unsigned int order)); @@ -413,6 +414,7 @@ extern void clear_page_tables(struct mm_struct *, unsigned long, int); +extern int fail_writepage(struct page *); struct page * shmem_nopage(struct vm_area_struct * vma, unsigned long address, int no_share); struct file *shmem_file_setup(char * name, loff_t size); extern void shmem_lock(struct file * file, int lock); diff -u --recursive --new-file v2.4.13/linux/include/linux/pci_ids.h linux/include/linux/pci_ids.h --- v2.4.13/linux/include/linux/pci_ids.h Tue Oct 23 22:48:53 2001 +++ linux/include/linux/pci_ids.h Thu Oct 25 00:07:39 2001 @@ -1261,6 +1261,10 @@ #define PCI_VENDOR_ID_ITE 0x1283 #define PCI_DEVICE_ID_ITE_IT8172G 0x8172 +#define PCI_VENDOR_ID_ITE 0x1283 +#define PCI_DEVICE_ID_ITE_8872 0x8872 + + /* formerly Platform Tech */ #define PCI_VENDOR_ID_ESS_OLD 0x1285 #define PCI_DEVICE_ID_ESS_ESS0100 0x0100 @@ -1500,6 +1504,10 @@ #define PCI_VENDOR_ID_AVANCE 0x4005 #define PCI_DEVICE_ID_AVANCE_ALG2064 0x2064 #define PCI_DEVICE_ID_AVANCE_2302 0x2302 + +#define PCI_VENDOR_ID_AKS 0x416c +#define PCI_DEVICE_ID_AKS_ALADDINCARD 0x0100 +#define PCI_DEVICE_ID_AKS_CPC 0x0200 #define PCI_VENDOR_ID_NETVIN 0x4a14 #define PCI_DEVICE_ID_NETVIN_NV5000SC 0x5000 diff -u --recursive --new-file v2.4.13/linux/include/linux/swap.h linux/include/linux/swap.h --- v2.4.13/linux/include/linux/swap.h Tue Oct 23 22:48:53 2001 +++ linux/include/linux/swap.h Thu Oct 25 03:31:38 2001 @@ -192,7 +192,6 @@ list_del(&(page)->lru); \ ClearPageActive(page); \ nr_active_pages--; \ - DEBUG_LRU_PAGE(page); \ } while (0) #define del_page_from_inactive_list(page) \ @@ -200,7 +199,6 @@ list_del(&(page)->lru); \ ClearPageInactive(page); \ nr_inactive_pages--; \ - DEBUG_LRU_PAGE(page); \ } while (0) /* diff -u --recursive --new-file v2.4.13/linux/kernel/exec_domain.c linux/kernel/exec_domain.c --- v2.4.13/linux/kernel/exec_domain.c Tue Oct 9 17:06:53 2001 +++ linux/kernel/exec_domain.c Wed Oct 24 08:25:30 2001 @@ -100,7 +100,7 @@ } #endif - ep = &default_exec_domain; + ep = NULL; out: read_unlock(&exec_domains_lock); return (ep); diff -u --recursive --new-file v2.4.13/linux/mm/Makefile linux/mm/Makefile --- v2.4.13/linux/mm/Makefile Wed Jul 25 17:10:26 2001 +++ linux/mm/Makefile Wed Oct 24 15:21:18 2001 @@ -9,7 +9,7 @@ O_TARGET := mm.o -export-objs := shmem.o +export-objs := shmem.o filemap.o obj-y := memory.o mmap.o filemap.o mprotect.o mlock.o mremap.o \ vmalloc.o slab.o bootmem.o swap.o vmscan.o page_io.o \ diff -u --recursive --new-file v2.4.13/linux/mm/filemap.c linux/mm/filemap.c --- v2.4.13/linux/mm/filemap.c Tue Oct 23 22:48:53 2001 +++ linux/mm/filemap.c Thu Oct 25 03:31:38 2001 @@ -524,6 +524,29 @@ return retval; } +/* + * In-memory filesystems have to fail their + * writepage function - and this has to be + * worked around in the VM layer.. + * + * We + * - mark the page dirty again (but do NOT + * add it back to the inode dirty list, as + * that would livelock in fdatasync) + * - activate the page so that the page stealer + * doesn't try to write it out over and over + * again. + */ +int fail_writepage(struct page *page) +{ + activate_page(page); + SetPageDirty(page); + UnlockPage(page); + return 0; +} + +EXPORT_SYMBOL(fail_writepage); + /** * filemap_fdatasync - walk the list of dirty pages of the given address space * and writepage() all of them. diff -u --recursive --new-file v2.4.13/linux/mm/memory.c linux/mm/memory.c --- v2.4.13/linux/mm/memory.c Tue Oct 23 22:48:53 2001 +++ linux/mm/memory.c Thu Oct 25 03:31:38 2001 @@ -963,7 +963,7 @@ if (!new_page) goto no_mem; copy_cow_page(old_page,new_page,address); - page_cache_release(old_page); + free_lru_page(old_page); /* * Re-check the pte - we dropped the lock @@ -973,18 +973,19 @@ if (PageReserved(old_page)) ++mm->rss; break_cow(vma, new_page, address, page_table); + lru_cache_add(new_page); /* Free the old page.. */ new_page = old_page; } - page_cache_release(new_page); + free_lru_page(new_page); return 1; /* Minor fault */ bad_wp_page: printk("do_wp_page: bogus page at address %08lx (page 0x%lx)\n",address,(unsigned long)old_page); return -1; no_mem: - page_cache_release(old_page); + free_lru_page(old_page); spin_lock(&mm->page_table_lock); return -1; } @@ -1212,6 +1213,7 @@ mm->rss++; flush_page_to_ram(page); entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot))); + lru_cache_add(page); } set_pte(page_table, entry); diff -u --recursive --new-file v2.4.13/linux/mm/page_alloc.c linux/mm/page_alloc.c --- v2.4.13/linux/mm/page_alloc.c Tue Oct 23 22:48:53 2001 +++ linux/mm/page_alloc.c Thu Oct 25 03:31:38 2001 @@ -430,6 +430,15 @@ return 0; } +void free_lru_page(struct page *page) +{ + if (!PageReserved(page) && put_page_testzero(page)) { + if (PageActive(page) || PageInactive(page)) + lru_cache_del(page); + __free_pages_ok(page, 0); + } +} + void __free_pages(struct page *page, unsigned int order) { if (!PageReserved(page) && put_page_testzero(page)) diff -u --recursive --new-file v2.4.13/linux/mm/shmem.c linux/mm/shmem.c --- v2.4.13/linux/mm/shmem.c Tue Oct 23 22:48:53 2001 +++ linux/mm/shmem.c Thu Oct 25 03:31:38 2001 @@ -422,7 +422,6 @@ */ static int shmem_writepage(struct page * page) { - int error; struct shmem_inode_info *info; swp_entry_t *entry, swap; struct address_space *mapping; @@ -438,12 +437,8 @@ info = SHMEM_I(inode); getswap: swap = get_swap_page(); - if (!swap.val) { - activate_page(page); - SetPageDirty(page); - error = -ENOMEM; - goto out; - } + if (!swap.val) + return fail_writepage(page); spin_lock(&info->lock); entry = shmem_swp_entry(info, index, 0); @@ -474,10 +469,8 @@ info->swapped++; spin_unlock(&info->lock); set_page_dirty(page); - error = 0; -out: UnlockPage(page); - return error; + return 0; } /* diff -u --recursive --new-file v2.4.13/linux/mm/swap.c linux/mm/swap.c --- v2.4.13/linux/mm/swap.c Tue Oct 23 22:48:53 2001 +++ linux/mm/swap.c Thu Oct 25 03:31:38 2001 @@ -87,11 +87,11 @@ */ void lru_cache_add(struct page * page) { - if (!PageLocked(page)) - BUG(); - spin_lock(&pagemap_lru_lock); - add_page_to_inactive_list(page); - spin_unlock(&pagemap_lru_lock); + if (!PageActive(page) && !PageInactive(page)) { + spin_lock(&pagemap_lru_lock); + add_page_to_inactive_list(page); + spin_unlock(&pagemap_lru_lock); + } } /** @@ -107,8 +107,9 @@ del_page_from_active_list(page); } else if (PageInactive(page)) { del_page_from_inactive_list(page); - } else - printk("VM: __lru_cache_del, found unknown page ?!\n"); + } else { +// printk("VM: __lru_cache_del, found unknown page ?!\n"); + } DEBUG_LRU_PAGE(page); } @@ -118,8 +119,6 @@ */ void lru_cache_del(struct page * page) { - if (!PageLocked(page)) - BUG(); spin_lock(&pagemap_lru_lock); __lru_cache_del(page); spin_unlock(&pagemap_lru_lock); diff -u --recursive --new-file v2.4.13/linux/mm/swap_state.c linux/mm/swap_state.c --- v2.4.13/linux/mm/swap_state.c Tue Oct 9 17:06:53 2001 +++ linux/mm/swap_state.c Thu Oct 25 03:31:38 2001 @@ -152,7 +152,7 @@ delete_from_swap_cache(page); UnlockPage(page); } - page_cache_release(page); + free_lru_page(page); } /* diff -u --recursive --new-file v2.4.13/linux/mm/vmscan.c linux/mm/vmscan.c --- v2.4.13/linux/mm/vmscan.c Tue Oct 23 22:48:53 2001 +++ linux/mm/vmscan.c Thu Oct 25 03:31:38 2001 @@ -50,7 +50,6 @@ /* Don't look at this pte if it's been accessed recently. */ if (ptep_test_and_clear_young(page_table)) { - flush_tlb_page(vma, address); mark_page_accessed(page); return 0; } @@ -330,13 +329,15 @@ return 0; } -static int FASTCALL(shrink_cache(int nr_pages, int max_mapped, zone_t * classzone, unsigned int gfp_mask)); -static int shrink_cache(int nr_pages, int max_mapped, zone_t * classzone, unsigned int gfp_mask) +static int FASTCALL(shrink_cache(int nr_pages, zone_t * classzone, unsigned int gfp_mask, int priority)); +static int shrink_cache(int nr_pages, zone_t * classzone, unsigned int gfp_mask, int priority) { struct list_head * entry; + int max_scan = nr_inactive_pages / priority; + int max_mapped = max_scan / 4; spin_lock(&pagemap_lru_lock); - while (max_mapped && (entry = inactive_list.prev) != &inactive_list) { + while (--max_scan >= 0 && (entry = inactive_list.prev) != &inactive_list) { struct page * page; if (unlikely(current->need_resched)) { @@ -355,11 +356,18 @@ list_del(entry); list_add(entry, &inactive_list); + /* + * Zero page counts can happen because we unlink the pages + * _after_ decrementing the usage count.. + */ + if (unlikely(!page_count(page))) + continue; + if (!memclass(page->zone, classzone)) continue; /* Racy check to avoid trylocking when not worthwhile */ - if (!page->buffers && page_count(page) != 1) + if (!page->buffers && (page_count(page) != 1 || !page->mapping)) goto page_mapped; /* @@ -452,9 +460,6 @@ } } - if (unlikely(!page->mapping)) - BUG(); - if (unlikely(!spin_trylock(&pagecache_lock))) { /* we hold the page lock so the page cannot go away from under us */ spin_unlock(&pagemap_lru_lock); @@ -464,17 +469,32 @@ } /* - * this is the non-racy check, it is critical to check - * PageDirty _after_ we made sure the page is freeable - * so not in use by anybody. + * this is the non-racy check for busy page. */ - if (!is_page_cache_freeable(page) || PageDirty(page)) { + if (!page->mapping || !is_page_cache_freeable(page)) { spin_unlock(&pagecache_lock); UnlockPage(page); page_mapped: - if (--max_mapped) + if (--max_mapped >= 0) continue; - break; + + /* + * Alert! We've found too many mapped pages on the + * inactive list, so we start swapping out now! + */ + spin_unlock(&pagemap_lru_lock); + swap_out(priority, gfp_mask, classzone); + return nr_pages; + } + + /* + * It is critical to check PageDirty _after_ we made sure + * the page is freeable* so not in use by anybody. + */ + if (PageDirty(page)) { + spin_unlock(&pagecache_lock); + UnlockPage(page); + continue; } /* point of no return */ @@ -537,7 +557,6 @@ static int FASTCALL(shrink_caches(zone_t * classzone, int priority, unsigned int gfp_mask, int nr_pages)); static int shrink_caches(zone_t * classzone, int priority, unsigned int gfp_mask, int nr_pages) { - int max_scan; int chunk_size = nr_pages; unsigned long ratio; @@ -550,8 +569,7 @@ ratio = (unsigned long) nr_pages * nr_active_pages / ((nr_inactive_pages + 1) * 2); refill_inactive(ratio); - max_scan = nr_inactive_pages / priority; - nr_pages = shrink_cache(nr_pages, max_scan, classzone, gfp_mask); + nr_pages = shrink_cache(nr_pages, classzone, gfp_mask, priority); if (nr_pages <= 0) return 0; @@ -574,8 +592,6 @@ nr_pages = shrink_caches(classzone, priority, gfp_mask, nr_pages); if (nr_pages <= 0) return 1; - - ret |= swap_out(priority, gfp_mask, classzone); } while (--priority); return ret;