1*a159c266SJung-uk Kim /******************************************************************************* 2*a159c266SJung-uk Kim * 3*a159c266SJung-uk Kim * Module Name: rsirq - IRQ resource descriptors 4*a159c266SJung-uk Kim * 5*a159c266SJung-uk Kim ******************************************************************************/ 6*a159c266SJung-uk Kim 7*a159c266SJung-uk Kim /* 8*a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9*a159c266SJung-uk Kim * All rights reserved. 10*a159c266SJung-uk Kim * 11*a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13*a159c266SJung-uk Kim * are met: 14*a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*a159c266SJung-uk Kim * without modification. 17*a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*a159c266SJung-uk Kim * binary redistribution. 22*a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*a159c266SJung-uk Kim * from this software without specific prior written permission. 25*a159c266SJung-uk Kim * 26*a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*a159c266SJung-uk Kim * Software Foundation. 29*a159c266SJung-uk Kim * 30*a159c266SJung-uk Kim * NO WARRANTY 31*a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*a159c266SJung-uk Kim */ 43*a159c266SJung-uk Kim 44*a159c266SJung-uk Kim #define __RSIRQ_C__ 45*a159c266SJung-uk Kim 46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acresrc.h> 49*a159c266SJung-uk Kim 50*a159c266SJung-uk Kim #define _COMPONENT ACPI_RESOURCES 51*a159c266SJung-uk Kim ACPI_MODULE_NAME ("rsirq") 52*a159c266SJung-uk Kim 53*a159c266SJung-uk Kim 54*a159c266SJung-uk Kim /******************************************************************************* 55*a159c266SJung-uk Kim * 56*a159c266SJung-uk Kim * AcpiRsGetIrq 57*a159c266SJung-uk Kim * 58*a159c266SJung-uk Kim ******************************************************************************/ 59*a159c266SJung-uk Kim 60*a159c266SJung-uk Kim ACPI_RSCONVERT_INFO AcpiRsGetIrq[8] = 61*a159c266SJung-uk Kim { 62*a159c266SJung-uk Kim {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IRQ, 63*a159c266SJung-uk Kim ACPI_RS_SIZE (ACPI_RESOURCE_IRQ), 64*a159c266SJung-uk Kim ACPI_RSC_TABLE_SIZE (AcpiRsGetIrq)}, 65*a159c266SJung-uk Kim 66*a159c266SJung-uk Kim /* Get the IRQ mask (bytes 1:2) */ 67*a159c266SJung-uk Kim 68*a159c266SJung-uk Kim {ACPI_RSC_BITMASK16,ACPI_RS_OFFSET (Data.Irq.Interrupts[0]), 69*a159c266SJung-uk Kim AML_OFFSET (Irq.IrqMask), 70*a159c266SJung-uk Kim ACPI_RS_OFFSET (Data.Irq.InterruptCount)}, 71*a159c266SJung-uk Kim 72*a159c266SJung-uk Kim /* Set default flags (others are zero) */ 73*a159c266SJung-uk Kim 74*a159c266SJung-uk Kim {ACPI_RSC_SET8, ACPI_RS_OFFSET (Data.Irq.Triggering), 75*a159c266SJung-uk Kim ACPI_EDGE_SENSITIVE, 76*a159c266SJung-uk Kim 1}, 77*a159c266SJung-uk Kim 78*a159c266SJung-uk Kim /* Get the descriptor length (2 or 3 for IRQ descriptor) */ 79*a159c266SJung-uk Kim 80*a159c266SJung-uk Kim {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Irq.DescriptorLength), 81*a159c266SJung-uk Kim AML_OFFSET (Irq.DescriptorType), 82*a159c266SJung-uk Kim 0}, 83*a159c266SJung-uk Kim 84*a159c266SJung-uk Kim /* All done if no flag byte present in descriptor */ 85*a159c266SJung-uk Kim 86*a159c266SJung-uk Kim {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 3}, 87*a159c266SJung-uk Kim 88*a159c266SJung-uk Kim /* Get flags: Triggering[0], Polarity[3], Sharing[4] */ 89*a159c266SJung-uk Kim 90*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Triggering), 91*a159c266SJung-uk Kim AML_OFFSET (Irq.Flags), 92*a159c266SJung-uk Kim 0}, 93*a159c266SJung-uk Kim 94*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Polarity), 95*a159c266SJung-uk Kim AML_OFFSET (Irq.Flags), 96*a159c266SJung-uk Kim 3}, 97*a159c266SJung-uk Kim 98*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Sharable), 99*a159c266SJung-uk Kim AML_OFFSET (Irq.Flags), 100*a159c266SJung-uk Kim 4} 101*a159c266SJung-uk Kim }; 102*a159c266SJung-uk Kim 103*a159c266SJung-uk Kim 104*a159c266SJung-uk Kim /******************************************************************************* 105*a159c266SJung-uk Kim * 106*a159c266SJung-uk Kim * AcpiRsSetIrq 107*a159c266SJung-uk Kim * 108*a159c266SJung-uk Kim ******************************************************************************/ 109*a159c266SJung-uk Kim 110*a159c266SJung-uk Kim ACPI_RSCONVERT_INFO AcpiRsSetIrq[13] = 111*a159c266SJung-uk Kim { 112*a159c266SJung-uk Kim /* Start with a default descriptor of length 3 */ 113*a159c266SJung-uk Kim 114*a159c266SJung-uk Kim {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IRQ, 115*a159c266SJung-uk Kim sizeof (AML_RESOURCE_IRQ), 116*a159c266SJung-uk Kim ACPI_RSC_TABLE_SIZE (AcpiRsSetIrq)}, 117*a159c266SJung-uk Kim 118*a159c266SJung-uk Kim /* Convert interrupt list to 16-bit IRQ bitmask */ 119*a159c266SJung-uk Kim 120*a159c266SJung-uk Kim {ACPI_RSC_BITMASK16,ACPI_RS_OFFSET (Data.Irq.Interrupts[0]), 121*a159c266SJung-uk Kim AML_OFFSET (Irq.IrqMask), 122*a159c266SJung-uk Kim ACPI_RS_OFFSET (Data.Irq.InterruptCount)}, 123*a159c266SJung-uk Kim 124*a159c266SJung-uk Kim /* Set the flags byte */ 125*a159c266SJung-uk Kim 126*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Triggering), 127*a159c266SJung-uk Kim AML_OFFSET (Irq.Flags), 128*a159c266SJung-uk Kim 0}, 129*a159c266SJung-uk Kim 130*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Polarity), 131*a159c266SJung-uk Kim AML_OFFSET (Irq.Flags), 132*a159c266SJung-uk Kim 3}, 133*a159c266SJung-uk Kim 134*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Sharable), 135*a159c266SJung-uk Kim AML_OFFSET (Irq.Flags), 136*a159c266SJung-uk Kim 4}, 137*a159c266SJung-uk Kim 138*a159c266SJung-uk Kim /* 139*a159c266SJung-uk Kim * All done if the output descriptor length is required to be 3 140*a159c266SJung-uk Kim * (i.e., optimization to 2 bytes cannot be attempted) 141*a159c266SJung-uk Kim */ 142*a159c266SJung-uk Kim {ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE, 143*a159c266SJung-uk Kim ACPI_RS_OFFSET(Data.Irq.DescriptorLength), 144*a159c266SJung-uk Kim 3}, 145*a159c266SJung-uk Kim 146*a159c266SJung-uk Kim /* Set length to 2 bytes (no flags byte) */ 147*a159c266SJung-uk Kim 148*a159c266SJung-uk Kim {ACPI_RSC_LENGTH, 0, 0, sizeof (AML_RESOURCE_IRQ_NOFLAGS)}, 149*a159c266SJung-uk Kim 150*a159c266SJung-uk Kim /* 151*a159c266SJung-uk Kim * All done if the output descriptor length is required to be 2. 152*a159c266SJung-uk Kim * 153*a159c266SJung-uk Kim * TBD: Perhaps we should check for error if input flags are not 154*a159c266SJung-uk Kim * compatible with a 2-byte descriptor. 155*a159c266SJung-uk Kim */ 156*a159c266SJung-uk Kim {ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE, 157*a159c266SJung-uk Kim ACPI_RS_OFFSET(Data.Irq.DescriptorLength), 158*a159c266SJung-uk Kim 2}, 159*a159c266SJung-uk Kim 160*a159c266SJung-uk Kim /* Reset length to 3 bytes (descriptor with flags byte) */ 161*a159c266SJung-uk Kim 162*a159c266SJung-uk Kim {ACPI_RSC_LENGTH, 0, 0, sizeof (AML_RESOURCE_IRQ)}, 163*a159c266SJung-uk Kim 164*a159c266SJung-uk Kim /* 165*a159c266SJung-uk Kim * Check if the flags byte is necessary. Not needed if the flags are: 166*a159c266SJung-uk Kim * ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_HIGH, ACPI_EXCLUSIVE 167*a159c266SJung-uk Kim */ 168*a159c266SJung-uk Kim {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, 169*a159c266SJung-uk Kim ACPI_RS_OFFSET (Data.Irq.Triggering), 170*a159c266SJung-uk Kim ACPI_EDGE_SENSITIVE}, 171*a159c266SJung-uk Kim 172*a159c266SJung-uk Kim {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, 173*a159c266SJung-uk Kim ACPI_RS_OFFSET (Data.Irq.Polarity), 174*a159c266SJung-uk Kim ACPI_ACTIVE_HIGH}, 175*a159c266SJung-uk Kim 176*a159c266SJung-uk Kim {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, 177*a159c266SJung-uk Kim ACPI_RS_OFFSET (Data.Irq.Sharable), 178*a159c266SJung-uk Kim ACPI_EXCLUSIVE}, 179*a159c266SJung-uk Kim 180*a159c266SJung-uk Kim /* We can optimize to a 2-byte IrqNoFlags() descriptor */ 181*a159c266SJung-uk Kim 182*a159c266SJung-uk Kim {ACPI_RSC_LENGTH, 0, 0, sizeof (AML_RESOURCE_IRQ_NOFLAGS)} 183*a159c266SJung-uk Kim }; 184*a159c266SJung-uk Kim 185*a159c266SJung-uk Kim 186*a159c266SJung-uk Kim /******************************************************************************* 187*a159c266SJung-uk Kim * 188*a159c266SJung-uk Kim * AcpiRsConvertExtIrq 189*a159c266SJung-uk Kim * 190*a159c266SJung-uk Kim ******************************************************************************/ 191*a159c266SJung-uk Kim 192*a159c266SJung-uk Kim ACPI_RSCONVERT_INFO AcpiRsConvertExtIrq[9] = 193*a159c266SJung-uk Kim { 194*a159c266SJung-uk Kim {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_IRQ, 195*a159c266SJung-uk Kim ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_IRQ), 196*a159c266SJung-uk Kim ACPI_RSC_TABLE_SIZE (AcpiRsConvertExtIrq)}, 197*a159c266SJung-uk Kim 198*a159c266SJung-uk Kim {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_IRQ, 199*a159c266SJung-uk Kim sizeof (AML_RESOURCE_EXTENDED_IRQ), 200*a159c266SJung-uk Kim 0}, 201*a159c266SJung-uk Kim 202*a159c266SJung-uk Kim /* Flag bits */ 203*a159c266SJung-uk Kim 204*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.ProducerConsumer), 205*a159c266SJung-uk Kim AML_OFFSET (ExtendedIrq.Flags), 206*a159c266SJung-uk Kim 0}, 207*a159c266SJung-uk Kim 208*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.Triggering), 209*a159c266SJung-uk Kim AML_OFFSET (ExtendedIrq.Flags), 210*a159c266SJung-uk Kim 1}, 211*a159c266SJung-uk Kim 212*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.Polarity), 213*a159c266SJung-uk Kim AML_OFFSET (ExtendedIrq.Flags), 214*a159c266SJung-uk Kim 2}, 215*a159c266SJung-uk Kim 216*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.Sharable), 217*a159c266SJung-uk Kim AML_OFFSET (ExtendedIrq.Flags), 218*a159c266SJung-uk Kim 3}, 219*a159c266SJung-uk Kim 220*a159c266SJung-uk Kim /* IRQ Table length (Byte4) */ 221*a159c266SJung-uk Kim 222*a159c266SJung-uk Kim {ACPI_RSC_COUNT, ACPI_RS_OFFSET (Data.ExtendedIrq.InterruptCount), 223*a159c266SJung-uk Kim AML_OFFSET (ExtendedIrq.InterruptCount), 224*a159c266SJung-uk Kim sizeof (UINT32)}, 225*a159c266SJung-uk Kim 226*a159c266SJung-uk Kim /* Copy every IRQ in the table, each is 32 bits */ 227*a159c266SJung-uk Kim 228*a159c266SJung-uk Kim {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.ExtendedIrq.Interrupts[0]), 229*a159c266SJung-uk Kim AML_OFFSET (ExtendedIrq.Interrupts[0]), 230*a159c266SJung-uk Kim 0}, 231*a159c266SJung-uk Kim 232*a159c266SJung-uk Kim /* Optional ResourceSource (Index and String) */ 233*a159c266SJung-uk Kim 234*a159c266SJung-uk Kim {ACPI_RSC_SOURCEX, ACPI_RS_OFFSET (Data.ExtendedIrq.ResourceSource), 235*a159c266SJung-uk Kim ACPI_RS_OFFSET (Data.ExtendedIrq.Interrupts[0]), 236*a159c266SJung-uk Kim sizeof (AML_RESOURCE_EXTENDED_IRQ)} 237*a159c266SJung-uk Kim }; 238*a159c266SJung-uk Kim 239*a159c266SJung-uk Kim 240*a159c266SJung-uk Kim /******************************************************************************* 241*a159c266SJung-uk Kim * 242*a159c266SJung-uk Kim * AcpiRsConvertDma 243*a159c266SJung-uk Kim * 244*a159c266SJung-uk Kim ******************************************************************************/ 245*a159c266SJung-uk Kim 246*a159c266SJung-uk Kim ACPI_RSCONVERT_INFO AcpiRsConvertDma[6] = 247*a159c266SJung-uk Kim { 248*a159c266SJung-uk Kim {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_DMA, 249*a159c266SJung-uk Kim ACPI_RS_SIZE (ACPI_RESOURCE_DMA), 250*a159c266SJung-uk Kim ACPI_RSC_TABLE_SIZE (AcpiRsConvertDma)}, 251*a159c266SJung-uk Kim 252*a159c266SJung-uk Kim {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_DMA, 253*a159c266SJung-uk Kim sizeof (AML_RESOURCE_DMA), 254*a159c266SJung-uk Kim 0}, 255*a159c266SJung-uk Kim 256*a159c266SJung-uk Kim /* Flags: transfer preference, bus mastering, channel speed */ 257*a159c266SJung-uk Kim 258*a159c266SJung-uk Kim {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Dma.Transfer), 259*a159c266SJung-uk Kim AML_OFFSET (Dma.Flags), 260*a159c266SJung-uk Kim 0}, 261*a159c266SJung-uk Kim 262*a159c266SJung-uk Kim {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Dma.BusMaster), 263*a159c266SJung-uk Kim AML_OFFSET (Dma.Flags), 264*a159c266SJung-uk Kim 2}, 265*a159c266SJung-uk Kim 266*a159c266SJung-uk Kim {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Dma.Type), 267*a159c266SJung-uk Kim AML_OFFSET (Dma.Flags), 268*a159c266SJung-uk Kim 5}, 269*a159c266SJung-uk Kim 270*a159c266SJung-uk Kim /* DMA channel mask bits */ 271*a159c266SJung-uk Kim 272*a159c266SJung-uk Kim {ACPI_RSC_BITMASK, ACPI_RS_OFFSET (Data.Dma.Channels[0]), 273*a159c266SJung-uk Kim AML_OFFSET (Dma.DmaChannelMask), 274*a159c266SJung-uk Kim ACPI_RS_OFFSET (Data.Dma.ChannelCount)} 275*a159c266SJung-uk Kim }; 276*a159c266SJung-uk Kim 277*a159c266SJung-uk Kim 278*a159c266SJung-uk Kim /******************************************************************************* 279*a159c266SJung-uk Kim * 280*a159c266SJung-uk Kim * AcpiRsConvertFixedDma 281*a159c266SJung-uk Kim * 282*a159c266SJung-uk Kim ******************************************************************************/ 283*a159c266SJung-uk Kim 284*a159c266SJung-uk Kim ACPI_RSCONVERT_INFO AcpiRsConvertFixedDma[4] = 285*a159c266SJung-uk Kim { 286*a159c266SJung-uk Kim {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_DMA, 287*a159c266SJung-uk Kim ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_DMA), 288*a159c266SJung-uk Kim ACPI_RSC_TABLE_SIZE (AcpiRsConvertFixedDma)}, 289*a159c266SJung-uk Kim 290*a159c266SJung-uk Kim {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_DMA, 291*a159c266SJung-uk Kim sizeof (AML_RESOURCE_FIXED_DMA), 292*a159c266SJung-uk Kim 0}, 293*a159c266SJung-uk Kim 294*a159c266SJung-uk Kim /* 295*a159c266SJung-uk Kim * These fields are contiguous in both the source and destination: 296*a159c266SJung-uk Kim * RequestLines 297*a159c266SJung-uk Kim * Channels 298*a159c266SJung-uk Kim */ 299*a159c266SJung-uk Kim 300*a159c266SJung-uk Kim {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.FixedDma.RequestLines), 301*a159c266SJung-uk Kim AML_OFFSET (FixedDma.RequestLines), 302*a159c266SJung-uk Kim 2}, 303*a159c266SJung-uk Kim 304*a159c266SJung-uk Kim {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.FixedDma.Width), 305*a159c266SJung-uk Kim AML_OFFSET (FixedDma.Width), 306*a159c266SJung-uk Kim 1}, 307*a159c266SJung-uk Kim 308*a159c266SJung-uk Kim }; 309