diff options
Diffstat (limited to 'drivers/acpi/resources/rsdump.c')
| -rw-r--r-- | drivers/acpi/resources/rsdump.c | 1399 | 
1 files changed, 528 insertions, 871 deletions
| diff --git a/drivers/acpi/resources/rsdump.c b/drivers/acpi/resources/rsdump.c index 75bd34d1783..e7de061cf88 100644 --- a/drivers/acpi/resources/rsdump.c +++ b/drivers/acpi/resources/rsdump.c @@ -5,7 +5,7 @@   ******************************************************************************/  /* - * Copyright (C) 2000 - 2005, R. Byron Moore + * Copyright (C) 2000 - 2006, R. Byron Moore   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -49,1063 +49,720 @@ ACPI_MODULE_NAME("rsdump")  #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)  /* Local prototypes */ -static void acpi_rs_dump_irq(union acpi_resource_data *data); +static void acpi_rs_out_string(char *title, char *value); -static void acpi_rs_dump_address16(union acpi_resource_data *data); +static void acpi_rs_out_integer8(char *title, u8 value); -static void acpi_rs_dump_address32(union acpi_resource_data *data); +static void acpi_rs_out_integer16(char *title, u16 value); -static void acpi_rs_dump_address64(union acpi_resource_data *data); +static void acpi_rs_out_integer32(char *title, u32 value); -static void acpi_rs_dump_dma(union acpi_resource_data *data); +static void acpi_rs_out_integer64(char *title, u64 value); -static void acpi_rs_dump_io(union acpi_resource_data *data); +static void acpi_rs_out_title(char *title); -static void acpi_rs_dump_extended_irq(union acpi_resource_data *data); +static void acpi_rs_dump_byte_list(u16 length, u8 * data); -static void acpi_rs_dump_fixed_io(union acpi_resource_data *data); +static void acpi_rs_dump_dword_list(u8 length, u32 * data); -static void acpi_rs_dump_fixed_memory32(union acpi_resource_data *data); +static void acpi_rs_dump_short_byte_list(u8 length, u8 * data); -static void acpi_rs_dump_memory24(union acpi_resource_data *data); +static void +acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source); -static void acpi_rs_dump_memory32(union acpi_resource_data *data); +static void acpi_rs_dump_address_common(union acpi_resource_data *resource); -static void acpi_rs_dump_start_depend_fns(union acpi_resource_data *data); +static void +acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table); -static void acpi_rs_dump_vendor_specific(union acpi_resource_data *data); +#define ACPI_RSD_OFFSET(f)          (u8) ACPI_OFFSET (union acpi_resource_data,f) +#define ACPI_PRT_OFFSET(f)          (u8) ACPI_OFFSET (struct acpi_pci_routing_table,f) +#define ACPI_RSD_TABLE_SIZE(name)   (sizeof(name) / sizeof (struct acpi_rsdump_info))  /*******************************************************************************   * - * FUNCTION:    acpi_rs_dump_irq + * Resource Descriptor info tables   * - * PARAMETERS:  Data            - pointer to the resource structure to dump. - * - * RETURN:      None - * - * DESCRIPTION: Prints out the various members of the Data structure type. + * Note: The first table entry must be a Title or Literal and must contain + * the table length (number of table entries)   *   ******************************************************************************/ -static void acpi_rs_dump_irq(union acpi_resource_data *data) -{ -	struct acpi_resource_irq *irq_data = (struct acpi_resource_irq *)data; -	u8 index = 0; - -	ACPI_FUNCTION_ENTRY(); - -	acpi_os_printf("IRQ Resource\n"); +struct acpi_rsdump_info acpi_rs_dump_irq[6] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_irq), "IRQ", NULL}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.triggering), "Triggering", +	 acpi_gbl_HEdecode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.polarity), "Polarity", +	 acpi_gbl_LLdecode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.sharable), "Sharing", +	 acpi_gbl_SHRdecode}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.interrupt_count), +	 "Interrupt Count", NULL}, +	{ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(irq.interrupts[0]), +	 "Interrupt List", NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_dma[6] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_dma), "DMA", NULL}, +	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.type), "Speed", +	 acpi_gbl_TYPdecode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(dma.bus_master), "Mastering", +	 acpi_gbl_BMdecode}, +	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.transfer), "Transfer Type", +	 acpi_gbl_SIZdecode}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(dma.channel_count), "Channel Count", +	 NULL}, +	{ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(dma.channels[0]), "Channel List", +	 NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_start_dpf[3] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_start_dpf), +	 "Start-Dependent-Functions", NULL}, +	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.compatibility_priority), +	 "Compatibility Priority", acpi_gbl_config_decode}, +	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.performance_robustness), +	 "Performance/Robustness", acpi_gbl_config_decode} +}; + +struct acpi_rsdump_info acpi_rs_dump_end_dpf[1] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_dpf), +	 "End-Dependent-Functions", NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_io[6] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io), "I/O", NULL}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(io.io_decode), "Address Decoding", +	 acpi_gbl_io_decode}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.minimum), "Address Minimum", NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.maximum), "Address Maximum", NULL}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.alignment), "Alignment", NULL}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.address_length), "Address Length", +	 NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_fixed_io[3] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_io), +	 "Fixed I/O", NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_io.address), "Address", NULL}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_io.address_length), +	 "Address Length", NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_vendor[3] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_vendor), +	 "Vendor Specific", NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(vendor.byte_length), "Length", NULL}, +	{ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET(vendor.byte_data[0]), "Vendor Data", +	 NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_end_tag[1] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_tag), "end_tag", +	 NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_memory24[6] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory24), +	 "24-Bit Memory Range", NULL}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory24.write_protect), +	 "Write Protect", acpi_gbl_RWdecode}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.minimum), "Address Minimum", +	 NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.maximum), "Address Maximum", +	 NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.alignment), "Alignment", +	 NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.address_length), +	 "Address Length", NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_memory32[6] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory32), +	 "32-Bit Memory Range", NULL}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory32.write_protect), +	 "Write Protect", acpi_gbl_RWdecode}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.minimum), "Address Minimum", +	 NULL}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.maximum), "Address Maximum", +	 NULL}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.alignment), "Alignment", +	 NULL}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.address_length), +	 "Address Length", NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[4] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_memory32), +	 "32-Bit Fixed Memory Range", NULL}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(fixed_memory32.write_protect), +	 "Write Protect", acpi_gbl_RWdecode}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address), "Address", +	 NULL}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address_length), +	 "Address Length", NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_address16[8] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address16), +	 "16-Bit WORD Address Space", NULL}, +	{ACPI_RSD_ADDRESS, 0, NULL, NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.granularity), "Granularity", +	 NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.minimum), "Address Minimum", +	 NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.maximum), "Address Maximum", +	 NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.translation_offset), +	 "Translation Offset", NULL}, +	{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.address_length), +	 "Address Length", NULL}, +	{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address16.resource_source), NULL, NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_address32[8] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address32), +	 "32-Bit DWORD Address Space", NULL}, +	{ACPI_RSD_ADDRESS, 0, NULL, NULL}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.granularity), "Granularity", +	 NULL}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.minimum), "Address Minimum", +	 NULL}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.maximum), "Address Maximum", +	 NULL}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.translation_offset), +	 "Translation Offset", NULL}, +	{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.address_length), +	 "Address Length", NULL}, +	{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address32.resource_source), NULL, NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_address64[8] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address64), +	 "64-Bit QWORD Address Space", NULL}, +	{ACPI_RSD_ADDRESS, 0, NULL, NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.granularity), "Granularity", +	 NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.minimum), "Address Minimum", +	 NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.maximum), "Address Maximum", +	 NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.translation_offset), +	 "Translation Offset", NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.address_length), +	 "Address Length", NULL}, +	{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address64.resource_source), NULL, NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_ext_address64[8] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_address64), +	 "64-Bit Extended Address Space", NULL}, +	{ACPI_RSD_ADDRESS, 0, NULL, NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.granularity), +	 "Granularity", NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.minimum), +	 "Address Minimum", NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.maximum), +	 "Address Maximum", NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.translation_offset), +	 "Translation Offset", NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.address_length), +	 "Address Length", NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.type_specific), +	 "Type-Specific Attribute", NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_ext_irq[8] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_irq), +	 "Extended IRQ", NULL}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.producer_consumer), +	 "Type", acpi_gbl_consume_decode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.triggering), +	 "Triggering", acpi_gbl_HEdecode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.polarity), "Polarity", +	 acpi_gbl_LLdecode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.sharable), "Sharing", +	 acpi_gbl_SHRdecode}, +	{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(extended_irq.resource_source), NULL, +	 NULL}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(extended_irq.interrupt_count), +	 "Interrupt Count", NULL}, +	{ACPI_RSD_DWORDLIST, ACPI_RSD_OFFSET(extended_irq.interrupts[0]), +	 "Interrupt List", NULL} +}; + +struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_generic_reg), +	 "Generic Register", NULL}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.space_id), "Space ID", +	 NULL}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_width), "Bit Width", +	 NULL}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_offset), "Bit Offset", +	 NULL}, +	{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.access_size), +	 "Access Size", NULL}, +	{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL} +}; -	acpi_os_printf("  %s Triggered\n", -		       ACPI_LEVEL_SENSITIVE == -		       irq_data->edge_level ? "Level" : "Edge"); - -	acpi_os_printf("  Active %s\n", -		       ACPI_ACTIVE_LOW == -		       irq_data->active_high_low ? "Low" : "High"); - -	acpi_os_printf("  %s\n", -		       ACPI_SHARED == -		       irq_data->shared_exclusive ? "Shared" : "Exclusive"); - -	acpi_os_printf("  %X Interrupts ( ", irq_data->number_of_interrupts); - -	for (index = 0; index < irq_data->number_of_interrupts; index++) { -		acpi_os_printf("%X ", irq_data->interrupts[index]); -	} +/* + * Tables used for common address descriptor flag fields + */ +static struct acpi_rsdump_info acpi_rs_dump_general_flags[5] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_general_flags), NULL, +	 NULL}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.producer_consumer), +	 "Consumer/Producer", acpi_gbl_consume_decode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.decode), "Address Decode", +	 acpi_gbl_DECdecode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.min_address_fixed), +	 "Min Relocatability", acpi_gbl_min_decode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.max_address_fixed), +	 "Max Relocatability", acpi_gbl_max_decode} +}; + +static struct acpi_rsdump_info acpi_rs_dump_memory_flags[5] = { +	{ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory_flags), +	 "Resource Type", (void *)"Memory Range"}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.write_protect), +	 "Write Protect", acpi_gbl_RWdecode}, +	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.caching), +	 "Caching", acpi_gbl_MEMdecode}, +	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.range_type), +	 "Range Type", acpi_gbl_MTPdecode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.translation), +	 "Translation", acpi_gbl_TTPdecode} +}; + +static struct acpi_rsdump_info acpi_rs_dump_io_flags[4] = { +	{ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io_flags), +	 "Resource Type", (void *)"I/O Range"}, +	{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.io.range_type), +	 "Range Type", acpi_gbl_RNGdecode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation), +	 "Translation", acpi_gbl_TTPdecode}, +	{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation_type), +	 "Translation Type", acpi_gbl_TRSdecode} +}; -	acpi_os_printf(")\n"); -	return; -} +/* + * Table used to dump _PRT contents + */ +static struct acpi_rsdump_info acpi_rs_dump_prt[5] = { +	{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_prt), NULL, NULL}, +	{ACPI_RSD_UINT64, ACPI_PRT_OFFSET(address), "Address", NULL}, +	{ACPI_RSD_UINT32, ACPI_PRT_OFFSET(pin), "Pin", NULL}, +	{ACPI_RSD_STRING, ACPI_PRT_OFFSET(source[0]), "Source", NULL}, +	{ACPI_RSD_UINT32, ACPI_PRT_OFFSET(source_index), "Source Index", NULL} +};  /*******************************************************************************   * - * FUNCTION:    acpi_rs_dump_dma + * FUNCTION:    acpi_rs_dump_descriptor   * - * PARAMETERS:  Data            - pointer to the resource structure to dump. + * PARAMETERS:  Resource   *   * RETURN:      None   * - * DESCRIPTION: Prints out the various members of the Data structure type. + * DESCRIPTION:   *   ******************************************************************************/ -static void acpi_rs_dump_dma(union acpi_resource_data *data) +static void +acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)  { -	struct acpi_resource_dma *dma_data = (struct acpi_resource_dma *)data; -	u8 index = 0; - -	ACPI_FUNCTION_ENTRY(); - -	acpi_os_printf("DMA Resource\n"); - -	switch (dma_data->type) { -	case ACPI_COMPATIBILITY: -		acpi_os_printf("  Compatibility mode\n"); -		break; - -	case ACPI_TYPE_A: -		acpi_os_printf("  Type A\n"); -		break; - -	case ACPI_TYPE_B: -		acpi_os_printf("  Type B\n"); -		break; - -	case ACPI_TYPE_F: -		acpi_os_printf("  Type F\n"); -		break; - -	default: -		acpi_os_printf("  Invalid DMA type\n"); -		break; -	} - -	acpi_os_printf("  %sBus Master\n", -		       ACPI_BUS_MASTER == dma_data->bus_master ? "" : "Not a "); - -	switch (dma_data->transfer) { -	case ACPI_TRANSFER_8: -		acpi_os_printf("  8-bit only transfer\n"); -		break; +	u8 *target = NULL; +	u8 *previous_target; +	char *name; +	u8 count; + +	/* First table entry must contain the table length (# of table entries) */ + +	count = table->offset; + +	while (count) { +		previous_target = target; +		target = ACPI_ADD_PTR(u8, resource, table->offset); +		name = table->name; + +		switch (table->opcode) { +		case ACPI_RSD_TITLE: +			/* +			 * Optional resource title +			 */ +			if (table->name) { +				acpi_os_printf("%s Resource\n", name); +			} +			break; -	case ACPI_TRANSFER_8_16: -		acpi_os_printf("  8 and 16-bit transfer\n"); -		break; +			/* Strings */ -	case ACPI_TRANSFER_16: -		acpi_os_printf("  16 bit only transfer\n"); -		break; +		case ACPI_RSD_LITERAL: +			acpi_rs_out_string(name, +					   ACPI_CAST_PTR(char, table->pointer)); +			break; -	default: -		acpi_os_printf("  Invalid transfer preference\n"); -		break; -	} +		case ACPI_RSD_STRING: +			acpi_rs_out_string(name, ACPI_CAST_PTR(char, target)); +			break; -	acpi_os_printf("  Number of Channels: %X ( ", -		       dma_data->number_of_channels); +			/* Data items, 8/16/32/64 bit */ -	for (index = 0; index < dma_data->number_of_channels; index++) { -		acpi_os_printf("%X ", dma_data->channels[index]); -	} +		case ACPI_RSD_UINT8: +			acpi_rs_out_integer8(name, ACPI_GET8(target)); +			break; -	acpi_os_printf(")\n"); -	return; -} +		case ACPI_RSD_UINT16: +			acpi_rs_out_integer16(name, ACPI_GET16(target)); +			break; -/******************************************************************************* - * - * FUNCTION:    acpi_rs_dump_start_depend_fns - * - * PARAMETERS:  Data            - pointer to the resource structure to dump. - * - * RETURN:      None - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ +		case ACPI_RSD_UINT32: +			acpi_rs_out_integer32(name, ACPI_GET32(target)); +			break; -static void acpi_rs_dump_start_depend_fns(union acpi_resource_data *data) -{ -	struct acpi_resource_start_dpf *sdf_data = -	    (struct acpi_resource_start_dpf *)data; +		case ACPI_RSD_UINT64: +			acpi_rs_out_integer64(name, ACPI_GET64(target)); +			break; -	ACPI_FUNCTION_ENTRY(); +			/* Flags: 1-bit and 2-bit flags supported */ -	acpi_os_printf("Start Dependent Functions Resource\n"); +		case ACPI_RSD_1BITFLAG: +			acpi_rs_out_string(name, ACPI_CAST_PTR(char, +							       table-> +							       pointer[*target & +								       0x01])); +			break; -	switch (sdf_data->compatibility_priority) { -	case ACPI_GOOD_CONFIGURATION: -		acpi_os_printf("  Good configuration\n"); -		break; +		case ACPI_RSD_2BITFLAG: +			acpi_rs_out_string(name, ACPI_CAST_PTR(char, +							       table-> +							       pointer[*target & +								       0x03])); +			break; -	case ACPI_ACCEPTABLE_CONFIGURATION: -		acpi_os_printf("  Acceptable configuration\n"); -		break; +		case ACPI_RSD_SHORTLIST: +			/* +			 * Short byte list (single line output) for DMA and IRQ resources +			 * Note: The list length is obtained from the previous table entry +			 */ +			if (previous_target) { +				acpi_rs_out_title(name); +				acpi_rs_dump_short_byte_list(*previous_target, +							     target); +			} +			break; -	case ACPI_SUB_OPTIMAL_CONFIGURATION: -		acpi_os_printf("  Sub-optimal configuration\n"); -		break; +		case ACPI_RSD_LONGLIST: +			/* +			 * Long byte list for Vendor resource data +			 * Note: The list length is obtained from the previous table entry +			 */ +			if (previous_target) { +				acpi_rs_dump_byte_list(ACPI_GET16 +						       (previous_target), +						       target); +			} +			break; -	default: -		acpi_os_printf("  Invalid compatibility priority\n"); -		break; -	} +		case ACPI_RSD_DWORDLIST: +			/* +			 * Dword list for Extended Interrupt resources +			 * Note: The list length is obtained from the previous table entry +			 */ +			if (previous_target) { +				acpi_rs_dump_dword_list(*previous_target, +							ACPI_CAST_PTR(u32, +								      target)); +			} +			break; -	switch (sdf_data->performance_robustness) { -	case ACPI_GOOD_CONFIGURATION: -		acpi_os_printf("  Good configuration\n"); -		break; +		case ACPI_RSD_ADDRESS: +			/* +			 * Common flags for all Address resources +			 */ +			acpi_rs_dump_address_common(ACPI_CAST_PTR +						    (union acpi_resource_data, +						     target)); +			break; -	case ACPI_ACCEPTABLE_CONFIGURATION: -		acpi_os_printf("  Acceptable configuration\n"); -		break; +		case ACPI_RSD_SOURCE: +			/* +			 * Optional resource_source for Address resources +			 */ +			acpi_rs_dump_resource_source(ACPI_CAST_PTR +						     (struct +						      acpi_resource_source, +						      target)); +			break; -	case ACPI_SUB_OPTIMAL_CONFIGURATION: -		acpi_os_printf("  Sub-optimal configuration\n"); -		break; +		default: +			acpi_os_printf("**** Invalid table opcode [%X] ****\n", +				       table->opcode); +			return; +		} -	default: -		acpi_os_printf("  Invalid performance robustness preference\n"); -		break; +		table++; +		count--;  	} - -	return; -} - -/******************************************************************************* - * - * FUNCTION:    acpi_rs_dump_io - * - * PARAMETERS:  Data            - pointer to the resource structure to dump. - * - * RETURN:      None - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -static void acpi_rs_dump_io(union acpi_resource_data *data) -{ -	struct acpi_resource_io *io_data = (struct acpi_resource_io *)data; - -	ACPI_FUNCTION_ENTRY(); - -	acpi_os_printf("Io Resource\n"); - -	acpi_os_printf("  %d bit decode\n", -		       ACPI_DECODE_16 == io_data->io_decode ? 16 : 10); - -	acpi_os_printf("  Range minimum base: %08X\n", -		       io_data->min_base_address); - -	acpi_os_printf("  Range maximum base: %08X\n", -		       io_data->max_base_address); - -	acpi_os_printf("  Alignment: %08X\n", io_data->alignment); - -	acpi_os_printf("  Range Length: %08X\n", io_data->range_length); - -	return; -} - -/******************************************************************************* - * - * FUNCTION:    acpi_rs_dump_fixed_io - * - * PARAMETERS:  Data            - pointer to the resource structure to dump. - * - * RETURN:      None - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -static void acpi_rs_dump_fixed_io(union acpi_resource_data *data) -{ -	struct acpi_resource_fixed_io *fixed_io_data = -	    (struct acpi_resource_fixed_io *)data; - -	ACPI_FUNCTION_ENTRY(); - -	acpi_os_printf("Fixed Io Resource\n"); -	acpi_os_printf("  Range base address: %08X", -		       fixed_io_data->base_address); - -	acpi_os_printf("  Range length: %08X", fixed_io_data->range_length); - -	return;  }  /*******************************************************************************   * - * FUNCTION:    acpi_rs_dump_vendor_specific + * FUNCTION:    acpi_rs_dump_resource_source   * - * PARAMETERS:  Data            - pointer to the resource structure to dump. + * PARAMETERS:  resource_source     - Pointer to a Resource Source struct   *   * RETURN:      None   * - * DESCRIPTION: Prints out the various members of the Data structure type. + * DESCRIPTION: Common routine for dumping the optional resource_source and the + *              corresponding resource_source_index.   *   ******************************************************************************/ -static void acpi_rs_dump_vendor_specific(union acpi_resource_data *data) +static void +acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source)  { -	struct acpi_resource_vendor *vendor_data = -	    (struct acpi_resource_vendor *)data; -	u16 index = 0; -  	ACPI_FUNCTION_ENTRY(); -	acpi_os_printf("Vendor Specific Resource\n"); - -	acpi_os_printf("  Length: %08X\n", vendor_data->length); - -	for (index = 0; index < vendor_data->length; index++) { -		acpi_os_printf("  Byte %X: %08X\n", -			       index, vendor_data->reserved[index]); +	if (resource_source->index == 0xFF) { +		return;  	} -	return; -} - -/******************************************************************************* - * - * FUNCTION:    acpi_rs_dump_memory24 - * - * PARAMETERS:  Data            - pointer to the resource structure to dump. - * - * RETURN:      None - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -static void acpi_rs_dump_memory24(union acpi_resource_data *data) -{ -	struct acpi_resource_mem24 *memory24_data = -	    (struct acpi_resource_mem24 *)data; - -	ACPI_FUNCTION_ENTRY(); - -	acpi_os_printf("24-Bit Memory Range Resource\n"); - -	acpi_os_printf("  Read%s\n", -		       ACPI_READ_WRITE_MEMORY == -		       memory24_data->read_write_attribute ? -		       "/Write" : " only"); - -	acpi_os_printf("  Range minimum base: %08X\n", -		       memory24_data->min_base_address); - -	acpi_os_printf("  Range maximum base: %08X\n", -		       memory24_data->max_base_address); - -	acpi_os_printf("  Alignment: %08X\n", memory24_data->alignment); - -	acpi_os_printf("  Range length: %08X\n", memory24_data->range_length); - -	return; -} - -/******************************************************************************* - * - * FUNCTION:    acpi_rs_dump_memory32 - * - * PARAMETERS:  Data            - pointer to the resource structure to dump. - * - * RETURN:      None - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -static void acpi_rs_dump_memory32(union acpi_resource_data *data) -{ -	struct acpi_resource_mem32 *memory32_data = -	    (struct acpi_resource_mem32 *)data; - -	ACPI_FUNCTION_ENTRY(); - -	acpi_os_printf("32-Bit Memory Range Resource\n"); - -	acpi_os_printf("  Read%s\n", -		       ACPI_READ_WRITE_MEMORY == -		       memory32_data->read_write_attribute ? -		       "/Write" : " only"); - -	acpi_os_printf("  Range minimum base: %08X\n", -		       memory32_data->min_base_address); - -	acpi_os_printf("  Range maximum base: %08X\n", -		       memory32_data->max_base_address); - -	acpi_os_printf("  Alignment: %08X\n", memory32_data->alignment); - -	acpi_os_printf("  Range length: %08X\n", memory32_data->range_length); +	acpi_rs_out_integer8("Resource Source Index", resource_source->index); -	return; +	acpi_rs_out_string("Resource Source", +			   resource_source->string_ptr ? +			   resource_source->string_ptr : "[Not Specified]");  }  /*******************************************************************************   * - * FUNCTION:    acpi_rs_dump_fixed_memory32 + * FUNCTION:    acpi_rs_dump_address_common   * - * PARAMETERS:  Data            - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -static void acpi_rs_dump_fixed_memory32(union acpi_resource_data *data) -{ -	struct acpi_resource_fixed_mem32 *fixed_memory32_data = -	    (struct acpi_resource_fixed_mem32 *)data; - -	ACPI_FUNCTION_ENTRY(); - -	acpi_os_printf("32-Bit Fixed Location Memory Range Resource\n"); - -	acpi_os_printf("  Read%s\n", -		       ACPI_READ_WRITE_MEMORY == -		       fixed_memory32_data-> -		       read_write_attribute ? "/Write" : " Only"); - -	acpi_os_printf("  Range base address: %08X\n", -		       fixed_memory32_data->range_base_address); - -	acpi_os_printf("  Range length: %08X\n", -		       fixed_memory32_data->range_length); - -	return; -} - -/******************************************************************************* - * - * FUNCTION:    acpi_rs_dump_address16 - * - * PARAMETERS:  Data            - pointer to the resource structure to dump. + * PARAMETERS:  Resource        - Pointer to an internal resource descriptor   *   * RETURN:      None   * - * DESCRIPTION: Prints out the various members of the Data structure type. + * DESCRIPTION: Dump the fields that are common to all Address resource + *              descriptors   *   ******************************************************************************/ -static void acpi_rs_dump_address16(union acpi_resource_data *data) +static void acpi_rs_dump_address_common(union acpi_resource_data *resource)  { -	struct acpi_resource_address16 *address16_data = -	    (struct acpi_resource_address16 *)data; -  	ACPI_FUNCTION_ENTRY(); -	acpi_os_printf("16-Bit Address Space Resource\n"); -	acpi_os_printf("  Resource Type: "); +	/* Decode the type-specific flags */ -	switch (address16_data->resource_type) { +	switch (resource->address.resource_type) {  	case ACPI_MEMORY_RANGE: -		acpi_os_printf("Memory Range\n"); - -		switch (address16_data->attribute.memory.cache_attribute) { -		case ACPI_NON_CACHEABLE_MEMORY: -			acpi_os_printf -			    ("  Type Specific: Noncacheable memory\n"); -			break; - -		case ACPI_CACHABLE_MEMORY: -			acpi_os_printf("  Type Specific: Cacheable memory\n"); -			break; - -		case ACPI_WRITE_COMBINING_MEMORY: -			acpi_os_printf -			    ("  Type Specific: Write-combining memory\n"); -			break; - -		case ACPI_PREFETCHABLE_MEMORY: -			acpi_os_printf -			    ("  Type Specific: Prefetchable memory\n"); -			break; - -		default: -			acpi_os_printf -			    ("  Type Specific: Invalid cache attribute\n"); -			break; -		} - -		acpi_os_printf("  Type Specific: Read%s\n", -			       ACPI_READ_WRITE_MEMORY == -			       address16_data->attribute.memory. -			       read_write_attribute ? "/Write" : " Only"); +		acpi_rs_dump_descriptor(resource, acpi_rs_dump_memory_flags);  		break;  	case ACPI_IO_RANGE: -		acpi_os_printf("I/O Range\n"); - -		switch (address16_data->attribute.io.range_attribute) { -		case ACPI_NON_ISA_ONLY_RANGES: -			acpi_os_printf -			    ("  Type Specific: Non-ISA Io Addresses\n"); -			break; - -		case ACPI_ISA_ONLY_RANGES: -			acpi_os_printf("  Type Specific: ISA Io Addresses\n"); -			break; - -		case ACPI_ENTIRE_RANGE: -			acpi_os_printf -			    ("  Type Specific: ISA and non-ISA Io Addresses\n"); -			break; - -		default: -			acpi_os_printf -			    ("  Type Specific: Invalid range attribute\n"); -			break; -		} - -		acpi_os_printf("  Type Specific: %s Translation\n", -			       ACPI_SPARSE_TRANSLATION == -			       address16_data->attribute.io. -			       translation_attribute ? "Sparse" : "Dense"); +		acpi_rs_dump_descriptor(resource, acpi_rs_dump_io_flags);  		break;  	case ACPI_BUS_NUMBER_RANGE: -		acpi_os_printf("Bus Number Range\n"); +		acpi_rs_out_string("Resource Type", "Bus Number Range");  		break;  	default: -		acpi_os_printf("0x%2.2X\n", address16_data->resource_type); +		acpi_rs_out_integer8("Resource Type", +				     (u8) resource->address.resource_type);  		break;  	} -	acpi_os_printf("  Resource %s\n", -		       ACPI_CONSUMER == address16_data->producer_consumer ? -		       "Consumer" : "Producer"); - -	acpi_os_printf("  %s decode\n", -		       ACPI_SUB_DECODE == address16_data->decode ? -		       "Subtractive" : "Positive"); +	/* Decode the general flags */ -	acpi_os_printf("  Min address is %s fixed\n", -		       ACPI_ADDRESS_FIXED == address16_data->min_address_fixed ? -		       "" : "not"); - -	acpi_os_printf("  Max address is %s fixed\n", -		       ACPI_ADDRESS_FIXED == address16_data->max_address_fixed ? -		       "" : "not"); - -	acpi_os_printf("  Granularity: %08X\n", address16_data->granularity); - -	acpi_os_printf("  Address range min: %08X\n", -		       address16_data->min_address_range); - -	acpi_os_printf("  Address range max: %08X\n", -		       address16_data->max_address_range); - -	acpi_os_printf("  Address translation offset: %08X\n", -		       address16_data->address_translation_offset); - -	acpi_os_printf("  Address Length: %08X\n", -		       address16_data->address_length); - -	if (0xFF != address16_data->resource_source.index) { -		acpi_os_printf("  Resource Source Index: %X\n", -			       address16_data->resource_source.index); - -		acpi_os_printf("  Resource Source: %s\n", -			       address16_data->resource_source.string_ptr); -	} - -	return; +	acpi_rs_dump_descriptor(resource, acpi_rs_dump_general_flags);  }  /*******************************************************************************   * - * FUNCTION:    acpi_rs_dump_address32 + * FUNCTION:    acpi_rs_dump_resource_list   * - * PARAMETERS:  Data            - pointer to the resource structure to dump. + * PARAMETERS:  resource_list       - Pointer to a resource descriptor list   *   * RETURN:      None   * - * DESCRIPTION: Prints out the various members of the Data structure type. + * DESCRIPTION: Dispatches the structure to the correct dump routine.   *   ******************************************************************************/ -static void acpi_rs_dump_address32(union acpi_resource_data *data) +void acpi_rs_dump_resource_list(struct acpi_resource *resource_list)  { -	struct acpi_resource_address32 *address32_data = -	    (struct acpi_resource_address32 *)data; +	u32 count = 0; +	u32 type;  	ACPI_FUNCTION_ENTRY(); -	acpi_os_printf("32-Bit Address Space Resource\n"); - -	switch (address32_data->resource_type) { -	case ACPI_MEMORY_RANGE: - -		acpi_os_printf("  Resource Type: Memory Range\n"); - -		switch (address32_data->attribute.memory.cache_attribute) { -		case ACPI_NON_CACHEABLE_MEMORY: -			acpi_os_printf -			    ("  Type Specific: Noncacheable memory\n"); -			break; - -		case ACPI_CACHABLE_MEMORY: -			acpi_os_printf("  Type Specific: Cacheable memory\n"); -			break; - -		case ACPI_WRITE_COMBINING_MEMORY: -			acpi_os_printf -			    ("  Type Specific: Write-combining memory\n"); -			break; - -		case ACPI_PREFETCHABLE_MEMORY: -			acpi_os_printf -			    ("  Type Specific: Prefetchable memory\n"); -			break; - -		default: -			acpi_os_printf -			    ("  Type Specific: Invalid cache attribute\n"); -			break; -		} - -		acpi_os_printf("  Type Specific: Read%s\n", -			       ACPI_READ_WRITE_MEMORY == -			       address32_data->attribute.memory. -			       read_write_attribute ? "/Write" : " Only"); -		break; - -	case ACPI_IO_RANGE: - -		acpi_os_printf("  Resource Type: Io Range\n"); +	if (!(acpi_dbg_level & ACPI_LV_RESOURCES) +	    || !(_COMPONENT & acpi_dbg_layer)) { +		return; +	} -		switch (address32_data->attribute.io.range_attribute) { -		case ACPI_NON_ISA_ONLY_RANGES: -			acpi_os_printf -			    ("  Type Specific: Non-ISA Io Addresses\n"); -			break; +	/* Walk list and dump all resource descriptors (END_TAG terminates) */ -		case ACPI_ISA_ONLY_RANGES: -			acpi_os_printf("  Type Specific: ISA Io Addresses\n"); -			break; +	do { +		acpi_os_printf("\n[%02X] ", count); +		count++; -		case ACPI_ENTIRE_RANGE: -			acpi_os_printf -			    ("  Type Specific: ISA and non-ISA Io Addresses\n"); -			break; +		/* Validate Type before dispatch */ -		default: +		type = resource_list->type; +		if (type > ACPI_RESOURCE_TYPE_MAX) {  			acpi_os_printf -			    ("  Type Specific: Invalid Range attribute"); -			break; +			    ("Invalid descriptor type (%X) in resource list\n", +			     resource_list->type); +			return;  		} -		acpi_os_printf("  Type Specific: %s Translation\n", -			       ACPI_SPARSE_TRANSLATION == -			       address32_data->attribute.io. -			       translation_attribute ? "Sparse" : "Dense"); -		break; - -	case ACPI_BUS_NUMBER_RANGE: - -		acpi_os_printf("  Resource Type: Bus Number Range\n"); -		break; - -	default: - -		acpi_os_printf("  Resource Type: 0x%2.2X\n", -			       address32_data->resource_type); -		break; -	} - -	acpi_os_printf("  Resource %s\n", -		       ACPI_CONSUMER == address32_data->producer_consumer ? -		       "Consumer" : "Producer"); - -	acpi_os_printf("  %s decode\n", -		       ACPI_SUB_DECODE == address32_data->decode ? -		       "Subtractive" : "Positive"); - -	acpi_os_printf("  Min address is %s fixed\n", -		       ACPI_ADDRESS_FIXED == address32_data->min_address_fixed ? -		       "" : "not "); - -	acpi_os_printf("  Max address is %s fixed\n", -		       ACPI_ADDRESS_FIXED == address32_data->max_address_fixed ? -		       "" : "not "); +		/* Dump the resource descriptor */ -	acpi_os_printf("  Granularity: %08X\n", address32_data->granularity); +		acpi_rs_dump_descriptor(&resource_list->data, +					acpi_gbl_dump_resource_dispatch[type]); -	acpi_os_printf("  Address range min: %08X\n", -		       address32_data->min_address_range); +		/* Point to the next resource structure */ -	acpi_os_printf("  Address range max: %08X\n", -		       address32_data->max_address_range); +		resource_list = +		    ACPI_ADD_PTR(struct acpi_resource, resource_list, +				 resource_list->length); -	acpi_os_printf("  Address translation offset: %08X\n", -		       address32_data->address_translation_offset); +		/* Exit when END_TAG descriptor is reached */ -	acpi_os_printf("  Address Length: %08X\n", -		       address32_data->address_length); - -	if (0xFF != address32_data->resource_source.index) { -		acpi_os_printf("  Resource Source Index: %X\n", -			       address32_data->resource_source.index); - -		acpi_os_printf("  Resource Source: %s\n", -			       address32_data->resource_source.string_ptr); -	} - -	return; +	} while (type != ACPI_RESOURCE_TYPE_END_TAG);  }  /*******************************************************************************   * - * FUNCTION:    acpi_rs_dump_address64 + * FUNCTION:    acpi_rs_dump_irq_list   * - * PARAMETERS:  Data            - pointer to the resource structure to dump. + * PARAMETERS:  route_table     - Pointer to the routing table to dump.   *   * RETURN:      None   * - * DESCRIPTION: Prints out the various members of the Data structure type. + * DESCRIPTION: Print IRQ routing table   *   ******************************************************************************/ -static void acpi_rs_dump_address64(union acpi_resource_data *data) +void acpi_rs_dump_irq_list(u8 * route_table)  { -	struct acpi_resource_address64 *address64_data = -	    (struct acpi_resource_address64 *)data; +	struct acpi_pci_routing_table *prt_element; +	u8 count;  	ACPI_FUNCTION_ENTRY(); -	acpi_os_printf("64-Bit Address Space Resource\n"); - -	switch (address64_data->resource_type) { -	case ACPI_MEMORY_RANGE: - -		acpi_os_printf("  Resource Type: Memory Range\n"); - -		switch (address64_data->attribute.memory.cache_attribute) { -		case ACPI_NON_CACHEABLE_MEMORY: -			acpi_os_printf -			    ("  Type Specific: Noncacheable memory\n"); -			break; - -		case ACPI_CACHABLE_MEMORY: -			acpi_os_printf("  Type Specific: Cacheable memory\n"); -			break; - -		case ACPI_WRITE_COMBINING_MEMORY: -			acpi_os_printf -			    ("  Type Specific: Write-combining memory\n"); -			break; - -		case ACPI_PREFETCHABLE_MEMORY: -			acpi_os_printf -			    ("  Type Specific: Prefetchable memory\n"); -			break; - -		default: -			acpi_os_printf -			    ("  Type Specific: Invalid cache attribute\n"); -			break; -		} - -		acpi_os_printf("  Type Specific: Read%s\n", -			       ACPI_READ_WRITE_MEMORY == -			       address64_data->attribute.memory. -			       read_write_attribute ? "/Write" : " Only"); -		break; - -	case ACPI_IO_RANGE: - -		acpi_os_printf("  Resource Type: Io Range\n"); - -		switch (address64_data->attribute.io.range_attribute) { -		case ACPI_NON_ISA_ONLY_RANGES: -			acpi_os_printf -			    ("  Type Specific: Non-ISA Io Addresses\n"); -			break; - -		case ACPI_ISA_ONLY_RANGES: -			acpi_os_printf("  Type Specific: ISA Io Addresses\n"); -			break; - -		case ACPI_ENTIRE_RANGE: -			acpi_os_printf -			    ("  Type Specific: ISA and non-ISA Io Addresses\n"); -			break; - -		default: -			acpi_os_printf -			    ("  Type Specific: Invalid Range attribute"); -			break; -		} - -		acpi_os_printf("  Type Specific: %s Translation\n", -			       ACPI_SPARSE_TRANSLATION == -			       address64_data->attribute.io. -			       translation_attribute ? "Sparse" : "Dense"); -		break; - -	case ACPI_BUS_NUMBER_RANGE: - -		acpi_os_printf("  Resource Type: Bus Number Range\n"); -		break; - -	default: - -		acpi_os_printf("  Resource Type: 0x%2.2X\n", -			       address64_data->resource_type); -		break; +	if (!(acpi_dbg_level & ACPI_LV_RESOURCES) +	    || !(_COMPONENT & acpi_dbg_layer)) { +		return;  	} -	acpi_os_printf("  Resource %s\n", -		       ACPI_CONSUMER == address64_data->producer_consumer ? -		       "Consumer" : "Producer"); - -	acpi_os_printf("  %s decode\n", -		       ACPI_SUB_DECODE == address64_data->decode ? -		       "Subtractive" : "Positive"); - -	acpi_os_printf("  Min address is %s fixed\n", -		       ACPI_ADDRESS_FIXED == address64_data->min_address_fixed ? -		       "" : "not "); - -	acpi_os_printf("  Max address is %s fixed\n", -		       ACPI_ADDRESS_FIXED == address64_data->max_address_fixed ? -		       "" : "not "); +	prt_element = ACPI_CAST_PTR(struct acpi_pci_routing_table, route_table); -	acpi_os_printf("  Granularity: %8.8X%8.8X\n", -		       ACPI_FORMAT_UINT64(address64_data->granularity)); +	/* Dump all table elements, Exit on zero length element */ -	acpi_os_printf("  Address range min: %8.8X%8.8X\n", -		       ACPI_FORMAT_UINT64(address64_data->min_address_range)); +	for (count = 0; prt_element->length; count++) { +		acpi_os_printf("\n[%02X] PCI IRQ Routing Table Package\n", +			       count); +		acpi_rs_dump_descriptor(prt_element, acpi_rs_dump_prt); -	acpi_os_printf("  Address range max: %8.8X%8.8X\n", -		       ACPI_FORMAT_UINT64(address64_data->max_address_range)); - -	acpi_os_printf("  Address translation offset: %8.8X%8.8X\n", -		       ACPI_FORMAT_UINT64(address64_data-> -					  address_translation_offset)); - -	acpi_os_printf("  Address Length: %8.8X%8.8X\n", -		       ACPI_FORMAT_UINT64(address64_data->address_length)); - -	acpi_os_printf("  Type Specific Attributes: %8.8X%8.8X\n", -		       ACPI_FORMAT_UINT64(address64_data-> -					  type_specific_attributes)); - -	if (0xFF != address64_data->resource_source.index) { -		acpi_os_printf("  Resource Source Index: %X\n", -			       address64_data->resource_source.index); - -		acpi_os_printf("  Resource Source: %s\n", -			       address64_data->resource_source.string_ptr); +		prt_element = ACPI_ADD_PTR(struct acpi_pci_routing_table, +					   prt_element, prt_element->length);  	} - -	return;  }  /*******************************************************************************   * - * FUNCTION:    acpi_rs_dump_extended_irq + * FUNCTION:    acpi_rs_out*   * - * PARAMETERS:  Data            - pointer to the resource structure to dump. + * PARAMETERS:  Title       - Name of the resource field + *              Value       - Value of the resource field   *   * RETURN:      None   * - * DESCRIPTION: Prints out the various members of the Data structure type. + * DESCRIPTION: Miscellaneous helper functions to consistently format the + *              output of the resource dump routines   *   ******************************************************************************/ -static void acpi_rs_dump_extended_irq(union acpi_resource_data *data) +static void acpi_rs_out_string(char *title, char *value)  { -	struct acpi_resource_ext_irq *ext_irq_data = -	    (struct acpi_resource_ext_irq *)data; -	u8 index = 0; - -	ACPI_FUNCTION_ENTRY(); - -	acpi_os_printf("Extended IRQ Resource\n"); - -	acpi_os_printf("  Resource %s\n", -		       ACPI_CONSUMER == ext_irq_data->producer_consumer ? -		       "Consumer" : "Producer"); - -	acpi_os_printf("  %s\n", -		       ACPI_LEVEL_SENSITIVE == ext_irq_data->edge_level ? -		       "Level" : "Edge"); - -	acpi_os_printf("  Active %s\n", -		       ACPI_ACTIVE_LOW == ext_irq_data->active_high_low ? -		       "low" : "high"); - -	acpi_os_printf("  %s\n", -		       ACPI_SHARED == ext_irq_data->shared_exclusive ? -		       "Shared" : "Exclusive"); - -	acpi_os_printf("  Interrupts : %X ( ", -		       ext_irq_data->number_of_interrupts); - -	for (index = 0; index < ext_irq_data->number_of_interrupts; index++) { -		acpi_os_printf("%X ", ext_irq_data->interrupts[index]); -	} - -	acpi_os_printf(")\n"); - -	if (0xFF != ext_irq_data->resource_source.index) { -		acpi_os_printf("  Resource Source Index: %X", -			       ext_irq_data->resource_source.index); - -		acpi_os_printf("  Resource Source: %s", -			       ext_irq_data->resource_source.string_ptr); +	acpi_os_printf("%27s : %s", title, value); +	if (!*value) { +		acpi_os_printf("[NULL NAMESTRING]");  	} - -	return; +	acpi_os_printf("\n");  } -/******************************************************************************* - * - * FUNCTION:    acpi_rs_dump_resource_list - * - * PARAMETERS:  Resource        - pointer to the resource structure to dump. - * - * RETURN:      None - * - * DESCRIPTION: Dispatches the structure to the correct dump routine. - * - ******************************************************************************/ - -void acpi_rs_dump_resource_list(struct acpi_resource *resource) +static void acpi_rs_out_integer8(char *title, u8 value)  { -	u8 count = 0; -	u8 done = FALSE; - -	ACPI_FUNCTION_ENTRY(); - -	if (acpi_dbg_level & ACPI_LV_RESOURCES && _COMPONENT & acpi_dbg_layer) { -		while (!done) { -			acpi_os_printf("Resource structure %X.\n", count++); - -			switch (resource->id) { -			case ACPI_RSTYPE_IRQ: -				acpi_rs_dump_irq(&resource->data); -				break; - -			case ACPI_RSTYPE_DMA: -				acpi_rs_dump_dma(&resource->data); -				break; - -			case ACPI_RSTYPE_START_DPF: -				acpi_rs_dump_start_depend_fns(&resource->data); -				break; - -			case ACPI_RSTYPE_END_DPF: -				acpi_os_printf -				    ("end_dependent_functions Resource\n"); -				/* acpi_rs_dump_end_dependent_functions (Resource->Data); */ -				break; - -			case ACPI_RSTYPE_IO: -				acpi_rs_dump_io(&resource->data); -				break; - -			case ACPI_RSTYPE_FIXED_IO: -				acpi_rs_dump_fixed_io(&resource->data); -				break; - -			case ACPI_RSTYPE_VENDOR: -				acpi_rs_dump_vendor_specific(&resource->data); -				break; - -			case ACPI_RSTYPE_END_TAG: -				/*rs_dump_end_tag (Resource->Data); */ -				acpi_os_printf("end_tag Resource\n"); -				done = TRUE; -				break; - -			case ACPI_RSTYPE_MEM24: -				acpi_rs_dump_memory24(&resource->data); -				break; - -			case ACPI_RSTYPE_MEM32: -				acpi_rs_dump_memory32(&resource->data); -				break; - -			case ACPI_RSTYPE_FIXED_MEM32: -				acpi_rs_dump_fixed_memory32(&resource->data); -				break; - -			case ACPI_RSTYPE_ADDRESS16: -				acpi_rs_dump_address16(&resource->data); -				break; - -			case ACPI_RSTYPE_ADDRESS32: -				acpi_rs_dump_address32(&resource->data); -				break; - -			case ACPI_RSTYPE_ADDRESS64: -				acpi_rs_dump_address64(&resource->data); -				break; - -			case ACPI_RSTYPE_EXT_IRQ: -				acpi_rs_dump_extended_irq(&resource->data); -				break; +	acpi_os_printf("%27s : %2.2X\n", title, value); +} -			default: -				acpi_os_printf("Invalid resource type\n"); -				break; +static void acpi_rs_out_integer16(char *title, u16 value) +{ +	acpi_os_printf("%27s : %4.4X\n", title, value); +} -			} +static void acpi_rs_out_integer32(char *title, u32 value) +{ +	acpi_os_printf("%27s : %8.8X\n", title, value); +} -			resource = -			    ACPI_PTR_ADD(struct acpi_resource, resource, -					 resource->length); -		} -	} +static void acpi_rs_out_integer64(char *title, u64 value) +{ +	acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value)); +} -	return; +static void acpi_rs_out_title(char *title) +{ +	acpi_os_printf("%27s : ", title);  }  /*******************************************************************************   * - * FUNCTION:    acpi_rs_dump_irq_list + * FUNCTION:    acpi_rs_dump*List   * - * PARAMETERS:  route_table     - pointer to the routing table to dump. + * PARAMETERS:  Length      - Number of elements in the list + *              Data        - Start of the list   *   * RETURN:      None   * - * DESCRIPTION: Dispatches the structures to the correct dump routine. + * DESCRIPTION: Miscellaneous functions to dump lists of raw data   *   ******************************************************************************/ -void acpi_rs_dump_irq_list(u8 * route_table) +static void acpi_rs_dump_byte_list(u16 length, u8 * data)  { -	u8 *buffer = route_table; -	u8 count = 0; -	u8 done = FALSE; -	struct acpi_pci_routing_table *prt_element; +	u8 i; -	ACPI_FUNCTION_ENTRY(); - -	if (acpi_dbg_level & ACPI_LV_RESOURCES && _COMPONENT & acpi_dbg_layer) { -		prt_element = -		    ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer); - -		while (!done) { -			acpi_os_printf("PCI IRQ Routing Table structure %X.\n", -				       count++); - -			acpi_os_printf("  Address: %8.8X%8.8X\n", -				       ACPI_FORMAT_UINT64(prt_element-> -							  address)); +	for (i = 0; i < length; i++) { +		acpi_os_printf("%25s%2.2X : %2.2X\n", "Byte", i, data[i]); +	} +} -			acpi_os_printf("  Pin: %X\n", prt_element->pin); +static void acpi_rs_dump_short_byte_list(u8 length, u8 * data) +{ +	u8 i; -			acpi_os_printf("  Source: %s\n", prt_element->source); +	for (i = 0; i < length; i++) { +		acpi_os_printf("%X ", data[i]); +	} +	acpi_os_printf("\n"); +} -			acpi_os_printf("  source_index: %X\n", -				       prt_element->source_index); +static void acpi_rs_dump_dword_list(u8 length, u32 * data) +{ +	u8 i; -			buffer += prt_element->length; -			prt_element = -			    ACPI_CAST_PTR(struct acpi_pci_routing_table, -					  buffer); -			if (0 == prt_element->length) { -				done = TRUE; -			} -		} +	for (i = 0; i < length; i++) { +		acpi_os_printf("%25s%2.2X : %8.8X\n", "Dword", i, data[i]);  	} - -	return;  }  #endif | 
