Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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

ACPICA commit 6bbc6357f7061f1243601adde0ea45f7a89274e0

ACPI 6.2 introduced a new resource that is used to describe how certain
pins are muxed for a device. The ASL syntax of this new resource looks
like below:

  PinFunction(Shared, PinConfig, FunctionNumber, ResourceSource,
              ResourceSourceIndex, ResourceUsage, DescriptorName,
              VendorData) {Pin List}

Which is pretty similar to GpioIo()/GpioInt() resources.

Teach ACPICA about this new resource.

Link: https://github.com/acpica/acpica/commit/6bbc6357


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 c7a1dfb9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1142,6 +1142,7 @@ struct acpi_port_info {
#define ACPI_RESOURCE_NAME_ADDRESS64            0x8A
#define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64   0x8B
#define ACPI_RESOURCE_NAME_GPIO                 0x8C
#define ACPI_RESOURCE_NAME_PIN_FUNCTION         0x8D
#define ACPI_RESOURCE_NAME_SERIAL_BUS           0x8E
#define ACPI_RESOURCE_NAME_LARGE_MAX            0x8E

+2 −0
Original line number Diff line number Diff line
@@ -329,6 +329,7 @@ extern struct acpi_rsconvert_info acpi_rs_convert_fixed_dma[];
extern struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[];
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[];

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

@@ -372,6 +373,7 @@ extern struct acpi_rsdump_info acpi_rs_dump_ext_address64[];
extern struct acpi_rsdump_info acpi_rs_dump_ext_irq[];
extern struct acpi_rsdump_info acpi_rs_dump_generic_reg[];
extern struct acpi_rsdump_info acpi_rs_dump_gpio[];
extern struct acpi_rsdump_info acpi_rs_dump_pin_function[];
extern struct acpi_rsdump_info acpi_rs_dump_fixed_dma[];
extern struct acpi_rsdump_info acpi_rs_dump_common_serial_bus[];
extern struct acpi_rsdump_info acpi_rs_dump_i2c_serial_bus[];
+22 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@
#define ACPI_RESTAG_DRIVESTRENGTH               "_DRS"
#define ACPI_RESTAG_ENDIANNESS                  "_END"
#define ACPI_RESTAG_FLOWCONTROL                 "_FLC"
#define ACPI_RESTAG_FUNCTION                    "_FUN"
#define ACPI_RESTAG_GRANULARITY                 "_GRA"
#define ACPI_RESTAG_INTERRUPT                   "_INT"
#define ACPI_RESTAG_INTERRUPTLEVEL              "_LL_"	/* active_lo(1), active_hi(0) */
@@ -404,6 +405,26 @@ struct aml_resource_uart_serialbus {
#define AML_RESOURCE_UART_TYPE_REVISION         1	/* ACPI 5.0 */
#define AML_RESOURCE_UART_MIN_DATA_LEN          10

struct aml_resource_pin_function {
	AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
	u16 flags;
	u8 pin_config;
	u16 function_number;
	u16 pin_table_offset;
	u8 res_source_index;
	u16 res_source_offset;
	u16 vendor_offset;
	u16 vendor_length;
	/*
	 * Optional fields follow immediately:
	 * 1) PIN list (Words)
	 * 2) Resource Source String
	 * 3) Vendor Data bytes
	 */
};

#define AML_RESOURCE_PIN_FUNCTION_REVISION      1	/* ACPI 6.2 */

/* restore default alignment */

#pragma pack()
@@ -446,6 +467,7 @@ union aml_resource {
	struct aml_resource_spi_serialbus spi_serial_bus;
	struct aml_resource_uart_serialbus uart_serial_bus;
	struct aml_resource_common_serialbus common_serial_bus;
	struct aml_resource_pin_function pin_function;

	/* Utility overlays */

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

			break;

		case ACPI_RESOURCE_TYPE_PIN_FUNCTION:

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

			break;

		case ACPI_RESOURCE_TYPE_SERIAL_BUS:

			total_size =
@@ -537,6 +553,24 @@ acpi_rs_get_list_length(u8 *aml_buffer,
			}
			break;

		case ACPI_RESOURCE_NAME_PIN_FUNCTION:

			/* Vendor data is optional */

			if (aml_resource->pin_function.vendor_length) {
				extra_struct_bytes +=
				    aml_resource->pin_function.vendor_offset -
				    aml_resource->pin_function.
				    pin_table_offset +
				    aml_resource->pin_function.vendor_length;
			} else {
				extra_struct_bytes +=
				    aml_resource->large_header.resource_length +
				    sizeof(struct aml_resource_large_header) -
				    aml_resource->pin_function.pin_table_offset;
			}
			break;

		case ACPI_RESOURCE_NAME_SERIAL_BUS:

			minimum_aml_resource_length =
+23 −0
Original line number Diff line number Diff line
@@ -314,6 +314,29 @@ struct acpi_rsdump_info acpi_rs_dump_gpio[16] = {
	 NULL},
};

struct acpi_rsdump_info acpi_rs_dump_pin_function[10] = {
	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_pin_function),
	 "PinFunction", NULL},
	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_function.revision_id),
	 "RevisionId", NULL},
	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_function.pin_config), "PinConfig",
	 acpi_gbl_ppc_decode},
	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_function.sharable), "Sharing",
	 acpi_gbl_shr_decode},
	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_function.function_number),
	 "FunctionNumber", NULL},
	{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(pin_function.resource_source),
	 "ResourceSource", NULL},
	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_function.pin_table_length),
	 "PinTableLength", NULL},
	{ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET(pin_function.pin_table), "PinTable",
	 NULL},
	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_function.vendor_length),
	 "VendorLength", NULL},
	{ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(pin_function.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},
Loading