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