1 // Copyright 2016 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #include <acpica/acpi.h>
8 #include <zircon/types.h>
9 
10 __BEGIN_CDECLS;
11 
12 enum resource_address_type {
13     RESOURCE_ADDRESS_MEMORY,
14     RESOURCE_ADDRESS_IO,
15     RESOURCE_ADDRESS_BUS_NUMBER,
16     RESOURCE_ADDRESS_UNKNOWN,
17 };
18 
19 // Structure that unifies the 3 Memory resource types
20 typedef struct resource_memory {
21     bool writeable;
22     uint32_t minimum; // min base address
23     uint32_t maximum; // max base address
24     uint32_t alignment;
25     uint32_t address_length;
26 } resource_memory_t;
27 
28 // Structure that unifies the 4 Address resource types
29 typedef struct resource_address {
30     // Interpretation of min/max depend on the min/max_address_fixed flags
31     // below.
32     uint64_t minimum;
33     uint64_t maximum;
34     uint64_t address_length;
35 
36     uint64_t translation_offset;
37     uint64_t granularity;
38 
39     enum resource_address_type resource_type;
40     bool consumed_only;
41     bool subtractive_decode;
42     bool min_address_fixed;
43     bool max_address_fixed;
44 } resource_address_t;
45 
46 typedef struct resource_io {
47     bool decodes_full_space; // If false, only decodes 10-bits
48     uint8_t alignment;
49     uint8_t address_length;
50     uint16_t minimum;
51     uint16_t maximum;
52 } resource_io_t;
53 
54 typedef struct resource_irq {
55     uint8_t trigger;
56     uint8_t polarity;
57     uint8_t sharable;
58     uint8_t wake_capable;
59     uint8_t pin_count;
60     uint32_t pins[16];
61 } resource_irq_t;
62 
resource_is_memory(ACPI_RESOURCE * res)63 static bool resource_is_memory(ACPI_RESOURCE* res) {
64     return res->Type == ACPI_RESOURCE_TYPE_MEMORY24 ||
65             res->Type == ACPI_RESOURCE_TYPE_MEMORY32||
66             res->Type == ACPI_RESOURCE_TYPE_FIXED_MEMORY32;
67 }
68 
resource_is_address(ACPI_RESOURCE * res)69 static bool resource_is_address(ACPI_RESOURCE* res) {
70     return res->Type == ACPI_RESOURCE_TYPE_ADDRESS16 ||
71             res->Type == ACPI_RESOURCE_TYPE_ADDRESS32 ||
72             res->Type == ACPI_RESOURCE_TYPE_ADDRESS64 ||
73             res->Type == ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64;
74 }
75 
resource_is_io(ACPI_RESOURCE * res)76 static bool resource_is_io(ACPI_RESOURCE* res) {
77     return res->Type == ACPI_RESOURCE_TYPE_IO ||
78             res->Type == ACPI_RESOURCE_TYPE_FIXED_IO;
79 }
80 
resource_is_irq(ACPI_RESOURCE * res)81 static bool resource_is_irq(ACPI_RESOURCE* res) {
82     return res->Type == ACPI_RESOURCE_TYPE_IRQ ||
83             res->Type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
84 }
85 
86 zx_status_t resource_parse_memory(ACPI_RESOURCE* res, resource_memory_t* out);
87 zx_status_t resource_parse_address(ACPI_RESOURCE* res, resource_address_t* out);
88 zx_status_t resource_parse_io(ACPI_RESOURCE* res, resource_io_t* out);
89 zx_status_t resource_parse_irq(ACPI_RESOURCE* res, resource_irq_t* out);
90 
91 __END_CDECLS;
92