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)63static 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)69static 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)76static 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)81static 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