xref: /openbmc/linux/drivers/acpi/acpica/rsio.c (revision c13aca79ff3c4af5fd31a5b2743a90eba6e36a26)
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