From: Shannon Zhao <shannon.z...@linaro.org> Add aml_interrupt() for describing device interrupt in resource template. These can be used to generating DSDT table for ACPI on ARM.
Signed-off-by: Shannon Zhao <zhaoshengl...@huawei.com> Signed-off-by: Shannon Zhao <shannon.z...@linaro.org> --- hw/acpi/aml-build.c | 23 +++++++++++++++++++++ include/hw/acpi/aml-build.h | 50 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index ce68d27..7553bfc 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -530,6 +530,29 @@ Aml *aml_memory32_fixed(uint32_t addr, uint32_t size, return var; } +/* + * ACPI 1.0: 6.4.3.6 Interrupt (Interrupt Resource Descriptor Macro) + */ +Aml *aml_interrupt(AmlConsumerAndProducer con_and_pro, + AmlLevelAndEdge level_and_edge, + AmlActiveHighAndLow high_and_low, + AmlExclusiveAndShared exclusive_and_shared, + AmlWakeCap wake_capable, uint32_t irq) +{ + Aml *var = aml_alloc(); + uint8_t irq_flags = con_and_pro | (level_and_edge << 1) + | (high_and_low << 2) | (exclusive_and_shared << 3) + | (wake_capable << 4); + + build_append_byte(var->buf, 0x89); /* Extended irq descriptor */ + build_append_byte(var->buf, 6); /* Length, bits[7:0] minimum value = 6 */ + build_append_byte(var->buf, 0); /* Length, bits[15:8] minimum value = 0 */ + build_append_byte(var->buf, irq_flags); /* Interrupt Vector Information. */ + build_append_byte(var->buf, 0x01); /* Interrupt table length = 1 */ + build_append_uint32(var->buf, irq); /* Interrupt Number */ + return var; +} + /* ACPI 1.0b: 6.4.2.5 I/O Port Descriptor */ Aml *aml_io(AmlIODecode dec, uint16_t min_base, uint16_t max_base, uint8_t aln, uint8_t len) diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h index b1413a3..586a742 100644 --- a/include/hw/acpi/aml-build.h +++ b/include/hw/acpi/aml-build.h @@ -111,6 +111,51 @@ typedef enum { aml_ReadWrite = 1, } AmlReadAndWrite; +/* + * ACPI 1.0b: Table 6-28 Extended Interrupt Descriptor Definition + * Interrupt Vector Flags Bits[0] Consumer/Producer + */ +typedef enum { + aml_consumer_producer = 0, + aml_consumer = 1, +} AmlConsumerAndProducer; + +/* + * ACPI 1.0b: Table 6-28 Extended Interrupt Descriptor Definition + * _HE field definition + */ +typedef enum { + aml_level = 0, + aml_edge = 1, +} AmlLevelAndEdge; + +/* + * ACPI 1.0b: Table 6-28 Extended Interrupt Descriptor Definition + * _LL field definition + */ +typedef enum { + aml_active_high = 0, + aml_active_low = 1, +} AmlActiveHighAndLow; + +/* + * ACPI 1.0b: Table 6-28 Extended Interrupt Descriptor Definition + * _SHR field definition + */ +typedef enum { + aml_exclusive = 0, + aml_shared = 1, +} AmlExclusiveAndShared; + +/* + * ACPI 5.1: Table 6-203 Extended Interrupt Descriptor Definition + * _WKC field definition + */ +typedef enum { + aml_not_wake_capable = 0, + aml_wake_capable = 1, +} AmlWakeCap; + typedef struct AcpiBuildTables { GArray *table_data; @@ -170,6 +215,11 @@ Aml *aml_call3(const char *method, Aml *arg1, Aml *arg2, Aml *arg3); Aml *aml_call4(const char *method, Aml *arg1, Aml *arg2, Aml *arg3, Aml *arg4); Aml *aml_memory32_fixed(uint32_t addr, uint32_t size, AmlReadAndWrite read_and_write); +Aml *aml_interrupt(AmlConsumerAndProducer con_and_pro, + AmlLevelAndEdge level_and_edge, + AmlActiveHighAndLow high_and_low, + AmlExclusiveAndShared exclusive_and_shared, + AmlWakeCap wake_capable, uint32_t irq); Aml *aml_io(AmlIODecode dec, uint16_t min_base, uint16_t max_base, uint8_t aln, uint8_t len); Aml *aml_operation_region(const char *name, AmlRegionSpace rs, -- 2.1.0