162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/******************************************************************************* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: rsmisc - Miscellaneous 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("rsmisc") 1462306a36Sopenharmony_ci#define INIT_RESOURCE_TYPE(i) i->resource_offset 1562306a36Sopenharmony_ci#define INIT_RESOURCE_LENGTH(i) i->aml_offset 1662306a36Sopenharmony_ci#define INIT_TABLE_LENGTH(i) i->value 1762306a36Sopenharmony_ci#define COMPARE_OPCODE(i) i->resource_offset 1862306a36Sopenharmony_ci#define COMPARE_TARGET(i) i->aml_offset 1962306a36Sopenharmony_ci#define COMPARE_VALUE(i) i->value 2062306a36Sopenharmony_ci/******************************************************************************* 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci * FUNCTION: acpi_rs_convert_aml_to_resource 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * PARAMETERS: resource - Pointer to the resource descriptor 2562306a36Sopenharmony_ci * aml - Where the AML descriptor is returned 2662306a36Sopenharmony_ci * info - Pointer to appropriate conversion table 2762306a36Sopenharmony_ci * 2862306a36Sopenharmony_ci * RETURN: Status 2962306a36Sopenharmony_ci * 3062306a36Sopenharmony_ci * DESCRIPTION: Convert an external AML resource descriptor to the corresponding 3162306a36Sopenharmony_ci * internal resource descriptor 3262306a36Sopenharmony_ci * 3362306a36Sopenharmony_ci ******************************************************************************/ 3462306a36Sopenharmony_ciacpi_status 3562306a36Sopenharmony_ciacpi_rs_convert_aml_to_resource(struct acpi_resource *resource, 3662306a36Sopenharmony_ci union aml_resource *aml, 3762306a36Sopenharmony_ci struct acpi_rsconvert_info *info) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci acpi_rs_length aml_resource_length; 4062306a36Sopenharmony_ci void *source; 4162306a36Sopenharmony_ci void *destination; 4262306a36Sopenharmony_ci char *target; 4362306a36Sopenharmony_ci u8 count; 4462306a36Sopenharmony_ci u8 flags_mode = FALSE; 4562306a36Sopenharmony_ci u16 item_count = 0; 4662306a36Sopenharmony_ci u16 temp16 = 0; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(rs_convert_aml_to_resource); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci if (!info) { 5162306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_PARAMETER); 5262306a36Sopenharmony_ci } 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci if (((acpi_size)resource) & 0x3) { 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci /* Each internal resource struct is expected to be 32-bit aligned */ 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci ACPI_WARNING((AE_INFO, 5962306a36Sopenharmony_ci "Misaligned resource pointer (get): %p Type 0x%2.2X Length %u", 6062306a36Sopenharmony_ci resource, resource->type, resource->length)); 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci /* Extract the resource Length field (does not include header length) */ 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci aml_resource_length = acpi_ut_get_resource_length(aml); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci /* 6862306a36Sopenharmony_ci * First table entry must be ACPI_RSC_INITxxx and must contain the 6962306a36Sopenharmony_ci * table length (# of table entries) 7062306a36Sopenharmony_ci */ 7162306a36Sopenharmony_ci count = INIT_TABLE_LENGTH(info); 7262306a36Sopenharmony_ci while (count) { 7362306a36Sopenharmony_ci target = NULL; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* 7662306a36Sopenharmony_ci * Source is the external AML byte stream buffer, 7762306a36Sopenharmony_ci * destination is the internal resource descriptor 7862306a36Sopenharmony_ci */ 7962306a36Sopenharmony_ci source = ACPI_ADD_PTR(void, aml, info->aml_offset); 8062306a36Sopenharmony_ci destination = 8162306a36Sopenharmony_ci ACPI_ADD_PTR(void, resource, info->resource_offset); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci switch (info->opcode) { 8462306a36Sopenharmony_ci case ACPI_RSC_INITGET: 8562306a36Sopenharmony_ci /* 8662306a36Sopenharmony_ci * Get the resource type and the initial (minimum) length 8762306a36Sopenharmony_ci */ 8862306a36Sopenharmony_ci memset(resource, 0, INIT_RESOURCE_LENGTH(info)); 8962306a36Sopenharmony_ci resource->type = INIT_RESOURCE_TYPE(info); 9062306a36Sopenharmony_ci resource->length = INIT_RESOURCE_LENGTH(info); 9162306a36Sopenharmony_ci break; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci case ACPI_RSC_INITSET: 9462306a36Sopenharmony_ci break; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci case ACPI_RSC_FLAGINIT: 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci flags_mode = TRUE; 9962306a36Sopenharmony_ci break; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci case ACPI_RSC_1BITFLAG: 10262306a36Sopenharmony_ci /* 10362306a36Sopenharmony_ci * Mask and shift the flag bit 10462306a36Sopenharmony_ci */ 10562306a36Sopenharmony_ci ACPI_SET8(destination, 10662306a36Sopenharmony_ci ((ACPI_GET8(source) >> info->value) & 0x01)); 10762306a36Sopenharmony_ci break; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci case ACPI_RSC_2BITFLAG: 11062306a36Sopenharmony_ci /* 11162306a36Sopenharmony_ci * Mask and shift the flag bits 11262306a36Sopenharmony_ci */ 11362306a36Sopenharmony_ci ACPI_SET8(destination, 11462306a36Sopenharmony_ci ((ACPI_GET8(source) >> info->value) & 0x03)); 11562306a36Sopenharmony_ci break; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci case ACPI_RSC_3BITFLAG: 11862306a36Sopenharmony_ci /* 11962306a36Sopenharmony_ci * Mask and shift the flag bits 12062306a36Sopenharmony_ci */ 12162306a36Sopenharmony_ci ACPI_SET8(destination, 12262306a36Sopenharmony_ci ((ACPI_GET8(source) >> info->value) & 0x07)); 12362306a36Sopenharmony_ci break; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci case ACPI_RSC_6BITFLAG: 12662306a36Sopenharmony_ci /* 12762306a36Sopenharmony_ci * Mask and shift the flag bits 12862306a36Sopenharmony_ci */ 12962306a36Sopenharmony_ci ACPI_SET8(destination, 13062306a36Sopenharmony_ci ((ACPI_GET8(source) >> info->value) & 0x3F)); 13162306a36Sopenharmony_ci break; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci case ACPI_RSC_COUNT: 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci item_count = ACPI_GET8(source); 13662306a36Sopenharmony_ci ACPI_SET8(destination, item_count); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci resource->length = resource->length + 13962306a36Sopenharmony_ci (info->value * (item_count - 1)); 14062306a36Sopenharmony_ci break; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci case ACPI_RSC_COUNT16: 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci item_count = aml_resource_length; 14562306a36Sopenharmony_ci ACPI_SET16(destination, item_count); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci resource->length = resource->length + 14862306a36Sopenharmony_ci (info->value * (item_count - 1)); 14962306a36Sopenharmony_ci break; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci case ACPI_RSC_COUNT_GPIO_PIN: 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci target = ACPI_ADD_PTR(void, aml, info->value); 15462306a36Sopenharmony_ci item_count = ACPI_GET16(target) - ACPI_GET16(source); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci resource->length = resource->length + item_count; 15762306a36Sopenharmony_ci item_count = item_count / 2; 15862306a36Sopenharmony_ci ACPI_SET16(destination, item_count); 15962306a36Sopenharmony_ci break; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci case ACPI_RSC_COUNT_GPIO_VEN: 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci item_count = ACPI_GET8(source); 16462306a36Sopenharmony_ci ACPI_SET8(destination, item_count); 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci resource->length = 16762306a36Sopenharmony_ci resource->length + (info->value * item_count); 16862306a36Sopenharmony_ci break; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci case ACPI_RSC_COUNT_GPIO_RES: 17162306a36Sopenharmony_ci /* 17262306a36Sopenharmony_ci * Vendor data is optional (length/offset may both be zero) 17362306a36Sopenharmony_ci * Examine vendor data length field first 17462306a36Sopenharmony_ci */ 17562306a36Sopenharmony_ci target = ACPI_ADD_PTR(void, aml, (info->value + 2)); 17662306a36Sopenharmony_ci if (ACPI_GET16(target)) { 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci /* Use vendor offset to get resource source length */ 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci target = ACPI_ADD_PTR(void, aml, info->value); 18162306a36Sopenharmony_ci item_count = 18262306a36Sopenharmony_ci ACPI_GET16(target) - ACPI_GET16(source); 18362306a36Sopenharmony_ci } else { 18462306a36Sopenharmony_ci /* No vendor data to worry about */ 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci item_count = aml->large_header.resource_length + 18762306a36Sopenharmony_ci sizeof(struct aml_resource_large_header) - 18862306a36Sopenharmony_ci ACPI_GET16(source); 18962306a36Sopenharmony_ci } 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci resource->length = resource->length + item_count; 19262306a36Sopenharmony_ci ACPI_SET16(destination, item_count); 19362306a36Sopenharmony_ci break; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci case ACPI_RSC_COUNT_SERIAL_VEN: 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci ACPI_MOVE_16_TO_16(&temp16, source); 19862306a36Sopenharmony_ci item_count = temp16 - info->value; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci resource->length = resource->length + item_count; 20162306a36Sopenharmony_ci ACPI_SET16(destination, item_count); 20262306a36Sopenharmony_ci break; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci case ACPI_RSC_COUNT_SERIAL_RES: 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci ACPI_MOVE_16_TO_16(&temp16, source); 20762306a36Sopenharmony_ci item_count = (aml_resource_length + 20862306a36Sopenharmony_ci sizeof(struct aml_resource_large_header)) 20962306a36Sopenharmony_ci - temp16 - info->value; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci resource->length = resource->length + item_count; 21262306a36Sopenharmony_ci ACPI_SET16(destination, item_count); 21362306a36Sopenharmony_ci break; 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci case ACPI_RSC_LENGTH: 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci resource->length = resource->length + info->value; 21862306a36Sopenharmony_ci break; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci case ACPI_RSC_MOVE8: 22162306a36Sopenharmony_ci case ACPI_RSC_MOVE16: 22262306a36Sopenharmony_ci case ACPI_RSC_MOVE32: 22362306a36Sopenharmony_ci case ACPI_RSC_MOVE64: 22462306a36Sopenharmony_ci /* 22562306a36Sopenharmony_ci * Raw data move. Use the Info value field unless item_count has 22662306a36Sopenharmony_ci * been previously initialized via a COUNT opcode 22762306a36Sopenharmony_ci */ 22862306a36Sopenharmony_ci if (info->value) { 22962306a36Sopenharmony_ci item_count = info->value; 23062306a36Sopenharmony_ci } 23162306a36Sopenharmony_ci acpi_rs_move_data(destination, source, item_count, 23262306a36Sopenharmony_ci info->opcode); 23362306a36Sopenharmony_ci break; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci case ACPI_RSC_MOVE_GPIO_PIN: 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci /* Generate and set the PIN data pointer */ 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci target = (char *)ACPI_ADD_PTR(void, resource, 24062306a36Sopenharmony_ci (resource->length - 24162306a36Sopenharmony_ci item_count * 2)); 24262306a36Sopenharmony_ci *(u16 **)destination = ACPI_CAST_PTR(u16, target); 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci /* Copy the PIN data */ 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci source = ACPI_ADD_PTR(void, aml, ACPI_GET16(source)); 24762306a36Sopenharmony_ci acpi_rs_move_data(target, source, item_count, 24862306a36Sopenharmony_ci info->opcode); 24962306a36Sopenharmony_ci break; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci case ACPI_RSC_MOVE_GPIO_RES: 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci /* Generate and set the resource_source string pointer */ 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci target = (char *)ACPI_ADD_PTR(void, resource, 25662306a36Sopenharmony_ci (resource->length - 25762306a36Sopenharmony_ci item_count)); 25862306a36Sopenharmony_ci *(u8 **)destination = ACPI_CAST_PTR(u8, target); 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci /* Copy the resource_source string */ 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci source = ACPI_ADD_PTR(void, aml, ACPI_GET16(source)); 26362306a36Sopenharmony_ci acpi_rs_move_data(target, source, item_count, 26462306a36Sopenharmony_ci info->opcode); 26562306a36Sopenharmony_ci break; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci case ACPI_RSC_MOVE_SERIAL_VEN: 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci /* Generate and set the Vendor Data pointer */ 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci target = (char *)ACPI_ADD_PTR(void, resource, 27262306a36Sopenharmony_ci (resource->length - 27362306a36Sopenharmony_ci item_count)); 27462306a36Sopenharmony_ci *(u8 **)destination = ACPI_CAST_PTR(u8, target); 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci /* Copy the Vendor Data */ 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci source = ACPI_ADD_PTR(void, aml, info->value); 27962306a36Sopenharmony_ci acpi_rs_move_data(target, source, item_count, 28062306a36Sopenharmony_ci info->opcode); 28162306a36Sopenharmony_ci break; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci case ACPI_RSC_MOVE_SERIAL_RES: 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci /* Generate and set the resource_source string pointer */ 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci target = (char *)ACPI_ADD_PTR(void, resource, 28862306a36Sopenharmony_ci (resource->length - 28962306a36Sopenharmony_ci item_count)); 29062306a36Sopenharmony_ci *(u8 **)destination = ACPI_CAST_PTR(u8, target); 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci /* Copy the resource_source string */ 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci ACPI_MOVE_16_TO_16(&temp16, source); 29562306a36Sopenharmony_ci source = 29662306a36Sopenharmony_ci ACPI_ADD_PTR(void, aml, (temp16 + info->value)); 29762306a36Sopenharmony_ci acpi_rs_move_data(target, source, item_count, 29862306a36Sopenharmony_ci info->opcode); 29962306a36Sopenharmony_ci break; 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci case ACPI_RSC_SET8: 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci memset(destination, info->aml_offset, info->value); 30462306a36Sopenharmony_ci break; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci case ACPI_RSC_DATA8: 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci target = ACPI_ADD_PTR(char, resource, info->value); 30962306a36Sopenharmony_ci memcpy(destination, source, ACPI_GET16(target)); 31062306a36Sopenharmony_ci break; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci case ACPI_RSC_ADDRESS: 31362306a36Sopenharmony_ci /* 31462306a36Sopenharmony_ci * Common handler for address descriptor flags 31562306a36Sopenharmony_ci */ 31662306a36Sopenharmony_ci if (!acpi_rs_get_address_common(resource, aml)) { 31762306a36Sopenharmony_ci return_ACPI_STATUS 31862306a36Sopenharmony_ci (AE_AML_INVALID_RESOURCE_TYPE); 31962306a36Sopenharmony_ci } 32062306a36Sopenharmony_ci break; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci case ACPI_RSC_SOURCE: 32362306a36Sopenharmony_ci /* 32462306a36Sopenharmony_ci * Optional resource_source (Index and String) 32562306a36Sopenharmony_ci */ 32662306a36Sopenharmony_ci resource->length += 32762306a36Sopenharmony_ci acpi_rs_get_resource_source(aml_resource_length, 32862306a36Sopenharmony_ci info->value, 32962306a36Sopenharmony_ci destination, aml, NULL); 33062306a36Sopenharmony_ci break; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci case ACPI_RSC_SOURCEX: 33362306a36Sopenharmony_ci /* 33462306a36Sopenharmony_ci * Optional resource_source (Index and String). This is the more 33562306a36Sopenharmony_ci * complicated case used by the Interrupt() macro 33662306a36Sopenharmony_ci */ 33762306a36Sopenharmony_ci target = ACPI_ADD_PTR(char, resource, 33862306a36Sopenharmony_ci info->aml_offset + 33962306a36Sopenharmony_ci (item_count * 4)); 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci resource->length += 34262306a36Sopenharmony_ci acpi_rs_get_resource_source(aml_resource_length, 34362306a36Sopenharmony_ci (acpi_rs_length) 34462306a36Sopenharmony_ci (((item_count - 34562306a36Sopenharmony_ci 1) * sizeof(u32)) + 34662306a36Sopenharmony_ci info->value), 34762306a36Sopenharmony_ci destination, aml, 34862306a36Sopenharmony_ci target); 34962306a36Sopenharmony_ci break; 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci case ACPI_RSC_BITMASK: 35262306a36Sopenharmony_ci /* 35362306a36Sopenharmony_ci * 8-bit encoded bitmask (DMA macro) 35462306a36Sopenharmony_ci */ 35562306a36Sopenharmony_ci item_count = 35662306a36Sopenharmony_ci acpi_rs_decode_bitmask(ACPI_GET8(source), 35762306a36Sopenharmony_ci destination); 35862306a36Sopenharmony_ci if (item_count) { 35962306a36Sopenharmony_ci resource->length += (item_count - 1); 36062306a36Sopenharmony_ci } 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci target = ACPI_ADD_PTR(char, resource, info->value); 36362306a36Sopenharmony_ci ACPI_SET8(target, item_count); 36462306a36Sopenharmony_ci break; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci case ACPI_RSC_BITMASK16: 36762306a36Sopenharmony_ci /* 36862306a36Sopenharmony_ci * 16-bit encoded bitmask (IRQ macro) 36962306a36Sopenharmony_ci */ 37062306a36Sopenharmony_ci ACPI_MOVE_16_TO_16(&temp16, source); 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci item_count = 37362306a36Sopenharmony_ci acpi_rs_decode_bitmask(temp16, destination); 37462306a36Sopenharmony_ci if (item_count) { 37562306a36Sopenharmony_ci resource->length += (item_count - 1); 37662306a36Sopenharmony_ci } 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci target = ACPI_ADD_PTR(char, resource, info->value); 37962306a36Sopenharmony_ci ACPI_SET8(target, item_count); 38062306a36Sopenharmony_ci break; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci case ACPI_RSC_EXIT_NE: 38362306a36Sopenharmony_ci /* 38462306a36Sopenharmony_ci * control - Exit conversion if not equal 38562306a36Sopenharmony_ci */ 38662306a36Sopenharmony_ci switch (info->resource_offset) { 38762306a36Sopenharmony_ci case ACPI_RSC_COMPARE_AML_LENGTH: 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci if (aml_resource_length != info->value) { 39062306a36Sopenharmony_ci goto exit; 39162306a36Sopenharmony_ci } 39262306a36Sopenharmony_ci break; 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci case ACPI_RSC_COMPARE_VALUE: 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci if (ACPI_GET8(source) != info->value) { 39762306a36Sopenharmony_ci goto exit; 39862306a36Sopenharmony_ci } 39962306a36Sopenharmony_ci break; 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci default: 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, 40462306a36Sopenharmony_ci "Invalid conversion sub-opcode")); 40562306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_PARAMETER); 40662306a36Sopenharmony_ci } 40762306a36Sopenharmony_ci break; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci default: 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, "Invalid conversion opcode")); 41262306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_PARAMETER); 41362306a36Sopenharmony_ci } 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci count--; 41662306a36Sopenharmony_ci info++; 41762306a36Sopenharmony_ci } 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ciexit: 42062306a36Sopenharmony_ci if (!flags_mode) { 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci /* Round the resource struct length up to the next boundary (32 or 64) */ 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci resource->length = (u32) 42562306a36Sopenharmony_ci ACPI_ROUND_UP_TO_NATIVE_WORD(resource->length); 42662306a36Sopenharmony_ci } 42762306a36Sopenharmony_ci return_ACPI_STATUS(AE_OK); 42862306a36Sopenharmony_ci} 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci/******************************************************************************* 43162306a36Sopenharmony_ci * 43262306a36Sopenharmony_ci * FUNCTION: acpi_rs_convert_resource_to_aml 43362306a36Sopenharmony_ci * 43462306a36Sopenharmony_ci * PARAMETERS: resource - Pointer to the resource descriptor 43562306a36Sopenharmony_ci * aml - Where the AML descriptor is returned 43662306a36Sopenharmony_ci * info - Pointer to appropriate conversion table 43762306a36Sopenharmony_ci * 43862306a36Sopenharmony_ci * RETURN: Status 43962306a36Sopenharmony_ci * 44062306a36Sopenharmony_ci * DESCRIPTION: Convert an internal resource descriptor to the corresponding 44162306a36Sopenharmony_ci * external AML resource descriptor. 44262306a36Sopenharmony_ci * 44362306a36Sopenharmony_ci ******************************************************************************/ 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ciacpi_status 44662306a36Sopenharmony_ciacpi_rs_convert_resource_to_aml(struct acpi_resource *resource, 44762306a36Sopenharmony_ci union aml_resource *aml, 44862306a36Sopenharmony_ci struct acpi_rsconvert_info *info) 44962306a36Sopenharmony_ci{ 45062306a36Sopenharmony_ci void *source = NULL; 45162306a36Sopenharmony_ci void *destination; 45262306a36Sopenharmony_ci char *target; 45362306a36Sopenharmony_ci acpi_rsdesc_size aml_length = 0; 45462306a36Sopenharmony_ci u8 count; 45562306a36Sopenharmony_ci u16 temp16 = 0; 45662306a36Sopenharmony_ci u16 item_count = 0; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(rs_convert_resource_to_aml); 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci if (!info) { 46162306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_PARAMETER); 46262306a36Sopenharmony_ci } 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci /* 46562306a36Sopenharmony_ci * First table entry must be ACPI_RSC_INITxxx and must contain the 46662306a36Sopenharmony_ci * table length (# of table entries) 46762306a36Sopenharmony_ci */ 46862306a36Sopenharmony_ci count = INIT_TABLE_LENGTH(info); 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci while (count) { 47162306a36Sopenharmony_ci /* 47262306a36Sopenharmony_ci * Source is the internal resource descriptor, 47362306a36Sopenharmony_ci * destination is the external AML byte stream buffer 47462306a36Sopenharmony_ci */ 47562306a36Sopenharmony_ci source = ACPI_ADD_PTR(void, resource, info->resource_offset); 47662306a36Sopenharmony_ci destination = ACPI_ADD_PTR(void, aml, info->aml_offset); 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci switch (info->opcode) { 47962306a36Sopenharmony_ci case ACPI_RSC_INITSET: 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci memset(aml, 0, INIT_RESOURCE_LENGTH(info)); 48262306a36Sopenharmony_ci aml_length = INIT_RESOURCE_LENGTH(info); 48362306a36Sopenharmony_ci acpi_rs_set_resource_header(INIT_RESOURCE_TYPE(info), 48462306a36Sopenharmony_ci aml_length, aml); 48562306a36Sopenharmony_ci break; 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci case ACPI_RSC_INITGET: 48862306a36Sopenharmony_ci break; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci case ACPI_RSC_FLAGINIT: 49162306a36Sopenharmony_ci /* 49262306a36Sopenharmony_ci * Clear the flag byte 49362306a36Sopenharmony_ci */ 49462306a36Sopenharmony_ci ACPI_SET8(destination, 0); 49562306a36Sopenharmony_ci break; 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci case ACPI_RSC_1BITFLAG: 49862306a36Sopenharmony_ci /* 49962306a36Sopenharmony_ci * Mask and shift the flag bit 50062306a36Sopenharmony_ci */ 50162306a36Sopenharmony_ci ACPI_SET_BIT(*ACPI_CAST8(destination), (u8) 50262306a36Sopenharmony_ci ((ACPI_GET8(source) & 0x01) << info-> 50362306a36Sopenharmony_ci value)); 50462306a36Sopenharmony_ci break; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci case ACPI_RSC_2BITFLAG: 50762306a36Sopenharmony_ci /* 50862306a36Sopenharmony_ci * Mask and shift the flag bits 50962306a36Sopenharmony_ci */ 51062306a36Sopenharmony_ci ACPI_SET_BIT(*ACPI_CAST8(destination), (u8) 51162306a36Sopenharmony_ci ((ACPI_GET8(source) & 0x03) << info-> 51262306a36Sopenharmony_ci value)); 51362306a36Sopenharmony_ci break; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci case ACPI_RSC_3BITFLAG: 51662306a36Sopenharmony_ci /* 51762306a36Sopenharmony_ci * Mask and shift the flag bits 51862306a36Sopenharmony_ci */ 51962306a36Sopenharmony_ci ACPI_SET_BIT(*ACPI_CAST8(destination), (u8) 52062306a36Sopenharmony_ci ((ACPI_GET8(source) & 0x07) << info-> 52162306a36Sopenharmony_ci value)); 52262306a36Sopenharmony_ci break; 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_ci case ACPI_RSC_6BITFLAG: 52562306a36Sopenharmony_ci /* 52662306a36Sopenharmony_ci * Mask and shift the flag bits 52762306a36Sopenharmony_ci */ 52862306a36Sopenharmony_ci ACPI_SET_BIT(*ACPI_CAST8(destination), (u8) 52962306a36Sopenharmony_ci ((ACPI_GET8(source) & 0x3F) << info-> 53062306a36Sopenharmony_ci value)); 53162306a36Sopenharmony_ci break; 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci case ACPI_RSC_COUNT: 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci item_count = ACPI_GET8(source); 53662306a36Sopenharmony_ci ACPI_SET8(destination, item_count); 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci aml_length = (u16) 53962306a36Sopenharmony_ci (aml_length + (info->value * (item_count - 1))); 54062306a36Sopenharmony_ci break; 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci case ACPI_RSC_COUNT16: 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci item_count = ACPI_GET16(source); 54562306a36Sopenharmony_ci aml_length = (u16) (aml_length + item_count); 54662306a36Sopenharmony_ci acpi_rs_set_resource_length(aml_length, aml); 54762306a36Sopenharmony_ci break; 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci case ACPI_RSC_COUNT_GPIO_PIN: 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci item_count = ACPI_GET16(source); 55262306a36Sopenharmony_ci ACPI_SET16(destination, aml_length); 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci aml_length = (u16)(aml_length + item_count * 2); 55562306a36Sopenharmony_ci target = ACPI_ADD_PTR(void, aml, info->value); 55662306a36Sopenharmony_ci ACPI_SET16(target, aml_length); 55762306a36Sopenharmony_ci acpi_rs_set_resource_length(aml_length, aml); 55862306a36Sopenharmony_ci break; 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci case ACPI_RSC_COUNT_GPIO_VEN: 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci item_count = ACPI_GET16(source); 56362306a36Sopenharmony_ci ACPI_SET16(destination, item_count); 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci aml_length = 56662306a36Sopenharmony_ci (u16)(aml_length + (info->value * item_count)); 56762306a36Sopenharmony_ci acpi_rs_set_resource_length(aml_length, aml); 56862306a36Sopenharmony_ci break; 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci case ACPI_RSC_COUNT_GPIO_RES: 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_ci /* Set resource source string length */ 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci item_count = ACPI_GET16(source); 57562306a36Sopenharmony_ci ACPI_SET16(destination, aml_length); 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci /* Compute offset for the Vendor Data */ 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci aml_length = (u16)(aml_length + item_count); 58062306a36Sopenharmony_ci target = ACPI_ADD_PTR(void, aml, info->value); 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci /* Set vendor offset only if there is vendor data */ 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_ci ACPI_SET16(target, aml_length); 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci acpi_rs_set_resource_length(aml_length, aml); 58762306a36Sopenharmony_ci break; 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci case ACPI_RSC_COUNT_SERIAL_VEN: 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci item_count = ACPI_GET16(source); 59262306a36Sopenharmony_ci ACPI_SET16(destination, item_count + info->value); 59362306a36Sopenharmony_ci aml_length = (u16)(aml_length + item_count); 59462306a36Sopenharmony_ci acpi_rs_set_resource_length(aml_length, aml); 59562306a36Sopenharmony_ci break; 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci case ACPI_RSC_COUNT_SERIAL_RES: 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci item_count = ACPI_GET16(source); 60062306a36Sopenharmony_ci aml_length = (u16)(aml_length + item_count); 60162306a36Sopenharmony_ci acpi_rs_set_resource_length(aml_length, aml); 60262306a36Sopenharmony_ci break; 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci case ACPI_RSC_LENGTH: 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci acpi_rs_set_resource_length(info->value, aml); 60762306a36Sopenharmony_ci break; 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci case ACPI_RSC_MOVE8: 61062306a36Sopenharmony_ci case ACPI_RSC_MOVE16: 61162306a36Sopenharmony_ci case ACPI_RSC_MOVE32: 61262306a36Sopenharmony_ci case ACPI_RSC_MOVE64: 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci if (info->value) { 61562306a36Sopenharmony_ci item_count = info->value; 61662306a36Sopenharmony_ci } 61762306a36Sopenharmony_ci acpi_rs_move_data(destination, source, item_count, 61862306a36Sopenharmony_ci info->opcode); 61962306a36Sopenharmony_ci break; 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ci case ACPI_RSC_MOVE_GPIO_PIN: 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci destination = (char *)ACPI_ADD_PTR(void, aml, 62462306a36Sopenharmony_ci ACPI_GET16 62562306a36Sopenharmony_ci (destination)); 62662306a36Sopenharmony_ci source = *(u16 **)source; 62762306a36Sopenharmony_ci acpi_rs_move_data(destination, source, item_count, 62862306a36Sopenharmony_ci info->opcode); 62962306a36Sopenharmony_ci break; 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci case ACPI_RSC_MOVE_GPIO_RES: 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci /* Used for both resource_source string and vendor_data */ 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_ci destination = (char *)ACPI_ADD_PTR(void, aml, 63662306a36Sopenharmony_ci ACPI_GET16 63762306a36Sopenharmony_ci (destination)); 63862306a36Sopenharmony_ci source = *(u8 **)source; 63962306a36Sopenharmony_ci acpi_rs_move_data(destination, source, item_count, 64062306a36Sopenharmony_ci info->opcode); 64162306a36Sopenharmony_ci break; 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_ci case ACPI_RSC_MOVE_SERIAL_VEN: 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_ci destination = (char *)ACPI_ADD_PTR(void, aml, 64662306a36Sopenharmony_ci (aml_length - 64762306a36Sopenharmony_ci item_count)); 64862306a36Sopenharmony_ci source = *(u8 **)source; 64962306a36Sopenharmony_ci acpi_rs_move_data(destination, source, item_count, 65062306a36Sopenharmony_ci info->opcode); 65162306a36Sopenharmony_ci break; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci case ACPI_RSC_MOVE_SERIAL_RES: 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci destination = (char *)ACPI_ADD_PTR(void, aml, 65662306a36Sopenharmony_ci (aml_length - 65762306a36Sopenharmony_ci item_count)); 65862306a36Sopenharmony_ci source = *(u8 **)source; 65962306a36Sopenharmony_ci acpi_rs_move_data(destination, source, item_count, 66062306a36Sopenharmony_ci info->opcode); 66162306a36Sopenharmony_ci break; 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_ci case ACPI_RSC_ADDRESS: 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci /* Set the Resource Type, General Flags, and Type-Specific Flags */ 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci acpi_rs_set_address_common(aml, resource); 66862306a36Sopenharmony_ci break; 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci case ACPI_RSC_SOURCEX: 67162306a36Sopenharmony_ci /* 67262306a36Sopenharmony_ci * Optional resource_source (Index and String) 67362306a36Sopenharmony_ci */ 67462306a36Sopenharmony_ci aml_length = 67562306a36Sopenharmony_ci acpi_rs_set_resource_source(aml, 67662306a36Sopenharmony_ci (acpi_rs_length) 67762306a36Sopenharmony_ci aml_length, source); 67862306a36Sopenharmony_ci acpi_rs_set_resource_length(aml_length, aml); 67962306a36Sopenharmony_ci break; 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_ci case ACPI_RSC_SOURCE: 68262306a36Sopenharmony_ci /* 68362306a36Sopenharmony_ci * Optional resource_source (Index and String). This is the more 68462306a36Sopenharmony_ci * complicated case used by the Interrupt() macro 68562306a36Sopenharmony_ci */ 68662306a36Sopenharmony_ci aml_length = 68762306a36Sopenharmony_ci acpi_rs_set_resource_source(aml, info->value, 68862306a36Sopenharmony_ci source); 68962306a36Sopenharmony_ci acpi_rs_set_resource_length(aml_length, aml); 69062306a36Sopenharmony_ci break; 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_ci case ACPI_RSC_BITMASK: 69362306a36Sopenharmony_ci /* 69462306a36Sopenharmony_ci * 8-bit encoded bitmask (DMA macro) 69562306a36Sopenharmony_ci */ 69662306a36Sopenharmony_ci ACPI_SET8(destination, 69762306a36Sopenharmony_ci acpi_rs_encode_bitmask(source, 69862306a36Sopenharmony_ci *ACPI_ADD_PTR(u8, 69962306a36Sopenharmony_ci resource, 70062306a36Sopenharmony_ci info-> 70162306a36Sopenharmony_ci value))); 70262306a36Sopenharmony_ci break; 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_ci case ACPI_RSC_BITMASK16: 70562306a36Sopenharmony_ci /* 70662306a36Sopenharmony_ci * 16-bit encoded bitmask (IRQ macro) 70762306a36Sopenharmony_ci */ 70862306a36Sopenharmony_ci temp16 = 70962306a36Sopenharmony_ci acpi_rs_encode_bitmask(source, 71062306a36Sopenharmony_ci *ACPI_ADD_PTR(u8, resource, 71162306a36Sopenharmony_ci info->value)); 71262306a36Sopenharmony_ci ACPI_MOVE_16_TO_16(destination, &temp16); 71362306a36Sopenharmony_ci break; 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci case ACPI_RSC_EXIT_LE: 71662306a36Sopenharmony_ci /* 71762306a36Sopenharmony_ci * control - Exit conversion if less than or equal 71862306a36Sopenharmony_ci */ 71962306a36Sopenharmony_ci if (item_count <= info->value) { 72062306a36Sopenharmony_ci goto exit; 72162306a36Sopenharmony_ci } 72262306a36Sopenharmony_ci break; 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_ci case ACPI_RSC_EXIT_NE: 72562306a36Sopenharmony_ci /* 72662306a36Sopenharmony_ci * control - Exit conversion if not equal 72762306a36Sopenharmony_ci */ 72862306a36Sopenharmony_ci switch (COMPARE_OPCODE(info)) { 72962306a36Sopenharmony_ci case ACPI_RSC_COMPARE_VALUE: 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci if (*ACPI_ADD_PTR(u8, resource, 73262306a36Sopenharmony_ci COMPARE_TARGET(info)) != 73362306a36Sopenharmony_ci COMPARE_VALUE(info)) { 73462306a36Sopenharmony_ci goto exit; 73562306a36Sopenharmony_ci } 73662306a36Sopenharmony_ci break; 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci default: 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, 74162306a36Sopenharmony_ci "Invalid conversion sub-opcode")); 74262306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_PARAMETER); 74362306a36Sopenharmony_ci } 74462306a36Sopenharmony_ci break; 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_ci case ACPI_RSC_EXIT_EQ: 74762306a36Sopenharmony_ci /* 74862306a36Sopenharmony_ci * control - Exit conversion if equal 74962306a36Sopenharmony_ci */ 75062306a36Sopenharmony_ci if (*ACPI_ADD_PTR(u8, resource, 75162306a36Sopenharmony_ci COMPARE_TARGET(info)) == 75262306a36Sopenharmony_ci COMPARE_VALUE(info)) { 75362306a36Sopenharmony_ci goto exit; 75462306a36Sopenharmony_ci } 75562306a36Sopenharmony_ci break; 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci default: 75862306a36Sopenharmony_ci 75962306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, "Invalid conversion opcode")); 76062306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_PARAMETER); 76162306a36Sopenharmony_ci } 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_ci count--; 76462306a36Sopenharmony_ci info++; 76562306a36Sopenharmony_ci } 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_ciexit: 76862306a36Sopenharmony_ci return_ACPI_STATUS(AE_OK); 76962306a36Sopenharmony_ci} 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_ci#if 0 77262306a36Sopenharmony_ci/* Previous resource validations */ 77362306a36Sopenharmony_ci 77462306a36Sopenharmony_ciif (aml->ext_address64.revision_ID != AML_RESOURCE_EXTENDED_ADDRESS_REVISION) { 77562306a36Sopenharmony_ci return_ACPI_STATUS(AE_SUPPORT); 77662306a36Sopenharmony_ci} 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ciif (resource->data.start_dpf.performance_robustness >= 3) { 77962306a36Sopenharmony_ci return_ACPI_STATUS(AE_AML_BAD_RESOURCE_VALUE); 78062306a36Sopenharmony_ci} 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_ciif (((aml->irq.flags & 0x09) == 0x00) || ((aml->irq.flags & 0x09) == 0x09)) { 78362306a36Sopenharmony_ci /* 78462306a36Sopenharmony_ci * Only [active_high, edge_sensitive] or [active_low, level_sensitive] 78562306a36Sopenharmony_ci * polarity/trigger interrupts are allowed (ACPI spec, section 78662306a36Sopenharmony_ci * "IRQ Format"), so 0x00 and 0x09 are illegal. 78762306a36Sopenharmony_ci */ 78862306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, 78962306a36Sopenharmony_ci "Invalid interrupt polarity/trigger in resource list, 0x%X", 79062306a36Sopenharmony_ci aml->irq.flags)); 79162306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_DATA); 79262306a36Sopenharmony_ci} 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ciresource->data.extended_irq.interrupt_count = temp8; 79562306a36Sopenharmony_ciif (temp8 < 1) { 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ci /* Must have at least one IRQ */ 79862306a36Sopenharmony_ci 79962306a36Sopenharmony_ci return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH); 80062306a36Sopenharmony_ci} 80162306a36Sopenharmony_ci 80262306a36Sopenharmony_ciif (resource->data.dma.transfer == 0x03) { 80362306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, "Invalid DMA.Transfer preference (3)")); 80462306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_DATA); 80562306a36Sopenharmony_ci} 80662306a36Sopenharmony_ci#endif 807