195b482a8SLen Brown /******************************************************************************* 295b482a8SLen Brown * 339239fedSBob Moore * Module Name: rsdump - AML debugger support for resource structures. 495b482a8SLen Brown * 595b482a8SLen Brown ******************************************************************************/ 695b482a8SLen Brown 795b482a8SLen Brown /* 87735ca0eSBob Moore * Copyright (C) 2000 - 2017, 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 */ 550dfaaa3dSBob Moore static void acpi_rs_out_string(const char *title, const char *value); 5695b482a8SLen Brown 570dfaaa3dSBob Moore static void acpi_rs_out_integer8(const char *title, u8 value); 5895b482a8SLen Brown 590dfaaa3dSBob Moore static void acpi_rs_out_integer16(const char *title, u16 value); 6095b482a8SLen Brown 610dfaaa3dSBob Moore static void acpi_rs_out_integer32(const char *title, u32 value); 6295b482a8SLen Brown 630dfaaa3dSBob Moore static void acpi_rs_out_integer64(const char *title, u64 value); 6495b482a8SLen Brown 650dfaaa3dSBob Moore static void acpi_rs_out_title(const 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 78*fdaa0980SMika Westerberg static void 79*fdaa0980SMika Westerberg acpi_rs_dump_resource_label(char *title, 80*fdaa0980SMika Westerberg struct acpi_resource_label *resource_label); 81*fdaa0980SMika Westerberg 8295b482a8SLen Brown static void acpi_rs_dump_address_common(union acpi_resource_data *resource); 8395b482a8SLen Brown 8495b482a8SLen Brown static void 8595b482a8SLen Brown acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table); 8695b482a8SLen Brown 8795b482a8SLen Brown /******************************************************************************* 8895b482a8SLen Brown * 8939239fedSBob Moore * FUNCTION: acpi_rs_dump_resource_list 9039239fedSBob Moore * 9139239fedSBob Moore * PARAMETERS: resource_list - Pointer to a resource descriptor list 9239239fedSBob Moore * 9339239fedSBob Moore * RETURN: None 9439239fedSBob Moore * 9539239fedSBob Moore * DESCRIPTION: Dispatches the structure to the correct dump routine. 9639239fedSBob Moore * 9739239fedSBob Moore ******************************************************************************/ 9839239fedSBob Moore 9939239fedSBob Moore void acpi_rs_dump_resource_list(struct acpi_resource *resource_list) 10039239fedSBob Moore { 10139239fedSBob Moore u32 count = 0; 10239239fedSBob Moore u32 type; 10339239fedSBob Moore 10439239fedSBob Moore ACPI_FUNCTION_ENTRY(); 10539239fedSBob Moore 10639239fedSBob Moore /* Check if debug output enabled */ 10739239fedSBob Moore 10839239fedSBob Moore if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_RESOURCES, _COMPONENT)) { 10939239fedSBob Moore return; 11039239fedSBob Moore } 11139239fedSBob Moore 11239239fedSBob Moore /* Walk list and dump all resource descriptors (END_TAG terminates) */ 11339239fedSBob Moore 11439239fedSBob Moore do { 11539239fedSBob Moore acpi_os_printf("\n[%02X] ", count); 11639239fedSBob Moore count++; 11739239fedSBob Moore 11839239fedSBob Moore /* Validate Type before dispatch */ 11939239fedSBob Moore 12039239fedSBob Moore type = resource_list->type; 12139239fedSBob Moore if (type > ACPI_RESOURCE_TYPE_MAX) { 12239239fedSBob Moore acpi_os_printf 12339239fedSBob Moore ("Invalid descriptor type (%X) in resource list\n", 12439239fedSBob Moore resource_list->type); 12539239fedSBob Moore return; 12639239fedSBob Moore } 12739239fedSBob Moore 12839239fedSBob Moore /* Sanity check the length. It must not be zero, or we loop forever */ 12939239fedSBob Moore 13039239fedSBob Moore if (!resource_list->length) { 13139239fedSBob Moore acpi_os_printf 13239239fedSBob Moore ("Invalid zero length descriptor in resource list\n"); 13339239fedSBob Moore return; 13439239fedSBob Moore } 13539239fedSBob Moore 13639239fedSBob Moore /* Dump the resource descriptor */ 13739239fedSBob Moore 13839239fedSBob Moore if (type == ACPI_RESOURCE_TYPE_SERIAL_BUS) { 13939239fedSBob Moore acpi_rs_dump_descriptor(&resource_list->data, 14039239fedSBob Moore acpi_gbl_dump_serial_bus_dispatch 14139239fedSBob Moore [resource_list->data. 14239239fedSBob Moore common_serial_bus.type]); 14339239fedSBob Moore } else { 14439239fedSBob Moore acpi_rs_dump_descriptor(&resource_list->data, 14539239fedSBob Moore acpi_gbl_dump_resource_dispatch 14639239fedSBob Moore [type]); 14739239fedSBob Moore } 14839239fedSBob Moore 14939239fedSBob Moore /* Point to the next resource structure */ 15039239fedSBob Moore 15139239fedSBob Moore resource_list = ACPI_NEXT_RESOURCE(resource_list); 15239239fedSBob Moore 15339239fedSBob Moore /* Exit when END_TAG descriptor is reached */ 15439239fedSBob Moore 15539239fedSBob Moore } while (type != ACPI_RESOURCE_TYPE_END_TAG); 15639239fedSBob Moore } 15739239fedSBob Moore 15839239fedSBob Moore /******************************************************************************* 15939239fedSBob Moore * 16039239fedSBob Moore * FUNCTION: acpi_rs_dump_irq_list 16139239fedSBob Moore * 16239239fedSBob Moore * PARAMETERS: route_table - Pointer to the routing table to dump. 16339239fedSBob Moore * 16439239fedSBob Moore * RETURN: None 16539239fedSBob Moore * 16639239fedSBob Moore * DESCRIPTION: Print IRQ routing table 16739239fedSBob Moore * 16839239fedSBob Moore ******************************************************************************/ 16939239fedSBob Moore 17039239fedSBob Moore void acpi_rs_dump_irq_list(u8 *route_table) 17139239fedSBob Moore { 17239239fedSBob Moore struct acpi_pci_routing_table *prt_element; 17339239fedSBob Moore u8 count; 17439239fedSBob Moore 17539239fedSBob Moore ACPI_FUNCTION_ENTRY(); 17639239fedSBob Moore 17739239fedSBob Moore /* Check if debug output enabled */ 17839239fedSBob Moore 17939239fedSBob Moore if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_RESOURCES, _COMPONENT)) { 18039239fedSBob Moore return; 18139239fedSBob Moore } 18239239fedSBob Moore 18339239fedSBob Moore prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, route_table); 18439239fedSBob Moore 18539239fedSBob Moore /* Dump all table elements, Exit on zero length element */ 18639239fedSBob Moore 18739239fedSBob Moore for (count = 0; prt_element->length; count++) { 18839239fedSBob Moore acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n", 18939239fedSBob Moore count); 19039239fedSBob Moore acpi_rs_dump_descriptor(prt_element, acpi_rs_dump_prt); 19139239fedSBob Moore 19239239fedSBob Moore prt_element = ACPI_ADD_PTR(struct acpi_pci_routing_table, 19339239fedSBob Moore prt_element, prt_element->length); 19439239fedSBob Moore } 19539239fedSBob Moore } 19639239fedSBob Moore 19739239fedSBob Moore /******************************************************************************* 19839239fedSBob Moore * 19995b482a8SLen Brown * FUNCTION: acpi_rs_dump_descriptor 20095b482a8SLen Brown * 20142f8fb75SBob Moore * PARAMETERS: resource - Buffer containing the resource 20242f8fb75SBob Moore * table - Table entry to decode the resource 20395b482a8SLen Brown * 20495b482a8SLen Brown * RETURN: None 20595b482a8SLen Brown * 20642f8fb75SBob Moore * DESCRIPTION: Dump a resource descriptor based on a dump table entry. 20795b482a8SLen Brown * 20895b482a8SLen Brown ******************************************************************************/ 20995b482a8SLen Brown 21095b482a8SLen Brown static void 21195b482a8SLen Brown acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table) 21295b482a8SLen Brown { 21395b482a8SLen Brown u8 *target = NULL; 21495b482a8SLen Brown u8 *previous_target; 2150dfaaa3dSBob Moore const char *name; 21695b482a8SLen Brown u8 count; 21795b482a8SLen Brown 21895b482a8SLen Brown /* First table entry must contain the table length (# of table entries) */ 21995b482a8SLen Brown 22095b482a8SLen Brown count = table->offset; 22195b482a8SLen Brown 22295b482a8SLen Brown while (count) { 22395b482a8SLen Brown previous_target = target; 22495b482a8SLen Brown target = ACPI_ADD_PTR(u8, resource, table->offset); 22595b482a8SLen Brown name = table->name; 22695b482a8SLen Brown 22795b482a8SLen Brown switch (table->opcode) { 22895b482a8SLen Brown case ACPI_RSD_TITLE: 22995b482a8SLen Brown /* 23095b482a8SLen Brown * Optional resource title 23195b482a8SLen Brown */ 23295b482a8SLen Brown if (table->name) { 23395b482a8SLen Brown acpi_os_printf("%s Resource\n", name); 23495b482a8SLen Brown } 23595b482a8SLen Brown break; 23695b482a8SLen Brown 23795b482a8SLen Brown /* Strings */ 23895b482a8SLen Brown 23995b482a8SLen Brown case ACPI_RSD_LITERAL: 2401d1ea1b7SChao Guan 24195b482a8SLen Brown acpi_rs_out_string(name, 24295b482a8SLen Brown ACPI_CAST_PTR(char, table->pointer)); 24395b482a8SLen Brown break; 24495b482a8SLen Brown 24595b482a8SLen Brown case ACPI_RSD_STRING: 2461d1ea1b7SChao Guan 24795b482a8SLen Brown acpi_rs_out_string(name, ACPI_CAST_PTR(char, target)); 24895b482a8SLen Brown break; 24995b482a8SLen Brown 25095b482a8SLen Brown /* Data items, 8/16/32/64 bit */ 25195b482a8SLen Brown 25295b482a8SLen Brown case ACPI_RSD_UINT8: 2531d1ea1b7SChao Guan 254e0fe0a8dSLin Ming if (table->pointer) { 2550dfaaa3dSBob Moore acpi_rs_out_string(name, 2560dfaaa3dSBob Moore table->pointer[*target]); 257e0fe0a8dSLin Ming } else { 25895b482a8SLen Brown acpi_rs_out_integer8(name, ACPI_GET8(target)); 259e0fe0a8dSLin Ming } 26095b482a8SLen Brown break; 26195b482a8SLen Brown 26295b482a8SLen Brown case ACPI_RSD_UINT16: 2631d1ea1b7SChao Guan 26495b482a8SLen Brown acpi_rs_out_integer16(name, ACPI_GET16(target)); 26595b482a8SLen Brown break; 26695b482a8SLen Brown 26795b482a8SLen Brown case ACPI_RSD_UINT32: 2681d1ea1b7SChao Guan 26995b482a8SLen Brown acpi_rs_out_integer32(name, ACPI_GET32(target)); 27095b482a8SLen Brown break; 27195b482a8SLen Brown 27295b482a8SLen Brown case ACPI_RSD_UINT64: 2731d1ea1b7SChao Guan 27495b482a8SLen Brown acpi_rs_out_integer64(name, ACPI_GET64(target)); 27595b482a8SLen Brown break; 27695b482a8SLen Brown 27795b482a8SLen Brown /* Flags: 1-bit and 2-bit flags supported */ 27895b482a8SLen Brown 27995b482a8SLen Brown case ACPI_RSD_1BITFLAG: 2801d1ea1b7SChao Guan 2810dfaaa3dSBob Moore acpi_rs_out_string(name, 2820dfaaa3dSBob Moore table->pointer[*target & 0x01]); 28395b482a8SLen Brown break; 28495b482a8SLen Brown 28595b482a8SLen Brown case ACPI_RSD_2BITFLAG: 2861d1ea1b7SChao Guan 2870dfaaa3dSBob Moore acpi_rs_out_string(name, 2880dfaaa3dSBob Moore table->pointer[*target & 0x03]); 28995b482a8SLen Brown break; 29095b482a8SLen Brown 291e0fe0a8dSLin Ming case ACPI_RSD_3BITFLAG: 2921d1ea1b7SChao Guan 2930dfaaa3dSBob Moore acpi_rs_out_string(name, 2940dfaaa3dSBob Moore table->pointer[*target & 0x07]); 295e0fe0a8dSLin Ming break; 296e0fe0a8dSLin Ming 29795b482a8SLen Brown case ACPI_RSD_SHORTLIST: 29895b482a8SLen Brown /* 29995b482a8SLen Brown * Short byte list (single line output) for DMA and IRQ resources 30095b482a8SLen Brown * Note: The list length is obtained from the previous table entry 30195b482a8SLen Brown */ 30295b482a8SLen Brown if (previous_target) { 30395b482a8SLen Brown acpi_rs_out_title(name); 30495b482a8SLen Brown acpi_rs_dump_short_byte_list(*previous_target, 30595b482a8SLen Brown target); 30695b482a8SLen Brown } 30795b482a8SLen Brown break; 30895b482a8SLen Brown 309e0fe0a8dSLin Ming case ACPI_RSD_SHORTLISTX: 310e0fe0a8dSLin Ming /* 311e0fe0a8dSLin Ming * Short byte list (single line output) for GPIO vendor data 312e0fe0a8dSLin Ming * Note: The list length is obtained from the previous table entry 313e0fe0a8dSLin Ming */ 314e0fe0a8dSLin Ming if (previous_target) { 315e0fe0a8dSLin Ming acpi_rs_out_title(name); 316e0fe0a8dSLin Ming acpi_rs_dump_short_byte_list(*previous_target, 317e0fe0a8dSLin Ming * 318e0fe0a8dSLin Ming (ACPI_CAST_INDIRECT_PTR 319e0fe0a8dSLin Ming (u8, target))); 320e0fe0a8dSLin Ming } 321e0fe0a8dSLin Ming break; 322e0fe0a8dSLin Ming 32395b482a8SLen Brown case ACPI_RSD_LONGLIST: 32495b482a8SLen Brown /* 32595b482a8SLen Brown * Long byte list for Vendor resource data 32695b482a8SLen Brown * Note: The list length is obtained from the previous table entry 32795b482a8SLen Brown */ 32895b482a8SLen Brown if (previous_target) { 32995b482a8SLen Brown acpi_rs_dump_byte_list(ACPI_GET16 33095b482a8SLen Brown (previous_target), 33195b482a8SLen Brown target); 33295b482a8SLen Brown } 33395b482a8SLen Brown break; 33495b482a8SLen Brown 33595b482a8SLen Brown case ACPI_RSD_DWORDLIST: 33695b482a8SLen Brown /* 33795b482a8SLen Brown * Dword list for Extended Interrupt resources 33895b482a8SLen Brown * Note: The list length is obtained from the previous table entry 33995b482a8SLen Brown */ 34095b482a8SLen Brown if (previous_target) { 34195b482a8SLen Brown acpi_rs_dump_dword_list(*previous_target, 34295b482a8SLen Brown ACPI_CAST_PTR(u32, 34395b482a8SLen Brown target)); 34495b482a8SLen Brown } 34595b482a8SLen Brown break; 34695b482a8SLen Brown 347e0fe0a8dSLin Ming case ACPI_RSD_WORDLIST: 348e0fe0a8dSLin Ming /* 349e0fe0a8dSLin Ming * Word list for GPIO Pin Table 350e0fe0a8dSLin Ming * Note: The list length is obtained from the previous table entry 351e0fe0a8dSLin Ming */ 352e0fe0a8dSLin Ming if (previous_target) { 353e0fe0a8dSLin Ming acpi_rs_dump_word_list(*previous_target, 354e0fe0a8dSLin Ming *(ACPI_CAST_INDIRECT_PTR 355e0fe0a8dSLin Ming (u16, target))); 356e0fe0a8dSLin Ming } 357e0fe0a8dSLin Ming break; 358e0fe0a8dSLin Ming 35995b482a8SLen Brown case ACPI_RSD_ADDRESS: 36095b482a8SLen Brown /* 36195b482a8SLen Brown * Common flags for all Address resources 36295b482a8SLen Brown */ 36395b482a8SLen Brown acpi_rs_dump_address_common(ACPI_CAST_PTR 36495b482a8SLen Brown (union acpi_resource_data, 36595b482a8SLen Brown target)); 36695b482a8SLen Brown break; 36795b482a8SLen Brown 36895b482a8SLen Brown case ACPI_RSD_SOURCE: 36995b482a8SLen Brown /* 37095b482a8SLen Brown * Optional resource_source for Address resources 37195b482a8SLen Brown */ 3723e8214e5SLv Zheng acpi_rs_dump_resource_source(ACPI_CAST_PTR 3733e8214e5SLv Zheng (struct 37495b482a8SLen Brown acpi_resource_source, 37595b482a8SLen Brown target)); 37695b482a8SLen Brown break; 37795b482a8SLen Brown 378*fdaa0980SMika Westerberg case ACPI_RSD_LABEL: 379*fdaa0980SMika Westerberg /* 380*fdaa0980SMika Westerberg * resource_label 381*fdaa0980SMika Westerberg */ 382*fdaa0980SMika Westerberg acpi_rs_dump_resource_label("Resource Label", 383*fdaa0980SMika Westerberg ACPI_CAST_PTR(struct 384*fdaa0980SMika Westerberg acpi_resource_label, 385*fdaa0980SMika Westerberg target)); 386*fdaa0980SMika Westerberg break; 387*fdaa0980SMika Westerberg 38895b482a8SLen Brown default: 3891d1ea1b7SChao Guan 39095b482a8SLen Brown acpi_os_printf("**** Invalid table opcode [%X] ****\n", 39195b482a8SLen Brown table->opcode); 39295b482a8SLen Brown return; 39395b482a8SLen Brown } 39495b482a8SLen Brown 39595b482a8SLen Brown table++; 39695b482a8SLen Brown count--; 39795b482a8SLen Brown } 39895b482a8SLen Brown } 39995b482a8SLen Brown 40095b482a8SLen Brown /******************************************************************************* 40195b482a8SLen Brown * 40295b482a8SLen Brown * FUNCTION: acpi_rs_dump_resource_source 40395b482a8SLen Brown * 40495b482a8SLen Brown * PARAMETERS: resource_source - Pointer to a Resource Source struct 40595b482a8SLen Brown * 40695b482a8SLen Brown * RETURN: None 40795b482a8SLen Brown * 40895b482a8SLen Brown * DESCRIPTION: Common routine for dumping the optional resource_source and the 40995b482a8SLen Brown * corresponding resource_source_index. 41095b482a8SLen Brown * 41195b482a8SLen Brown ******************************************************************************/ 41295b482a8SLen Brown 41395b482a8SLen Brown static void 41495b482a8SLen Brown acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source) 41595b482a8SLen Brown { 41695b482a8SLen Brown ACPI_FUNCTION_ENTRY(); 41795b482a8SLen Brown 41895b482a8SLen Brown if (resource_source->index == 0xFF) { 41995b482a8SLen Brown return; 42095b482a8SLen Brown } 42195b482a8SLen Brown 42295b482a8SLen Brown acpi_rs_out_integer8("Resource Source Index", resource_source->index); 42395b482a8SLen Brown 42495b482a8SLen Brown acpi_rs_out_string("Resource Source", 42595b482a8SLen Brown resource_source->string_ptr ? 42695b482a8SLen Brown resource_source->string_ptr : "[Not Specified]"); 42795b482a8SLen Brown } 42895b482a8SLen Brown 42995b482a8SLen Brown /******************************************************************************* 43095b482a8SLen Brown * 431*fdaa0980SMika Westerberg * FUNCTION: acpi_rs_dump_resource_label 432*fdaa0980SMika Westerberg * 433*fdaa0980SMika Westerberg * PARAMETERS: title - Title of the dumped resource field 434*fdaa0980SMika Westerberg * resource_label - Pointer to a Resource Label struct 435*fdaa0980SMika Westerberg * 436*fdaa0980SMika Westerberg * RETURN: None 437*fdaa0980SMika Westerberg * 438*fdaa0980SMika Westerberg * DESCRIPTION: Common routine for dumping the resource_label 439*fdaa0980SMika Westerberg * 440*fdaa0980SMika Westerberg ******************************************************************************/ 441*fdaa0980SMika Westerberg 442*fdaa0980SMika Westerberg static void 443*fdaa0980SMika Westerberg acpi_rs_dump_resource_label(char *title, 444*fdaa0980SMika Westerberg struct acpi_resource_label *resource_label) 445*fdaa0980SMika Westerberg { 446*fdaa0980SMika Westerberg ACPI_FUNCTION_ENTRY(); 447*fdaa0980SMika Westerberg 448*fdaa0980SMika Westerberg acpi_rs_out_string(title, 449*fdaa0980SMika Westerberg resource_label->string_ptr ? 450*fdaa0980SMika Westerberg resource_label->string_ptr : "[Not Specified]"); 451*fdaa0980SMika Westerberg } 452*fdaa0980SMika Westerberg 453*fdaa0980SMika Westerberg /******************************************************************************* 454*fdaa0980SMika Westerberg * 45595b482a8SLen Brown * FUNCTION: acpi_rs_dump_address_common 45695b482a8SLen Brown * 457ba494beeSBob Moore * PARAMETERS: resource - Pointer to an internal resource descriptor 45895b482a8SLen Brown * 45995b482a8SLen Brown * RETURN: None 46095b482a8SLen Brown * 46195b482a8SLen Brown * DESCRIPTION: Dump the fields that are common to all Address resource 46295b482a8SLen Brown * descriptors 46395b482a8SLen Brown * 46495b482a8SLen Brown ******************************************************************************/ 46595b482a8SLen Brown 46695b482a8SLen Brown static void acpi_rs_dump_address_common(union acpi_resource_data *resource) 46795b482a8SLen Brown { 46895b482a8SLen Brown ACPI_FUNCTION_ENTRY(); 46995b482a8SLen Brown 47095b482a8SLen Brown /* Decode the type-specific flags */ 47195b482a8SLen Brown 47295b482a8SLen Brown switch (resource->address.resource_type) { 47395b482a8SLen Brown case ACPI_MEMORY_RANGE: 47495b482a8SLen Brown 47595b482a8SLen Brown acpi_rs_dump_descriptor(resource, acpi_rs_dump_memory_flags); 47695b482a8SLen Brown break; 47795b482a8SLen Brown 47895b482a8SLen Brown case ACPI_IO_RANGE: 47995b482a8SLen Brown 48095b482a8SLen Brown acpi_rs_dump_descriptor(resource, acpi_rs_dump_io_flags); 48195b482a8SLen Brown break; 48295b482a8SLen Brown 48395b482a8SLen Brown case ACPI_BUS_NUMBER_RANGE: 48495b482a8SLen Brown 48595b482a8SLen Brown acpi_rs_out_string("Resource Type", "Bus Number Range"); 48695b482a8SLen Brown break; 48795b482a8SLen Brown 48895b482a8SLen Brown default: 48995b482a8SLen Brown 49095b482a8SLen Brown acpi_rs_out_integer8("Resource Type", 49195b482a8SLen Brown (u8) resource->address.resource_type); 49295b482a8SLen Brown break; 49395b482a8SLen Brown } 49495b482a8SLen Brown 49595b482a8SLen Brown /* Decode the general flags */ 49695b482a8SLen Brown 49795b482a8SLen Brown acpi_rs_dump_descriptor(resource, acpi_rs_dump_general_flags); 49895b482a8SLen Brown } 49995b482a8SLen Brown 50095b482a8SLen Brown /******************************************************************************* 50195b482a8SLen Brown * 50295b482a8SLen Brown * FUNCTION: acpi_rs_out* 50395b482a8SLen Brown * 504ba494beeSBob Moore * PARAMETERS: title - Name of the resource field 505ba494beeSBob Moore * value - Value of the resource field 50695b482a8SLen Brown * 50795b482a8SLen Brown * RETURN: None 50895b482a8SLen Brown * 50995b482a8SLen Brown * DESCRIPTION: Miscellaneous helper functions to consistently format the 51095b482a8SLen Brown * output of the resource dump routines 51195b482a8SLen Brown * 51295b482a8SLen Brown ******************************************************************************/ 51395b482a8SLen Brown 5140dfaaa3dSBob Moore static void acpi_rs_out_string(const char *title, const char *value) 51595b482a8SLen Brown { 5161fad8738SBob Moore 51795b482a8SLen Brown acpi_os_printf("%27s : %s", title, value); 51895b482a8SLen Brown if (!*value) { 51995b482a8SLen Brown acpi_os_printf("[NULL NAMESTRING]"); 52095b482a8SLen Brown } 52195b482a8SLen Brown acpi_os_printf("\n"); 52295b482a8SLen Brown } 52395b482a8SLen Brown 5240dfaaa3dSBob Moore static void acpi_rs_out_integer8(const char *title, u8 value) 52595b482a8SLen Brown { 52695b482a8SLen Brown acpi_os_printf("%27s : %2.2X\n", title, value); 52795b482a8SLen Brown } 52895b482a8SLen Brown 5290dfaaa3dSBob Moore static void acpi_rs_out_integer16(const char *title, u16 value) 53095b482a8SLen Brown { 5311fad8738SBob Moore 53295b482a8SLen Brown acpi_os_printf("%27s : %4.4X\n", title, value); 53395b482a8SLen Brown } 53495b482a8SLen Brown 5350dfaaa3dSBob Moore static void acpi_rs_out_integer32(const char *title, u32 value) 53695b482a8SLen Brown { 5371fad8738SBob Moore 53895b482a8SLen Brown acpi_os_printf("%27s : %8.8X\n", title, value); 53995b482a8SLen Brown } 54095b482a8SLen Brown 5410dfaaa3dSBob Moore static void acpi_rs_out_integer64(const char *title, u64 value) 54295b482a8SLen Brown { 5431fad8738SBob Moore 54495b482a8SLen Brown acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value)); 54595b482a8SLen Brown } 54695b482a8SLen Brown 5470dfaaa3dSBob Moore static void acpi_rs_out_title(const char *title) 54895b482a8SLen Brown { 5491fad8738SBob Moore 55095b482a8SLen Brown acpi_os_printf("%27s : ", title); 55195b482a8SLen Brown } 55295b482a8SLen Brown 55395b482a8SLen Brown /******************************************************************************* 55495b482a8SLen Brown * 55595b482a8SLen Brown * FUNCTION: acpi_rs_dump*List 55695b482a8SLen Brown * 557ba494beeSBob Moore * PARAMETERS: length - Number of elements in the list 558ba494beeSBob Moore * data - Start of the list 55995b482a8SLen Brown * 56095b482a8SLen Brown * RETURN: None 56195b482a8SLen Brown * 56295b482a8SLen Brown * DESCRIPTION: Miscellaneous functions to dump lists of raw data 56395b482a8SLen Brown * 56495b482a8SLen Brown ******************************************************************************/ 56595b482a8SLen Brown 56695b482a8SLen Brown static void acpi_rs_dump_byte_list(u16 length, u8 * data) 56795b482a8SLen Brown { 56895b482a8SLen Brown u8 i; 56995b482a8SLen Brown 57095b482a8SLen Brown for (i = 0; i < length; i++) { 57195b482a8SLen Brown acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]); 57295b482a8SLen Brown } 57395b482a8SLen Brown } 57495b482a8SLen Brown 57595b482a8SLen Brown static void acpi_rs_dump_short_byte_list(u8 length, u8 * data) 57695b482a8SLen Brown { 57795b482a8SLen Brown u8 i; 57895b482a8SLen Brown 57995b482a8SLen Brown for (i = 0; i < length; i++) { 58095b482a8SLen Brown acpi_os_printf("%X ", data[i]); 58195b482a8SLen Brown } 5821fad8738SBob Moore 58395b482a8SLen Brown acpi_os_printf("\n"); 58495b482a8SLen Brown } 58595b482a8SLen Brown 58695b482a8SLen Brown static void acpi_rs_dump_dword_list(u8 length, u32 * data) 58795b482a8SLen Brown { 58895b482a8SLen Brown u8 i; 58995b482a8SLen Brown 59095b482a8SLen Brown for (i = 0; i < length; i++) { 59195b482a8SLen Brown acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]); 59295b482a8SLen Brown } 59395b482a8SLen Brown } 59495b482a8SLen Brown 595e0fe0a8dSLin Ming static void acpi_rs_dump_word_list(u16 length, u16 *data) 596e0fe0a8dSLin Ming { 597e0fe0a8dSLin Ming u16 i; 598e0fe0a8dSLin Ming 599e0fe0a8dSLin Ming for (i = 0; i < length; i++) { 600e0fe0a8dSLin Ming acpi_os_printf("%25s%2.2X : %4.4X\n", "Word", i, data[i]); 601e0fe0a8dSLin Ming } 602e0fe0a8dSLin Ming } 603