Commit fdaa0980 authored by Mika Westerberg's avatar Mika Westerberg Committed by Rafael J. Wysocki
Browse files

ACPICA: ACPI 6.2: Add support for PinGroup() resource

ACPICA commit 7d928e3174fb19d7dc0066b03c30bea07c001563

ACPI 6.2 introduced a new resource that is used to declare set of pins
belonging to a GPIO controller. This resource is referenced by new
PinGroupFunction() and PinGroupConfig() resources using ResourceSource
and ResourceLabel fields.

The PinGroup() resource looks like this:

  PinGroup (ResourceLabel, ResourceUsage, DescriptorName,
            VendorData) {Pin List}

This resource should be listed in _CRS under the GPIO/pincontroller
device providing these pins.

Link: https://github.com/acpica/acpica/commit/7d928e31


Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 97028ce6
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1145,7 +1145,8 @@ struct acpi_port_info {
#define ACPI_RESOURCE_NAME_PIN_FUNCTION         0x8D
#define ACPI_RESOURCE_NAME_SERIAL_BUS           0x8E
#define ACPI_RESOURCE_NAME_PIN_CONFIG           0x8F
#define ACPI_RESOURCE_NAME_LARGE_MAX            0x8F
#define ACPI_RESOURCE_NAME_PIN_GROUP            0x90
#define ACPI_RESOURCE_NAME_LARGE_MAX            0x90

/*****************************************************************************
 *
+5 −1
Original line number Diff line number Diff line
@@ -148,7 +148,9 @@ typedef enum {
	ACPI_RSD_UINT16,
	ACPI_RSD_UINT32,
	ACPI_RSD_UINT64,
	ACPI_RSD_WORDLIST
	ACPI_RSD_WORDLIST,
	ACPI_RSD_LABEL,

} ACPI_RSDUMP_OPCODES;

/* restore default alignment */
@@ -331,6 +333,7 @@ extern struct acpi_rsconvert_info acpi_rs_convert_spi_serial_bus[];
extern struct acpi_rsconvert_info acpi_rs_convert_uart_serial_bus[];
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[];

/* These resources require separate get/set tables */

@@ -382,6 +385,7 @@ extern struct acpi_rsdump_info acpi_rs_dump_spi_serial_bus[];
extern struct acpi_rsdump_info acpi_rs_dump_uart_serial_bus[];
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[];
#endif

#endif				/* __ACRESRC_H__ */
+18 −0
Original line number Diff line number Diff line
@@ -447,6 +447,23 @@ struct aml_resource_pin_config {

#define AML_RESOURCE_PIN_CONFIG_REVISION      1	/* ACPI 6.2 */

struct aml_resource_pin_group {
	AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
	u16 flags;
	u16 pin_table_offset;
	u16 label_offset;
	u16 vendor_offset;
	u16 vendor_length;
	/*
	 * Optional fields follow immediately:
	 * 1) PIN list (Words)
	 * 2) Resource Label String
	 * 3) Vendor Data bytes
	 */
};

#define AML_RESOURCE_PIN_GROUP_REVISION      1	/* ACPI 6.2 */

/* restore default alignment */

#pragma pack()
@@ -491,6 +508,7 @@ union aml_resource {
	struct aml_resource_common_serialbus common_serial_bus;
	struct aml_resource_pin_function pin_function;
	struct aml_resource_pin_config pin_config;
	struct aml_resource_pin_group pin_group;

	/* Utility overlays */

+22 −0
Original line number Diff line number Diff line
@@ -389,6 +389,19 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,

			break;

		case ACPI_RESOURCE_TYPE_PIN_GROUP:

			total_size = (acpi_rs_length)(total_size +
						      (resource->data.pin_group.
						       pin_table_length * 2) +
						      resource->data.pin_group.
						      resource_label.
						      string_length +
						      resource->data.pin_group.
						      vendor_length);

			break;

		default:

			break;
@@ -612,6 +625,15 @@ acpi_rs_get_list_length(u8 *aml_buffer,
			}
			break;

		case ACPI_RESOURCE_NAME_PIN_GROUP:

			extra_struct_bytes +=
			    aml_resource->pin_group.vendor_offset -
			    aml_resource->pin_group.pin_table_offset +
			    aml_resource->pin_group.vendor_length;

			break;

		default:

			break;
+38 −0
Original line number Diff line number Diff line
@@ -75,6 +75,10 @@ static void acpi_rs_dump_short_byte_list(u8 length, u8 *data);
static void
acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source);

static void
acpi_rs_dump_resource_label(char *title,
			    struct acpi_resource_label *resource_label);

static void acpi_rs_dump_address_common(union acpi_resource_data *resource);

static void
@@ -371,6 +375,16 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
								   target));
			break;

		case ACPI_RSD_LABEL:
			/*
			 * resource_label
			 */
			acpi_rs_dump_resource_label("Resource Label",
						    ACPI_CAST_PTR(struct
								  acpi_resource_label,
								  target));
			break;

		default:

			acpi_os_printf("**** Invalid table opcode [%X] ****\n",
@@ -412,6 +426,30 @@ acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source)
			   resource_source->string_ptr : "[Not Specified]");
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_dump_resource_label
 *
 * PARAMETERS:  title              - Title of the dumped resource field
 *              resource_label     - Pointer to a Resource Label struct
 *
 * RETURN:      None
 *
 * DESCRIPTION: Common routine for dumping the resource_label
 *
 ******************************************************************************/

static void
acpi_rs_dump_resource_label(char *title,
			    struct acpi_resource_label *resource_label)
{
	ACPI_FUNCTION_ENTRY();

	acpi_rs_out_string(title,
			   resource_label->string_ptr ?
			   resource_label->string_ptr : "[Not Specified]");
}

/*******************************************************************************
 *
 * FUNCTION:    acpi_rs_dump_address_common
Loading