]> git.itanic.dy.fi Git - linux-stable/commitdiff
ACPICA: Add support for FFH Opregion special context data
authorSudeep Holla <sudeep.holla@arm.com>
Thu, 27 Oct 2022 17:54:32 +0000 (19:54 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 28 Oct 2022 15:28:22 +0000 (17:28 +0200)
ACPICA commit fad527b6e76babc7527c41325bfbef6bd1a1132b

FFH(Fixed Function Hardware) Opregion is approved to be added in ACPI 6.5 via
code first approach [1]. It requires special context data similar to GPIO and
Generic Serial Bus as it needs to know platform specific offset and length.

Add support for the special context data needed by FFH Opregion.

FFH op_region enables advanced use of FFH on some architectures. For example,
it could be used to easily proxy AML code to architecture-specific behavior
(to ensure it is OS initiated)

Actual behavior of FFH is ofcourse architecture specific and depends on
the FFH bindings. The offset and length could have arch specific meaning
or usage.

Link: https://bugzilla.tianocore.org/show_bug.cgi?id=3598
Link: https://github.com/acpica/acpica/commit/fad527b6
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/evregion.c
drivers/acpi/acpica/exfield.c
drivers/acpi/acpica/exserial.c
include/acpi/acconfig.h
include/acpi/actypes.h

index b96b3a7e78e50acdcab4ac0239d8a223a05068dd..d035092799eb577e7e8afa7c1f9a555a18cc8068 100644 (file)
@@ -172,6 +172,15 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
                        ctx->subspace_id = (u8)region_obj->region.address;
                }
 
+               if (region_obj->region.space_id ==
+                   ACPI_ADR_SPACE_FIXED_HARDWARE) {
+                       struct acpi_ffh_info *ctx =
+                           handler_desc->address_space.context;
+
+                       ctx->length = region_obj->region.length;
+                       ctx->offset = region_obj->region.address;
+               }
+
                /*
                 * We must exit the interpreter because the region setup will
                 * potentially execute control methods (for example, the _REG method
index 2b89a496de65c69a652e0f4bf6c63ba865726991..657f4002f9dca6fa00f0ffcf1f8a1a227ba0cff9 100644 (file)
@@ -141,7 +141,9 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state,
                    || obj_desc->field.region_obj->region.space_id ==
                    ACPI_ADR_SPACE_IPMI
                    || obj_desc->field.region_obj->region.space_id ==
-                   ACPI_ADR_SPACE_PLATFORM_RT)) {
+                   ACPI_ADR_SPACE_PLATFORM_RT
+                   || obj_desc->field.region_obj->region.space_id ==
+                   ACPI_ADR_SPACE_FIXED_HARDWARE)) {
 
                /* SMBus, GSBus, IPMI serial */
 
@@ -305,7 +307,9 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
                    || obj_desc->field.region_obj->region.space_id ==
                    ACPI_ADR_SPACE_IPMI
                    || obj_desc->field.region_obj->region.space_id ==
-                   ACPI_ADR_SPACE_PLATFORM_RT)) {
+                   ACPI_ADR_SPACE_PLATFORM_RT
+                   || obj_desc->field.region_obj->region.space_id ==
+                   ACPI_ADR_SPACE_FIXED_HARDWARE)) {
 
                /* SMBus, GSBus, IPMI serial */
 
index 4da20d7845df1ee87d0d6efab5cc16fdb8de1e42..fd63f20425147db4271e27755744198771a2b50d 100644 (file)
@@ -323,6 +323,12 @@ acpi_ex_write_serial_bus(union acpi_operand_object *source_desc,
                function = ACPI_WRITE;
                break;
 
+       case ACPI_ADR_SPACE_FIXED_HARDWARE:
+
+               buffer_length = ACPI_FFH_INPUT_BUFFER_SIZE;
+               function = ACPI_WRITE;
+               break;
+
        default:
                return_ACPI_STATUS(AE_AML_INVALID_SPACE_ID);
        }
index c3ae3ea88e178b8f965dfe0c5d490a360f5258ce..151e40385673f73e9269283d2dca0fdded49eacb 100644 (file)
 
 #define ACPI_PRM_INPUT_BUFFER_SIZE      26
 
+#define ACPI_FFH_INPUT_BUFFER_SIZE      256
+
 /* _sx_d and _sx_w control methods */
 
 #define ACPI_NUM_sx_d_METHODS           4
index ed725335741e0d2d14e72c29bb08bd809a82a89f..95e4f56f97546665165c3ede9ed85f8451f40c6a 100644 (file)
@@ -1116,6 +1116,13 @@ struct acpi_pcc_info {
        u8 *internal_buffer;
 };
 
+/* Special Context data for FFH Opregion (ACPI 6.5) */
+
+struct acpi_ffh_info {
+       u64 offset;
+       u64 length;
+};
+
 typedef
 acpi_status (*acpi_adr_space_setup) (acpi_handle region_handle,
                                     u32 function,