Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rsirq.c
Go to the documentation of this file.
1 /*******************************************************************************
2  *
3  * Module Name: rsirq - IRQ resource descriptors
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2012, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  * notice, this list of conditions, and the following disclaimer,
16  * without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  * substantially similar to the "NO WARRANTY" disclaimer below
19  * ("Disclaimer") and any redistribution must be conditioned upon
20  * including a substantially similar Disclaimer requirement for further
21  * binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  * of any contributors may be used to endorse or promote products derived
24  * from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include <acpi/acpi.h>
45 #include "accommon.h"
46 #include "acresrc.h"
47 
48 #define _COMPONENT ACPI_RESOURCES
49 ACPI_MODULE_NAME("rsirq")
50 
51 /*******************************************************************************
52  *
53  * acpi_rs_get_irq
54  *
55  ******************************************************************************/
59  ACPI_RSC_TABLE_SIZE(acpi_rs_get_irq)},
60 
61  /* Get the IRQ mask (bytes 1:2) */
62 
63  {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]),
64  AML_OFFSET(irq.irq_mask),
65  ACPI_RS_OFFSET(data.irq.interrupt_count)},
66 
67  /* Set default flags (others are zero) */
68 
69  {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.irq.triggering),
71  1},
72 
73  /* Get the descriptor length (2 or 3 for IRQ descriptor) */
74 
75  {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.irq.descriptor_length),
76  AML_OFFSET(irq.descriptor_type),
77  0},
78 
79  /* All done if no flag byte present in descriptor */
80 
82 
83  /* Get flags: Triggering[0], Polarity[3], Sharing[4] */
84 
85  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering),
86  AML_OFFSET(irq.flags),
87  0},
88 
89  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity),
90  AML_OFFSET(irq.flags),
91  3},
92 
93  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable),
94  AML_OFFSET(irq.flags),
95  4}
96 };
97 
98 /*******************************************************************************
99  *
100  * acpi_rs_set_irq
101  *
102  ******************************************************************************/
103 
105  /* Start with a default descriptor of length 3 */
106 
108  sizeof(struct aml_resource_irq),
109  ACPI_RSC_TABLE_SIZE(acpi_rs_set_irq)},
110 
111  /* Convert interrupt list to 16-bit IRQ bitmask */
112 
113  {ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]),
114  AML_OFFSET(irq.irq_mask),
115  ACPI_RS_OFFSET(data.irq.interrupt_count)},
116 
117  /* Set the flags byte */
118 
119  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering),
120  AML_OFFSET(irq.flags),
121  0},
122 
123  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity),
124  AML_OFFSET(irq.flags),
125  3},
126 
127  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable),
128  AML_OFFSET(irq.flags),
129  4},
130 
131  /*
132  * All done if the output descriptor length is required to be 3
133  * (i.e., optimization to 2 bytes cannot be attempted)
134  */
136  ACPI_RS_OFFSET(data.irq.descriptor_length),
137  3},
138 
139  /* Set length to 2 bytes (no flags byte) */
140 
141  {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_irq_noflags)},
142 
143  /*
144  * All done if the output descriptor length is required to be 2.
145  *
146  * TBD: Perhaps we should check for error if input flags are not
147  * compatible with a 2-byte descriptor.
148  */
150  ACPI_RS_OFFSET(data.irq.descriptor_length),
151  2},
152 
153  /* Reset length to 3 bytes (descriptor with flags byte) */
154 
155  {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_irq)},
156 
157  /*
158  * Check if the flags byte is necessary. Not needed if the flags are:
159  * ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_HIGH, ACPI_EXCLUSIVE
160  */
162  ACPI_RS_OFFSET(data.irq.triggering),
164 
166  ACPI_RS_OFFSET(data.irq.polarity),
168 
170  ACPI_RS_OFFSET(data.irq.sharable),
172 
173  /* We can optimize to a 2-byte irq_no_flags() descriptor */
174 
175  {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_irq_noflags)}
176 };
177 
178 /*******************************************************************************
179  *
180  * acpi_rs_convert_ext_irq
181  *
182  ******************************************************************************/
183 
187  ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_irq)},
188 
190  sizeof(struct aml_resource_extended_irq),
191  0},
192 
193  /* Flag bits */
194 
195  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.producer_consumer),
196  AML_OFFSET(extended_irq.flags),
197  0},
198 
199  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.triggering),
200  AML_OFFSET(extended_irq.flags),
201  1},
202 
203  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.polarity),
204  AML_OFFSET(extended_irq.flags),
205  2},
206 
207  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.sharable),
208  AML_OFFSET(extended_irq.flags),
209  3},
210 
211  /* IRQ Table length (Byte4) */
212 
213  {ACPI_RSC_COUNT, ACPI_RS_OFFSET(data.extended_irq.interrupt_count),
214  AML_OFFSET(extended_irq.interrupt_count),
215  sizeof(u32)}
216  ,
217 
218  /* Copy every IRQ in the table, each is 32 bits */
219 
220  {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.extended_irq.interrupts[0]),
221  AML_OFFSET(extended_irq.interrupts[0]),
222  0}
223  ,
224 
225  /* Optional resource_source (Index and String) */
226 
227  {ACPI_RSC_SOURCEX, ACPI_RS_OFFSET(data.extended_irq.resource_source),
228  ACPI_RS_OFFSET(data.extended_irq.interrupts[0]),
229  sizeof(struct aml_resource_extended_irq)}
230 };
231 
232 /*******************************************************************************
233  *
234  * acpi_rs_convert_dma
235  *
236  ******************************************************************************/
237 
241  ACPI_RSC_TABLE_SIZE(acpi_rs_convert_dma)},
242 
244  sizeof(struct aml_resource_dma),
245  0},
246 
247  /* Flags: transfer preference, bus mastering, channel speed */
248 
249  {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.dma.transfer),
250  AML_OFFSET(dma.flags),
251  0},
252 
253  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.dma.bus_master),
254  AML_OFFSET(dma.flags),
255  2},
256 
258  AML_OFFSET(dma.flags),
259  5},
260 
261  /* DMA channel mask bits */
262 
263  {ACPI_RSC_BITMASK, ACPI_RS_OFFSET(data.dma.channels[0]),
264  AML_OFFSET(dma.dma_channel_mask),
265  ACPI_RS_OFFSET(data.dma.channel_count)}
266 };
267 
268 /*******************************************************************************
269  *
270  * acpi_rs_convert_fixed_dma
271  *
272  ******************************************************************************/
273 
277  ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_dma)},
278 
280  sizeof(struct aml_resource_fixed_dma),
281  0},
282 
283  /*
284  * These fields are contiguous in both the source and destination:
285  * request_lines
286  * Channels
287  */
288 
289  {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_dma.request_lines),
290  AML_OFFSET(fixed_dma.request_lines),
291  2},
292 
293  {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_dma.width),
294  AML_OFFSET(fixed_dma.width),
295  1},
296 
297 };