patch-2.4.0-test3 linux/drivers/acpi/dispatcher/dsfield.c
Next file: linux/drivers/acpi/dispatcher/dsmethod.c
Previous file: linux/drivers/acpi/common/cmxface.c
Back to the patch index
Back to the overall index
- Lines: 415
- Date:
Wed Jul 5 11:23:12 2000
- Orig file:
v2.4.0-test2/linux/drivers/acpi/dispatcher/dsfield.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.4.0-test2/linux/drivers/acpi/dispatcher/dsfield.c linux/drivers/acpi/dispatcher/dsfield.c
@@ -0,0 +1,414 @@
+
+/******************************************************************************
+ *
+ * Module Name: dsfield - Dispatcher field routines
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 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 "amlcode.h"
+#include "dispatch.h"
+#include "interp.h"
+#include "namesp.h"
+
+
+#define _COMPONENT 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
+ *
+ * PARAMETERS: Op - Op containing the Field definition and args
+ * Region - NTE for the containing Operation Region
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new field in the specified operation region
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+acpi_ds_create_field (
+ ACPI_GENERIC_OP *op,
+ ACPI_HANDLE region,
+ ACPI_WALK_STATE *walk_state)
+{
+ ACPI_STATUS status = AE_AML_ERROR;
+ ACPI_GENERIC_OP *arg;
+ ACPI_NAMED_OBJECT *entry;
+ u8 field_flags;
+ u8 access_attribute = 0;
+ u32 field_bit_position = 0;
+
+
+ /* First arg is the name of the parent Op_region */
+
+ arg = op->value.arg;
+
+ /* Second arg is the field flags */
+
+ arg = arg->next;
+ field_flags = (u8) arg->value.integer;
+
+ /* Each remaining arg is a Named Field */
+
+ arg = arg->next;
+ while (arg) {
+ switch (arg->opcode)
+ {
+ case AML_RESERVEDFIELD_OP:
+
+ field_bit_position += arg->value.size;
+ break;
+
+
+ case AML_ACCESSFIELD_OP:
+
+ /*
+ * Get a new Access_type and Access_attribute for all
+ * entries (until end or another Access_as keyword)
+ */
+
+ access_attribute = (u8) arg->value.integer;
+ field_flags = (u8)
+ ((field_flags & FIELD_ACCESS_TYPE_MASK) ||
+ ((u8) (arg->value.integer >> 8)));
+ break;
+
+
+ case AML_NAMEDFIELD_OP:
+
+ status = acpi_ns_lookup (walk_state->scope_info,
+ (char *) &((ACPI_NAMED_OP *)arg)->name,
+ INTERNAL_TYPE_DEF_FIELD,
+ IMODE_LOAD_PASS1,
+ NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
+ NULL, &entry);
+
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /*
+ * Initialize an object for the new NTE that is on
+ * the object stack
+ */
+
+ status = acpi_aml_prep_def_field_value (entry, region,
+ field_flags,
+ access_attribute,
+ field_bit_position,
+ arg->value.size);
+
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /* Keep track of bit position for the *next* field */
+
+ field_bit_position += arg->value.size;
+ break;
+ }
+
+ arg = arg->next;
+ }
+
+ return (status);
+}
+
+
+/*****************************************************************************
+ *
+ * FUNCTION: Acpi_ds_create_bank_field
+ *
+ * PARAMETERS: Op - Op containing the Field definition and args
+ * Region - NTE for the containing Operation Region
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new bank field in the specified operation region
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+acpi_ds_create_bank_field (
+ ACPI_GENERIC_OP *op,
+ ACPI_HANDLE region,
+ ACPI_WALK_STATE *walk_state)
+{
+ ACPI_STATUS status = AE_AML_ERROR;
+ ACPI_GENERIC_OP *arg;
+ ACPI_NAMED_OBJECT *bank_reg;
+ ACPI_NAMED_OBJECT *entry;
+ u32 bank_value;
+ u8 field_flags;
+ u8 access_attribute = 0;
+ u32 field_bit_position = 0;
+
+
+ /* First arg is the name of the parent Op_region */
+
+ arg = op->value.arg;
+
+ /* Socond arg is the Bank Register */
+
+ arg = arg->next;
+
+ 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, &bank_reg);
+
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /* Third arg is the Bank_value */
+
+ arg = arg->next;
+ bank_value = arg->value.integer;
+
+
+ /* Next arg is the field flags */
+
+ arg = arg->next;
+ field_flags = (u8) arg->value.integer;
+
+ /* Each remaining arg is a Named Field */
+
+ arg = arg->next;
+ while (arg) {
+ switch (arg->opcode)
+ {
+ case AML_RESERVEDFIELD_OP:
+
+ field_bit_position += arg->value.size;
+ break;
+
+
+ case AML_ACCESSFIELD_OP:
+
+ /*
+ * Get a new Access_type and Access_attribute for
+ * all entries (until end or another Access_as keyword)
+ */
+
+ access_attribute = (u8) arg->value.integer;
+ field_flags = (u8)
+ ((field_flags & FIELD_ACCESS_TYPE_MASK) ||
+ ((u8) (arg->value.integer >> 8)));
+ break;
+
+
+ case AML_NAMEDFIELD_OP:
+
+ status = acpi_ns_lookup (walk_state->scope_info,
+ (char *) &((ACPI_NAMED_OP *)arg)->name,
+ INTERNAL_TYPE_DEF_FIELD,
+ IMODE_LOAD_PASS1,
+ NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
+ NULL, &entry);
+
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /*
+ * Initialize an object for the new NTE that is on
+ * the object stack
+ */
+
+ status = acpi_aml_prep_bank_field_value (entry, region,
+ bank_reg, bank_value,
+ field_flags,
+ access_attribute,
+ field_bit_position,
+ arg->value.size);
+
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /* Keep track of bit position for the *next* field */
+
+ field_bit_position += arg->value.size;
+ break;
+
+ }
+
+ arg = arg->next;
+ }
+
+ return (status);
+}
+
+
+/*****************************************************************************
+ *
+ * FUNCTION: Acpi_ds_create_index_field
+ *
+ * PARAMETERS: Op - Op containing the Field definition and args
+ * Region - NTE for the containing Operation Region
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new index field in the specified operation region
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+acpi_ds_create_index_field (
+ ACPI_GENERIC_OP *op,
+ ACPI_HANDLE region,
+ ACPI_WALK_STATE *walk_state)
+{
+ ACPI_STATUS status;
+ ACPI_GENERIC_OP *arg;
+ ACPI_NAMED_OBJECT *entry;
+ ACPI_NAMED_OBJECT *index_reg;
+ ACPI_NAMED_OBJECT *data_reg;
+ u8 field_flags;
+ u8 access_attribute = 0;
+ u32 field_bit_position = 0;
+
+
+ arg = op->value.arg;
+
+ /* First arg is the name of the Index register */
+
+ 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_reg);
+
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /* Second arg is the data register */
+
+ 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_reg);
+
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+
+ /* Next arg is the field flags */
+
+ arg = arg->next;
+ field_flags = (u8) arg->value.integer;
+
+
+ /* Each remaining arg is a Named Field */
+
+ arg = arg->next;
+ while (arg) {
+ switch (arg->opcode)
+ {
+ case AML_RESERVEDFIELD_OP:
+
+ field_bit_position += arg->value.size;
+ break;
+
+
+ case AML_ACCESSFIELD_OP:
+
+ /*
+ * Get a new Access_type and Access_attribute for all
+ * entries (until end or another Access_as keyword)
+ */
+
+ access_attribute = (u8) arg->value.integer;
+ field_flags = (u8)
+ ((field_flags & FIELD_ACCESS_TYPE_MASK) ||
+ ((u8) (arg->value.integer >> 8)));
+ break;
+
+
+ case AML_NAMEDFIELD_OP:
+
+ status = acpi_ns_lookup (walk_state->scope_info,
+ (char *) &((ACPI_NAMED_OP *)arg)->name,
+ INTERNAL_TYPE_INDEX_FIELD,
+ IMODE_LOAD_PASS1,
+ NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
+ NULL, &entry);
+
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /*
+ * Initialize an object for the new NTE that is on
+ * the object stack
+ */
+
+ status = acpi_aml_prep_index_field_value (entry, index_reg,
+ data_reg, field_flags,
+ access_attribute,
+ field_bit_position,
+ arg->value.size);
+
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /* Keep track of bit position for the *next* field */
+
+ field_bit_position += arg->value.size;
+ break;
+
+
+ default:
+
+ status = AE_AML_ERROR;
+ break;
+ }
+
+ arg = arg->next;
+ }
+
+ return (status);
+}
+
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)