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:
Robert Moore 2011-09-14 13:48:34 -07:00 committed by Lin Ming
parent 03c8c470cc
commit 397ec63252
3 changed files with 52 additions and 10 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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},