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

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)