1*95857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 295b482a8SLen Brown /******************************************************************************* 395b482a8SLen Brown * 495b482a8SLen Brown * Module Name: rsio - IO and DMA resource descriptors 595b482a8SLen Brown * 695b482a8SLen Brown ******************************************************************************/ 795b482a8SLen Brown 895b482a8SLen Brown #include <acpi/acpi.h> 9e2f7a777SLen Brown #include "accommon.h" 10e2f7a777SLen Brown #include "acresrc.h" 1195b482a8SLen Brown 1295b482a8SLen Brown #define _COMPONENT ACPI_RESOURCES 1395b482a8SLen Brown ACPI_MODULE_NAME("rsio") 1495b482a8SLen Brown 1595b482a8SLen Brown /******************************************************************************* 1695b482a8SLen Brown * 1795b482a8SLen Brown * acpi_rs_convert_io 1895b482a8SLen Brown * 1995b482a8SLen Brown ******************************************************************************/ 2095b482a8SLen Brown struct acpi_rsconvert_info acpi_rs_convert_io[5] = { 2195b482a8SLen Brown {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO, 2295b482a8SLen Brown ACPI_RS_SIZE(struct acpi_resource_io), 2395b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)}, 2495b482a8SLen Brown 2595b482a8SLen Brown {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO, 2695b482a8SLen Brown sizeof(struct aml_resource_io), 2795b482a8SLen Brown 0}, 2895b482a8SLen Brown 2995b482a8SLen Brown /* Decode flag */ 3095b482a8SLen Brown 3195b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.io.io_decode), 3295b482a8SLen Brown AML_OFFSET(io.flags), 3395b482a8SLen Brown 0}, 3495b482a8SLen Brown /* 3595b482a8SLen Brown * These fields are contiguous in both the source and destination: 3695b482a8SLen Brown * Address Alignment 3795b482a8SLen Brown * Length 3895b482a8SLen Brown * Minimum Base Address 3995b482a8SLen Brown * Maximum Base Address 4095b482a8SLen Brown */ 4195b482a8SLen Brown {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.io.alignment), 4295b482a8SLen Brown AML_OFFSET(io.alignment), 4395b482a8SLen Brown 2}, 4495b482a8SLen Brown 4595b482a8SLen Brown {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.io.minimum), 4695b482a8SLen Brown AML_OFFSET(io.minimum), 4795b482a8SLen Brown 2} 4895b482a8SLen Brown }; 4995b482a8SLen Brown 5095b482a8SLen Brown /******************************************************************************* 5195b482a8SLen Brown * 5295b482a8SLen Brown * acpi_rs_convert_fixed_io 5395b482a8SLen Brown * 5495b482a8SLen Brown ******************************************************************************/ 5595b482a8SLen Brown 5695b482a8SLen Brown struct acpi_rsconvert_info acpi_rs_convert_fixed_io[4] = { 5795b482a8SLen Brown {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO, 5895b482a8SLen Brown ACPI_RS_SIZE(struct acpi_resource_fixed_io), 5995b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)}, 6095b482a8SLen Brown 6195b482a8SLen Brown {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO, 6295b482a8SLen Brown sizeof(struct aml_resource_fixed_io), 6395b482a8SLen Brown 0}, 6495b482a8SLen Brown /* 6595b482a8SLen Brown * These fields are contiguous in both the source and destination: 6695b482a8SLen Brown * Base Address 6795b482a8SLen Brown * Length 6895b482a8SLen Brown */ 6995b482a8SLen Brown {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_io.address_length), 7095b482a8SLen Brown AML_OFFSET(fixed_io.address_length), 7195b482a8SLen Brown 1}, 7295b482a8SLen Brown 7395b482a8SLen Brown {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_io.address), 7495b482a8SLen Brown AML_OFFSET(fixed_io.address), 7595b482a8SLen Brown 1} 7695b482a8SLen Brown }; 7795b482a8SLen Brown 7895b482a8SLen Brown /******************************************************************************* 7995b482a8SLen Brown * 8095b482a8SLen Brown * acpi_rs_convert_generic_reg 8195b482a8SLen Brown * 8295b482a8SLen Brown ******************************************************************************/ 8395b482a8SLen Brown 8495b482a8SLen Brown struct acpi_rsconvert_info acpi_rs_convert_generic_reg[4] = { 8595b482a8SLen Brown {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER, 8695b482a8SLen Brown ACPI_RS_SIZE(struct acpi_resource_generic_register), 8795b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)}, 8895b482a8SLen Brown 8995b482a8SLen Brown {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER, 9095b482a8SLen Brown sizeof(struct aml_resource_generic_register), 9195b482a8SLen Brown 0}, 9295b482a8SLen Brown /* 9395b482a8SLen Brown * These fields are contiguous in both the source and destination: 9495b482a8SLen Brown * Address Space ID 9595b482a8SLen Brown * Register Bit Width 9695b482a8SLen Brown * Register Bit Offset 9795b482a8SLen Brown * Access Size 9895b482a8SLen Brown */ 9995b482a8SLen Brown {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.generic_reg.space_id), 10095b482a8SLen Brown AML_OFFSET(generic_reg.address_space_id), 10195b482a8SLen Brown 4}, 10295b482a8SLen Brown 10395b482a8SLen Brown /* Get the Register Address */ 10495b482a8SLen Brown 10595b482a8SLen Brown {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.generic_reg.address), 10695b482a8SLen Brown AML_OFFSET(generic_reg.address), 10795b482a8SLen Brown 1} 10895b482a8SLen Brown }; 10995b482a8SLen Brown 11095b482a8SLen Brown /******************************************************************************* 11195b482a8SLen Brown * 11295b482a8SLen Brown * acpi_rs_convert_end_dpf 11395b482a8SLen Brown * 11495b482a8SLen Brown ******************************************************************************/ 11595b482a8SLen Brown 11695b482a8SLen Brown struct acpi_rsconvert_info acpi_rs_convert_end_dpf[2] = { 11795b482a8SLen Brown {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT, 11895b482a8SLen Brown ACPI_RS_SIZE_MIN, 11995b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)}, 12095b482a8SLen Brown 12195b482a8SLen Brown {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT, 12295b482a8SLen Brown sizeof(struct aml_resource_end_dependent), 12395b482a8SLen Brown 0} 12495b482a8SLen Brown }; 12595b482a8SLen Brown 12695b482a8SLen Brown /******************************************************************************* 12795b482a8SLen Brown * 12895b482a8SLen Brown * acpi_rs_convert_end_tag 12995b482a8SLen Brown * 13095b482a8SLen Brown ******************************************************************************/ 13195b482a8SLen Brown 13295b482a8SLen Brown struct acpi_rsconvert_info acpi_rs_convert_end_tag[2] = { 13395b482a8SLen Brown {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG, 13495b482a8SLen Brown ACPI_RS_SIZE_MIN, 13595b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_tag)}, 13695b482a8SLen Brown 13795b482a8SLen Brown /* 13895b482a8SLen Brown * Note: The checksum field is set to zero, meaning that the resource 13995b482a8SLen Brown * data is treated as if the checksum operation succeeded. 14095b482a8SLen Brown * (ACPI Spec 1.0b Section 6.4.2.8) 14195b482a8SLen Brown */ 14295b482a8SLen Brown {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG, 14395b482a8SLen Brown sizeof(struct aml_resource_end_tag), 14495b482a8SLen Brown 0} 14595b482a8SLen Brown }; 14695b482a8SLen Brown 14795b482a8SLen Brown /******************************************************************************* 14895b482a8SLen Brown * 14995b482a8SLen Brown * acpi_rs_get_start_dpf 15095b482a8SLen Brown * 15195b482a8SLen Brown ******************************************************************************/ 15295b482a8SLen Brown 15395b482a8SLen Brown struct acpi_rsconvert_info acpi_rs_get_start_dpf[6] = { 15495b482a8SLen Brown {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT, 15595b482a8SLen Brown ACPI_RS_SIZE(struct acpi_resource_start_dependent), 15695b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_get_start_dpf)}, 15795b482a8SLen Brown 15895b482a8SLen Brown /* Defaults for Compatibility and Performance priorities */ 15995b482a8SLen Brown 16095b482a8SLen Brown {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.start_dpf.compatibility_priority), 16195b482a8SLen Brown ACPI_ACCEPTABLE_CONFIGURATION, 16295b482a8SLen Brown 2}, 16395b482a8SLen Brown 16495b482a8SLen Brown /* Get the descriptor length (0 or 1 for Start Dpf descriptor) */ 16595b482a8SLen Brown 16695b482a8SLen Brown {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.start_dpf.descriptor_length), 16795b482a8SLen Brown AML_OFFSET(start_dpf.descriptor_type), 16895b482a8SLen Brown 0}, 16995b482a8SLen Brown 17095b482a8SLen Brown /* All done if there is no flag byte present in the descriptor */ 17195b482a8SLen Brown 17295b482a8SLen Brown {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1}, 17395b482a8SLen Brown 17495b482a8SLen Brown /* Flag byte is present, get the flags */ 17595b482a8SLen Brown 17695b482a8SLen Brown {ACPI_RSC_2BITFLAG, 17795b482a8SLen Brown ACPI_RS_OFFSET(data.start_dpf.compatibility_priority), 17895b482a8SLen Brown AML_OFFSET(start_dpf.flags), 17995b482a8SLen Brown 0}, 18095b482a8SLen Brown 18195b482a8SLen Brown {ACPI_RSC_2BITFLAG, 18295b482a8SLen Brown ACPI_RS_OFFSET(data.start_dpf.performance_robustness), 18395b482a8SLen Brown AML_OFFSET(start_dpf.flags), 18495b482a8SLen Brown 2} 18595b482a8SLen Brown }; 18695b482a8SLen Brown 18795b482a8SLen Brown /******************************************************************************* 18895b482a8SLen Brown * 18995b482a8SLen Brown * acpi_rs_set_start_dpf 19095b482a8SLen Brown * 19195b482a8SLen Brown ******************************************************************************/ 19295b482a8SLen Brown 19395b482a8SLen Brown struct acpi_rsconvert_info acpi_rs_set_start_dpf[10] = { 19495b482a8SLen Brown /* Start with a default descriptor of length 1 */ 19595b482a8SLen Brown 19695b482a8SLen Brown {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT, 19795b482a8SLen Brown sizeof(struct aml_resource_start_dependent), 19895b482a8SLen Brown ACPI_RSC_TABLE_SIZE(acpi_rs_set_start_dpf)}, 19995b482a8SLen Brown 20095b482a8SLen Brown /* Set the default flag values */ 20195b482a8SLen Brown 20295b482a8SLen Brown {ACPI_RSC_2BITFLAG, 20395b482a8SLen Brown ACPI_RS_OFFSET(data.start_dpf.compatibility_priority), 20495b482a8SLen Brown AML_OFFSET(start_dpf.flags), 20595b482a8SLen Brown 0}, 20695b482a8SLen Brown 20795b482a8SLen Brown {ACPI_RSC_2BITFLAG, 20895b482a8SLen Brown ACPI_RS_OFFSET(data.start_dpf.performance_robustness), 20995b482a8SLen Brown AML_OFFSET(start_dpf.flags), 21095b482a8SLen Brown 2}, 21195b482a8SLen Brown /* 21295b482a8SLen Brown * All done if the output descriptor length is required to be 1 21395b482a8SLen Brown * (i.e., optimization to 0 bytes cannot be attempted) 21495b482a8SLen Brown */ 21595b482a8SLen Brown {ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE, 21695b482a8SLen Brown ACPI_RS_OFFSET(data.start_dpf.descriptor_length), 21795b482a8SLen Brown 1}, 21895b482a8SLen Brown 21995b482a8SLen Brown /* Set length to 0 bytes (no flags byte) */ 22095b482a8SLen Brown 22195b482a8SLen Brown {ACPI_RSC_LENGTH, 0, 0, 22295b482a8SLen Brown sizeof(struct aml_resource_start_dependent_noprio)}, 22395b482a8SLen Brown 22495b482a8SLen Brown /* 22595b482a8SLen Brown * All done if the output descriptor length is required to be 0. 22695b482a8SLen Brown * 22795b482a8SLen Brown * TBD: Perhaps we should check for error if input flags are not 22895b482a8SLen Brown * compatible with a 0-byte descriptor. 22995b482a8SLen Brown */ 23095b482a8SLen Brown {ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE, 23195b482a8SLen Brown ACPI_RS_OFFSET(data.start_dpf.descriptor_length), 23295b482a8SLen Brown 0}, 23395b482a8SLen Brown 23495b482a8SLen Brown /* Reset length to 1 byte (descriptor with flags byte) */ 23595b482a8SLen Brown 23695b482a8SLen Brown {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_start_dependent)}, 23795b482a8SLen Brown 23895b482a8SLen Brown /* 23995b482a8SLen Brown * All done if flags byte is necessary -- if either priority value 24095b482a8SLen Brown * is not ACPI_ACCEPTABLE_CONFIGURATION 24195b482a8SLen Brown */ 24295b482a8SLen Brown {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, 24395b482a8SLen Brown ACPI_RS_OFFSET(data.start_dpf.compatibility_priority), 24495b482a8SLen Brown ACPI_ACCEPTABLE_CONFIGURATION}, 24595b482a8SLen Brown 24695b482a8SLen Brown {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE, 24795b482a8SLen Brown ACPI_RS_OFFSET(data.start_dpf.performance_robustness), 24895b482a8SLen Brown ACPI_ACCEPTABLE_CONFIGURATION}, 24995b482a8SLen Brown 25095b482a8SLen Brown /* Flag byte is not necessary */ 25195b482a8SLen Brown 25295b482a8SLen Brown {ACPI_RSC_LENGTH, 0, 0, 25395b482a8SLen Brown sizeof(struct aml_resource_start_dependent_noprio)} 25495b482a8SLen Brown }; 255