Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /******************************************************************************* |
2 | * | |
3 | * Module Name: rsdump - Functions to display the resource structures. | |
4 | * | |
5 | ******************************************************************************/ | |
6 | ||
7 | /* | |
77848130 | 8 | * Copyright (C) 2000 - 2012, Intel Corp. |
1da177e4 LT |
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 | ||
1da177e4 | 44 | #include <acpi/acpi.h> |
e2f7a777 LB |
45 | #include "accommon.h" |
46 | #include "acresrc.h" | |
1da177e4 LT |
47 | |
48 | #define _COMPONENT ACPI_RESOURCES | |
4be44fcd | 49 | ACPI_MODULE_NAME("rsdump") |
6f42ccf2 | 50 | #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) |
44f6c012 | 51 | /* Local prototypes */ |
bda663d3 RM |
52 | static void acpi_rs_out_string(char *title, char *value); |
53 | ||
54 | static void acpi_rs_out_integer8(char *title, u8 value); | |
55 | ||
56 | static void acpi_rs_out_integer16(char *title, u16 value); | |
57 | ||
58 | static void acpi_rs_out_integer32(char *title, u32 value); | |
59 | ||
60 | static void acpi_rs_out_integer64(char *title, u64 value); | |
61 | ||
62 | static void acpi_rs_out_title(char *title); | |
63 | ||
e0fe0a8d | 64 | static void acpi_rs_dump_byte_list(u16 length, u8 *data); |
bda663d3 | 65 | |
e0fe0a8d | 66 | static void acpi_rs_dump_word_list(u16 length, u16 *data); |
bda663d3 | 67 | |
e0fe0a8d LM |
68 | static void acpi_rs_dump_dword_list(u8 length, u32 *data); |
69 | ||
70 | static void acpi_rs_dump_short_byte_list(u8 length, u8 *data); | |
bda663d3 RM |
71 | |
72 | static void | |
73 | acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source); | |
74 | ||
75 | static void acpi_rs_dump_address_common(union acpi_resource_data *resource); | |
76 | ||
0897831b BM |
77 | static void |
78 | acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table); | |
79 | ||
80 | #define ACPI_RSD_OFFSET(f) (u8) ACPI_OFFSET (union acpi_resource_data,f) | |
81 | #define ACPI_PRT_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_pci_routing_table,f) | |
82 | #define ACPI_RSD_TABLE_SIZE(name) (sizeof(name) / sizeof (struct acpi_rsdump_info)) | |
83 | ||
1da177e4 LT |
84 | /******************************************************************************* |
85 | * | |
0897831b | 86 | * Resource Descriptor info tables |
bda663d3 | 87 | * |
0897831b BM |
88 | * Note: The first table entry must be a Title or Literal and must contain |
89 | * the table length (number of table entries) | |
bda663d3 RM |
90 | * |
91 | ******************************************************************************/ | |
92 | ||
1d5b285d | 93 | struct acpi_rsdump_info acpi_rs_dump_irq[7] = { |
0897831b | 94 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_irq), "IRQ", NULL}, |
1d5b285d BM |
95 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.descriptor_length), |
96 | "Descriptor Length", NULL}, | |
0897831b | 97 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.triggering), "Triggering", |
b229cf92 | 98 | acpi_gbl_he_decode}, |
0897831b | 99 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.polarity), "Polarity", |
b229cf92 | 100 | acpi_gbl_ll_decode}, |
0897831b | 101 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.sharable), "Sharing", |
b229cf92 | 102 | acpi_gbl_shr_decode}, |
0897831b BM |
103 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.interrupt_count), |
104 | "Interrupt Count", NULL}, | |
105 | {ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(irq.interrupts[0]), | |
106 | "Interrupt List", NULL} | |
107 | }; | |
108 | ||
109 | struct acpi_rsdump_info acpi_rs_dump_dma[6] = { | |
110 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_dma), "DMA", NULL}, | |
111 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.type), "Speed", | |
b229cf92 | 112 | acpi_gbl_typ_decode}, |
0897831b | 113 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(dma.bus_master), "Mastering", |
b229cf92 | 114 | acpi_gbl_bm_decode}, |
0897831b | 115 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.transfer), "Transfer Type", |
b229cf92 | 116 | acpi_gbl_siz_decode}, |
0897831b BM |
117 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(dma.channel_count), "Channel Count", |
118 | NULL}, | |
119 | {ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(dma.channels[0]), "Channel List", | |
120 | NULL} | |
121 | }; | |
122 | ||
1d5b285d | 123 | struct acpi_rsdump_info acpi_rs_dump_start_dpf[4] = { |
0897831b BM |
124 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_start_dpf), |
125 | "Start-Dependent-Functions", NULL}, | |
1d5b285d BM |
126 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(start_dpf.descriptor_length), |
127 | "Descriptor Length", NULL}, | |
0897831b BM |
128 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.compatibility_priority), |
129 | "Compatibility Priority", acpi_gbl_config_decode}, | |
130 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.performance_robustness), | |
131 | "Performance/Robustness", acpi_gbl_config_decode} | |
132 | }; | |
133 | ||
134 | struct acpi_rsdump_info acpi_rs_dump_end_dpf[1] = { | |
135 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_dpf), | |
136 | "End-Dependent-Functions", NULL} | |
137 | }; | |
138 | ||
139 | struct acpi_rsdump_info acpi_rs_dump_io[6] = { | |
140 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io), "I/O", NULL}, | |
141 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(io.io_decode), "Address Decoding", | |
142 | acpi_gbl_io_decode}, | |
143 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.minimum), "Address Minimum", NULL}, | |
144 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.maximum), "Address Maximum", NULL}, | |
145 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.alignment), "Alignment", NULL}, | |
146 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.address_length), "Address Length", | |
147 | NULL} | |
148 | }; | |
149 | ||
150 | struct acpi_rsdump_info acpi_rs_dump_fixed_io[3] = { | |
151 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_io), | |
152 | "Fixed I/O", NULL}, | |
153 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_io.address), "Address", NULL}, | |
154 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_io.address_length), | |
155 | "Address Length", NULL} | |
156 | }; | |
157 | ||
158 | struct acpi_rsdump_info acpi_rs_dump_vendor[3] = { | |
159 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_vendor), | |
160 | "Vendor Specific", NULL}, | |
161 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(vendor.byte_length), "Length", NULL}, | |
162 | {ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET(vendor.byte_data[0]), "Vendor Data", | |
163 | NULL} | |
164 | }; | |
165 | ||
166 | struct acpi_rsdump_info acpi_rs_dump_end_tag[1] = { | |
b229cf92 | 167 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_tag), "EndTag", |
0897831b BM |
168 | NULL} |
169 | }; | |
170 | ||
171 | struct acpi_rsdump_info acpi_rs_dump_memory24[6] = { | |
172 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory24), | |
173 | "24-Bit Memory Range", NULL}, | |
174 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory24.write_protect), | |
b229cf92 | 175 | "Write Protect", acpi_gbl_rw_decode}, |
0897831b BM |
176 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.minimum), "Address Minimum", |
177 | NULL}, | |
178 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.maximum), "Address Maximum", | |
179 | NULL}, | |
180 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.alignment), "Alignment", | |
181 | NULL}, | |
182 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.address_length), | |
183 | "Address Length", NULL} | |
184 | }; | |
185 | ||
186 | struct acpi_rsdump_info acpi_rs_dump_memory32[6] = { | |
187 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory32), | |
188 | "32-Bit Memory Range", NULL}, | |
189 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory32.write_protect), | |
b229cf92 | 190 | "Write Protect", acpi_gbl_rw_decode}, |
0897831b BM |
191 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.minimum), "Address Minimum", |
192 | NULL}, | |
193 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.maximum), "Address Maximum", | |
194 | NULL}, | |
195 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.alignment), "Alignment", | |
196 | NULL}, | |
197 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.address_length), | |
198 | "Address Length", NULL} | |
199 | }; | |
200 | ||
201 | struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[4] = { | |
202 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_memory32), | |
203 | "32-Bit Fixed Memory Range", NULL}, | |
204 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(fixed_memory32.write_protect), | |
b229cf92 | 205 | "Write Protect", acpi_gbl_rw_decode}, |
0897831b BM |
206 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address), "Address", |
207 | NULL}, | |
208 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address_length), | |
209 | "Address Length", NULL} | |
210 | }; | |
211 | ||
212 | struct acpi_rsdump_info acpi_rs_dump_address16[8] = { | |
213 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address16), | |
214 | "16-Bit WORD Address Space", NULL}, | |
215 | {ACPI_RSD_ADDRESS, 0, NULL, NULL}, | |
216 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.granularity), "Granularity", | |
217 | NULL}, | |
218 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.minimum), "Address Minimum", | |
219 | NULL}, | |
220 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.maximum), "Address Maximum", | |
221 | NULL}, | |
222 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.translation_offset), | |
223 | "Translation Offset", NULL}, | |
224 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.address_length), | |
225 | "Address Length", NULL}, | |
226 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address16.resource_source), NULL, NULL} | |
227 | }; | |
228 | ||
229 | struct acpi_rsdump_info acpi_rs_dump_address32[8] = { | |
230 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address32), | |
231 | "32-Bit DWORD Address Space", NULL}, | |
232 | {ACPI_RSD_ADDRESS, 0, NULL, NULL}, | |
233 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.granularity), "Granularity", | |
234 | NULL}, | |
235 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.minimum), "Address Minimum", | |
236 | NULL}, | |
237 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.maximum), "Address Maximum", | |
238 | NULL}, | |
239 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.translation_offset), | |
240 | "Translation Offset", NULL}, | |
241 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.address_length), | |
242 | "Address Length", NULL}, | |
243 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address32.resource_source), NULL, NULL} | |
244 | }; | |
245 | ||
246 | struct acpi_rsdump_info acpi_rs_dump_address64[8] = { | |
247 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address64), | |
248 | "64-Bit QWORD Address Space", NULL}, | |
249 | {ACPI_RSD_ADDRESS, 0, NULL, NULL}, | |
250 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.granularity), "Granularity", | |
251 | NULL}, | |
252 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.minimum), "Address Minimum", | |
253 | NULL}, | |
254 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.maximum), "Address Maximum", | |
255 | NULL}, | |
256 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.translation_offset), | |
257 | "Translation Offset", NULL}, | |
258 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.address_length), | |
259 | "Address Length", NULL}, | |
260 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address64.resource_source), NULL, NULL} | |
261 | }; | |
262 | ||
263 | struct acpi_rsdump_info acpi_rs_dump_ext_address64[8] = { | |
264 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_address64), | |
265 | "64-Bit Extended Address Space", NULL}, | |
266 | {ACPI_RSD_ADDRESS, 0, NULL, NULL}, | |
267 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.granularity), | |
268 | "Granularity", NULL}, | |
269 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.minimum), | |
270 | "Address Minimum", NULL}, | |
271 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.maximum), | |
272 | "Address Maximum", NULL}, | |
273 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.translation_offset), | |
274 | "Translation Offset", NULL}, | |
275 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.address_length), | |
276 | "Address Length", NULL}, | |
277 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.type_specific), | |
278 | "Type-Specific Attribute", NULL} | |
279 | }; | |
280 | ||
281 | struct acpi_rsdump_info acpi_rs_dump_ext_irq[8] = { | |
282 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_irq), | |
283 | "Extended IRQ", NULL}, | |
284 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.producer_consumer), | |
285 | "Type", acpi_gbl_consume_decode}, | |
286 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.triggering), | |
b229cf92 | 287 | "Triggering", acpi_gbl_he_decode}, |
0897831b | 288 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.polarity), "Polarity", |
b229cf92 | 289 | acpi_gbl_ll_decode}, |
0897831b | 290 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.sharable), "Sharing", |
b229cf92 | 291 | acpi_gbl_shr_decode}, |
0897831b BM |
292 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(extended_irq.resource_source), NULL, |
293 | NULL}, | |
294 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(extended_irq.interrupt_count), | |
295 | "Interrupt Count", NULL}, | |
296 | {ACPI_RSD_DWORDLIST, ACPI_RSD_OFFSET(extended_irq.interrupts[0]), | |
297 | "Interrupt List", NULL} | |
298 | }; | |
299 | ||
300 | struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = { | |
301 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_generic_reg), | |
302 | "Generic Register", NULL}, | |
303 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.space_id), "Space ID", | |
304 | NULL}, | |
305 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_width), "Bit Width", | |
306 | NULL}, | |
307 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_offset), "Bit Offset", | |
308 | NULL}, | |
309 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.access_size), | |
310 | "Access Size", NULL}, | |
311 | {ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL} | |
312 | }; | |
bda663d3 | 313 | |
e0fe0a8d LM |
314 | struct acpi_rsdump_info acpi_rs_dump_gpio[16] = { |
315 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_gpio), "GPIO", NULL}, | |
316 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.revision_id), "RevisionId", NULL}, | |
317 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.connection_type), | |
318 | "ConnectionType", acpi_gbl_ct_decode}, | |
319 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(gpio.producer_consumer), | |
320 | "ProducerConsumer", acpi_gbl_consume_decode}, | |
321 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.pin_config), "PinConfig", | |
322 | acpi_gbl_ppc_decode}, | |
323 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.sharable), "Sharable", | |
324 | acpi_gbl_shr_decode}, | |
325 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.io_restriction), | |
326 | "IoRestriction", acpi_gbl_ior_decode}, | |
327 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(gpio.triggering), "Triggering", | |
328 | acpi_gbl_he_decode}, | |
329 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.polarity), "Polarity", | |
330 | acpi_gbl_ll_decode}, | |
331 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.drive_strength), "DriveStrength", | |
332 | NULL}, | |
333 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.debounce_timeout), | |
334 | "DebounceTimeout", NULL}, | |
335 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(gpio.resource_source), | |
336 | "ResourceSource", NULL}, | |
337 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.pin_table_length), | |
338 | "PinTableLength", NULL}, | |
339 | {ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET(gpio.pin_table), "PinTable", NULL}, | |
340 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.vendor_length), "VendorLength", | |
341 | NULL}, | |
342 | {ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(gpio.vendor_data), "VendorData", | |
343 | NULL}, | |
344 | }; | |
345 | ||
346 | struct acpi_rsdump_info acpi_rs_dump_fixed_dma[4] = { | |
347 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_dma), | |
348 | "FixedDma", NULL}, | |
349 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_dma.request_lines), | |
350 | "RequestLines", NULL}, | |
351 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_dma.channels), "Channels", | |
352 | NULL}, | |
353 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_dma.width), "TransferWidth", | |
354 | acpi_gbl_dts_decode}, | |
355 | }; | |
356 | ||
357 | #define ACPI_RS_DUMP_COMMON_SERIAL_BUS \ | |
358 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.revision_id), "RevisionId", NULL}, \ | |
359 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.type), "Type", acpi_gbl_sbt_decode}, \ | |
360 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (common_serial_bus.producer_consumer), "ProducerConsumer", acpi_gbl_consume_decode}, \ | |
361 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (common_serial_bus.slave_mode), "SlaveMode", acpi_gbl_sm_decode}, \ | |
362 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.type_revision_id), "TypeRevisionId", NULL}, \ | |
363 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (common_serial_bus.type_data_length), "TypeDataLength", NULL}, \ | |
364 | {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (common_serial_bus.resource_source), "ResourceSource", NULL}, \ | |
365 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (common_serial_bus.vendor_length), "VendorLength", NULL}, \ | |
366 | {ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (common_serial_bus.vendor_data), "VendorData", NULL}, | |
367 | ||
368 | struct acpi_rsdump_info acpi_rs_dump_common_serial_bus[10] = { | |
369 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_common_serial_bus), | |
370 | "Common Serial Bus", NULL}, | |
371 | ACPI_RS_DUMP_COMMON_SERIAL_BUS | |
372 | }; | |
373 | ||
374 | struct acpi_rsdump_info acpi_rs_dump_i2c_serial_bus[13] = { | |
375 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_i2c_serial_bus), | |
376 | "I2C Serial Bus", NULL}, | |
377 | ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_1BITFLAG, | |
378 | ACPI_RSD_OFFSET(i2c_serial_bus. | |
379 | access_mode), | |
380 | "AccessMode", acpi_gbl_am_decode}, | |
381 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(i2c_serial_bus.connection_speed), | |
382 | "ConnectionSpeed", NULL}, | |
383 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(i2c_serial_bus.slave_address), | |
384 | "SlaveAddress", NULL}, | |
385 | }; | |
386 | ||
387 | struct acpi_rsdump_info acpi_rs_dump_spi_serial_bus[17] = { | |
388 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_spi_serial_bus), | |
389 | "Spi Serial Bus", NULL}, | |
390 | ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_1BITFLAG, | |
391 | ACPI_RSD_OFFSET(spi_serial_bus. | |
392 | wire_mode), "WireMode", | |
393 | acpi_gbl_wm_decode}, | |
394 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(spi_serial_bus.device_polarity), | |
395 | "DevicePolarity", acpi_gbl_dp_decode}, | |
396 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.data_bit_length), | |
397 | "DataBitLength", NULL}, | |
398 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.clock_phase), | |
399 | "ClockPhase", acpi_gbl_cph_decode}, | |
400 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.clock_polarity), | |
401 | "ClockPolarity", acpi_gbl_cpo_decode}, | |
402 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(spi_serial_bus.device_selection), | |
403 | "DeviceSelection", NULL}, | |
404 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(spi_serial_bus.connection_speed), | |
405 | "ConnectionSpeed", NULL}, | |
406 | }; | |
407 | ||
408 | struct acpi_rsdump_info acpi_rs_dump_uart_serial_bus[19] = { | |
409 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_uart_serial_bus), | |
410 | "Uart Serial Bus", NULL}, | |
411 | ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_2BITFLAG, | |
412 | ACPI_RSD_OFFSET(uart_serial_bus. | |
413 | flow_control), | |
414 | "FlowControl", acpi_gbl_fc_decode}, | |
415 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.stop_bits), | |
416 | "StopBits", acpi_gbl_sb_decode}, | |
417 | {ACPI_RSD_3BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.data_bits), | |
418 | "DataBits", acpi_gbl_bpb_decode}, | |
419 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.endian), "Endian", | |
420 | acpi_gbl_ed_decode}, | |
421 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(uart_serial_bus.parity), "Parity", | |
422 | acpi_gbl_pt_decode}, | |
423 | {ACPI_RSD_UINT8, ACPI_RSD_OFFSET(uart_serial_bus.lines_enabled), | |
424 | "LinesEnabled", NULL}, | |
425 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(uart_serial_bus.rx_fifo_size), | |
426 | "RxFifoSize", NULL}, | |
427 | {ACPI_RSD_UINT16, ACPI_RSD_OFFSET(uart_serial_bus.tx_fifo_size), | |
428 | "TxFifoSize", NULL}, | |
429 | {ACPI_RSD_UINT32, ACPI_RSD_OFFSET(uart_serial_bus.default_baud_rate), | |
430 | "ConnectionSpeed", NULL}, | |
431 | }; | |
432 | ||
0897831b BM |
433 | /* |
434 | * Tables used for common address descriptor flag fields | |
435 | */ | |
436 | static struct acpi_rsdump_info acpi_rs_dump_general_flags[5] = { | |
437 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_general_flags), NULL, | |
438 | NULL}, | |
439 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.producer_consumer), | |
440 | "Consumer/Producer", acpi_gbl_consume_decode}, | |
441 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.decode), "Address Decode", | |
b229cf92 | 442 | acpi_gbl_dec_decode}, |
0897831b BM |
443 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.min_address_fixed), |
444 | "Min Relocatability", acpi_gbl_min_decode}, | |
445 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.max_address_fixed), | |
446 | "Max Relocatability", acpi_gbl_max_decode} | |
447 | }; | |
448 | ||
449 | static struct acpi_rsdump_info acpi_rs_dump_memory_flags[5] = { | |
450 | {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory_flags), | |
96db255c | 451 | "Resource Type", (void *)"Memory Range"}, |
0897831b | 452 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.write_protect), |
b229cf92 | 453 | "Write Protect", acpi_gbl_rw_decode}, |
0897831b | 454 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.caching), |
b229cf92 | 455 | "Caching", acpi_gbl_mem_decode}, |
0897831b | 456 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.range_type), |
b229cf92 | 457 | "Range Type", acpi_gbl_mtp_decode}, |
0897831b | 458 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.translation), |
b229cf92 | 459 | "Translation", acpi_gbl_ttp_decode} |
0897831b BM |
460 | }; |
461 | ||
462 | static struct acpi_rsdump_info acpi_rs_dump_io_flags[4] = { | |
463 | {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io_flags), | |
96db255c | 464 | "Resource Type", (void *)"I/O Range"}, |
0897831b | 465 | {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.io.range_type), |
b229cf92 | 466 | "Range Type", acpi_gbl_rng_decode}, |
0897831b | 467 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation), |
b229cf92 | 468 | "Translation", acpi_gbl_ttp_decode}, |
0897831b | 469 | {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation_type), |
b229cf92 | 470 | "Translation Type", acpi_gbl_trs_decode} |
0897831b | 471 | }; |
bda663d3 | 472 | |
0897831b BM |
473 | /* |
474 | * Table used to dump _PRT contents | |
475 | */ | |
476 | static struct acpi_rsdump_info acpi_rs_dump_prt[5] = { | |
477 | {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_prt), NULL, NULL}, | |
478 | {ACPI_RSD_UINT64, ACPI_PRT_OFFSET(address), "Address", NULL}, | |
479 | {ACPI_RSD_UINT32, ACPI_PRT_OFFSET(pin), "Pin", NULL}, | |
480 | {ACPI_RSD_STRING, ACPI_PRT_OFFSET(source[0]), "Source", NULL}, | |
481 | {ACPI_RSD_UINT32, ACPI_PRT_OFFSET(source_index), "Source Index", NULL} | |
482 | }; | |
bda663d3 RM |
483 | |
484 | /******************************************************************************* | |
485 | * | |
0897831b | 486 | * FUNCTION: acpi_rs_dump_descriptor |
bda663d3 | 487 | * |
0897831b | 488 | * PARAMETERS: Resource |
bda663d3 RM |
489 | * |
490 | * RETURN: None | |
491 | * | |
0897831b | 492 | * DESCRIPTION: |
bda663d3 RM |
493 | * |
494 | ******************************************************************************/ | |
495 | ||
0897831b BM |
496 | static void |
497 | acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) | |
bda663d3 | 498 | { |
96db255c BM |
499 | u8 *target = NULL; |
500 | u8 *previous_target; | |
0897831b BM |
501 | char *name; |
502 | u8 count; | |
503 | ||
504 | /* First table entry must contain the table length (# of table entries) */ | |
505 | ||
506 | count = table->offset; | |
507 | ||
508 | while (count) { | |
509 | previous_target = target; | |
c51a4de8 | 510 | target = ACPI_ADD_PTR(u8, resource, table->offset); |
0897831b BM |
511 | name = table->name; |
512 | ||
513 | switch (table->opcode) { | |
514 | case ACPI_RSD_TITLE: | |
515 | /* | |
516 | * Optional resource title | |
517 | */ | |
518 | if (table->name) { | |
519 | acpi_os_printf("%s Resource\n", name); | |
520 | } | |
521 | break; | |
bda663d3 | 522 | |
0897831b | 523 | /* Strings */ |
bda663d3 | 524 | |
0897831b | 525 | case ACPI_RSD_LITERAL: |
96db255c BM |
526 | acpi_rs_out_string(name, |
527 | ACPI_CAST_PTR(char, table->pointer)); | |
0897831b | 528 | break; |
bda663d3 | 529 | |
0897831b | 530 | case ACPI_RSD_STRING: |
96db255c | 531 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, target)); |
0897831b | 532 | break; |
bda663d3 | 533 | |
0897831b | 534 | /* Data items, 8/16/32/64 bit */ |
bda663d3 | 535 | |
0897831b | 536 | case ACPI_RSD_UINT8: |
e0fe0a8d LM |
537 | if (table->pointer) { |
538 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, | |
539 | table-> | |
540 | pointer | |
541 | [*target])); | |
542 | } else { | |
543 | acpi_rs_out_integer8(name, ACPI_GET8(target)); | |
544 | } | |
0897831b | 545 | break; |
bda663d3 | 546 | |
0897831b | 547 | case ACPI_RSD_UINT16: |
c51a4de8 | 548 | acpi_rs_out_integer16(name, ACPI_GET16(target)); |
0897831b BM |
549 | break; |
550 | ||
551 | case ACPI_RSD_UINT32: | |
c51a4de8 | 552 | acpi_rs_out_integer32(name, ACPI_GET32(target)); |
0897831b | 553 | break; |
50eca3eb | 554 | |
0897831b | 555 | case ACPI_RSD_UINT64: |
c51a4de8 | 556 | acpi_rs_out_integer64(name, ACPI_GET64(target)); |
0897831b BM |
557 | break; |
558 | ||
559 | /* Flags: 1-bit and 2-bit flags supported */ | |
560 | ||
561 | case ACPI_RSD_1BITFLAG: | |
96db255c BM |
562 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, |
563 | table-> | |
564 | pointer[*target & | |
565 | 0x01])); | |
0897831b BM |
566 | break; |
567 | ||
568 | case ACPI_RSD_2BITFLAG: | |
96db255c BM |
569 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, |
570 | table-> | |
571 | pointer[*target & | |
572 | 0x03])); | |
0897831b BM |
573 | break; |
574 | ||
e0fe0a8d LM |
575 | case ACPI_RSD_3BITFLAG: |
576 | acpi_rs_out_string(name, ACPI_CAST_PTR(char, | |
577 | table-> | |
578 | pointer[*target & | |
579 | 0x07])); | |
580 | break; | |
581 | ||
0897831b BM |
582 | case ACPI_RSD_SHORTLIST: |
583 | /* | |
584 | * Short byte list (single line output) for DMA and IRQ resources | |
585 | * Note: The list length is obtained from the previous table entry | |
586 | */ | |
587 | if (previous_target) { | |
588 | acpi_rs_out_title(name); | |
96db255c BM |
589 | acpi_rs_dump_short_byte_list(*previous_target, |
590 | target); | |
0897831b BM |
591 | } |
592 | break; | |
593 | ||
e0fe0a8d LM |
594 | case ACPI_RSD_SHORTLISTX: |
595 | /* | |
596 | * Short byte list (single line output) for GPIO vendor data | |
597 | * Note: The list length is obtained from the previous table entry | |
598 | */ | |
599 | if (previous_target) { | |
600 | acpi_rs_out_title(name); | |
601 | acpi_rs_dump_short_byte_list(*previous_target, | |
602 | * | |
603 | (ACPI_CAST_INDIRECT_PTR | |
604 | (u8, target))); | |
605 | } | |
606 | break; | |
607 | ||
0897831b BM |
608 | case ACPI_RSD_LONGLIST: |
609 | /* | |
610 | * Long byte list for Vendor resource data | |
611 | * Note: The list length is obtained from the previous table entry | |
612 | */ | |
613 | if (previous_target) { | |
c51a4de8 BM |
614 | acpi_rs_dump_byte_list(ACPI_GET16 |
615 | (previous_target), | |
96db255c | 616 | target); |
0897831b BM |
617 | } |
618 | break; | |
619 | ||
620 | case ACPI_RSD_DWORDLIST: | |
621 | /* | |
622 | * Dword list for Extended Interrupt resources | |
623 | * Note: The list length is obtained from the previous table entry | |
624 | */ | |
625 | if (previous_target) { | |
96db255c BM |
626 | acpi_rs_dump_dword_list(*previous_target, |
627 | ACPI_CAST_PTR(u32, | |
628 | target)); | |
0897831b BM |
629 | } |
630 | break; | |
631 | ||
e0fe0a8d LM |
632 | case ACPI_RSD_WORDLIST: |
633 | /* | |
634 | * Word list for GPIO Pin Table | |
635 | * Note: The list length is obtained from the previous table entry | |
636 | */ | |
637 | if (previous_target) { | |
638 | acpi_rs_dump_word_list(*previous_target, | |
639 | *(ACPI_CAST_INDIRECT_PTR | |
640 | (u16, target))); | |
641 | } | |
642 | break; | |
643 | ||
0897831b BM |
644 | case ACPI_RSD_ADDRESS: |
645 | /* | |
646 | * Common flags for all Address resources | |
647 | */ | |
96db255c BM |
648 | acpi_rs_dump_address_common(ACPI_CAST_PTR |
649 | (union acpi_resource_data, | |
650 | target)); | |
0897831b BM |
651 | break; |
652 | ||
653 | case ACPI_RSD_SOURCE: | |
654 | /* | |
655 | * Optional resource_source for Address resources | |
656 | */ | |
3e8214e5 LZ |
657 | acpi_rs_dump_resource_source(ACPI_CAST_PTR |
658 | (struct | |
fd350943 LB |
659 | acpi_resource_source, |
660 | target)); | |
0897831b BM |
661 | break; |
662 | ||
663 | default: | |
664 | acpi_os_printf("**** Invalid table opcode [%X] ****\n", | |
665 | table->opcode); | |
666 | return; | |
667 | } | |
668 | ||
669 | table++; | |
670 | count--; | |
671 | } | |
50eca3eb BM |
672 | } |
673 | ||
bda663d3 RM |
674 | /******************************************************************************* |
675 | * | |
676 | * FUNCTION: acpi_rs_dump_resource_source | |
1da177e4 | 677 | * |
bda663d3 | 678 | * PARAMETERS: resource_source - Pointer to a Resource Source struct |
1da177e4 LT |
679 | * |
680 | * RETURN: None | |
681 | * | |
bda663d3 RM |
682 | * DESCRIPTION: Common routine for dumping the optional resource_source and the |
683 | * corresponding resource_source_index. | |
1da177e4 LT |
684 | * |
685 | ******************************************************************************/ | |
686 | ||
bda663d3 RM |
687 | static void |
688 | acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source) | |
1da177e4 | 689 | { |
50eca3eb | 690 | ACPI_FUNCTION_ENTRY(); |
1da177e4 | 691 | |
bda663d3 RM |
692 | if (resource_source->index == 0xFF) { |
693 | return; | |
694 | } | |
695 | ||
0897831b | 696 | acpi_rs_out_integer8("Resource Source Index", resource_source->index); |
bda663d3 RM |
697 | |
698 | acpi_rs_out_string("Resource Source", | |
699 | resource_source->string_ptr ? | |
700 | resource_source->string_ptr : "[Not Specified]"); | |
701 | } | |
702 | ||
703 | /******************************************************************************* | |
704 | * | |
705 | * FUNCTION: acpi_rs_dump_address_common | |
706 | * | |
ba494bee | 707 | * PARAMETERS: resource - Pointer to an internal resource descriptor |
bda663d3 RM |
708 | * |
709 | * RETURN: None | |
710 | * | |
711 | * DESCRIPTION: Dump the fields that are common to all Address resource | |
712 | * descriptors | |
713 | * | |
714 | ******************************************************************************/ | |
715 | ||
716 | static void acpi_rs_dump_address_common(union acpi_resource_data *resource) | |
717 | { | |
4be44fcd | 718 | ACPI_FUNCTION_ENTRY(); |
1da177e4 | 719 | |
bda663d3 RM |
720 | /* Decode the type-specific flags */ |
721 | ||
722 | switch (resource->address.resource_type) { | |
723 | case ACPI_MEMORY_RANGE: | |
1da177e4 | 724 | |
0897831b | 725 | acpi_rs_dump_descriptor(resource, acpi_rs_dump_memory_flags); |
bda663d3 RM |
726 | break; |
727 | ||
728 | case ACPI_IO_RANGE: | |
729 | ||
0897831b | 730 | acpi_rs_dump_descriptor(resource, acpi_rs_dump_io_flags); |
bda663d3 RM |
731 | break; |
732 | ||
733 | case ACPI_BUS_NUMBER_RANGE: | |
734 | ||
735 | acpi_rs_out_string("Resource Type", "Bus Number Range"); | |
736 | break; | |
737 | ||
738 | default: | |
739 | ||
740 | acpi_rs_out_integer8("Resource Type", | |
741 | (u8) resource->address.resource_type); | |
742 | break; | |
1da177e4 LT |
743 | } |
744 | ||
bda663d3 RM |
745 | /* Decode the general flags */ |
746 | ||
0897831b | 747 | acpi_rs_dump_descriptor(resource, acpi_rs_dump_general_flags); |
1da177e4 LT |
748 | } |
749 | ||
1da177e4 LT |
750 | /******************************************************************************* |
751 | * | |
bda663d3 | 752 | * FUNCTION: acpi_rs_dump_resource_list |
1da177e4 | 753 | * |
bda663d3 | 754 | * PARAMETERS: resource_list - Pointer to a resource descriptor list |
1da177e4 LT |
755 | * |
756 | * RETURN: None | |
757 | * | |
bda663d3 | 758 | * DESCRIPTION: Dispatches the structure to the correct dump routine. |
1da177e4 LT |
759 | * |
760 | ******************************************************************************/ | |
761 | ||
bda663d3 | 762 | void acpi_rs_dump_resource_list(struct acpi_resource *resource_list) |
1da177e4 | 763 | { |
bda663d3 | 764 | u32 count = 0; |
0897831b | 765 | u32 type; |
1da177e4 | 766 | |
4be44fcd | 767 | ACPI_FUNCTION_ENTRY(); |
1da177e4 | 768 | |
bda663d3 RM |
769 | if (!(acpi_dbg_level & ACPI_LV_RESOURCES) |
770 | || !(_COMPONENT & acpi_dbg_layer)) { | |
771 | return; | |
772 | } | |
773 | ||
0897831b | 774 | /* Walk list and dump all resource descriptors (END_TAG terminates) */ |
bda663d3 | 775 | |
0897831b | 776 | do { |
bda663d3 | 777 | acpi_os_printf("\n[%02X] ", count); |
0897831b | 778 | count++; |
bda663d3 RM |
779 | |
780 | /* Validate Type before dispatch */ | |
781 | ||
0897831b BM |
782 | type = resource_list->type; |
783 | if (type > ACPI_RESOURCE_TYPE_MAX) { | |
bda663d3 RM |
784 | acpi_os_printf |
785 | ("Invalid descriptor type (%X) in resource list\n", | |
786 | resource_list->type); | |
787 | return; | |
788 | } | |
789 | ||
790 | /* Dump the resource descriptor */ | |
791 | ||
e0fe0a8d LM |
792 | if (type == ACPI_RESOURCE_TYPE_SERIAL_BUS) { |
793 | acpi_rs_dump_descriptor(&resource_list->data, | |
794 | acpi_gbl_dump_serial_bus_dispatch | |
795 | [resource_list->data. | |
796 | common_serial_bus.type]); | |
797 | } else { | |
798 | acpi_rs_dump_descriptor(&resource_list->data, | |
799 | acpi_gbl_dump_resource_dispatch | |
800 | [type]); | |
801 | } | |
bda663d3 | 802 | |
0897831b | 803 | /* Point to the next resource structure */ |
bda663d3 | 804 | |
e0fe0a8d | 805 | resource_list = ACPI_NEXT_RESOURCE(resource_list); |
bda663d3 | 806 | |
0897831b | 807 | /* Exit when END_TAG descriptor is reached */ |
bda663d3 | 808 | |
0897831b | 809 | } while (type != ACPI_RESOURCE_TYPE_END_TAG); |
bda663d3 RM |
810 | } |
811 | ||
812 | /******************************************************************************* | |
813 | * | |
0897831b | 814 | * FUNCTION: acpi_rs_dump_irq_list |
bda663d3 | 815 | * |
0897831b | 816 | * PARAMETERS: route_table - Pointer to the routing table to dump. |
bda663d3 RM |
817 | * |
818 | * RETURN: None | |
819 | * | |
0897831b | 820 | * DESCRIPTION: Print IRQ routing table |
bda663d3 RM |
821 | * |
822 | ******************************************************************************/ | |
823 | ||
0897831b | 824 | void acpi_rs_dump_irq_list(u8 * route_table) |
bda663d3 | 825 | { |
0897831b BM |
826 | struct acpi_pci_routing_table *prt_element; |
827 | u8 count; | |
1da177e4 | 828 | |
4be44fcd | 829 | ACPI_FUNCTION_ENTRY(); |
1da177e4 | 830 | |
0897831b BM |
831 | if (!(acpi_dbg_level & ACPI_LV_RESOURCES) |
832 | || !(_COMPONENT & acpi_dbg_layer)) { | |
833 | return; | |
1da177e4 LT |
834 | } |
835 | ||
0897831b | 836 | prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, route_table); |
1da177e4 | 837 | |
0897831b | 838 | /* Dump all table elements, Exit on zero length element */ |
1da177e4 | 839 | |
0897831b BM |
840 | for (count = 0; prt_element->length; count++) { |
841 | acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n", | |
842 | count); | |
843 | acpi_rs_dump_descriptor(prt_element, acpi_rs_dump_prt); | |
1da177e4 | 844 | |
c51a4de8 BM |
845 | prt_element = ACPI_ADD_PTR(struct acpi_pci_routing_table, |
846 | prt_element, prt_element->length); | |
1da177e4 | 847 | } |
1da177e4 LT |
848 | } |
849 | ||
1da177e4 LT |
850 | /******************************************************************************* |
851 | * | |
0897831b | 852 | * FUNCTION: acpi_rs_out* |
1da177e4 | 853 | * |
ba494bee BM |
854 | * PARAMETERS: title - Name of the resource field |
855 | * value - Value of the resource field | |
1da177e4 LT |
856 | * |
857 | * RETURN: None | |
858 | * | |
0897831b BM |
859 | * DESCRIPTION: Miscellaneous helper functions to consistently format the |
860 | * output of the resource dump routines | |
1da177e4 LT |
861 | * |
862 | ******************************************************************************/ | |
863 | ||
0897831b | 864 | static void acpi_rs_out_string(char *title, char *value) |
1da177e4 | 865 | { |
b8e4d893 BM |
866 | acpi_os_printf("%27s : %s", title, value); |
867 | if (!*value) { | |
868 | acpi_os_printf("[NULL NAMESTRING]"); | |
869 | } | |
870 | acpi_os_printf("\n"); | |
1da177e4 LT |
871 | } |
872 | ||
0897831b | 873 | static void acpi_rs_out_integer8(char *title, u8 value) |
1da177e4 | 874 | { |
0897831b | 875 | acpi_os_printf("%27s : %2.2X\n", title, value); |
1da177e4 LT |
876 | } |
877 | ||
0897831b | 878 | static void acpi_rs_out_integer16(char *title, u16 value) |
1da177e4 | 879 | { |
0897831b | 880 | acpi_os_printf("%27s : %4.4X\n", title, value); |
1da177e4 LT |
881 | } |
882 | ||
0897831b | 883 | static void acpi_rs_out_integer32(char *title, u32 value) |
50eca3eb | 884 | { |
0897831b | 885 | acpi_os_printf("%27s : %8.8X\n", title, value); |
50eca3eb BM |
886 | } |
887 | ||
0897831b | 888 | static void acpi_rs_out_integer64(char *title, u64 value) |
1da177e4 | 889 | { |
0897831b | 890 | acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value)); |
1da177e4 LT |
891 | } |
892 | ||
0897831b | 893 | static void acpi_rs_out_title(char *title) |
1da177e4 | 894 | { |
0897831b | 895 | acpi_os_printf("%27s : ", title); |
bda663d3 | 896 | } |
1da177e4 | 897 | |
bda663d3 RM |
898 | /******************************************************************************* |
899 | * | |
0897831b | 900 | * FUNCTION: acpi_rs_dump*List |
bda663d3 | 901 | * |
ba494bee BM |
902 | * PARAMETERS: length - Number of elements in the list |
903 | * data - Start of the list | |
bda663d3 RM |
904 | * |
905 | * RETURN: None | |
906 | * | |
0897831b | 907 | * DESCRIPTION: Miscellaneous functions to dump lists of raw data |
bda663d3 RM |
908 | * |
909 | ******************************************************************************/ | |
1da177e4 | 910 | |
0897831b | 911 | static void acpi_rs_dump_byte_list(u16 length, u8 * data) |
bda663d3 | 912 | { |
0897831b | 913 | u8 i; |
1da177e4 | 914 | |
0897831b BM |
915 | for (i = 0; i < length; i++) { |
916 | acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]); | |
917 | } | |
bda663d3 | 918 | } |
1da177e4 | 919 | |
0897831b | 920 | static void acpi_rs_dump_short_byte_list(u8 length, u8 * data) |
bda663d3 | 921 | { |
0897831b | 922 | u8 i; |
1da177e4 | 923 | |
0897831b BM |
924 | for (i = 0; i < length; i++) { |
925 | acpi_os_printf("%X ", data[i]); | |
926 | } | |
927 | acpi_os_printf("\n"); | |
1da177e4 LT |
928 | } |
929 | ||
0897831b | 930 | static void acpi_rs_dump_dword_list(u8 length, u32 * data) |
1da177e4 | 931 | { |
0897831b | 932 | u8 i; |
1da177e4 | 933 | |
0897831b BM |
934 | for (i = 0; i < length; i++) { |
935 | acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]); | |
1da177e4 | 936 | } |
1da177e4 LT |
937 | } |
938 | ||
e0fe0a8d LM |
939 | static void acpi_rs_dump_word_list(u16 length, u16 *data) |
940 | { | |
941 | u16 i; | |
942 | ||
943 | for (i = 0; i < length; i++) { | |
944 | acpi_os_printf("%25s%2.2X : %4.4X\n", "Word", i, data[i]); | |
945 | } | |
946 | } | |
947 | ||
1da177e4 | 948 | #endif |