ACPI: Add GPIO Connection Descriptor
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> Tested-by: Wei Huang <wei@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Message-id: 1449804086-3464-7-git-send-email-zhaoshenglong@huawei.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
ac6aa59a21
commit
4ecdc746e9
@ -564,6 +564,74 @@ Aml *aml_call4(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4)
|
||||
return var;
|
||||
}
|
||||
|
||||
/*
|
||||
* ACPI 5.0: 6.4.3.8.1 GPIO Connection Descriptor
|
||||
* Type 1, Large Item Name 0xC
|
||||
*/
|
||||
|
||||
static Aml *aml_gpio_connection(AmlGpioConnectionType type,
|
||||
AmlConsumerAndProducer con_and_pro,
|
||||
uint8_t flags, AmlPinConfig pin_config,
|
||||
uint16_t output_drive,
|
||||
uint16_t debounce_timeout,
|
||||
const uint32_t pin_list[], uint32_t pin_count,
|
||||
const char *resource_source_name,
|
||||
const uint8_t *vendor_data,
|
||||
uint16_t vendor_data_len)
|
||||
{
|
||||
Aml *var = aml_alloc();
|
||||
const uint16_t min_desc_len = 0x16;
|
||||
uint16_t resource_source_name_len, length;
|
||||
uint16_t pin_table_offset, resource_source_name_offset, vendor_data_offset;
|
||||
uint32_t i;
|
||||
|
||||
assert(resource_source_name);
|
||||
resource_source_name_len = strlen(resource_source_name) + 1;
|
||||
length = min_desc_len + resource_source_name_len + vendor_data_len;
|
||||
pin_table_offset = min_desc_len + 1;
|
||||
resource_source_name_offset = pin_table_offset + pin_count * 2;
|
||||
vendor_data_offset = resource_source_name_offset + resource_source_name_len;
|
||||
|
||||
build_append_byte(var->buf, 0x8C); /* GPIO Connection Descriptor */
|
||||
build_append_int_noprefix(var->buf, length, 2); /* Length */
|
||||
build_append_byte(var->buf, 1); /* Revision ID */
|
||||
build_append_byte(var->buf, type); /* GPIO Connection Type */
|
||||
/* General Flags (2 bytes) */
|
||||
build_append_int_noprefix(var->buf, con_and_pro, 2);
|
||||
/* Interrupt and IO Flags (2 bytes) */
|
||||
build_append_int_noprefix(var->buf, flags, 2);
|
||||
/* Pin Configuration 0 = Default 1 = Pull-up 2 = Pull-down 3 = No Pull */
|
||||
build_append_byte(var->buf, pin_config);
|
||||
/* Output Drive Strength (2 bytes) */
|
||||
build_append_int_noprefix(var->buf, output_drive, 2);
|
||||
/* Debounce Timeout (2 bytes) */
|
||||
build_append_int_noprefix(var->buf, debounce_timeout, 2);
|
||||
/* Pin Table Offset (2 bytes) */
|
||||
build_append_int_noprefix(var->buf, pin_table_offset, 2);
|
||||
build_append_byte(var->buf, 0); /* Resource Source Index */
|
||||
/* Resource Source Name Offset (2 bytes) */
|
||||
build_append_int_noprefix(var->buf, resource_source_name_offset, 2);
|
||||
/* Vendor Data Offset (2 bytes) */
|
||||
build_append_int_noprefix(var->buf, vendor_data_offset, 2);
|
||||
/* Vendor Data Length (2 bytes) */
|
||||
build_append_int_noprefix(var->buf, vendor_data_len, 2);
|
||||
/* Pin Number (2n bytes)*/
|
||||
for (i = 0; i < pin_count; i++) {
|
||||
build_append_int_noprefix(var->buf, pin_list[i], 2);
|
||||
}
|
||||
|
||||
/* Resource Source Name */
|
||||
build_append_namestring(var->buf, "%s", resource_source_name);
|
||||
build_append_byte(var->buf, '\0');
|
||||
|
||||
/* Vendor-defined Data */
|
||||
if (vendor_data != NULL) {
|
||||
g_array_append_vals(var->buf, vendor_data, vendor_data_len);
|
||||
}
|
||||
|
||||
return var;
|
||||
}
|
||||
|
||||
/*
|
||||
* ACPI 1.0b: 6.4.3.4 32-Bit Fixed Location Memory Range Descriptor
|
||||
* (Type 1, Large Item Name 0x6)
|
||||
|
@ -154,6 +154,26 @@ typedef enum {
|
||||
AML_SERIALIZED = 1,
|
||||
} AmlSerializeFlag;
|
||||
|
||||
/*
|
||||
* ACPI 5.0: Table 6-189 GPIO Connection Descriptor Definition
|
||||
* GPIO Connection Type
|
||||
*/
|
||||
typedef enum {
|
||||
AML_INTERRUPT_CONNECTION = 0,
|
||||
AML_IO_CONNECTION = 1,
|
||||
} AmlGpioConnectionType;
|
||||
|
||||
/*
|
||||
* ACPI 5.0: Table 6-189 GPIO Connection Descriptor Definition
|
||||
* _PPI field definition
|
||||
*/
|
||||
typedef enum {
|
||||
AML_PULL_DEFAULT = 0,
|
||||
AML_PULL_UP = 1,
|
||||
AML_PULL_DOWN = 2,
|
||||
AML_PULL_NONE = 3,
|
||||
} AmlPinConfig;
|
||||
|
||||
typedef
|
||||
struct AcpiBuildTables {
|
||||
GArray *table_data;
|
||||
|
Loading…
Reference in New Issue
Block a user