ACPICA: ACPI 6.2: Add support for PinGroupConfig() resource
authorMika Westerberg <mika.westerberg@linux.intel.com>
Mon, 5 Jun 2017 08:39:37 +0000 (16:39 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 12 Jun 2017 12:58:40 +0000 (14:58 +0200)
ACPICA commit 08b83591c0db751769d61fa889f4f50f575aeffb

PinGroupConfig() is analogous to PinGroupFunction() but instead of mode
(muxing), it is used to apply specific fine-grained configuration to a
set of referenced pins.

The format of this new resource is:

  PinGroupConfig (Shared/Exclusive, PinConfigType, PinConfigValue,
                  ResourceSource, ResourceSourceIndex, ResourceSourceLabel,
                  ResourceUsage, DescriptorName, VendorData)

The PinConfigType/PinConfigValue are the same used by PinConfig()
resource.

Here also the combination of ResourceSource and ResourceSourceLabel is
used to specify the PinGroup() this resource refers to.

Link: https://github.com/acpica/acpica/commit/08b83591
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/aclocal.h
drivers/acpi/acpica/acresrc.h
drivers/acpi/acpica/amlresrc.h
drivers/acpi/acpica/rscalc.c
drivers/acpi/acpica/rsdumpinfo.c
drivers/acpi/acpica/rsinfo.c
drivers/acpi/acpica/rsserial.c
drivers/acpi/acpica/utresrc.c
include/acpi/acrestyp.h

index 75fd75c373a178bb1c0a9c1d847d8ce2bf9793f5..2a8394fe199e9f163abb2ef87e1c68e88b141f41 100644 (file)
@@ -1147,7 +1147,8 @@ struct acpi_port_info {
 #define ACPI_RESOURCE_NAME_PIN_CONFIG           0x8F
 #define ACPI_RESOURCE_NAME_PIN_GROUP            0x90
 #define ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION   0x91
-#define ACPI_RESOURCE_NAME_LARGE_MAX            0x91
+#define ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG     0x92
+#define ACPI_RESOURCE_NAME_LARGE_MAX            0x92
 
 /*****************************************************************************
  *
index 4b28939da311ff15d6eb3b8b2edef68af32b3f3a..438f3098a093a3e39ccc3ec8be87d91d46d2c8fd 100644 (file)
@@ -336,6 +336,7 @@ extern struct acpi_rsconvert_info acpi_rs_convert_pin_function[];
 extern struct acpi_rsconvert_info acpi_rs_convert_pin_config[];
 extern struct acpi_rsconvert_info acpi_rs_convert_pin_group[];
 extern struct acpi_rsconvert_info acpi_rs_convert_pin_group_function[];
+extern struct acpi_rsconvert_info acpi_rs_convert_pin_group_config[];
 
 /* These resources require separate get/set tables */
 
@@ -389,6 +390,7 @@ extern struct acpi_rsdump_info acpi_rs_dump_general_flags[];
 extern struct acpi_rsdump_info acpi_rs_dump_pin_config[];
 extern struct acpi_rsdump_info acpi_rs_dump_pin_group[];
 extern struct acpi_rsdump_info acpi_rs_dump_pin_group_function[];
+extern struct acpi_rsdump_info acpi_rs_dump_pin_group_config[];
 #endif
 
 #endif                         /* __ACRESRC_H__ */
index de44df73378fb62cc6da6ffe7ad23fde60919b18..1236e9a414e4d4b98b997c182a524ec37bf63c58 100644 (file)
@@ -483,6 +483,26 @@ struct aml_resource_pin_group_function {
 
 #define AML_RESOURCE_PIN_GROUP_FUNCTION_REVISION    1  /* ACPI 6.2 */
 
+struct aml_resource_pin_group_config {
+       AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
+       u16 flags;
+       u8 pin_config_type;
+       u32 pin_config_value;
+       u8 res_source_index;
+       u16 res_source_offset;
+       u16 res_source_label_offset;
+       u16 vendor_offset;
+       u16 vendor_length;
+       /*
+        * Optional fields follow immediately:
+        * 1) Resource Source String
+        * 2) Resource Source Label String
+        * 3) Vendor Data bytes
+        */
+};
+
+#define AML_RESOURCE_PIN_GROUP_CONFIG_REVISION    1    /* ACPI 6.2 */
+
 /* restore default alignment */
 
 #pragma pack()
@@ -529,6 +549,7 @@ union aml_resource {
        struct aml_resource_pin_config pin_config;
        struct aml_resource_pin_group pin_group;
        struct aml_resource_pin_group_function pin_group_function;
+       struct aml_resource_pin_group_config pin_group_config;
 
        /* Utility overlays */
 
index a0331ef6269c9e7c02a5036a90deaa04770689e5..659fb718504a660b75bf0dd52767b729929df602 100644 (file)
@@ -419,6 +419,23 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
 
                        break;
 
+               case ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG:
+
+                       total_size = (acpi_rs_length)(total_size +
+                                                     resource->data.
+                                                     pin_group_config.
+                                                     resource_source.
+                                                     string_length +
+                                                     resource->data.
+                                                     pin_group_config.
+                                                     resource_source_label.
+                                                     string_length +
+                                                     resource->data.
+                                                     pin_group_config.
+                                                     vendor_length);
+
+                       break;
+
                default:
 
                        break;
@@ -660,6 +677,15 @@ acpi_rs_get_list_length(u8 *aml_buffer,
 
                        break;
 
+               case ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG:
+
+                       extra_struct_bytes +=
+                           aml_resource->pin_group_config.vendor_offset -
+                           aml_resource->pin_group_config.res_source_offset +
+                           aml_resource->pin_group_config.vendor_length;
+
+                       break;
+
                default:
 
                        break;
index 355b40f9b235ad08e3114ce90b2fa471dba28f92..da150e17795b9ff089a1fe8928defe7a4ded4670 100644 (file)
@@ -404,6 +404,30 @@ struct acpi_rsdump_info acpi_rs_dump_pin_group_function[9] = {
         "VendorData", NULL},
 };
 
+struct acpi_rsdump_info acpi_rs_dump_pin_group_config[10] = {
+       {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_pin_group_config),
+        "PinGroupConfig", NULL},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_group_config.revision_id),
+        "RevisionId", NULL},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_group_config.producer_consumer),
+        "ProducerConsumer", acpi_gbl_consume_decode},
+       {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_group_config.sharable),
+        "Sharing", acpi_gbl_shr_decode},
+       {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_group_config.pin_config_type),
+        "PinConfigType", NULL},
+       {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(pin_group_config.pin_config_value),
+        "PinConfigValue", NULL},
+       {ACPI_RSD_SOURCE_LABEL,
+        ACPI_RSD_OFFSET(pin_group_config.resource_source_label),
+        "ResourceSourceLabel", NULL},
+       {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(pin_group_config.resource_source),
+        "ResourceSource", NULL},
+       {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_group_config.vendor_length),
+        "VendorLength", NULL},
+       {ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(pin_group_config.vendor_data),
+        "VendorData", NULL},
+};
+
 struct acpi_rsdump_info acpi_rs_dump_fixed_dma[4] = {
        {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_dma),
         "FixedDma", NULL},
