patch-2.4.0-test3 linux/drivers/acpi/interpreter/amprep.c
Next file: linux/drivers/acpi/interpreter/amregion.c
Previous file: linux/drivers/acpi/interpreter/amnames.c
Back to the patch index
Back to the overall index
- Lines: 393
- Date:
Wed Jul 5 11:23:12 2000
- Orig file:
v2.4.0-test2/linux/drivers/acpi/interpreter/amprep.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.4.0-test2/linux/drivers/acpi/interpreter/amprep.c linux/drivers/acpi/interpreter/amprep.c
@@ -0,0 +1,392 @@
+
+/******************************************************************************
+ *
+ * Module Name: amprep - ACPI AML (p-code) execution - field prep utilities
+ *
+ *****************************************************************************/
+
+/*
+ * 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 "interp.h"
+#include "amlcode.h"
+#include "namesp.h"
+#include "parser.h"
+
+
+#define _COMPONENT INTERPRETER
+ MODULE_NAME ("amprep");
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_aml_decode_field_access_type
+ *
+ * PARAMETERS: Access - Encoded field access bits
+ *
+ * RETURN: Field granularity (8, 16, or 32)
+ *
+ * DESCRIPTION: Decode the Access_type bits of a field definition.
+ *
+ ******************************************************************************/
+
+u32
+acpi_aml_decode_field_access_type (
+ u32 access)
+{
+
+ switch (access)
+ {
+ case ACCESS_ANY_ACC:
+ return 8;
+ break;
+
+ case ACCESS_BYTE_ACC:
+ return 8;
+ break;
+
+ case ACCESS_WORD_ACC:
+ return 16;
+ break;
+
+ case ACCESS_DWORD_ACC:
+ return 32;
+ break;
+
+ default:
+ /* Invalid field access type */
+
+ return 0;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_aml_prep_common_field_objec
+ *
+ * PARAMETERS: Obj_desc - The field object
+ * Field_flags - Access, Lock_rule, or Update_rule.
+ * The format of a Field_flag is described
+ * in the ACPI specification
+ * Field_position - Field position
+ * Field_length - Field length
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize the areas of the field object that are common
+ * to the various types of fields.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+acpi_aml_prep_common_field_object (
+ ACPI_OBJECT_INTERNAL *obj_desc,
+ u8 field_flags,
+ u8 field_attribute,
+ u32 field_position,
+ u32 field_length)
+{
+ u32 granularity;
+
+
+ /*
+ * Note: the structure being initialized is the
+ * ACPI_COMMON_FIELD_INFO; Therefore, we can just use the Field union to
+ * access this common area. No structure fields outside of the common area
+ * are initialized by this procedure.
+ */
+
+ /* Decode the Field_flags */
+
+ obj_desc->field.access = (u8) ((field_flags & ACCESS_TYPE_MASK)
+ >> ACCESS_TYPE_SHIFT);
+ obj_desc->field.lock_rule = (u8) ((field_flags & LOCK_RULE_MASK)
+ >> LOCK_RULE_SHIFT);
+ obj_desc->field.update_rule = (u8) ((field_flags & UPDATE_RULE_MASK)
+ >> UPDATE_RULE_SHIFT);
+
+ /* Other misc fields */
+
+ obj_desc->field.length = (u16) field_length;
+ obj_desc->field.access_attribute = field_attribute;
+
+ /* Decode the access type so we can compute offsets */
+
+ granularity = acpi_aml_decode_field_access_type (obj_desc->field.access);
+ if (!granularity) {
+ return (AE_AML_OPERAND_VALUE);
+ }
+
+ /* Access granularity based fields */
+
+ obj_desc->field.granularity = (u8) granularity;
+ obj_desc->field.bit_offset = (u8) (field_position % granularity);
+ obj_desc->field.offset = (u32) field_position / granularity;
+
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_aml_prep_def_field_value
+ *
+ * PARAMETERS: This_entry - Owning NTE
+ * Region - Region in which field is being defined
+ * Field_flags - Access, Lock_rule, or Update_rule.
+ * The format of a Field_flag is described
+ * in the ACPI specification
+ * Field_position - Field position
+ * Field_length - Field length
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Construct an ACPI_OBJECT_INTERNAL of type Def_field and
+ * connect it to the parent NTE.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+acpi_aml_prep_def_field_value (
+ ACPI_NAMED_OBJECT *this_entry,
+ ACPI_HANDLE region,
+ u8 field_flags,
+ u8 field_attribute,
+ u32 field_position,
+ u32 field_length)
+{
+ ACPI_OBJECT_INTERNAL *obj_desc;
+ s32 type;
+ ACPI_STATUS status;
+
+
+ /* Parameter validation */
+
+ if (!region) {
+ return (AE_AML_NO_OPERAND);
+ }
+
+ type = acpi_ns_get_type (region);
+ if (type != ACPI_TYPE_REGION) {
+ return (AE_AML_OPERAND_TYPE);
+ }
+
+ /* Allocate a new object */
+
+ obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_DEF_FIELD);
+ if (!obj_desc) {
+ return (AE_NO_MEMORY);
+ }
+
+
+ /* Obj_desc and Region valid */
+
+ /* Initialize areas of the object that are common to all fields */
+
+ status = acpi_aml_prep_common_field_object (obj_desc, field_flags, field_attribute,
+ field_position, field_length);
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /* Initialize areas of the object that are specific to this field type */
+
+ obj_desc->field.container = acpi_ns_get_attached_object (region);
+
+ /* An additional reference for the container */
+
+ acpi_cm_add_reference (obj_desc->field.container);
+
+
+ /* Debug info */
+
+ /*
+ * Store the constructed descriptor (Obj_desc) into the nte whose
+ * handle is on TOS, preserving the current type of that nte.
+ */
+ status = acpi_ns_attach_object ((ACPI_HANDLE) this_entry, obj_desc,
+ (u8) acpi_ns_get_type ((ACPI_HANDLE) this_entry));
+
+ return (status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_aml_prep_bank_field_value
+ *
+ * PARAMETERS: This_entry - Owning NTE
+ * Region - Region in which field is being defined
+ * Bank_reg - Bank selection register
+ * Bank_val - Value to store in selection register
+ * Field_flags - Access, Lock_rule, or Update_rule
+ * Field_position - Field position
+ * Field_length - Field length
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Construct an ACPI_OBJECT_INTERNAL of type Bank_field and
+ * connect it to the parent NTE.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+acpi_aml_prep_bank_field_value (
+ ACPI_NAMED_OBJECT *this_entry,
+ ACPI_HANDLE region,
+ ACPI_HANDLE bank_reg,
+ u32 bank_val,
+ u8 field_flags,
+ u8 field_attribute,
+ u32 field_position,
+ u32 field_length)
+{
+ ACPI_OBJECT_INTERNAL *obj_desc;
+ s32 type;
+ ACPI_STATUS status;
+
+
+ /* Parameter validation */
+
+ if (!region) {
+ return (AE_AML_NO_OPERAND);
+ }
+
+ type = acpi_ns_get_type (region);
+ if (type != ACPI_TYPE_REGION) {
+ return (AE_AML_OPERAND_TYPE);
+ }
+
+ /* Allocate a new object */
+
+ obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_BANK_FIELD);
+ if (!obj_desc) {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Obj_desc and Region valid */
+
+ /* Initialize areas of the object that are common to all fields */
+
+ status = acpi_aml_prep_common_field_object (obj_desc, field_flags, field_attribute,
+ field_position, field_length);
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /* Initialize areas of the object that are specific to this field type */
+
+ obj_desc->bank_field.value = bank_val;
+ obj_desc->bank_field.container = acpi_ns_get_attached_object (region);
+ obj_desc->bank_field.bank_select = acpi_ns_get_attached_object (bank_reg);
+
+ /* An additional reference for the container and bank select */
+ /* TBD: [Restructure] is "Bank_select" ever a real internal object?? */
+
+ acpi_cm_add_reference (obj_desc->bank_field.container);
+ acpi_cm_add_reference (obj_desc->bank_field.bank_select);
+
+ /* Debug info */
+
+ /*
+ * Store the constructed descriptor (Obj_desc) into the nte whose
+ * handle is on TOS, preserving the current type of that nte.
+ */
+ status = acpi_ns_attach_object ((ACPI_HANDLE) this_entry, obj_desc,
+ (u8) acpi_ns_get_type ((ACPI_HANDLE) this_entry));
+
+ return (status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Acpi_aml_prep_index_field_value
+ *
+ * PARAMETERS: This_entry - Owning NTE
+ * Index_reg - Index register
+ * Data_reg - Data register
+ * Field_flags - Access, Lock_rule, or Update_rule
+ * Field_position - Field position
+ * Field_length - Field length
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Construct an ACPI_OBJECT_INTERNAL of type Index_field and
+ * connect it to the parent NTE.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+acpi_aml_prep_index_field_value (
+ ACPI_NAMED_OBJECT *this_entry,
+ ACPI_HANDLE index_reg,
+ ACPI_HANDLE data_reg,
+ u8 field_flags,
+ u8 field_attribute,
+ u32 field_position,
+ u32 field_length)
+{
+ ACPI_OBJECT_INTERNAL *obj_desc;
+ ACPI_STATUS status;
+
+
+ /* Parameter validation */
+
+ if (!index_reg || !data_reg) {
+ return (AE_AML_NO_OPERAND);
+ }
+
+ /* Allocate a new object descriptor */
+
+ obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_INDEX_FIELD);
+ if (!obj_desc) {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Initialize areas of the object that are common to all fields */
+
+ status = acpi_aml_prep_common_field_object (obj_desc, field_flags, field_attribute,
+ field_position, field_length);
+ if (ACPI_FAILURE (status)) {
+ return (status);
+ }
+
+ /* Initialize areas of the object that are specific to this field type */
+
+ obj_desc->index_field.value = (u32) (field_position /
+ obj_desc->field.granularity);
+ obj_desc->index_field.index = index_reg;
+ obj_desc->index_field.data = data_reg;
+
+ /* Debug info */
+
+ /*
+ * Store the constructed descriptor (Obj_desc) into the nte whose
+ * handle is on TOS, preserving the current type of that nte.
+ */
+ status = acpi_ns_attach_object ((ACPI_HANDLE) this_entry, obj_desc,
+ (u8) acpi_ns_get_type ((ACPI_HANDLE) this_entry));
+
+ return (status);
+}
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)