/*******************************************************************************
*
* Module Name: rscalc - Calculate stream and list lengths
*
******************************************************************************/
/*
* Copyright (C) 2000 - 2016, Intel Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the "NO WARRANTY" disclaimer below
* ("Disclaimer") and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution.
* 3. Neither the names of the above-listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*/
#include "acpi.h"
#include "accommon.h"
#include "acresrc.h"
#include "acnamesp.h"
ACPI_MODULE_NAME ("rscalc")
/* Local prototypes */
static UINT8
static ACPI_RS_LENGTH
static UINT32
/*******************************************************************************
*
* FUNCTION: AcpiRsCountSetBits
*
* PARAMETERS: BitField - Field in which to count bits
*
* RETURN: Number of bits set within the field
*
* DESCRIPTION: Count the number of bits set in a resource field. Used for
* (Short descriptor) interrupt and DMA lists.
*
******************************************************************************/
static UINT8
{
{
/* Zero the least significant bit that is set */
}
return (BitsSet);
}
/*******************************************************************************
*
* FUNCTION: AcpiRsStructOptionLength
*
* PARAMETERS: ResourceSource - Pointer to optional descriptor field
*
* RETURN: Status
*
* DESCRIPTION: Common code to handle optional ResourceSourceIndex and
* ResourceSource fields in some Large descriptors. Used during
* list-to-stream conversion
*
******************************************************************************/
static ACPI_RS_LENGTH
{
/*
* If the ResourceSource string is valid, return the size of the string
* (StringLength includes the NULL terminator) plus the size of the
* ResourceSourceIndex (1).
*/
if (ResourceSource->StringPtr)
{
}
return (0);
}
/*******************************************************************************
*
* FUNCTION: AcpiRsStreamOptionLength
*
* PARAMETERS: ResourceLength - Length from the resource header
* MinimumTotalLength - Minimum length of this resource, before
* any optional fields. Includes header size
*
* RETURN: Length of optional string (0 if no string present)
*
* DESCRIPTION: Common code to handle optional ResourceSourceIndex and
* ResourceSource fields in some Large descriptors. Used during
* stream-to-list conversion
*
******************************************************************************/
static UINT32
{
/*
* The ResourceSourceIndex and ResourceSource are optional elements of
* some Large-type resource descriptors.
*/
/*
* If the length of the actual resource descriptor is greater than the
* ACPI spec-defined minimum length, it means that a ResourceSourceIndex
* exists and is followed by a (required) null terminated string. The
* string length (including the null terminator) is the resource length
* minus the minimum length, minus one byte for the ResourceSourceIndex
* itself.
*/
{
/* Compute the length of the optional string */
}
/*
* Round the length up to a multiple of the native word in order to
* guarantee that the entire resource descriptor is native word aligned
*/
}
/*******************************************************************************
*
* FUNCTION: AcpiRsGetAmlLength
*
* PARAMETERS: Resource - Pointer to the resource linked list
* ResourceListSize - Size of the resource linked list
* SizeNeeded - Where the required size is returned
*
* RETURN: Status
*
* DESCRIPTION: Takes a linked list of internal resource descriptors and
* calculates the size buffer needed to hold the corresponding
* external resource byte stream.
*
******************************************************************************/
{
/* Traverse entire list of internal resource descriptors */
while (Resource < ResourceEnd)
{
/* Validate the descriptor type */
{
}
/* Sanity check the length. It must not be zero, or we loop forever */
{
}
/* Get the base size of the (external stream) resource descriptor */
/*
* variable-length fields
*/
{
case ACPI_RESOURCE_TYPE_IRQ:
/* Length can be 3 or 2 */
{
TotalSize--;
}
break;
/* Length can be 1 or 0 */
{
TotalSize--;
}
break;
/*
* Vendor Defined Resource:
* For a Vendor Specific resource, if the Length is between 1 and 7
* it will be created as a Small Resource data type, otherwise it
* is a Large Resource data type.
*/
{
/* Base size of a Large resource descriptor */
TotalSize = sizeof (AML_RESOURCE_LARGE_HEADER);
}
/* Add the size of the vendor-specific data */
break;
/*
* End Tag:
* We are done -- return the accumulated total size.
*/
/* Normal exit */
/*
* 16-Bit Address Resource:
* Add the size of the optional ResourceSource info
*/
break;
/*
* 32-Bit Address Resource:
* Add the size of the optional ResourceSource info
*/
break;
/*
* 64-Bit Address Resource:
* Add the size of the optional ResourceSource info
*/
break;
/*
* Extended IRQ Resource:
* Add the size of each additional optional interrupt beyond the
* required 1 (4 bytes for each UINT32 interrupt number)
*/
/* Add the size of the optional ResourceSource info */
break;
case ACPI_RESOURCE_TYPE_GPIO:
break;
break;
default:
break;
}
/* Update the total */
/* Point to the next object */
}
/* Did not find an EndTag resource descriptor */
}
/*******************************************************************************
*
* FUNCTION: AcpiRsGetListLength
*
* PARAMETERS: AmlBuffer - Pointer to the resource byte stream
* AmlBufferLength - Size of AmlBuffer
* SizeNeeded - Where the size needed is returned
*
* RETURN: Status
*
* DESCRIPTION: Takes an external resource byte stream and calculates the size
* buffer needed to hold the corresponding internal resource
* descriptor linked list.
*
******************************************************************************/
{
/* Walk the list of AML resource descriptors */
{
/* Validate the Resource Type and Resource Length */
if (ACPI_FAILURE (Status))
{
/*
* Exit on failure. Cannot continue because the descriptor length
* may be bogus also.
*/
}
AmlResource = (void *) AmlBuffer;
/* Get the resource length and base (minimum) AML size */
/*
* Augment the size for descriptors with optional
*/
ExtraStructBytes = 0;
switch (AcpiUtGetResourceType (AmlBuffer))
{
case ACPI_RESOURCE_NAME_IRQ:
/*
* IRQ Resource:
* Get the number of bits set in the 16-bit IRQ mask
*/
break;
case ACPI_RESOURCE_NAME_DMA:
/*
* DMA Resource:
* Get the number of bits set in the 8-bit DMA mask
*/
break;
/*
* Vendor Resource:
* Get the number of vendor data bytes
*/
/*
* There is already one byte included in the minimum
* descriptor size. If there are extra struct bytes,
* subtract one from the count.
*/
if (ExtraStructBytes)
{
}
break;
/*
* End Tag: This is the normal exit
*/
/*
* Address Resource:
* Add the size of the optional ResourceSource
*/
break;
/*
* Extended IRQ Resource:
* Using the InterruptTableLength, add 4 bytes for each additional
* interrupt. Note: at least one interrupt is required and is
* included in the minimum descriptor size (reason for the -1)
*/
/* Add the size of the optional ResourceSource */
break;
case ACPI_RESOURCE_NAME_GPIO:
/* Vendor data is optional */
{
}
else
{
sizeof (AML_RESOURCE_LARGE_HEADER) -
}
break;
break;
default:
break;
}
/*
* Update the required buffer size for the internal descriptor structs
*
* Important: Round the size up for the appropriate alignment. This
* is a requirement on IA64.
*/
if (AcpiUtGetResourceType (AmlBuffer) ==
{
}
else
{
}
*SizeNeeded += BufferSize;
"Type %.2X, AmlLength %.2X InternalLength %.2X\n",
/*
* Point to the next resource within the AML stream using the length
* contained in the resource descriptor header
*/
}
/* Did not find an EndTag resource descriptor */
}
/*******************************************************************************
*
* FUNCTION: AcpiRsGetPciRoutingTableLength
*
* PARAMETERS: PackageObject - Pointer to the package object
* BufferSizeNeeded - UINT32 pointer of the size buffer
* needed to properly return the
* parsed data
*
* RETURN: Status
*
* DESCRIPTION: Given a package representing a PCI routing table, this
* calculates the size of the corresponding linked list of
* descriptions.
*
******************************************************************************/
{
/*
* Calculate the size of the return buffer.
* The base size is the number of elements * the sizes of the
* structures. Additional space for the strings is added below.
* The minus one is to subtract the size of the UINT8 Source[1]
* member because it is added below.
*
* But each PRT_ENTRY structure has a pointer to a string and
* the size of that string must be found.
*/
{
/* Dereference the subpackage */
/* We must have a valid Package object */
if (!PackageElement ||
{
}
/*
* The SubObjectList will now point to an array of the
* four IRQ elements: Address, Pin, Source and SourceIndex
*/
/* Scan the IrqTableElements for the Source Name String */
for (TableIndex = 0;
TableIndex++)
{
if (*SubObjectList && /* Null object allowed */
((ACPI_TYPE_STRING ==
{
}
else
{
/* Look at the next element */
}
}
/* Was a String type found? */
if (NameFound)
{
{
/*
* The length String.Length field does not include the
* terminating NULL, add 1
*/
TempSizeNeeded += ((ACPI_SIZE)
}
else
{
}
}
else
{
/*
* If no name was found, then this is a NULL, which is
* translated as a UINT32 zero.
*/
TempSizeNeeded += sizeof (UINT32);
}
/* Round up the size since each element must be aligned */
/* Point to the next ACPI_OPERAND_OBJECT */
}
/*
* Add an extra element to the end of the list, essentially a
* NULL terminator
*/
}