index ebccc6a4267b7847c147be0f7191077f22b96012..b0e50518d76663f989bbe81ce472e46676d3f6a3 100644 (file)
@@ -84,6 +84,7 @@ struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[] = {
        acpi_rs_convert_pin_config,     /* 0x15, ACPI_RESOURCE_TYPE_PIN_CONFIG */
        acpi_rs_convert_pin_group,      /* 0x16, ACPI_RESOURCE_TYPE_PIN_GROUP */
        acpi_rs_convert_pin_group_function,     /* 0x17, ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
+       acpi_rs_convert_pin_group_config,       /* 0x18, ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
 };
 
 /* Dispatch tables for AML-to-resource (Get Resource) conversion functions */
@@ -128,6 +129,7 @@ struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[] = {
        acpi_rs_convert_pin_config,     /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
        acpi_rs_convert_pin_group,      /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
        acpi_rs_convert_pin_group_function,     /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
+       acpi_rs_convert_pin_group_config,       /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
 };
 
 /* Subtype table for serial_bus -- I2C, SPI, and UART */
@@ -168,6 +170,7 @@ struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[] = {
        acpi_rs_dump_pin_config,        /* ACPI_RESOURCE_TYPE_PIN_CONFIG */
        acpi_rs_dump_pin_group, /* ACPI_RESOURCE_TYPE_PIN_GROUP */
        acpi_rs_dump_pin_group_function,        /* ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
+       acpi_rs_dump_pin_group_config,  /* ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
 };
 
 struct acpi_rsdump_info *acpi_gbl_dump_serial_bus_dispatch[] = {
@@ -208,6 +211,7 @@ const u8 acpi_gbl_aml_resource_sizes[] = {
        sizeof(struct aml_resource_pin_config), /* ACPI_RESOURCE_TYPE_PIN_CONFIG */
        sizeof(struct aml_resource_pin_group),  /* ACPI_RESOURCE_TYPE_PIN_GROUP */
        sizeof(struct aml_resource_pin_group_function), /* ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
+       sizeof(struct aml_resource_pin_group_config),   /* ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
 };
 
 const u8 acpi_gbl_resource_struct_sizes[] = {
@@ -250,6 +254,7 @@ const u8 acpi_gbl_resource_struct_sizes[] = {
        ACPI_RS_SIZE(struct acpi_resource_pin_config),
        ACPI_RS_SIZE(struct acpi_resource_pin_group),
        ACPI_RS_SIZE(struct acpi_resource_pin_group_function),
+       ACPI_RS_SIZE(struct acpi_resource_pin_group_config),
 };
 
 const u8 acpi_gbl_aml_resource_serial_bus_sizes[] = {
index 96ee92ec044db49201e0775def04d939c731e24b..14d12d6eb716f8f148ed11093a83a9ef26f64d92 100644 (file)
@@ -751,3 +751,83 @@ struct acpi_rsconvert_info acpi_rs_convert_pin_group_function[13] = {
         AML_OFFSET(pin_group_function.vendor_offset),
         0},
 };
+
+/*******************************************************************************
+ *
+ * acpi_rs_convert_pin_group_config
+ *
+ ******************************************************************************/
+
+struct acpi_rsconvert_info acpi_rs_convert_pin_group_config[14] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG,
+        ACPI_RS_SIZE(struct acpi_resource_pin_group_config),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_group_config)},
+
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG,
+        sizeof(struct aml_resource_pin_group_config),
+        0},
+
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group_config.revision_id),
+        AML_OFFSET(pin_group_config.revision_id),
+        1},
+
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_group_config.sharable),
+        AML_OFFSET(pin_group_config.flags),
+        0},
+
+       {ACPI_RSC_1BITFLAG,
+        ACPI_RS_OFFSET(data.pin_group_config.producer_consumer),
+        AML_OFFSET(pin_group_config.flags),
+        1},
+
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group_config.pin_config_type),
+        AML_OFFSET(pin_group_config.pin_config_type),
+        1},
+
+       {ACPI_RSC_MOVE32,
+        ACPI_RS_OFFSET(data.pin_group_config.pin_config_value),
+        AML_OFFSET(pin_group_config.pin_config_value),
+        1},
+
+       /* Resource Source */
+
+       {ACPI_RSC_MOVE8,
+        ACPI_RS_OFFSET(data.pin_group_config.resource_source.index),
+        AML_OFFSET(pin_group_config.res_source_index),
+        1},
+
+       {ACPI_RSC_COUNT_GPIO_RES,
+        ACPI_RS_OFFSET(data.pin_group_config.resource_source.string_length),
+        AML_OFFSET(pin_group_config.res_source_offset),
+        AML_OFFSET(pin_group_config.res_source_label_offset)},
+
+       {ACPI_RSC_MOVE_GPIO_RES,
+        ACPI_RS_OFFSET(data.pin_group_config.resource_source.string_ptr),
+        AML_OFFSET(pin_group_config.res_source_offset),
+        0},
+
+       /* Resource Source Label */
+
+       {ACPI_RSC_COUNT_GPIO_RES,
+        ACPI_RS_OFFSET(data.pin_group_config.resource_source_label.
+                       string_length),
+        AML_OFFSET(pin_group_config.res_source_label_offset),
+        AML_OFFSET(pin_group_config.vendor_offset)},
+
+       {ACPI_RSC_MOVE_GPIO_RES,
+        ACPI_RS_OFFSET(data.pin_group_config.resource_source_label.string_ptr),
+        AML_OFFSET(pin_group_config.res_source_label_offset),
+        0},
+
+       /* Vendor Data */
+
+       {ACPI_RSC_COUNT_GPIO_VEN,
+        ACPI_RS_OFFSET(data.pin_group_config.vendor_length),
+        AML_OFFSET(pin_group_config.vendor_length),
+        1},
+
+       {ACPI_RSC_MOVE_GPIO_RES,
+        ACPI_RS_OFFSET(data.pin_group_config.vendor_data),
+        AML_OFFSET(pin_group_config.vendor_offset),
+        0},
+};
index bf5d19e4f9d243c243b9d9d9cd8e8b5a1bdf8620..b4282ea32262f286884dda3899b9b6fb0df9dd3e 100644 (file)
@@ -356,6 +356,7 @@ const u8 acpi_gbl_resource_aml_sizes[] = {
        ACPI_AML_SIZE_LARGE(struct aml_resource_pin_config),
        ACPI_AML_SIZE_LARGE(struct aml_resource_pin_group),
        ACPI_AML_SIZE_LARGE(struct aml_resource_pin_group_function),
+       ACPI_AML_SIZE_LARGE(struct aml_resource_pin_group_config),
 };
 
 const u8 acpi_gbl_resource_aml_serial_bus_sizes[] = {
@@ -411,6 +412,7 @@ static const u8 acpi_gbl_resource_types[] = {
        ACPI_VARIABLE_LENGTH,   /* 0F pin_config */
        ACPI_VARIABLE_LENGTH,   /* 10 pin_group */
        ACPI_VARIABLE_LENGTH,   /* 11 pin_group_function */
+       ACPI_VARIABLE_LENGTH,   /* 12 pin_group_config */
 };
 
 /*******************************************************************************
index b4b9e5721b14ef40670688ebfd9e502f90b5fde9..343dbdcef20c66b6a1833d03f23028a625a7bb67 100644 (file)
@@ -602,6 +602,18 @@ struct acpi_resource_pin_group_function {
        u8 *vendor_data;
 };
 
+struct acpi_resource_pin_group_config {
+       u8 revision_id;
+       u8 producer_consumer;   /* For values, see Producer/Consumer above */
+       u8 sharable;            /* For values, see Interrupt Attributes above */
+       u8 pin_config_type;     /* For values, see pin_config_type above */
+       u32 pin_config_value;
+       u16 vendor_length;
+       struct acpi_resource_source resource_source;
+       struct acpi_resource_label resource_source_label;
+       u8 *vendor_data;
+};
+
 /* ACPI_RESOURCE_TYPEs */
 
 #define ACPI_RESOURCE_TYPE_IRQ                  0
@@ -628,7 +640,8 @@ struct acpi_resource_pin_group_function {
 #define ACPI_RESOURCE_TYPE_PIN_CONFIG           21     /* ACPI 6.2 */
 #define ACPI_RESOURCE_TYPE_PIN_GROUP            22     /* ACPI 6.2 */
 #define ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION   23     /* ACPI 6.2 */
-#define ACPI_RESOURCE_TYPE_MAX                  23
+#define ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG     24     /* ACPI 6.2 */
+#define ACPI_RESOURCE_TYPE_MAX                  24
 
 /* Master union for resource descriptors */
 
@@ -660,6 +673,7 @@ union acpi_resource_data {
        struct acpi_resource_pin_config pin_config;
        struct acpi_resource_pin_group pin_group;
        struct acpi_resource_pin_group_function pin_group_function;
+       struct acpi_resource_pin_group_config pin_group_config;
 
        /* Common fields */