diff options
Diffstat (limited to 'drivers/acpi/dispatcher/dsopcode.c')
-rw-r--r-- | drivers/acpi/dispatcher/dsopcode.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c index f0847eed5f3a..a3f29798d1d1 100644 --- a/drivers/acpi/dispatcher/dsopcode.c +++ b/drivers/acpi/dispatcher/dsopcode.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #include <acpi/acinterp.h> | 49 | #include <acpi/acinterp.h> |
50 | #include <acpi/acnamesp.h> | 50 | #include <acpi/acnamesp.h> |
51 | #include <acpi/acevents.h> | 51 | #include <acpi/acevents.h> |
52 | #include <acpi/actables.h> | ||
52 | 53 | ||
53 | #define _COMPONENT ACPI_DISPATCHER | 54 | #define _COMPONENT ACPI_DISPATCHER |
54 | ACPI_MODULE_NAME("dsopcode") | 55 | ACPI_MODULE_NAME("dsopcode") |
@@ -782,6 +783,108 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state, | |||
782 | 783 | ||
783 | /******************************************************************************* | 784 | /******************************************************************************* |
784 | * | 785 | * |
786 | * FUNCTION: acpi_ds_eval_table_region_operands | ||
787 | * | ||
788 | * PARAMETERS: walk_state - Current walk | ||
789 | * Op - A valid region Op object | ||
790 | * | ||
791 | * RETURN: Status | ||
792 | * | ||
793 | * DESCRIPTION: Get region address and length | ||
794 | * Called from acpi_ds_exec_end_op during data_table_region parse tree walk | ||
795 | * | ||
796 | ******************************************************************************/ | ||
797 | |||
798 | acpi_status | ||
799 | acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state, | ||
800 | union acpi_parse_object *op) | ||
801 | { | ||
802 | acpi_status status; | ||
803 | union acpi_operand_object *obj_desc; | ||
804 | union acpi_operand_object **operand; | ||
805 | struct acpi_namespace_node *node; | ||
806 | union acpi_parse_object *next_op; | ||
807 | acpi_native_uint table_index; | ||
808 | struct acpi_table_header *table; | ||
809 | |||
810 | ACPI_FUNCTION_TRACE_PTR(ds_eval_table_region_operands, op); | ||
811 | |||
812 | /* | ||
813 | * This is where we evaluate the signature_string and oem_iDString | ||
814 | * and oem_table_iDString of the data_table_region declaration | ||
815 | */ | ||
816 | node = op->common.node; | ||
817 | |||
818 | /* next_op points to signature_string op */ | ||
819 | |||
820 | next_op = op->common.value.arg; | ||
821 | |||
822 | /* | ||
823 | * Evaluate/create the signature_string and oem_iDString | ||
824 | * and oem_table_iDString operands | ||
825 | */ | ||
826 | status = acpi_ds_create_operands(walk_state, next_op); | ||
827 | if (ACPI_FAILURE(status)) { | ||
828 | return_ACPI_STATUS(status); | ||
829 | } | ||
830 | |||
831 | /* | ||
832 | * Resolve the signature_string and oem_iDString | ||
833 | * and oem_table_iDString operands | ||
834 | */ | ||
835 | status = acpi_ex_resolve_operands(op->common.aml_opcode, | ||
836 | ACPI_WALK_OPERANDS, walk_state); | ||
837 | if (ACPI_FAILURE(status)) { | ||
838 | return_ACPI_STATUS(status); | ||
839 | } | ||
840 | |||
841 | ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE, | ||
842 | acpi_ps_get_opcode_name(op->common.aml_opcode), | ||
843 | 1, "after AcpiExResolveOperands"); | ||
844 | |||
845 | operand = &walk_state->operands[0]; | ||
846 | |||
847 | /* Find the ACPI table */ | ||
848 | |||
849 | status = acpi_tb_find_table(operand[0]->string.pointer, | ||
850 | operand[1]->string.pointer, | ||
851 | operand[2]->string.pointer, &table_index); | ||
852 | if (ACPI_FAILURE(status)) { | ||
853 | return_ACPI_STATUS(status); | ||
854 | } | ||
855 | |||
856 | acpi_ut_remove_reference(operand[0]); | ||
857 | acpi_ut_remove_reference(operand[1]); | ||
858 | acpi_ut_remove_reference(operand[2]); | ||
859 | |||
860 | status = acpi_get_table_by_index(table_index, &table); | ||
861 | if (ACPI_FAILURE(status)) { | ||
862 | return_ACPI_STATUS(status); | ||
863 | } | ||
864 | |||
865 | obj_desc = acpi_ns_get_attached_object(node); | ||
866 | if (!obj_desc) { | ||
867 | return_ACPI_STATUS(AE_NOT_EXIST); | ||
868 | } | ||
869 | |||
870 | obj_desc->region.address = | ||
871 | (acpi_physical_address) ACPI_TO_INTEGER(table); | ||
872 | obj_desc->region.length = table->length; | ||
873 | |||
874 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n", | ||
875 | obj_desc, | ||
876 | ACPI_FORMAT_NATIVE_UINT(obj_desc->region.address), | ||
877 | obj_desc->region.length)); | ||
878 | |||
879 | /* Now the address and length are valid for this opregion */ | ||
880 | |||
881 | obj_desc->region.flags |= AOPOBJ_DATA_VALID; | ||
882 | |||
883 | return_ACPI_STATUS(status); | ||
884 | } | ||
885 | |||
886 | /******************************************************************************* | ||
887 | * | ||
785 | * FUNCTION: acpi_ds_eval_data_object_operands | 888 | * FUNCTION: acpi_ds_eval_data_object_operands |
786 | * | 889 | * |
787 | * PARAMETERS: walk_state - Current walk | 890 | * PARAMETERS: walk_state - Current walk |