162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/*******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: rsio - IO and DMA resource descriptors
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci ******************************************************************************/
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <acpi/acpi.h>
962306a36Sopenharmony_ci#include "accommon.h"
1062306a36Sopenharmony_ci#include "acresrc.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define _COMPONENT          ACPI_RESOURCES
1362306a36Sopenharmony_ciACPI_MODULE_NAME("rsio")
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/*******************************************************************************
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci * acpi_rs_convert_io
1862306a36Sopenharmony_ci *
1962306a36Sopenharmony_ci ******************************************************************************/
2062306a36Sopenharmony_cistruct acpi_rsconvert_info acpi_rs_convert_io[5] = {
2162306a36Sopenharmony_ci	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO,
2262306a36Sopenharmony_ci	 ACPI_RS_SIZE(struct acpi_resource_io),
2362306a36Sopenharmony_ci	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)},
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO,
2662306a36Sopenharmony_ci	 sizeof(struct aml_resource_io),
2762306a36Sopenharmony_ci	 0},
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	/* Decode flag */
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.io.io_decode),
3262306a36Sopenharmony_ci	 AML_OFFSET(io.flags),
3362306a36Sopenharmony_ci	 0},
3462306a36Sopenharmony_ci	/*
3562306a36Sopenharmony_ci	 * These fields are contiguous in both the source and destination:
3662306a36Sopenharmony_ci	 * Address Alignment
3762306a36Sopenharmony_ci	 * Length
3862306a36Sopenharmony_ci	 * Minimum Base Address
3962306a36Sopenharmony_ci	 * Maximum Base Address
4062306a36Sopenharmony_ci	 */
4162306a36Sopenharmony_ci	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.io.alignment),
4262306a36Sopenharmony_ci	 AML_OFFSET(io.alignment),
4362306a36Sopenharmony_ci	 2},
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.io.minimum),
4662306a36Sopenharmony_ci	 AML_OFFSET(io.minimum),
4762306a36Sopenharmony_ci	 2}
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/*******************************************************************************
5162306a36Sopenharmony_ci *
5262306a36Sopenharmony_ci * acpi_rs_convert_fixed_io
5362306a36Sopenharmony_ci *
5462306a36Sopenharmony_ci ******************************************************************************/
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistruct acpi_rsconvert_info acpi_rs_convert_fixed_io[4] = {
5762306a36Sopenharmony_ci	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO,
5862306a36Sopenharmony_ci	 ACPI_RS_SIZE(struct acpi_resource_fixed_io),
5962306a36Sopenharmony_ci	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)},
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO,
6262306a36Sopenharmony_ci	 sizeof(struct aml_resource_fixed_io),
6362306a36Sopenharmony_ci	 0},
6462306a36Sopenharmony_ci	/*
6562306a36Sopenharmony_ci	 * These fields are contiguous in both the source and destination:
6662306a36Sopenharmony_ci	 * Base Address
6762306a36Sopenharmony_ci	 * Length
6862306a36Sopenharmony_ci	 */
6962306a36Sopenharmony_ci	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_io.address_length),
7062306a36Sopenharmony_ci	 AML_OFFSET(fixed_io.address_length),
7162306a36Sopenharmony_ci	 1},
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_io.address),
7462306a36Sopenharmony_ci	 AML_OFFSET(fixed_io.address),
7562306a36Sopenharmony_ci	 1}
7662306a36Sopenharmony_ci};
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci/*******************************************************************************
7962306a36Sopenharmony_ci *
8062306a36Sopenharmony_ci * acpi_rs_convert_generic_reg
8162306a36Sopenharmony_ci *
8262306a36Sopenharmony_ci ******************************************************************************/
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cistruct acpi_rsconvert_info acpi_rs_convert_generic_reg[4] = {
8562306a36Sopenharmony_ci	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
8662306a36Sopenharmony_ci	 ACPI_RS_SIZE(struct acpi_resource_generic_register),
8762306a36Sopenharmony_ci	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)},
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER,
9062306a36Sopenharmony_ci	 sizeof(struct aml_resource_generic_register),
9162306a36Sopenharmony_ci	 0},
9262306a36Sopenharmony_ci	/*
9362306a36Sopenharmony_ci	 * These fields are contiguous in both the source and destination:
9462306a36Sopenharmony_ci	 * Address Space ID
9562306a36Sopenharmony_ci	 * Register Bit Width
9662306a36Sopenharmony_ci	 * Register Bit Offset
9762306a36Sopenharmony_ci	 * Access Size
9862306a36Sopenharmony_ci	 */
9962306a36Sopenharmony_ci	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.generic_reg.space_id),
10062306a36Sopenharmony_ci	 AML_OFFSET(generic_reg.address_space_id),
10162306a36Sopenharmony_ci	 4},
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	/* Get the Register Address */
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	{ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.generic_reg.address),
10662306a36Sopenharmony_ci	 AML_OFFSET(generic_reg.address),
10762306a36Sopenharmony_ci	 1}
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/*******************************************************************************
11162306a36Sopenharmony_ci *
11262306a36Sopenharmony_ci * acpi_rs_convert_end_dpf
11362306a36Sopenharmony_ci *
11462306a36Sopenharmony_ci ******************************************************************************/
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cistruct acpi_rsconvert_info acpi_rs_convert_end_dpf[2] = {
11762306a36Sopenharmony_ci	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT,
11862306a36Sopenharmony_ci	 ACPI_RS_SIZE_MIN,
11962306a36Sopenharmony_ci	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)},
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT,
12262306a36Sopenharmony_ci	 sizeof(struct aml_resource_end_dependent),
12362306a36Sopenharmony_ci	 0}
12462306a36Sopenharmony_ci};
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci/*******************************************************************************
12762306a36Sopenharmony_ci *
12862306a36Sopenharmony_ci * acpi_rs_convert_end_tag
12962306a36Sopenharmony_ci *
13062306a36Sopenharmony_ci ******************************************************************************/
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_cistruct acpi_rsconvert_info acpi_rs_convert_end_tag[2] = {
13362306a36Sopenharmony_ci	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG,
13462306a36Sopenharmony_ci	 ACPI_RS_SIZE_MIN,
13562306a36Sopenharmony_ci	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_tag)},
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	/*
13862306a36Sopenharmony_ci	 * Note: The checksum field is set to zero, meaning that the resource
13962306a36Sopenharmony_ci	 * data is treated as if the checksum operation succeeded.
14062306a36Sopenharmony_ci	 * (ACPI Spec 1.0b Section 6.4.2.8)
14162306a36Sopenharmony_ci	 */
14262306a36Sopenharmony_ci	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG,
14362306a36Sopenharmony_ci	 sizeof(struct aml_resource_end_tag),
14462306a36Sopenharmony_ci	 0}
14562306a36Sopenharmony_ci};
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci/*******************************************************************************
14862306a36Sopenharmony_ci *
14962306a36Sopenharmony_ci * acpi_rs_get_start_dpf
15062306a36Sopenharmony_ci *
15162306a36Sopenharmony_ci ******************************************************************************/
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistruct acpi_rsconvert_info acpi_rs_get_start_dpf[6] = {
15462306a36Sopenharmony_ci	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT,
15562306a36Sopenharmony_ci	 ACPI_RS_SIZE(struct acpi_resource_start_dependent),
15662306a36Sopenharmony_ci	 ACPI_RSC_TABLE_SIZE(acpi_rs_get_start_dpf)},
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	/* Defaults for Compatibility and Performance priorities */
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	{ACPI_RSC_SET8, ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
16162306a36Sopenharmony_ci	 ACPI_ACCEPTABLE_CONFIGURATION,
16262306a36Sopenharmony_ci	 2},
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	/* Get the descriptor length (0 or 1 for Start Dpf descriptor) */
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
16762306a36Sopenharmony_ci	 AML_OFFSET(start_dpf.descriptor_type),
16862306a36Sopenharmony_ci	 0},
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci	/* All done if there is no flag byte present in the descriptor */
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci	{ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci	/* Flag byte is present, get the flags */
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	{ACPI_RSC_2BITFLAG,
17762306a36Sopenharmony_ci	 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
17862306a36Sopenharmony_ci	 AML_OFFSET(start_dpf.flags),
17962306a36Sopenharmony_ci	 0},
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	{ACPI_RSC_2BITFLAG,
18262306a36Sopenharmony_ci	 ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
18362306a36Sopenharmony_ci	 AML_OFFSET(start_dpf.flags),
18462306a36Sopenharmony_ci	 2}
18562306a36Sopenharmony_ci};
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/*******************************************************************************
18862306a36Sopenharmony_ci *
18962306a36Sopenharmony_ci * acpi_rs_set_start_dpf
19062306a36Sopenharmony_ci *
19162306a36Sopenharmony_ci ******************************************************************************/
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_cistruct acpi_rsconvert_info acpi_rs_set_start_dpf[10] = {
19462306a36Sopenharmony_ci	/* Start with a default descriptor of length 1 */
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT,
19762306a36Sopenharmony_ci	 sizeof(struct aml_resource_start_dependent),
19862306a36Sopenharmony_ci	 ACPI_RSC_TABLE_SIZE(acpi_rs_set_start_dpf)},
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	/* Set the default flag values */
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci	{ACPI_RSC_2BITFLAG,
20362306a36Sopenharmony_ci	 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
20462306a36Sopenharmony_ci	 AML_OFFSET(start_dpf.flags),
20562306a36Sopenharmony_ci	 0},
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	{ACPI_RSC_2BITFLAG,
20862306a36Sopenharmony_ci	 ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
20962306a36Sopenharmony_ci	 AML_OFFSET(start_dpf.flags),
21062306a36Sopenharmony_ci	 2},
21162306a36Sopenharmony_ci	/*
21262306a36Sopenharmony_ci	 * All done if the output descriptor length is required to be 1
21362306a36Sopenharmony_ci	 * (i.e., optimization to 0 bytes cannot be attempted)
21462306a36Sopenharmony_ci	 */
21562306a36Sopenharmony_ci	{ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE,
21662306a36Sopenharmony_ci	 ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
21762306a36Sopenharmony_ci	 1},
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci	/* Set length to 0 bytes (no flags byte) */
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	{ACPI_RSC_LENGTH, 0, 0,
22262306a36Sopenharmony_ci	 sizeof(struct aml_resource_start_dependent_noprio)},
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci	/*
22562306a36Sopenharmony_ci	 * All done if the output descriptor length is required to be 0.
22662306a36Sopenharmony_ci	 *
22762306a36Sopenharmony_ci	 * TBD: Perhaps we should check for error if input flags are not
22862306a36Sopenharmony_ci	 * compatible with a 0-byte descriptor.
22962306a36Sopenharmony_ci	 */
23062306a36Sopenharmony_ci	{ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE,
23162306a36Sopenharmony_ci	 ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
23262306a36Sopenharmony_ci	 0},
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	/* Reset length to 1 byte (descriptor with flags byte) */
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	{ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_start_dependent)},
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	/*
23962306a36Sopenharmony_ci	 * All done if flags byte is necessary -- if either priority value
24062306a36Sopenharmony_ci	 * is not ACPI_ACCEPTABLE_CONFIGURATION
24162306a36Sopenharmony_ci	 */
24262306a36Sopenharmony_ci	{ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
24362306a36Sopenharmony_ci	 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
24462306a36Sopenharmony_ci	 ACPI_ACCEPTABLE_CONFIGURATION},
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci	{ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
24762306a36Sopenharmony_ci	 ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
24862306a36Sopenharmony_ci	 ACPI_ACCEPTABLE_CONFIGURATION},
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	/* Flag byte is not necessary */
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	{ACPI_RSC_LENGTH, 0, 0,
25362306a36Sopenharmony_ci	 sizeof(struct aml_resource_start_dependent_noprio)}
25462306a36Sopenharmony_ci};
255