1 2/****************************************************************************** 3 * 4 * Module Name: amlresrc.h - AML resource descriptors 5 * 6 *****************************************************************************/ 7 8/* 9 * Copyright (C) 2000 - 2008, 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 95struct 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 120struct aml_resource_small_header { 121AML_RESOURCE_SMALL_HEADER_COMMON}; 122 123struct aml_resource_irq { 124 AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask; 125 u8 flags; 126}; 127 128struct aml_resource_irq_noflags { 129 AML_RESOURCE_SMALL_HEADER_COMMON u16 irq_mask; 130}; 131 132struct aml_resource_dma { 133 AML_RESOURCE_SMALL_HEADER_COMMON u8 dma_channel_mask; 134 u8 flags; 135}; 136 137struct aml_resource_start_dependent { 138 AML_RESOURCE_SMALL_HEADER_COMMON u8 flags; 139}; 140 141struct aml_resource_start_dependent_noprio { 142AML_RESOURCE_SMALL_HEADER_COMMON}; 143 144struct aml_resource_end_dependent { 145AML_RESOURCE_SMALL_HEADER_COMMON}; 146 147struct 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 155struct aml_resource_fixed_io { 156 AML_RESOURCE_SMALL_HEADER_COMMON u16 address; 157 u8 address_length; 158}; 159 160struct aml_resource_vendor_small { 161AML_RESOURCE_SMALL_HEADER_COMMON}; 162 163struct 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 174struct aml_resource_large_header { 175AML_RESOURCE_LARGE_HEADER_COMMON}; 176 177struct 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 185struct aml_resource_vendor_large { 186AML_RESOURCE_LARGE_HEADER_COMMON}; 187 188struct 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 196struct 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 207struct aml_resource_address { 208AML_RESOURCE_LARGE_HEADER_COMMON AML_RESOURCE_ADDRESS_COMMON}; 209 210struct 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 224struct 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 233struct 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 242struct 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 251struct 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 258struct 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 272union 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