195b482a8SLen Brown /******************************************************************************* 295b482a8SLen Brown * 339239fedSBob Moore * Module Name: rsdump - AML debugger support for resource structures. 495b482a8SLen Brown * 595b482a8SLen Brown ******************************************************************************/ 695b482a8SLen Brown 795b482a8SLen Brown /* 882a80941SDavid E. Box * Copyright (C) 2000 - 2015, 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> 45e2f7a777SLen Brown #include "accommon.h" 46e2f7a777SLen Brown #include "acresrc.h" 4795b482a8SLen Brown 4895b482a8SLen Brown #define _COMPONENT ACPI_RESOURCES 4995b482a8SLen Brown ACPI_MODULE_NAME("rsdump") 503334861bSLv Zheng 5139239fedSBob Moore /* 5239239fedSBob Moore * All functions in this module are used by the AML Debugger only 5339239fedSBob Moore */ 5495b482a8SLen Brown /* Local prototypes */ 5595b482a8SLen Brown static void acpi_rs_out_string(char *title, char *value); 5695b482a8SLen Brown 5795b482a8SLen Brown static void acpi_rs_out_integer8(char *title, u8 value); 5895b482a8SLen Brown 5995b482a8SLen Brown static void acpi_rs_out_integer16(char *title, u16 value); 6095b482a8SLen Brown 6195b482a8SLen Brown static void acpi_rs_out_integer32(char *title, u32 value); 6295b482a8SLen Brown 6395b482a8SLen Brown static void acpi_rs_out_integer64(char *title, u64 value); 6495b482a8SLen Brown 6595b482a8SLen Brown static void acpi_rs_out_title(char *title); 6695b482a8SLen Brown 6795b482a8SLen Brown static void acpi_rs_dump_byte_list(u16 length, u8 *data); 6895b482a8SLen Brown 69e0fe0a8dSLin Ming static void acpi_rs_dump_word_list(u16 length, u16 *data); 70e0fe0a8dSLin Ming 7195b482a8SLen Brown static void acpi_rs_dump_dword_list(u8 length, u32 *data); 7295b482a8SLen Brown 7395b482a8SLen Brown static void acpi_rs_dump_short_byte_list(u8 length, u8 *data); 7495b482a8SLen Brown 7595b482a8SLen Brown static void 7695b482a8SLen Brown acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source); 7795b482a8SLen Brown 7895b482a8SLen Brown static void acpi_rs_dump_address_common(union acpi_resource_data *resource); 7995b482a8SLen Brown 8095b482a8SLen Brown static void 8195b482a8SLen Brown acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table); 8295b482a8SLen Brown 8395b482a8SLen Brown /******************************************************************************* 8495b482a8SLen Brown * 8539239fedSBob Moore * FUNCTION: acpi_rs_dump_resource_list 8639239fedSBob Moore * 8739239fedSBob Moore * PARAMETERS: resource_list - Pointer to a resource descriptor list 8839239fedSBob Moore * 8939239fedSBob Moore * RETURN: None 9039239fedSBob Moore * 9139239fedSBob Moore * DESCRIPTION: Dispatches the structure to the correct dump routine. 9239239fedSBob Moore * 9339239fedSBob Moore ******************************************************************************/ 9439239fedSBob Moore 9539239fedSBob Moore void acpi_rs_dump_resource_list(struct acpi_resource *resource_list) 9639239fedSBob Moore { 9739239fedSBob Moore u32 count = 0; 9839239fedSBob Moore u32 type; 9939239fedSBob Moore 10039239fedSBob Moore ACPI_FUNCTION_ENTRY(); 10139239fedSBob Moore 10239239fedSBob Moore /* Check if debug output enabled */ 10339239fedSBob Moore 10439239fedSBob Moore if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_RESOURCES, _COMPONENT)) { 10539239fedSBob Moore return; 10639239fedSBob Moore } 10739239fedSBob Moore 10839239fedSBob Moore /* Walk list and dump all resource descriptors (END_TAG terminates) */ 10939239fedSBob Moore 11039239fedSBob Moore do { 11139239fedSBob Moore acpi_os_printf("\n[%02X] ", count); 11239239fedSBob Moore count++; 11339239fedSBob Moore 11439239fedSBob Moore /* Validate Type before dispatch */ 11539239fedSBob Moore 11639239fedSBob Moore type = resource_list->type; 11739239fedSBob Moore if (type > ACPI_RESOURCE_TYPE_MAX) { 11839239fedSBob Moore acpi_os_printf 11939239fedSBob Moore ("Invalid descriptor type (%X) in resource list\n", 12039239fedSBob Moore resource_list->type); 12139239fedSBob Moore return; 12239239fedSBob Moore } 12339239fedSBob Moore 12439239fedSBob Moore /* Sanity check the length. It must not be zero, or we loop forever */ 12539239fedSBob Moore 12639239fedSBob Moore if (!resource_list->length) { 12739239fedSBob Moore acpi_os_printf 12839239fedSBob Moore ("Invalid zero length descriptor in resource list\n"); 12939239fedSBob Moore return; 13039239fedSBob Moore } 13139239fedSBob Moore 13239239fedSBob Moore /* Dump the resource descriptor */ 13339239fedSBob Moore 13439239fedSBob Moore if (type == ACPI_RESOURCE_TYPE_SERIAL_BUS) { 13539239fedSBob Moore acpi_rs_dump_descriptor(&resource_list->data, 13639239fedSBob Moore acpi_gbl_dump_serial_bus_dispatch 13739239fedSBob Moore [resource_list->data. 13839239fedSBob Moore common_serial_bus.type]); 13939239fedSBob Moore } else { 14039239fedSBob Moore acpi_rs_dump_descriptor(&resource_list->data, 14139239fedSBob Moore acpi_gbl_dump_resource_dispatch 14239239fedSBob Moore [type]); 14339239fedSBob Moore } 14439239fedSBob Moore 14539239fedSBob Moore /* Point to the next resource structure */ 14639239fedSBob Moore 14739239fedSBob Moore resource_list = ACPI_NEXT_RESOURCE(resource_list); 14839239fedSBob Moore 14939239fedSBob Moore /* Exit when END_TAG descriptor is reached */ 15039239fedSBob Moore 15139239fedSBob Moore } while (type != ACPI_RESOURCE_TYPE_END_TAG); 15239239fedSBob Moore } 15339239fedSBob Moore 15439239fedSBob Moore /******************************************************************************* 15539239fedSBob Moore * 15639239fedSBob Moore * FUNCTION: acpi_rs_dump_irq_list 15739239fedSBob Moore * 15839239fedSBob Moore * PARAMETERS: route_table - Pointer to the routing table to dump. 15939239fedSBob Moore * 16039239fedSBob Moore * RETURN: None 16139239fedSBob Moore * 16239239fedSBob Moore * DESCRIPTION: Print IRQ routing table 16339239fedSBob Moore * 16439239fedSBob Moore ******************************************************************************/ 16539239fedSBob Moore 16639239fedSBob Moore void acpi_rs_dump_irq_list(u8 *route_table) 16739239fedSBob Moore { 16839239fedSBob Moore struct acpi_pci_routing_table *prt_element; 16939239fedSBob Moore u8 count; 17039239fedSBob Moore 17139239fedSBob Moore ACPI_FUNCTION_ENTRY(); 17239239fedSBob Moore 17339239fedSBob Moore /* Check if debug output enabled */ 17439239fedSBob Moore 17539239fedSBob Moore if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_RESOURCES, _COMPONENT)) { 17639239fedSBob Moore return; 17739239fedSBob Moore } 17839239fedSBob Moore 17939239fedSBob Moore prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, route_table); 18039239fedSBob Moore 18139239fedSBob Moore /* Dump all table elements, Exit on zero length element */ 18239239fedSBob Moore 18339239fedSBob Moore for (count = 0; prt_element->length; count++) { 18439239fedSBob Moore acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n", 18539239fedSBob Moore count); 18639239fedSBob Moore acpi_rs_dump_descriptor(prt_element, acpi_rs_dump_prt); 18739239fedSBob Moore 18839239fedSBob Moore prt_element = ACPI_ADD_PTR(struct acpi_pci_routing_table, 18939239fedSBob Moore prt_element, prt_element->length); 19039239fedSBob Moore } 19139239fedSBob Moore } 19239239fedSBob Moore 19339239fedSBob Moore /******************************************************************************* 19439239fedSBob Moore * 19595b482a8SLen Brown * FUNCTION: acpi_rs_dump_descriptor 19695b482a8SLen Brown * 19742f8fb75SBob Moore * PARAMETERS: resource - Buffer containing the resource 19842f8fb75SBob Moore * table - Table entry to decode the resource 19995b482a8SLen Brown * 20095b482a8SLen Brown * RETURN: None 20195b482a8SLen Brown * 20242f8fb75SBob Moore * DESCRIPTION: Dump a resource descriptor based on a dump table entry. 20395b482a8SLen Brown * 20495b482a8SLen Brown ******************************************************************************/ 20595b482a8SLen Brown 20695b482a8SLen Brown static void 20795b482a8SLen Brown acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) 20895b482a8SLen Brown { 20995b482a8SLen Brown u8 *target = NULL; 21095b482a8SLen Brown u8 *previous_target; 21195b482a8SLen Brown char *name; 21295b482a8SLen Brown u8 count; 21395b482a8SLen Brown 21495b482a8SLen Brown /* First table entry must contain the table length (# of table entries) */ 21595b482a8SLen Brown 21695b482a8SLen Brown count = table->offset; 21795b482a8SLen Brown 21895b482a8SLen Brown while (count) { 21995b482a8SLen Brown previous_target = target; 22095b482a8SLen Brown target = ACPI_ADD_PTR(u8, resource, table->offset); 22195b482a8SLen Brown name = table->name; 22295b482a8SLen Brown 22395b482a8SLen Brown switch (table->opcode) { 22495b482a8SLen Brown case ACPI_RSD_TITLE: 22595b482a8SLen Brown /* 22695b482a8SLen Brown * Optional resource title 22795b482a8SLen Brown */ 22895b482a8SLen Brown if (table->name) { 22995b482a8SLen Brown acpi_os_printf("%s Resource\n", name); 23095b482a8SLen Brown } 23195b482a8SLen Brown break; 23295b482a8SLen Brown 23395b482a8SLen Brown /* Strings */ 23495b482a8SLen Brown 23595b482a8SLen Brown case ACPI_RSD_LITERAL: 2361d1ea1b7SChao Guan 23795b482a8SLen Brown acpi_rs_out_string(name, 23895b482a8SLen Brown ACPI_CAST_PTR(char, table->pointer)); 23995b482a8SLen Brown break; 24095b482a8SLen Brown 24195b482a8SLen Brown case ACPI_RSD_STRING: 2421d1ea1b7SChao Guan 24395b482a8SLen Brown acpi_rs_out_string(name, ACPI_CAST_PTR(char, target)); 24495b482a8SLen Brown break; 24595b482a8SLen Brown 24695b482a8SLen Brown /* Data items, 8/16/32/64 bit */ 24795b482a8SLen Brown 24895b482a8SLen Brown case ACPI_RSD_UINT8: 2491d1ea1b7SChao Guan 250e0fe0a8dSLin Ming if (table->pointer) { 251e0fe0a8dSLin Ming acpi_rs_out_string(name, ACPI_CAST_PTR(char, 252e0fe0a8dSLin Ming table-> 253e0fe0a8dSLin Ming pointer 254e0fe0a8dSLin Ming [*target])); 255e0fe0a8dSLin Ming } else { 25695b482a8SLen Brown acpi_rs_out_integer8(name, ACPI_GET8(target)); 257e0fe0a8dSLin Ming } 25895b482a8SLen Brown break; 25995b482a8SLen Brown 26095b482a8SLen Brown case ACPI_RSD_UINT16: 2611d1ea1b7SChao Guan 26295b482a8SLen Brown acpi_rs_out_integer16(name, ACPI_GET16(target)); 26395b482a8SLen Brown break; 26495b482a8SLen Brown 26595b482a8SLen Brown case ACPI_RSD_UINT32: 2661d1ea1b7SChao Guan 26795b482a8SLen Brown acpi_rs_out_integer32(name, ACPI_GET32(target)); 26895b482a8SLen Brown break; 26995b482a8SLen Brown 27095b482a8SLen Brown case ACPI_RSD_UINT64: 2711d1ea1b7SChao Guan 27295b482a8SLen Brown acpi_rs_out_integer64(name, ACPI_GET64(target)); 27395b482a8SLen Brown break; 27495b482a8SLen Brown 27595b482a8SLen Brown /* Flags: 1-bit and 2-bit flags supported */ 27695b482a8SLen Brown 27795b482a8SLen Brown case ACPI_RSD_1BITFLAG: 2781d1ea1b7SChao Guan 27995b482a8SLen Brown acpi_rs_out_string(name, ACPI_CAST_PTR(char, 28095b482a8SLen Brown table-> 28195b482a8SLen Brown pointer[*target & 28295b482a8SLen Brown 0x01])); 28395b482a8SLen Brown break; 28495b482a8SLen Brown 28595b482a8SLen Brown case ACPI_RSD_2BITFLAG: 2861d1ea1b7SChao Guan 28795b482a8SLen Brown acpi_rs_out_string(name, ACPI_CAST_PTR(char, 28895b482a8SLen Brown table-> 28995b482a8SLen Brown pointer[*target & 29095b482a8SLen Brown 0x03])); 29195b482a8SLen Brown break; 29295b482a8SLen Brown 293e0fe0a8dSLin Ming case ACPI_RSD_3BITFLAG: 2941d1ea1b7SChao Guan 295e0fe0a8dSLin Ming acpi_rs_out_string(name, ACPI_CAST_PTR(char, 296e0fe0a8dSLin Ming table-> 297e0fe0a8dSLin Ming pointer[*target & 298e0fe0a8dSLin Ming 0x07])); 299e0fe0a8dSLin Ming break; 300e0fe0a8dSLin Ming 30195b482a8SLen Brown case ACPI_RSD_SHORTLIST: 30295b482a8SLen Brown /* 30395b482a8SLen Brown * Short byte list (single line output) for DMA and IRQ resources 30495b482a8SLen Brown * Note: The list length is obtained from the previous table entry 30595b482a8SLen Brown */ 30695b482a8SLen Brown if (previous_target) { 30795b482a8SLen Brown acpi_rs_out_title(name); 30895b482a8SLen Brown acpi_rs_dump_short_byte_list(*previous_target, 30995b482a8SLen Brown target); 31095b482a8SLen Brown } 31195b482a8SLen Brown break; 31295b482a8SLen Brown 313e0fe0a8dSLin Ming case ACPI_RSD_SHORTLISTX: 314e0fe0a8dSLin Ming /* 315e0fe0a8dSLin Ming * Short byte list (single line output) for GPIO vendor data 316e0fe0a8dSLin Ming * Note: The list length is obtained from the previous table entry 317e0fe0a8dSLin Ming */ 318e0fe0a8dSLin Ming if (previous_target) { 319e0fe0a8dSLin Ming acpi_rs_out_title(name); 320e0fe0a8dSLin Ming acpi_rs_dump_short_byte_list(*previous_target, 321e0fe0a8dSLin Ming * 322e0fe0a8dSLin Ming (ACPI_CAST_INDIRECT_PTR 323e0fe0a8dSLin Ming (u8, target))); 324e0fe0a8dSLin Ming } 325e0fe0a8dSLin Ming break; 326e0fe0a8dSLin Ming 32795b482a8SLen Brown case ACPI_RSD_LONGLIST: 32895b482a8SLen Brown /* 32995b482a8SLen Brown * Long byte list for Vendor resource data 33095b482a8SLen Brown * Note: The list length is obtained from the previous table entry 33195b482a8SLen Brown */ 33295b482a8SLen Brown if (previous_target) { 33395b482a8SLen Brown acpi_rs_dump_byte_list(ACPI_GET16 33495b482a8SLen Brown (previous_target), 33595b482a8SLen Brown target); 33695b482a8SLen Brown } 33795b482a8SLen Brown break; 33895b482a8SLen Brown 33995b482a8SLen Brown case ACPI_RSD_DWORDLIST: 34095b482a8SLen Brown /* 34195b482a8SLen Brown * Dword list for Extended Interrupt resources 34295b482a8SLen Brown * Note: The list length is obtained from the previous table entry 34395b482a8SLen Brown */ 34495b482a8SLen Brown if (previous_target) { 34595b482a8SLen Brown acpi_rs_dump_dword_list(*previous_target, 34695b482a8SLen Brown ACPI_CAST_PTR(u32, 34795b482a8SLen Brown target)); 34895b482a8SLen Brown } 34995b482a8SLen Brown break; 35095b482a8SLen Brown 351e0fe0a8dSLin Ming case ACPI_RSD_WORDLIST: 352e0fe0a8dSLin Ming /* 353e0fe0a8dSLin Ming * Word list for GPIO Pin Table 354e0fe0a8dSLin Ming * Note: The list length is obtained from the previous table entry 355e0fe0a8dSLin Ming */ 356e0fe0a8dSLin Ming if (previous_target) { 357e0fe0a8dSLin Ming acpi_rs_dump_word_list(*previous_target, 358e0fe0a8dSLin Ming *(ACPI_CAST_INDIRECT_PTR 359e0fe0a8dSLin Ming (u16, target))); 360e0fe0a8dSLin Ming } 361e0fe0a8dSLin Ming break; 362e0fe0a8dSLin Ming 36395b482a8SLen Brown case ACPI_RSD_ADDRESS: 36495b482a8SLen Brown /* 36595b482a8SLen Brown * Common flags for all Address resources 36695b482a8SLen Brown */ 36795b482a8SLen Brown acpi_rs_dump_address_common(ACPI_CAST_PTR 36895b482a8SLen Brown (union acpi_resource_data, 36995b482a8SLen Brown target)); 37095b482a8SLen Brown break; 37195b482a8SLen Brown 37295b482a8SLen Brown case ACPI_RSD_SOURCE: 37395b482a8SLen Brown /* 37495b482a8SLen Brown * Optional resource_source for Address resources 37595b482a8SLen Brown */ 3763e8214e5SLv Zheng acpi_rs_dump_resource_source(ACPI_CAST_PTR 3773e8214e5SLv Zheng (struct 37895b482a8SLen Brown acpi_resource_source, 37995b482a8SLen Brown target)); 38095b482a8SLen Brown break; 38195b482a8SLen Brown 38295b482a8SLen Brown default: 3831d1ea1b7SChao Guan 38495b482a8SLen Brown acpi_os_printf("**** Invalid table opcode [%X] ****\n", 38595b482a8SLen Brown table->opcode); 38695b482a8SLen Brown return; 38795b482a8SLen Brown } 38895b482a8SLen Brown 38995b482a8SLen Brown table++; 39095b482a8SLen Brown count--; 39195b482a8SLen Brown } 39295b482a8SLen Brown } 39395b482a8SLen Brown 39495b482a8SLen Brown /******************************************************************************* 39595b482a8SLen Brown * 39695b482a8SLen Brown * FUNCTION: acpi_rs_dump_resource_source 39795b482a8SLen Brown * 39895b482a8SLen Brown * PARAMETERS: resource_source - Pointer to a Resource Source struct 39995b482a8SLen Brown * 40095b482a8SLen Brown * RETURN: None 40195b482a8SLen Brown * 40295b482a8SLen Brown * DESCRIPTION: Common routine for dumping the optional resource_source and the 40395b482a8SLen Brown * corresponding resource_source_index. 40495b482a8SLen Brown * 40595b482a8SLen Brown ******************************************************************************/ 40695b482a8SLen Brown 40795b482a8SLen Brown static void 40895b482a8SLen Brown acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source) 40995b482a8SLen Brown { 41095b482a8SLen Brown ACPI_FUNCTION_ENTRY(); 41195b482a8SLen Brown 41295b482a8SLen Brown if (resource_source->index == 0xFF) { 41395b482a8SLen Brown return; 41495b482a8SLen Brown } 41595b482a8SLen Brown 41695b482a8SLen Brown acpi_rs_out_integer8("Resource Source Index", resource_source->index); 41795b482a8SLen Brown 41895b482a8SLen Brown acpi_rs_out_string("Resource Source", 41995b482a8SLen Brown resource_source->string_ptr ? 42095b482a8SLen Brown resource_source->string_ptr : "[Not Specified]"); 42195b482a8SLen Brown } 42295b482a8SLen Brown 42395b482a8SLen Brown /******************************************************************************* 42495b482a8SLen Brown * 42595b482a8SLen Brown * FUNCTION: acpi_rs_dump_address_common 42695b482a8SLen Brown * 427ba494beeSBob Moore * PARAMETERS: resource - Pointer to an internal resource descriptor 42895b482a8SLen Brown * 42995b482a8SLen Brown * RETURN: None 43095b482a8SLen Brown * 43195b482a8SLen Brown * DESCRIPTION: Dump the fields that are common to all Address resource 43295b482a8SLen Brown * descriptors 43395b482a8SLen Brown * 43495b482a8SLen Brown ******************************************************************************/ 43595b482a8SLen Brown 43695b482a8SLen Brown static void acpi_rs_dump_address_common(union acpi_resource_data *resource) 43795b482a8SLen Brown { 43895b482a8SLen Brown ACPI_FUNCTION_ENTRY(); 43995b482a8SLen Brown 44095b482a8SLen Brown /* Decode the type-specific flags */ 44195b482a8SLen Brown 44295b482a8SLen Brown switch (resource->address.resource_type) { 44395b482a8SLen Brown case ACPI_MEMORY_RANGE: 44495b482a8SLen Brown 44595b482a8SLen Brown acpi_rs_dump_descriptor(resource, acpi_rs_dump_memory_flags); 44695b482a8SLen Brown break; 44795b482a8SLen Brown 44895b482a8SLen Brown case ACPI_IO_RANGE: 44995b482a8SLen Brown 45095b482a8SLen Brown acpi_rs_dump_descriptor(resource, acpi_rs_dump_io_flags); 45195b482a8SLen Brown break; 45295b482a8SLen Brown 45395b482a8SLen Brown case ACPI_BUS_NUMBER_RANGE: 45495b482a8SLen Brown 45595b482a8SLen Brown acpi_rs_out_string("Resource Type", "Bus Number Range"); 45695b482a8SLen Brown break; 45795b482a8SLen Brown 45895b482a8SLen Brown default: 45995b482a8SLen Brown 46095b482a8SLen Brown acpi_rs_out_integer8("Resource Type", 46195b482a8SLen Brown (u8) resource->address.resource_type); 46295b482a8SLen Brown break; 46395b482a8SLen Brown } 46495b482a8SLen Brown 46595b482a8SLen Brown /* Decode the general flags */ 46695b482a8SLen Brown 46795b482a8SLen Brown acpi_rs_dump_descriptor(resource, acpi_rs_dump_general_flags); 46895b482a8SLen Brown } 46995b482a8SLen Brown 47095b482a8SLen Brown /******************************************************************************* 47195b482a8SLen Brown * 47295b482a8SLen Brown * FUNCTION: acpi_rs_out* 47395b482a8SLen Brown * 474ba494beeSBob Moore * PARAMETERS: title - Name of the resource field 475ba494beeSBob Moore * value - Value of the resource field 47695b482a8SLen Brown * 47795b482a8SLen Brown * RETURN: None 47895b482a8SLen Brown * 47995b482a8SLen Brown * DESCRIPTION: Miscellaneous helper functions to consistently format the 48095b482a8SLen Brown * output of the resource dump routines 48195b482a8SLen Brown * 48295b482a8SLen Brown ******************************************************************************/ 48395b482a8SLen Brown 48495b482a8SLen Brown static void acpi_rs_out_string(char *title, char *value) 48595b482a8SLen Brown { 486*1fad8738SBob Moore 48795b482a8SLen Brown acpi_os_printf("%27s : %s", title, value); 48895b482a8SLen Brown if (!*value) { 48995b482a8SLen Brown acpi_os_printf("[NULL NAMESTRING]"); 49095b482a8SLen Brown } 49195b482a8SLen Brown acpi_os_printf("\n"); 49295b482a8SLen Brown } 49395b482a8SLen Brown 49495b482a8SLen Brown static void acpi_rs_out_integer8(char *title, u8 value) 49595b482a8SLen Brown { 49695b482a8SLen Brown acpi_os_printf("%27s : %2.2X\n", title, value); 49795b482a8SLen Brown } 49895b482a8SLen Brown 49995b482a8SLen Brown static void acpi_rs_out_integer16(char *title, u16 value) 50095b482a8SLen Brown { 501*1fad8738SBob Moore 50295b482a8SLen Brown acpi_os_printf("%27s : %4.4X\n", title, value); 50395b482a8SLen Brown } 50495b482a8SLen Brown 50595b482a8SLen Brown static void acpi_rs_out_integer32(char *title, u32 value) 50695b482a8SLen Brown { 507*1fad8738SBob Moore 50895b482a8SLen Brown acpi_os_printf("%27s : %8.8X\n", title, value); 50995b482a8SLen Brown } 51095b482a8SLen Brown 51195b482a8SLen Brown static void acpi_rs_out_integer64(char *title, u64 value) 51295b482a8SLen Brown { 513*1fad8738SBob Moore 51495b482a8SLen Brown acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value)); 51595b482a8SLen Brown } 51695b482a8SLen Brown 51795b482a8SLen Brown static void acpi_rs_out_title(char *title) 51895b482a8SLen Brown { 519*1fad8738SBob Moore 52095b482a8SLen Brown acpi_os_printf("%27s : ", title); 52195b482a8SLen Brown } 52295b482a8SLen Brown 52395b482a8SLen Brown /******************************************************************************* 52495b482a8SLen Brown * 52595b482a8SLen Brown * FUNCTION: acpi_rs_dump*List 52695b482a8SLen Brown * 527ba494beeSBob Moore * PARAMETERS: length - Number of elements in the list 528ba494beeSBob Moore * data - Start of the list 52995b482a8SLen Brown * 53095b482a8SLen Brown * RETURN: None 53195b482a8SLen Brown * 53295b482a8SLen Brown * DESCRIPTION: Miscellaneous functions to dump lists of raw data 53395b482a8SLen Brown * 53495b482a8SLen Brown ******************************************************************************/ 53595b482a8SLen Brown 53695b482a8SLen Brown static void acpi_rs_dump_byte_list(u16 length, u8 * data) 53795b482a8SLen Brown { 53895b482a8SLen Brown u8 i; 53995b482a8SLen Brown 54095b482a8SLen Brown for (i = 0; i < length; i++) { 54195b482a8SLen Brown acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]); 54295b482a8SLen Brown } 54395b482a8SLen Brown } 54495b482a8SLen Brown 54595b482a8SLen Brown static void acpi_rs_dump_short_byte_list(u8 length, u8 * data) 54695b482a8SLen Brown { 54795b482a8SLen Brown u8 i; 54895b482a8SLen Brown 54995b482a8SLen Brown for (i = 0; i < length; i++) { 55095b482a8SLen Brown acpi_os_printf("%X ", data[i]); 55195b482a8SLen Brown } 552*1fad8738SBob Moore 55395b482a8SLen Brown acpi_os_printf("\n"); 55495b482a8SLen Brown } 55595b482a8SLen Brown 55695b482a8SLen Brown static void acpi_rs_dump_dword_list(u8 length, u32 * data) 55795b482a8SLen Brown { 55895b482a8SLen Brown u8 i; 55995b482a8SLen Brown 56095b482a8SLen Brown for (i = 0; i < length; i++) { 56195b482a8SLen Brown acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]); 56295b482a8SLen Brown } 56395b482a8SLen Brown } 56495b482a8SLen Brown 565e0fe0a8dSLin Ming static void acpi_rs_dump_word_list(u16 length, u16 *data) 566e0fe0a8dSLin Ming { 567e0fe0a8dSLin Ming u16 i; 568e0fe0a8dSLin Ming 569e0fe0a8dSLin Ming for (i = 0; i < length; i++) { 570e0fe0a8dSLin Ming acpi_os_printf("%25s%2.2X : %4.4X\n", "Word", i, data[i]); 571e0fe0a8dSLin Ming } 572e0fe0a8dSLin Ming } 573