xref: /freebsd/sys/contrib/dev/acpica/components/resources/rsirq.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
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