xref: /openbmc/linux/drivers/acpi/acpica/rsdump.c (revision e2f7a7772880458edff1b1cc5a988947229fac26)
195b482a8SLen Brown /*******************************************************************************
295b482a8SLen Brown  *
395b482a8SLen Brown  * Module Name: rsdump - Functions to display the resource structures.
495b482a8SLen Brown  *
595b482a8SLen Brown  ******************************************************************************/
695b482a8SLen Brown 
795b482a8SLen Brown /*
895b482a8SLen Brown  * Copyright (C) 2000 - 2008, Intel Corp.
995b482a8SLen Brown  * All rights reserved.
1095b482a8SLen Brown  *
1195b482a8SLen Brown  * Redistribution and use in source and binary forms, with or without
1295b482a8SLen Brown  * modification, are permitted provided that the following conditions
1395b482a8SLen Brown  * are met:
1495b482a8SLen Brown  * 1. Redistributions of source code must retain the above copyright
1595b482a8SLen Brown  *    notice, this list of conditions, and the following disclaimer,
1695b482a8SLen Brown  *    without modification.
1795b482a8SLen Brown  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1895b482a8SLen Brown  *    substantially similar to the "NO WARRANTY" disclaimer below
1995b482a8SLen Brown  *    ("Disclaimer") and any redistribution must be conditioned upon
2095b482a8SLen Brown  *    including a substantially similar Disclaimer requirement for further
2195b482a8SLen Brown  *    binary redistribution.
2295b482a8SLen Brown  * 3. Neither the names of the above-listed copyright holders nor the names
2395b482a8SLen Brown  *    of any contributors may be used to endorse or promote products derived
2495b482a8SLen Brown  *    from this software without specific prior written permission.
2595b482a8SLen Brown  *
2695b482a8SLen Brown  * Alternatively, this software may be distributed under the terms of the
2795b482a8SLen Brown  * GNU General Public License ("GPL") version 2 as published by the Free
2895b482a8SLen Brown  * Software Foundation.
2995b482a8SLen Brown  *
3095b482a8SLen Brown  * NO WARRANTY
3195b482a8SLen Brown  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3295b482a8SLen Brown  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3395b482a8SLen Brown  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3495b482a8SLen Brown  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3595b482a8SLen Brown  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3695b482a8SLen Brown  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3795b482a8SLen Brown  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3895b482a8SLen Brown  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3995b482a8SLen Brown  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4095b482a8SLen Brown  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4195b482a8SLen Brown  * POSSIBILITY OF SUCH DAMAGES.
4295b482a8SLen Brown  */
4395b482a8SLen Brown 
4495b482a8SLen Brown #include <acpi/acpi.h>
45*e2f7a777SLen Brown #include "accommon.h"
46*e2f7a777SLen Brown #include "acresrc.h"
4795b482a8SLen Brown 
4895b482a8SLen Brown #define _COMPONENT          ACPI_RESOURCES
4995b482a8SLen Brown ACPI_MODULE_NAME("rsdump")
5095b482a8SLen Brown #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
5195b482a8SLen Brown /* Local prototypes */
5295b482a8SLen Brown static void acpi_rs_out_string(char *title, char *value);
5395b482a8SLen Brown 
5495b482a8SLen Brown static void acpi_rs_out_integer8(char *title, u8 value);
5595b482a8SLen Brown 
5695b482a8SLen Brown static void acpi_rs_out_integer16(char *title, u16 value);
5795b482a8SLen Brown 
5895b482a8SLen Brown static void acpi_rs_out_integer32(char *title, u32 value);
5995b482a8SLen Brown 
6095b482a8SLen Brown static void acpi_rs_out_integer64(char *title, u64 value);
6195b482a8SLen Brown 
6295b482a8SLen Brown static void acpi_rs_out_title(char *title);
6395b482a8SLen Brown 
6495b482a8SLen Brown static void acpi_rs_dump_byte_list(u16 length, u8 * data);
6595b482a8SLen Brown 
6695b482a8SLen Brown static void acpi_rs_dump_dword_list(u8 length, u32 * data);
6795b482a8SLen Brown 
6895b482a8SLen Brown static void acpi_rs_dump_short_byte_list(u8 length, u8 * data);
6995b482a8SLen Brown 
7095b482a8SLen Brown static void
7195b482a8SLen Brown acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source);
7295b482a8SLen Brown 
7395b482a8SLen Brown static void acpi_rs_dump_address_common(union acpi_resource_data *resource);
7495b482a8SLen Brown 
7595b482a8SLen Brown static void
7695b482a8SLen Brown acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table);
7795b482a8SLen Brown 
7895b482a8SLen Brown #define ACPI_RSD_OFFSET(f)          (u8) ACPI_OFFSET (union acpi_resource_data,f)
7995b482a8SLen Brown #define ACPI_PRT_OFFSET(f)          (u8) ACPI_OFFSET (struct acpi_pci_routing_table,f)
8095b482a8SLen Brown #define ACPI_RSD_TABLE_SIZE(name)   (sizeof(name) / sizeof (struct acpi_rsdump_info))
8195b482a8SLen Brown 
8295b482a8SLen Brown /*******************************************************************************
8395b482a8SLen Brown  *
8495b482a8SLen Brown  * Resource Descriptor info tables
8595b482a8SLen Brown  *
8695b482a8SLen Brown  * Note: The first table entry must be a Title or Literal and must contain
8795b482a8SLen Brown  * the table length (number of table entries)
8895b482a8SLen Brown  *
8995b482a8SLen Brown  ******************************************************************************/
9095b482a8SLen Brown 
9195b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_irq[7] = {
9295b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_irq), "IRQ", NULL},
9395b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.descriptor_length),
9495b482a8SLen Brown 	 "Descriptor Length", NULL},
9595b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.triggering), "Triggering",
9695b482a8SLen Brown 	 acpi_gbl_he_decode},
9795b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.polarity), "Polarity",
9895b482a8SLen Brown 	 acpi_gbl_ll_decode},
9995b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.sharable), "Sharing",
10095b482a8SLen Brown 	 acpi_gbl_shr_decode},
10195b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.interrupt_count),
10295b482a8SLen Brown 	 "Interrupt Count", NULL},
10395b482a8SLen Brown 	{ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(irq.interrupts[0]),
10495b482a8SLen Brown 	 "Interrupt List", NULL}
10595b482a8SLen Brown };
10695b482a8SLen Brown 
10795b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_dma[6] = {
10895b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_dma), "DMA", NULL},
10995b482a8SLen Brown 	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.type), "Speed",
11095b482a8SLen Brown 	 acpi_gbl_typ_decode},
11195b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(dma.bus_master), "Mastering",
11295b482a8SLen Brown 	 acpi_gbl_bm_decode},
11395b482a8SLen Brown 	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.transfer), "Transfer Type",
11495b482a8SLen Brown 	 acpi_gbl_siz_decode},
11595b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(dma.channel_count), "Channel Count",
11695b482a8SLen Brown 	 NULL},
11795b482a8SLen Brown 	{ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(dma.channels[0]), "Channel List",
11895b482a8SLen Brown 	 NULL}
11995b482a8SLen Brown };
12095b482a8SLen Brown 
12195b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_start_dpf[4] = {
12295b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_start_dpf),
12395b482a8SLen Brown 	 "Start-Dependent-Functions", NULL},
12495b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(start_dpf.descriptor_length),
12595b482a8SLen Brown 	 "Descriptor Length", NULL},
12695b482a8SLen Brown 	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.compatibility_priority),
12795b482a8SLen Brown 	 "Compatibility Priority", acpi_gbl_config_decode},
12895b482a8SLen Brown 	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.performance_robustness),
12995b482a8SLen Brown 	 "Performance/Robustness", acpi_gbl_config_decode}
13095b482a8SLen Brown };
13195b482a8SLen Brown 
13295b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_end_dpf[1] = {
13395b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_dpf),
13495b482a8SLen Brown 	 "End-Dependent-Functions", NULL}
13595b482a8SLen Brown };
13695b482a8SLen Brown 
13795b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_io[6] = {
13895b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io), "I/O", NULL},
13995b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(io.io_decode), "Address Decoding",
14095b482a8SLen Brown 	 acpi_gbl_io_decode},
14195b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.minimum), "Address Minimum", NULL},
14295b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.maximum), "Address Maximum", NULL},
14395b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.alignment), "Alignment", NULL},
14495b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.address_length), "Address Length",
14595b482a8SLen Brown 	 NULL}
14695b482a8SLen Brown };
14795b482a8SLen Brown 
14895b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_fixed_io[3] = {
14995b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_io),
15095b482a8SLen Brown 	 "Fixed I/O", NULL},
15195b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_io.address), "Address", NULL},
15295b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_io.address_length),
15395b482a8SLen Brown 	 "Address Length", NULL}
15495b482a8SLen Brown };
15595b482a8SLen Brown 
15695b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_vendor[3] = {
15795b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_vendor),
15895b482a8SLen Brown 	 "Vendor Specific", NULL},
15995b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(vendor.byte_length), "Length", NULL},
16095b482a8SLen Brown 	{ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET(vendor.byte_data[0]), "Vendor Data",
16195b482a8SLen Brown 	 NULL}
16295b482a8SLen Brown };
16395b482a8SLen Brown 
16495b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_end_tag[1] = {
16595b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_tag), "EndTag",
16695b482a8SLen Brown 	 NULL}
16795b482a8SLen Brown };
16895b482a8SLen Brown 
16995b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_memory24[6] = {
17095b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory24),
17195b482a8SLen Brown 	 "24-Bit Memory Range", NULL},
17295b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory24.write_protect),
17395b482a8SLen Brown 	 "Write Protect", acpi_gbl_rw_decode},
17495b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.minimum), "Address Minimum",
17595b482a8SLen Brown 	 NULL},
17695b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.maximum), "Address Maximum",
17795b482a8SLen Brown 	 NULL},
17895b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.alignment), "Alignment",
17995b482a8SLen Brown 	 NULL},
18095b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.address_length),
18195b482a8SLen Brown 	 "Address Length", NULL}
18295b482a8SLen Brown };
18395b482a8SLen Brown 
18495b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_memory32[6] = {
18595b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory32),
18695b482a8SLen Brown 	 "32-Bit Memory Range", NULL},
18795b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory32.write_protect),
18895b482a8SLen Brown 	 "Write Protect", acpi_gbl_rw_decode},
18995b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.minimum), "Address Minimum",
19095b482a8SLen Brown 	 NULL},
19195b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.maximum), "Address Maximum",
19295b482a8SLen Brown 	 NULL},
19395b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.alignment), "Alignment",
19495b482a8SLen Brown 	 NULL},
19595b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.address_length),
19695b482a8SLen Brown 	 "Address Length", NULL}
19795b482a8SLen Brown };
19895b482a8SLen Brown 
19995b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[4] = {
20095b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_memory32),
20195b482a8SLen Brown 	 "32-Bit Fixed Memory Range", NULL},
20295b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(fixed_memory32.write_protect),
20395b482a8SLen Brown 	 "Write Protect", acpi_gbl_rw_decode},
20495b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address), "Address",
20595b482a8SLen Brown 	 NULL},
20695b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address_length),
20795b482a8SLen Brown 	 "Address Length", NULL}
20895b482a8SLen Brown };
20995b482a8SLen Brown 
21095b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_address16[8] = {
21195b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address16),
21295b482a8SLen Brown 	 "16-Bit WORD Address Space", NULL},
21395b482a8SLen Brown 	{ACPI_RSD_ADDRESS, 0, NULL, NULL},
21495b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.granularity), "Granularity",
21595b482a8SLen Brown 	 NULL},
21695b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.minimum), "Address Minimum",
21795b482a8SLen Brown 	 NULL},
21895b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.maximum), "Address Maximum",
21995b482a8SLen Brown 	 NULL},
22095b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.translation_offset),
22195b482a8SLen Brown 	 "Translation Offset", NULL},
22295b482a8SLen Brown 	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.address_length),
22395b482a8SLen Brown 	 "Address Length", NULL},
22495b482a8SLen Brown 	{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address16.resource_source), NULL, NULL}
22595b482a8SLen Brown };
22695b482a8SLen Brown 
22795b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_address32[8] = {
22895b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address32),
22995b482a8SLen Brown 	 "32-Bit DWORD Address Space", NULL},
23095b482a8SLen Brown 	{ACPI_RSD_ADDRESS, 0, NULL, NULL},
23195b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.granularity), "Granularity",
23295b482a8SLen Brown 	 NULL},
23395b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.minimum), "Address Minimum",
23495b482a8SLen Brown 	 NULL},
23595b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.maximum), "Address Maximum",
23695b482a8SLen Brown 	 NULL},
23795b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.translation_offset),
23895b482a8SLen Brown 	 "Translation Offset", NULL},
23995b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.address_length),
24095b482a8SLen Brown 	 "Address Length", NULL},
24195b482a8SLen Brown 	{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address32.resource_source), NULL, NULL}
24295b482a8SLen Brown };
24395b482a8SLen Brown 
24495b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_address64[8] = {
24595b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address64),
24695b482a8SLen Brown 	 "64-Bit QWORD Address Space", NULL},
24795b482a8SLen Brown 	{ACPI_RSD_ADDRESS, 0, NULL, NULL},
24895b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.granularity), "Granularity",
24995b482a8SLen Brown 	 NULL},
25095b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.minimum), "Address Minimum",
25195b482a8SLen Brown 	 NULL},
25295b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.maximum), "Address Maximum",
25395b482a8SLen Brown 	 NULL},
25495b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.translation_offset),
25595b482a8SLen Brown 	 "Translation Offset", NULL},
25695b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.address_length),
25795b482a8SLen Brown 	 "Address Length", NULL},
25895b482a8SLen Brown 	{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address64.resource_source), NULL, NULL}
25995b482a8SLen Brown };
26095b482a8SLen Brown 
26195b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_ext_address64[8] = {
26295b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_address64),
26395b482a8SLen Brown 	 "64-Bit Extended Address Space", NULL},
26495b482a8SLen Brown 	{ACPI_RSD_ADDRESS, 0, NULL, NULL},
26595b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.granularity),
26695b482a8SLen Brown 	 "Granularity", NULL},
26795b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.minimum),
26895b482a8SLen Brown 	 "Address Minimum", NULL},
26995b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.maximum),
27095b482a8SLen Brown 	 "Address Maximum", NULL},
27195b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.translation_offset),
27295b482a8SLen Brown 	 "Translation Offset", NULL},
27395b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.address_length),
27495b482a8SLen Brown 	 "Address Length", NULL},
27595b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.type_specific),
27695b482a8SLen Brown 	 "Type-Specific Attribute", NULL}
27795b482a8SLen Brown };
27895b482a8SLen Brown 
27995b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_ext_irq[8] = {
28095b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_irq),
28195b482a8SLen Brown 	 "Extended IRQ", NULL},
28295b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.producer_consumer),
28395b482a8SLen Brown 	 "Type", acpi_gbl_consume_decode},
28495b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.triggering),
28595b482a8SLen Brown 	 "Triggering", acpi_gbl_he_decode},
28695b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.polarity), "Polarity",
28795b482a8SLen Brown 	 acpi_gbl_ll_decode},
28895b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.sharable), "Sharing",
28995b482a8SLen Brown 	 acpi_gbl_shr_decode},
29095b482a8SLen Brown 	{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(extended_irq.resource_source), NULL,
29195b482a8SLen Brown 	 NULL},
29295b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(extended_irq.interrupt_count),
29395b482a8SLen Brown 	 "Interrupt Count", NULL},
29495b482a8SLen Brown 	{ACPI_RSD_DWORDLIST, ACPI_RSD_OFFSET(extended_irq.interrupts[0]),
29595b482a8SLen Brown 	 "Interrupt List", NULL}
29695b482a8SLen Brown };
29795b482a8SLen Brown 
29895b482a8SLen Brown struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = {
29995b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_generic_reg),
30095b482a8SLen Brown 	 "Generic Register", NULL},
30195b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.space_id), "Space ID",
30295b482a8SLen Brown 	 NULL},
30395b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_width), "Bit Width",
30495b482a8SLen Brown 	 NULL},
30595b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_offset), "Bit Offset",
30695b482a8SLen Brown 	 NULL},
30795b482a8SLen Brown 	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.access_size),
30895b482a8SLen Brown 	 "Access Size", NULL},
30995b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL}
31095b482a8SLen Brown };
31195b482a8SLen Brown 
31295b482a8SLen Brown /*
31395b482a8SLen Brown  * Tables used for common address descriptor flag fields
31495b482a8SLen Brown  */
31595b482a8SLen Brown static struct acpi_rsdump_info acpi_rs_dump_general_flags[5] = {
31695b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_general_flags), NULL,
31795b482a8SLen Brown 	 NULL},
31895b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.producer_consumer),
31995b482a8SLen Brown 	 "Consumer/Producer", acpi_gbl_consume_decode},
32095b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.decode), "Address Decode",
32195b482a8SLen Brown 	 acpi_gbl_dec_decode},
32295b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.min_address_fixed),
32395b482a8SLen Brown 	 "Min Relocatability", acpi_gbl_min_decode},
32495b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.max_address_fixed),
32595b482a8SLen Brown 	 "Max Relocatability", acpi_gbl_max_decode}
32695b482a8SLen Brown };
32795b482a8SLen Brown 
32895b482a8SLen Brown static struct acpi_rsdump_info acpi_rs_dump_memory_flags[5] = {
32995b482a8SLen Brown 	{ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory_flags),
33095b482a8SLen Brown 	 "Resource Type", (void *)"Memory Range"},
33195b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.write_protect),
33295b482a8SLen Brown 	 "Write Protect", acpi_gbl_rw_decode},
33395b482a8SLen Brown 	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.caching),
33495b482a8SLen Brown 	 "Caching", acpi_gbl_mem_decode},
33595b482a8SLen Brown 	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.range_type),
33695b482a8SLen Brown 	 "Range Type", acpi_gbl_mtp_decode},
33795b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.translation),
33895b482a8SLen Brown 	 "Translation", acpi_gbl_ttp_decode}
33995b482a8SLen Brown };
34095b482a8SLen Brown 
34195b482a8SLen Brown static struct acpi_rsdump_info acpi_rs_dump_io_flags[4] = {
34295b482a8SLen Brown 	{ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io_flags),
34395b482a8SLen Brown 	 "Resource Type", (void *)"I/O Range"},
34495b482a8SLen Brown 	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.io.range_type),
34595b482a8SLen Brown 	 "Range Type", acpi_gbl_rng_decode},
34695b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation),
34795b482a8SLen Brown 	 "Translation", acpi_gbl_ttp_decode},
34895b482a8SLen Brown 	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation_type),
34995b482a8SLen Brown 	 "Translation Type", acpi_gbl_trs_decode}
35095b482a8SLen Brown };
35195b482a8SLen Brown 
35295b482a8SLen Brown /*
35395b482a8SLen Brown  * Table used to dump _PRT contents
35495b482a8SLen Brown  */
35595b482a8SLen Brown static struct acpi_rsdump_info acpi_rs_dump_prt[5] = {
35695b482a8SLen Brown 	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_prt), NULL, NULL},
35795b482a8SLen Brown 	{ACPI_RSD_UINT64, ACPI_PRT_OFFSET(address), "Address", NULL},
35895b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_PRT_OFFSET(pin), "Pin", NULL},
35995b482a8SLen Brown 	{ACPI_RSD_STRING, ACPI_PRT_OFFSET(source[0]), "Source", NULL},
36095b482a8SLen Brown 	{ACPI_RSD_UINT32, ACPI_PRT_OFFSET(source_index), "Source Index", NULL}
36195b482a8SLen Brown };
36295b482a8SLen Brown 
36395b482a8SLen Brown /*******************************************************************************
36495b482a8SLen Brown  *
36595b482a8SLen Brown  * FUNCTION:    acpi_rs_dump_descriptor
36695b482a8SLen Brown  *
36795b482a8SLen Brown  * PARAMETERS:  Resource
36895b482a8SLen Brown  *
36995b482a8SLen Brown  * RETURN:      None
37095b482a8SLen Brown  *
37195b482a8SLen Brown  * DESCRIPTION:
37295b482a8SLen Brown  *
37395b482a8SLen Brown  ******************************************************************************/
37495b482a8SLen Brown 
37595b482a8SLen Brown static void
37695b482a8SLen Brown acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
37795b482a8SLen Brown {
37895b482a8SLen Brown 	u8 *target = NULL;
37995b482a8SLen Brown 	u8 *previous_target;
38095b482a8SLen Brown 	char *name;
38195b482a8SLen Brown 	u8 count;
38295b482a8SLen Brown 
38395b482a8SLen Brown 	/* First table entry must contain the table length (# of table entries) */
38495b482a8SLen Brown 
38595b482a8SLen Brown 	count = table->offset;
38695b482a8SLen Brown 
38795b482a8SLen Brown 	while (count) {
38895b482a8SLen Brown 		previous_target = target;
38995b482a8SLen Brown 		target = ACPI_ADD_PTR(u8, resource, table->offset);
39095b482a8SLen Brown 		name = table->name;
39195b482a8SLen Brown 
39295b482a8SLen Brown 		switch (table->opcode) {
39395b482a8SLen Brown 		case ACPI_RSD_TITLE:
39495b482a8SLen Brown 			/*
39595b482a8SLen Brown 			 * Optional resource title
39695b482a8SLen Brown 			 */
39795b482a8SLen Brown 			if (table->name) {
39895b482a8SLen Brown 				acpi_os_printf("%s Resource\n", name);
39995b482a8SLen Brown 			}
40095b482a8SLen Brown 			break;
40195b482a8SLen Brown 
40295b482a8SLen Brown 			/* Strings */
40395b482a8SLen Brown 
40495b482a8SLen Brown 		case ACPI_RSD_LITERAL:
40595b482a8SLen Brown 			acpi_rs_out_string(name,
40695b482a8SLen Brown 					   ACPI_CAST_PTR(char, table->pointer));
40795b482a8SLen Brown 			break;
40895b482a8SLen Brown 
40995b482a8SLen Brown 		case ACPI_RSD_STRING:
41095b482a8SLen Brown 			acpi_rs_out_string(name, ACPI_CAST_PTR(char, target));
41195b482a8SLen Brown 			break;
41295b482a8SLen Brown 
41395b482a8SLen Brown 			/* Data items, 8/16/32/64 bit */
41495b482a8SLen Brown 
41595b482a8SLen Brown 		case ACPI_RSD_UINT8:
41695b482a8SLen Brown 			acpi_rs_out_integer8(name, ACPI_GET8(target));
41795b482a8SLen Brown 			break;
41895b482a8SLen Brown 
41995b482a8SLen Brown 		case ACPI_RSD_UINT16:
42095b482a8SLen Brown 			acpi_rs_out_integer16(name, ACPI_GET16(target));
42195b482a8SLen Brown 			break;
42295b482a8SLen Brown 
42395b482a8SLen Brown 		case ACPI_RSD_UINT32:
42495b482a8SLen Brown 			acpi_rs_out_integer32(name, ACPI_GET32(target));
42595b482a8SLen Brown 			break;
42695b482a8SLen Brown 
42795b482a8SLen Brown 		case ACPI_RSD_UINT64:
42895b482a8SLen Brown 			acpi_rs_out_integer64(name, ACPI_GET64(target));
42995b482a8SLen Brown 			break;
43095b482a8SLen Brown 
43195b482a8SLen Brown 			/* Flags: 1-bit and 2-bit flags supported */
43295b482a8SLen Brown 
43395b482a8SLen Brown 		case ACPI_RSD_1BITFLAG:
43495b482a8SLen Brown 			acpi_rs_out_string(name, ACPI_CAST_PTR(char,
43595b482a8SLen Brown 							       table->
43695b482a8SLen Brown 							       pointer[*target &
43795b482a8SLen Brown 								       0x01]));
43895b482a8SLen Brown 			break;
43995b482a8SLen Brown 
44095b482a8SLen Brown 		case ACPI_RSD_2BITFLAG:
44195b482a8SLen Brown 			acpi_rs_out_string(name, ACPI_CAST_PTR(char,
44295b482a8SLen Brown 							       table->
44395b482a8SLen Brown 							       pointer[*target &
44495b482a8SLen Brown 								       0x03]));
44595b482a8SLen Brown 			break;
44695b482a8SLen Brown 
44795b482a8SLen Brown 		case ACPI_RSD_SHORTLIST:
44895b482a8SLen Brown 			/*
44995b482a8SLen Brown 			 * Short byte list (single line output) for DMA and IRQ resources
45095b482a8SLen Brown 			 * Note: The list length is obtained from the previous table entry
45195b482a8SLen Brown 			 */
45295b482a8SLen Brown 			if (previous_target) {
45395b482a8SLen Brown 				acpi_rs_out_title(name);
45495b482a8SLen Brown 				acpi_rs_dump_short_byte_list(*previous_target,
45595b482a8SLen Brown 							     target);
45695b482a8SLen Brown 			}
45795b482a8SLen Brown 			break;
45895b482a8SLen Brown 
45995b482a8SLen Brown 		case ACPI_RSD_LONGLIST:
46095b482a8SLen Brown 			/*
46195b482a8SLen Brown 			 * Long byte list for Vendor resource data
46295b482a8SLen Brown 			 * Note: The list length is obtained from the previous table entry
46395b482a8SLen Brown 			 */
46495b482a8SLen Brown 			if (previous_target) {
46595b482a8SLen Brown 				acpi_rs_dump_byte_list(ACPI_GET16
46695b482a8SLen Brown 						       (previous_target),
46795b482a8SLen Brown 						       target);
46895b482a8SLen Brown 			}
46995b482a8SLen Brown 			break;
47095b482a8SLen Brown 
47195b482a8SLen Brown 		case ACPI_RSD_DWORDLIST:
47295b482a8SLen Brown 			/*
47395b482a8SLen Brown 			 * Dword list for Extended Interrupt resources
47495b482a8SLen Brown 			 * Note: The list length is obtained from the previous table entry
47595b482a8SLen Brown 			 */
47695b482a8SLen Brown 			if (previous_target) {
47795b482a8SLen Brown 				acpi_rs_dump_dword_list(*previous_target,
47895b482a8SLen Brown 							ACPI_CAST_PTR(u32,
47995b482a8SLen Brown 								      target));
48095b482a8SLen Brown 			}
48195b482a8SLen Brown 			break;
48295b482a8SLen Brown 
48395b482a8SLen Brown 		case ACPI_RSD_ADDRESS:
48495b482a8SLen Brown 			/*
48595b482a8SLen Brown 			 * Common flags for all Address resources
48695b482a8SLen Brown 			 */
48795b482a8SLen Brown 			acpi_rs_dump_address_common(ACPI_CAST_PTR
48895b482a8SLen Brown 						    (union acpi_resource_data,
48995b482a8SLen Brown 						     target));
49095b482a8SLen Brown 			break;
49195b482a8SLen Brown 
49295b482a8SLen Brown 		case ACPI_RSD_SOURCE:
49395b482a8SLen Brown 			/*
49495b482a8SLen Brown 			 * Optional resource_source for Address resources
49595b482a8SLen Brown 			 */
49695b482a8SLen Brown 			acpi_rs_dump_resource_source(ACPI_CAST_PTR(struct
49795b482a8SLen Brown 								   acpi_resource_source,
49895b482a8SLen Brown 								   target));
49995b482a8SLen Brown 			break;
50095b482a8SLen Brown 
50195b482a8SLen Brown 		default:
50295b482a8SLen Brown 			acpi_os_printf("**** Invalid table opcode [%X] ****\n",
50395b482a8SLen Brown 				       table->opcode);
50495b482a8SLen Brown 			return;
50595b482a8SLen Brown 		}
50695b482a8SLen Brown 
50795b482a8SLen Brown 		table++;
50895b482a8SLen Brown 		count--;
50995b482a8SLen Brown 	}
51095b482a8SLen Brown }
51195b482a8SLen Brown 
51295b482a8SLen Brown /*******************************************************************************
51395b482a8SLen Brown  *
51495b482a8SLen Brown  * FUNCTION:    acpi_rs_dump_resource_source
51595b482a8SLen Brown  *
51695b482a8SLen Brown  * PARAMETERS:  resource_source     - Pointer to a Resource Source struct
51795b482a8SLen Brown  *
51895b482a8SLen Brown  * RETURN:      None
51995b482a8SLen Brown  *
52095b482a8SLen Brown  * DESCRIPTION: Common routine for dumping the optional resource_source and the
52195b482a8SLen Brown  *              corresponding resource_source_index.
52295b482a8SLen Brown  *
52395b482a8SLen Brown  ******************************************************************************/
52495b482a8SLen Brown 
52595b482a8SLen Brown static void
52695b482a8SLen Brown acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source)
52795b482a8SLen Brown {
52895b482a8SLen Brown 	ACPI_FUNCTION_ENTRY();
52995b482a8SLen Brown 
53095b482a8SLen Brown 	if (resource_source->index == 0xFF) {
53195b482a8SLen Brown 		return;
53295b482a8SLen Brown 	}
53395b482a8SLen Brown 
53495b482a8SLen Brown 	acpi_rs_out_integer8("Resource Source Index", resource_source->index);
53595b482a8SLen Brown 
53695b482a8SLen Brown 	acpi_rs_out_string("Resource Source",
53795b482a8SLen Brown 			   resource_source->string_ptr ?
53895b482a8SLen Brown 			   resource_source->string_ptr : "[Not Specified]");
53995b482a8SLen Brown }
54095b482a8SLen Brown 
54195b482a8SLen Brown /*******************************************************************************
54295b482a8SLen Brown  *
54395b482a8SLen Brown  * FUNCTION:    acpi_rs_dump_address_common
54495b482a8SLen Brown  *
54595b482a8SLen Brown  * PARAMETERS:  Resource        - Pointer to an internal resource descriptor
54695b482a8SLen Brown  *
54795b482a8SLen Brown  * RETURN:      None
54895b482a8SLen Brown  *
54995b482a8SLen Brown  * DESCRIPTION: Dump the fields that are common to all Address resource
55095b482a8SLen Brown  *              descriptors
55195b482a8SLen Brown  *
55295b482a8SLen Brown  ******************************************************************************/
55395b482a8SLen Brown 
55495b482a8SLen Brown static void acpi_rs_dump_address_common(union acpi_resource_data *resource)
55595b482a8SLen Brown {
55695b482a8SLen Brown 	ACPI_FUNCTION_ENTRY();
55795b482a8SLen Brown 
55895b482a8SLen Brown 	/* Decode the type-specific flags */
55995b482a8SLen Brown 
56095b482a8SLen Brown 	switch (resource->address.resource_type) {
56195b482a8SLen Brown 	case ACPI_MEMORY_RANGE:
56295b482a8SLen Brown 
56395b482a8SLen Brown 		acpi_rs_dump_descriptor(resource, acpi_rs_dump_memory_flags);
56495b482a8SLen Brown 		break;
56595b482a8SLen Brown 
56695b482a8SLen Brown 	case ACPI_IO_RANGE:
56795b482a8SLen Brown 
56895b482a8SLen Brown 		acpi_rs_dump_descriptor(resource, acpi_rs_dump_io_flags);
56995b482a8SLen Brown 		break;
57095b482a8SLen Brown 
57195b482a8SLen Brown 	case ACPI_BUS_NUMBER_RANGE:
57295b482a8SLen Brown 
57395b482a8SLen Brown 		acpi_rs_out_string("Resource Type", "Bus Number Range");
57495b482a8SLen Brown 		break;
57595b482a8SLen Brown 
57695b482a8SLen Brown 	default:
57795b482a8SLen Brown 
57895b482a8SLen Brown 		acpi_rs_out_integer8("Resource Type",
57995b482a8SLen Brown 				     (u8) resource->address.resource_type);
58095b482a8SLen Brown 		break;
58195b482a8SLen Brown 	}
58295b482a8SLen Brown 
58395b482a8SLen Brown 	/* Decode the general flags */
58495b482a8SLen Brown 
58595b482a8SLen Brown 	acpi_rs_dump_descriptor(resource, acpi_rs_dump_general_flags);
58695b482a8SLen Brown }
58795b482a8SLen Brown 
58895b482a8SLen Brown /*******************************************************************************
58995b482a8SLen Brown  *
59095b482a8SLen Brown  * FUNCTION:    acpi_rs_dump_resource_list
59195b482a8SLen Brown  *
59295b482a8SLen Brown  * PARAMETERS:  resource_list       - Pointer to a resource descriptor list
59395b482a8SLen Brown  *
59495b482a8SLen Brown  * RETURN:      None
59595b482a8SLen Brown  *
59695b482a8SLen Brown  * DESCRIPTION: Dispatches the structure to the correct dump routine.
59795b482a8SLen Brown  *
59895b482a8SLen Brown  ******************************************************************************/
59995b482a8SLen Brown 
60095b482a8SLen Brown void acpi_rs_dump_resource_list(struct acpi_resource *resource_list)
60195b482a8SLen Brown {
60295b482a8SLen Brown 	u32 count = 0;
60395b482a8SLen Brown 	u32 type;
60495b482a8SLen Brown 
60595b482a8SLen Brown 	ACPI_FUNCTION_ENTRY();
60695b482a8SLen Brown 
60795b482a8SLen Brown 	if (!(acpi_dbg_level & ACPI_LV_RESOURCES)
60895b482a8SLen Brown 	    || !(_COMPONENT & acpi_dbg_layer)) {
60995b482a8SLen Brown 		return;
61095b482a8SLen Brown 	}
61195b482a8SLen Brown 
61295b482a8SLen Brown 	/* Walk list and dump all resource descriptors (END_TAG terminates) */
61395b482a8SLen Brown 
61495b482a8SLen Brown 	do {
61595b482a8SLen Brown 		acpi_os_printf("\n[%02X] ", count);
61695b482a8SLen Brown 		count++;
61795b482a8SLen Brown 
61895b482a8SLen Brown 		/* Validate Type before dispatch */
61995b482a8SLen Brown 
62095b482a8SLen Brown 		type = resource_list->type;
62195b482a8SLen Brown 		if (type > ACPI_RESOURCE_TYPE_MAX) {
62295b482a8SLen Brown 			acpi_os_printf
62395b482a8SLen Brown 			    ("Invalid descriptor type (%X) in resource list\n",
62495b482a8SLen Brown 			     resource_list->type);
62595b482a8SLen Brown 			return;
62695b482a8SLen Brown 		}
62795b482a8SLen Brown 
62895b482a8SLen Brown 		/* Dump the resource descriptor */
62995b482a8SLen Brown 
63095b482a8SLen Brown 		acpi_rs_dump_descriptor(&resource_list->data,
63195b482a8SLen Brown 					acpi_gbl_dump_resource_dispatch[type]);
63295b482a8SLen Brown 
63395b482a8SLen Brown 		/* Point to the next resource structure */
63495b482a8SLen Brown 
63595b482a8SLen Brown 		resource_list =
63695b482a8SLen Brown 		    ACPI_ADD_PTR(struct acpi_resource, resource_list,
63795b482a8SLen Brown 				 resource_list->length);
63895b482a8SLen Brown 
63995b482a8SLen Brown 		/* Exit when END_TAG descriptor is reached */
64095b482a8SLen Brown 
64195b482a8SLen Brown 	} while (type != ACPI_RESOURCE_TYPE_END_TAG);
64295b482a8SLen Brown }
64395b482a8SLen Brown 
64495b482a8SLen Brown /*******************************************************************************
64595b482a8SLen Brown  *
64695b482a8SLen Brown  * FUNCTION:    acpi_rs_dump_irq_list
64795b482a8SLen Brown  *
64895b482a8SLen Brown  * PARAMETERS:  route_table     - Pointer to the routing table to dump.
64995b482a8SLen Brown  *
65095b482a8SLen Brown  * RETURN:      None
65195b482a8SLen Brown  *
65295b482a8SLen Brown  * DESCRIPTION: Print IRQ routing table
65395b482a8SLen Brown  *
65495b482a8SLen Brown  ******************************************************************************/
65595b482a8SLen Brown 
65695b482a8SLen Brown void acpi_rs_dump_irq_list(u8 * route_table)
65795b482a8SLen Brown {
65895b482a8SLen Brown 	struct acpi_pci_routing_table *prt_element;
65995b482a8SLen Brown 	u8 count;
66095b482a8SLen Brown 
66195b482a8SLen Brown 	ACPI_FUNCTION_ENTRY();
66295b482a8SLen Brown 
66395b482a8SLen Brown 	if (!(acpi_dbg_level & ACPI_LV_RESOURCES)
66495b482a8SLen Brown 	    || !(_COMPONENT & acpi_dbg_layer)) {
66595b482a8SLen Brown 		return;
66695b482a8SLen Brown 	}
66795b482a8SLen Brown 
66895b482a8SLen Brown 	prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, route_table);
66995b482a8SLen Brown 
67095b482a8SLen Brown 	/* Dump all table elements, Exit on zero length element */
67195b482a8SLen Brown 
67295b482a8SLen Brown 	for (count = 0; prt_element->length; count++) {
67395b482a8SLen Brown 		acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n",
67495b482a8SLen Brown 			       count);
67595b482a8SLen Brown 		acpi_rs_dump_descriptor(prt_element, acpi_rs_dump_prt);
67695b482a8SLen Brown 
67795b482a8SLen Brown 		prt_element = ACPI_ADD_PTR(struct acpi_pci_routing_table,
67895b482a8SLen Brown 					   prt_element, prt_element->length);
67995b482a8SLen Brown 	}
68095b482a8SLen Brown }
68195b482a8SLen Brown 
68295b482a8SLen Brown /*******************************************************************************
68395b482a8SLen Brown  *
68495b482a8SLen Brown  * FUNCTION:    acpi_rs_out*
68595b482a8SLen Brown  *
68695b482a8SLen Brown  * PARAMETERS:  Title       - Name of the resource field
68795b482a8SLen Brown  *              Value       - Value of the resource field
68895b482a8SLen Brown  *
68995b482a8SLen Brown  * RETURN:      None
69095b482a8SLen Brown  *
69195b482a8SLen Brown  * DESCRIPTION: Miscellaneous helper functions to consistently format the
69295b482a8SLen Brown  *              output of the resource dump routines
69395b482a8SLen Brown  *
69495b482a8SLen Brown  ******************************************************************************/
69595b482a8SLen Brown 
69695b482a8SLen Brown static void acpi_rs_out_string(char *title, char *value)
69795b482a8SLen Brown {
69895b482a8SLen Brown 	acpi_os_printf("%27s : %s", title, value);
69995b482a8SLen Brown 	if (!*value) {
70095b482a8SLen Brown 		acpi_os_printf("[NULL NAMESTRING]");
70195b482a8SLen Brown 	}
70295b482a8SLen Brown 	acpi_os_printf("\n");
70395b482a8SLen Brown }
70495b482a8SLen Brown 
70595b482a8SLen Brown static void acpi_rs_out_integer8(char *title, u8 value)
70695b482a8SLen Brown {
70795b482a8SLen Brown 	acpi_os_printf("%27s : %2.2X\n", title, value);
70895b482a8SLen Brown }
70995b482a8SLen Brown 
71095b482a8SLen Brown static void acpi_rs_out_integer16(char *title, u16 value)
71195b482a8SLen Brown {
71295b482a8SLen Brown 	acpi_os_printf("%27s : %4.4X\n", title, value);
71395b482a8SLen Brown }
71495b482a8SLen Brown 
71595b482a8SLen Brown static void acpi_rs_out_integer32(char *title, u32 value)
71695b482a8SLen Brown {
71795b482a8SLen Brown 	acpi_os_printf("%27s : %8.8X\n", title, value);
71895b482a8SLen Brown }
71995b482a8SLen Brown 
72095b482a8SLen Brown static void acpi_rs_out_integer64(char *title, u64 value)
72195b482a8SLen Brown {
72295b482a8SLen Brown 	acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value));
72395b482a8SLen Brown }
72495b482a8SLen Brown 
72595b482a8SLen Brown static void acpi_rs_out_title(char *title)
72695b482a8SLen Brown {
72795b482a8SLen Brown 	acpi_os_printf("%27s : ", title);
72895b482a8SLen Brown }
72995b482a8SLen Brown 
73095b482a8SLen Brown /*******************************************************************************
73195b482a8SLen Brown  *
73295b482a8SLen Brown  * FUNCTION:    acpi_rs_dump*List
73395b482a8SLen Brown  *
73495b482a8SLen Brown  * PARAMETERS:  Length      - Number of elements in the list
73595b482a8SLen Brown  *              Data        - Start of the list
73695b482a8SLen Brown  *
73795b482a8SLen Brown  * RETURN:      None
73895b482a8SLen Brown  *
73995b482a8SLen Brown  * DESCRIPTION: Miscellaneous functions to dump lists of raw data
74095b482a8SLen Brown  *
74195b482a8SLen Brown  ******************************************************************************/
74295b482a8SLen Brown 
74395b482a8SLen Brown static void acpi_rs_dump_byte_list(u16 length, u8 * data)
74495b482a8SLen Brown {
74595b482a8SLen Brown 	u8 i;
74695b482a8SLen Brown 
74795b482a8SLen Brown 	for (i = 0; i < length; i++) {
74895b482a8SLen Brown 		acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]);
74995b482a8SLen Brown 	}
75095b482a8SLen Brown }
75195b482a8SLen Brown 
75295b482a8SLen Brown static void acpi_rs_dump_short_byte_list(u8 length, u8 * data)
75395b482a8SLen Brown {
75495b482a8SLen Brown 	u8 i;
75595b482a8SLen Brown 
75695b482a8SLen Brown 	for (i = 0; i < length; i++) {
75795b482a8SLen Brown 		acpi_os_printf("%X ", data[i]);
75895b482a8SLen Brown 	}
75995b482a8SLen Brown 	acpi_os_printf("\n");
76095b482a8SLen Brown }
76195b482a8SLen Brown 
76295b482a8SLen Brown static void acpi_rs_dump_dword_list(u8 length, u32 * data)
76395b482a8SLen Brown {
76495b482a8SLen Brown 	u8 i;
76595b482a8SLen Brown 
76695b482a8SLen Brown 	for (i = 0; i < length; i++) {
76795b482a8SLen Brown 		acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]);
76895b482a8SLen Brown 	}
76995b482a8SLen Brown }
77095b482a8SLen Brown 
77195b482a8SLen Brown #endif
772