1 2 /****************************************************************************** 3 * 4 * Module Name: amlresrc.h - AML resource descriptors 5 * 6 *****************************************************************************/ 7 8 /* 9 * Copyright (C) 2000 - 2011, Intel Corp. 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions, and the following disclaimer, 17 * without modification. 18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19 * substantially similar to the "NO WARRANTY" disclaimer below 20 * ("Disclaimer") and any redistribution must be conditioned upon 21 * including a substantially similar Disclaimer requirement for further 22 * binary redistribution. 23 * 3. Neither the names of the above-listed copyright holders nor the names 24 * of any contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * Alternatively, this software may be distributed under the terms of the 28 * GNU General Public License ("GPL") version 2 as published by the Free 29 * Software Foundation. 30 * 31 * NO WARRANTY 32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42 * POSSIBILITY OF SUCH DAMAGES. 43 */ 44 45 /* acpisrc:struct_defs -- for acpisrc conversion */ 46 47 #ifndef __AMLRESRC_H 48 #define __AMLRESRC_H 49 50 /* 51 * Resource descriptor tags, as defined in the ACPI specification. 52 * Used to symbolically reference fields within a descriptor. 53 */ 54 #define ACPI_RESTAG_ADDRESS "_ADR" 55 #define ACPI_RESTAG_ALIGNMENT "_ALN" 56 #define ACPI_RESTAG_ADDRESSSPACE "_ASI" 57 #define ACPI_RESTAG_ACCESSSIZE "_ASZ" 58 #define ACPI_RESTAG_TYPESPECIFICATTRIBUTES "_ATT" 59 #define ACPI_RESTAG_BASEADDRESS "_BAS" 60 #define ACPI_RESTAG_BUSMASTER "_BM_" /* Master(1), Slave(0) */ 61 #define ACPI_RESTAG_DECODE "_DEC" 62 #define ACPI_RESTAG_DMA "_DMA" 63 #define ACPI_RESTAG_DMATYPE "_TYP" /* Compatible(0), A(1), B(2), F(3) */ 64 #define ACPI_RESTAG_GRANULARITY "_GRA" 65 #define ACPI_RESTAG_INTERRUPT "_INT" 66 #define ACPI_RESTAG_INTERRUPTLEVEL "_LL_" /* active_lo(1), active_hi(0) */ 67 #define ACPI_RESTAG_INTERRUPTSHARE "_SHR" /* Shareable(1), no_share(0) */ 68 #define ACPI_RESTAG_INTERRUPTTYPE "_HE_" /* Edge(1), Level(0) */ 69 #define ACPI_RESTAG_LENGTH "_LEN" 70 #define ACPI_RESTAG_MEMATTRIBUTES "_MTP" /* Memory(0), Reserved(1), ACPI(2), NVS(3) */ 71 #define ACPI_RESTAG_MEMTYPE "_MEM" /* non_cache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */ 72 #define ACPI_RESTAG_MAXADDR "_MAX" 73 #define ACPI_RESTAG_MINADDR "_MIN" 74 #define ACPI_RESTAG_MAXTYPE "_MAF" 75 #define ACPI_RESTAG_MINTYPE "_MIF" 76 #define ACPI_RESTAG_REGISTERBITOFFSET "_RBO" 77 #define ACPI_RESTAG_REGISTERBITWIDTH "_RBW" 78 #define ACPI_RESTAG_RANGETYPE "_RNG" 79 #define ACPI_RESTAG_READWRITETYPE "_RW_" /* read_only(0), Writeable (1) */ 80 #define ACPI_RESTAG_TRANSLATION "_TRA" 81 #define ACPI_RESTAG_TRANSTYPE "_TRS" /* Sparse(1), Dense(0) */ 82 #define ACPI_RESTAG_TYPE "_TTP" /* Translation(1), Static (0) */ 83 #define ACPI_RESTAG_XFERTYPE "_SIZ" /* 8(0), 8_and16(1), 16(2) */ 84 85 /* Default sizes for "small" resource descriptors */ 86 87 #define ASL_RDESC_IRQ_SIZE 0x02 88 #define ASL_RDESC_DMA_SIZE 0x02 89 #define ASL_RDESC_ST_DEPEND_SIZE 0x00 90 #define ASL_RDESC_END_DEPEND_SIZE 0x00 91 #define ASL_RDESC_IO_SIZE 0x07 92 #define ASL_RDESC_FIXED_IO_SIZE 0x03 93 #define ASL_RDESC_END_TAG_SIZE 0x01 94 95 struct asl_resource_node { 96 u32 buffer_length; 97 void *buffer; 98 struct asl_resource_node *next; 99 }; 100 101 /* Macros used to generate AML resource length fields */ 102 103 #define ACPI_AML_SIZE_LARGE(r) (sizeof (r) - sizeof (struct aml_resource_large_header)) 104 #define ACPI_AML_SIZE_SMALL(r) (sizeof (r) - sizeof (struct aml_resource_small_header)) 105 106 /* 107 * Resource descriptors defined in the ACPI specification. 108 * 109 * Packing/alignment must be BYTE because these descriptors 110 * are used to overlay the raw AML byte stream. 111 */ 112 #pragma pack(1) 113 114 /* 115 * SMALL descriptors 116 */ 117 #define AML_RESOURCE_SMALL_HEADER_COMMON \ 118 u8 descriptor_type; 119 120 struct aml_resource_small_header { 121 AML_RESOURCE_SMALL_HEADER_COMMON}; 122 123 struct aml_resource_irq { 124 AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask; 125 u8 flags; 126 }; 127 128 struct aml_resource_irq_noflags { 129 AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask; 130 }; 131 132 struct aml_resource_dma { 133 AML_RESOURCE_SMALL_HEADER_COMMON u8 dma_channel_mask; 134 u8 flags; 135 }; 136 137 struct aml_resource_start_dependent { 138 AML_RESOURCE_SMALL_HEADER_COMMON u8 flags; 139 }; 140 141 struct aml_resource_start_dependent_noprio { 142 AML_RESOURCE_SMALL_HEADER_COMMON}; 143 144 struct aml_resource_end_dependent { 145 AML_RESOURCE_SMALL_HEADER_COMMON}; 146 147 struct aml_resource_io { 148 AML_RESOURCE_SMALL_HEADER_COMMON u8 flags; 149 u16 minimum; 150 u16 maximum; 151 u8 alignment; 152 u8 address_length; 153 }; 154 155 struct aml_resource_fixed_io { 156 AML_RESOURCE_SMALL_HEADER_COMMON u16 address; 157 u8 address_length; 158 }; 159 160 struct aml_resource_vendor_small { 161 AML_RESOURCE_SMALL_HEADER_COMMON}; 162 163 struct aml_resource_end_tag { 164 AML_RESOURCE_SMALL_HEADER_COMMON u8 checksum; 165 }; 166 167 /* 168 * LARGE descriptors 169 */ 170 #define AML_RESOURCE_LARGE_HEADER_COMMON \ 171 u8 descriptor_type;\ 172 u16 resource_length; 173 174 struct aml_resource_large_header { 175 AML_RESOURCE_LARGE_HEADER_COMMON}; 176 177 struct aml_resource_memory24 { 178 AML_RESOURCE_LARGE_HEADER_COMMON u8 flags; 179 u16 minimum; 180 u16 maximum; 181 u16 alignment; 182 u16 address_length; 183 }; 184 185 struct aml_resource_vendor_large { 186 AML_RESOURCE_LARGE_HEADER_COMMON}; 187 188 struct aml_resource_memory32 { 189 AML_RESOURCE_LARGE_HEADER_COMMON u8 flags; 190 u32 minimum; 191 u32 maximum; 192 u32 alignment; 193 u32 address_length; 194 }; 195 196 struct aml_resource_fixed_memory32 { 197 AML_RESOURCE_LARGE_HEADER_COMMON u8 flags; 198 u32 address; 199 u32 address_length; 200 }; 201 202 #define AML_RESOURCE_ADDRESS_COMMON \ 203 u8 resource_type; \ 204 u8 flags; \ 205 u8 specific_flags; 206 207 struct aml_resource_address { 208 AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_ADDRESS_COMMON}; 209 210 struct aml_resource_extended_address64 { 211 AML_RESOURCE_LARGE_HEADER_COMMON 212 AML_RESOURCE_ADDRESS_COMMON u8 revision_iD; 213 u8 reserved; 214 u64 granularity; 215 u64 minimum; 216 u64 maximum; 217 u64 translation_offset; 218 u64 address_length; 219 u64 type_specific; 220 }; 221 222 #define AML_RESOURCE_EXTENDED_ADDRESS_REVISION 1 /* ACPI 3.0 */ 223 224 struct aml_resource_address64 { 225 AML_RESOURCE_LARGE_HEADER_COMMON 226 AML_RESOURCE_ADDRESS_COMMON u64 granularity; 227 u64 minimum; 228 u64 maximum; 229 u64 translation_offset; 230 u64 address_length; 231 }; 232 233 struct aml_resource_address32 { 234 AML_RESOURCE_LARGE_HEADER_COMMON 235 AML_RESOURCE_ADDRESS_COMMON u32 granularity; 236 u32 minimum; 237 u32 maximum; 238 u32 translation_offset; 239 u32 address_length; 240 }; 241 242 struct aml_resource_address16 { 243 AML_RESOURCE_LARGE_HEADER_COMMON 244 AML_RESOURCE_ADDRESS_COMMON u16 granularity; 245 u16 minimum; 246 u16 maximum; 247 u16 translation_offset; 248 u16 address_length; 249 }; 250 251 struct aml_resource_extended_irq { 252 AML_RESOURCE_LARGE_HEADER_COMMON u8 flags; 253 u8 interrupt_count; 254 u32 interrupts[1]; 255 /* res_source_index, res_source optional fields follow */ 256 }; 257 258 struct aml_resource_generic_register { 259 AML_RESOURCE_LARGE_HEADER_COMMON u8 address_space_id; 260 u8 bit_width; 261 u8 bit_offset; 262 u8 access_size; /* ACPI 3.0, was previously Reserved */ 263 u64 address; 264 }; 265 266 /* restore default alignment */ 267 268 #pragma pack() 269 270 /* Union of all resource descriptors, so we can allocate the worst case */ 271 272 union aml_resource { 273 /* Descriptor headers */ 274 275 u8 descriptor_type; 276 struct aml_resource_small_header small_header; 277 struct aml_resource_large_header large_header; 278 279 /* Small resource descriptors */ 280 281 struct aml_resource_irq irq; 282 struct aml_resource_dma dma; 283 struct aml_resource_start_dependent start_dpf; 284 struct aml_resource_end_dependent end_dpf; 285 struct aml_resource_io io; 286 struct aml_resource_fixed_io fixed_io; 287 struct aml_resource_vendor_small vendor_small; 288 struct aml_resource_end_tag end_tag; 289 290 /* Large resource descriptors */ 291 292 struct aml_resource_memory24 memory24; 293 struct aml_resource_generic_register generic_reg; 294 struct aml_resource_vendor_large vendor_large; 295 struct aml_resource_memory32 memory32; 296 struct aml_resource_fixed_memory32 fixed_memory32; 297 struct aml_resource_address16 address16; 298 struct aml_resource_address32 address32; 299 struct aml_resource_address64 address64; 300 struct aml_resource_extended_address64 ext_address64; 301 struct aml_resource_extended_irq extended_irq; 302 303 /* Utility overlays */ 304 305 struct aml_resource_address address; 306 u32 dword_item; 307 u16 word_item; 308 u8 byte_item; 309 }; 310 311 #endif 312