mirror of
https://github.com/acpica/acpica/
synced 2025-03-29 01:22:54 +03:00
ACPI 5.0/ResourceMgr: Fix for GPIO descriptors with no Vendor Data.
Fixes a problem where the GPIO descriptor is not handled properly if there is no vendor data associated with it.
This commit is contained in:
parent
03c8c470cc
commit
397ec63252
@ -595,8 +595,19 @@ AcpiRsGetListLength (
|
||||
|
||||
case ACPI_RESOURCE_NAME_GPIO:
|
||||
|
||||
ExtraStructBytes += AmlResource->Gpio.VendorOffset -
|
||||
AmlResource->Gpio.PinTableOffset + AmlResource->Gpio.VendorLength;
|
||||
/* Vendor data is optional */
|
||||
|
||||
if (AmlResource->Gpio.VendorLength)
|
||||
{
|
||||
ExtraStructBytes += AmlResource->Gpio.VendorOffset -
|
||||
AmlResource->Gpio.PinTableOffset + AmlResource->Gpio.VendorLength;
|
||||
}
|
||||
else
|
||||
{
|
||||
ExtraStructBytes += AmlResource->LargeHeader.ResourceLength +
|
||||
sizeof (AML_RESOURCE_LARGE_HEADER) -
|
||||
AmlResource->Gpio.PinTableOffset;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_RESOURCE_NAME_SERIAL_BUS:
|
||||
|
@ -290,8 +290,26 @@ AcpiRsConvertAmlToResource (
|
||||
|
||||
case ACPI_RSC_COUNT_GPIO_RES:
|
||||
|
||||
Target = ACPI_ADD_PTR (void, Aml, Info->Value);
|
||||
ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
|
||||
/*
|
||||
* Vendor data is optional (length/offset may both be zero)
|
||||
* Examine vendor data length field first
|
||||
*/
|
||||
Target = ACPI_ADD_PTR (void, Aml, (Info->Value + 2));
|
||||
if (ACPI_GET16 (Target))
|
||||
{
|
||||
/* Use vendor offset to get resource source length */
|
||||
|
||||
Target = ACPI_ADD_PTR (void, Aml, Info->Value);
|
||||
ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* No vendor data to worry about */
|
||||
|
||||
ItemCount = Aml->LargeHeader.ResourceLength +
|
||||
sizeof (AML_RESOURCE_LARGE_HEADER) -
|
||||
ACPI_GET16 (Source);
|
||||
}
|
||||
|
||||
Resource->Length = Resource->Length + ItemCount;
|
||||
ACPI_SET16 (Destination) = ItemCount;
|
||||
@ -653,6 +671,7 @@ AcpiRsConvertResourceToAml (
|
||||
|
||||
ItemCount = ACPI_GET16 (Source);
|
||||
ACPI_SET16 (Destination) = (UINT16) AmlLength;
|
||||
|
||||
AmlLength = (UINT16) (AmlLength + ItemCount * 2);
|
||||
Target = ACPI_ADD_PTR (void, Aml, Info->Value);
|
||||
ACPI_SET16 (Target) = (UINT16) AmlLength;
|
||||
@ -662,8 +681,8 @@ AcpiRsConvertResourceToAml (
|
||||
|
||||
case ACPI_RSC_COUNT_GPIO_VEN:
|
||||
|
||||
ItemCount = ACPI_GET8 (Source);
|
||||
ACPI_SET8 (Destination) = (UINT8) ItemCount;
|
||||
ItemCount = ACPI_GET16 (Source);
|
||||
ACPI_SET16 (Destination) = (UINT16) ItemCount;
|
||||
|
||||
AmlLength = (UINT16) (AmlLength + (Info->Value * ItemCount));
|
||||
AcpiRsSetResourceLength (AmlLength, Aml);
|
||||
@ -672,11 +691,23 @@ AcpiRsConvertResourceToAml (
|
||||
|
||||
case ACPI_RSC_COUNT_GPIO_RES:
|
||||
|
||||
/* Set resource source string length */
|
||||
|
||||
ItemCount = ACPI_GET16 (Source);
|
||||
ACPI_SET16 (Destination) = (UINT16) AmlLength;
|
||||
|
||||
/* Compute offset for the Vendor Data */
|
||||
|
||||
AmlLength = (UINT16) (AmlLength + ItemCount);
|
||||
Target = ACPI_ADD_PTR (void, Aml, Info->Value);
|
||||
ACPI_SET16 (Target) = (UINT16) AmlLength;
|
||||
|
||||
/* Set vendor offset only if there is vendor data */
|
||||
|
||||
if (Resource->Data.Gpio.VendorLength)
|
||||
{
|
||||
ACPI_SET16 (Target) = (UINT16) AmlLength;
|
||||
}
|
||||
|
||||
AcpiRsSetResourceLength (AmlLength, Aml);
|
||||
break;
|
||||
|
||||
@ -728,6 +759,8 @@ AcpiRsConvertResourceToAml (
|
||||
|
||||
case ACPI_RSC_MOVE_GPIO_RES:
|
||||
|
||||
/* Used for both ResourceSource string and VendorData */
|
||||
|
||||
Destination = (char *) ACPI_ADD_PTR (void, Aml,
|
||||
ACPI_GET16 (Destination));
|
||||
Source = * (UINT8 **) Source;
|
||||
|
@ -144,7 +144,6 @@ ACPI_RSCONVERT_INFO AcpiRsConvertGpio[17] =
|
||||
* RevisionId
|
||||
* ConnectionType
|
||||
*/
|
||||
|
||||
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Gpio.RevisionId),
|
||||
AML_OFFSET (Gpio.RevisionId),
|
||||
2},
|
||||
@ -178,7 +177,6 @@ ACPI_RSCONVERT_INFO AcpiRsConvertGpio[17] =
|
||||
* DriveStrength
|
||||
* DebounceTimeout
|
||||
*/
|
||||
|
||||
{ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.Gpio.DriveStrength),
|
||||
AML_OFFSET (Gpio.DriveStrength),
|
||||
2},
|
||||
@ -195,7 +193,7 @@ ACPI_RSCONVERT_INFO AcpiRsConvertGpio[17] =
|
||||
|
||||
/* Resource Source */
|
||||
|
||||
{ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.Gpio.ResourceSource.Index),
|
||||
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Gpio.ResourceSource.Index),
|
||||
AML_OFFSET (Gpio.ResSourceIndex),
|
||||
1},
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user