aslresource.c revision 199767f8919635c4928607450d9e0abb932109ce
/******************************************************************************
*
* Module Name: aslresource - Resource template/descriptor utilities
*
*****************************************************************************/
/*
* Copyright (C) 2000 - 2015, 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 "aslcompiler.y.h"
#define _COMPONENT ACPI_COMPILER
ACPI_MODULE_NAME ("aslresource")
/*******************************************************************************
*
* FUNCTION: RsSmallAddressCheck
*
* PARAMETERS: Minimum - Address Min value
* Maximum - Address Max value
* Length - Address range value
* Alignment - Address alignment value
* MinOp - Original Op for Address Min
* MaxOp - Original Op for Address Max
* LengthOp - Original Op for address range
* AlignOp - Original Op for address alignment. If
* NULL, means "zero value for alignment is
* OK, and means 64K alignment" (for
* Memory24 descriptor)
* Op - Parent Op for entire construct
*
* RETURN: None. Adds error messages to error log if necessary
*
* DESCRIPTION: Perform common value checks for "small" address descriptors.
* Currently:
* Io, Memory24, Memory32
*
******************************************************************************/
void
{
{
return;
}
/*
* Check for a so-called "null descriptor". These are descriptors that are
* created with most fields set to zero. The intent is that the descriptor
*
* If the descriptor does NOT have a resource tag, it cannot be referenced
* by a BufferField and we will flag this as an error. Conversely, if
* the descriptor has a resource tag, we will assume that a BufferField
* will be used to dynamically update it, so no error.
*
* A possible enhancement to this check would be to verify that in fact
* a BufferField is created using the resource tag, and perhaps even
* verify that a Store is performed to the BufferField.
*
* Note: for these descriptors, Alignment is allowed to be zero
*/
{
{
/* No resource tag. Descriptor is fixed and is also illegal */
}
return;
}
/*
* Range checks for Memory24 and Memory32.
*/
if (Type != ACPI_RESOURCE_NAME_IO)
{
{
}
{
}
if (Type == ACPI_RESOURCE_NAME_MEMORY24)
{
if (!Alignment) /* Alignment==0 means 64K alignment */
{
}
Minimum <<= 8;
Maximum <<= 8;
}
}
/* Alignment of zero is not in ACPI spec, but is used to mean byte acc */
if (!Alignment)
{
Alignment = 1;
}
/* Addresses must be an exact multiple of the alignment value */
{
}
{
}
}
/*******************************************************************************
*
* FUNCTION: RsLargeAddressCheck
*
* PARAMETERS: Minimum - Address Min value
* Maximum - Address Max value
* Length - Address range value
* Granularity - Address granularity value
* Flags - General flags for address descriptors:
* _MIF, _MAF, _DEC
* MinOp - Original Op for Address Min
* MaxOp - Original Op for Address Max
* LengthOp - Original Op for address range
* GranOp - Original Op for address granularity
* Op - Parent Op for entire construct
*
* RETURN: None. Adds error messages to error log if necessary
*
* DESCRIPTION: Perform common value checks for "large" address descriptors.
* Currently:
* WordIo, WordBusNumber, WordSpace
* DWordIo, DWordMemory, DWordSpace
* QWordIo, QWordMemory, QWordSpace
* ExtendedIo, ExtendedMemory, ExtendedSpace
*
* _MIF flag set means that the minimum address is fixed and is not relocatable
* _MAF flag set means that the maximum address is fixed and is not relocatable
* Length of zero means that the record size is variable
*
* of the ACPI 4.0a specification. Added 04/2010.
*
******************************************************************************/
void
{
{
return;
}
/*
* Check for a so-called "null descriptor". These are descriptors that are
* created with most fields set to zero. The intent is that the descriptor
*
* If the descriptor does NOT have a resource tag, it cannot be referenced
* by a BufferField and we will flag this as an error. Conversely, if
* the descriptor has a resource tag, we will assume that a BufferField
* will be used to dynamically update it, so no error.
*
* A possible enhancement to this check would be to verify that in fact
* a BufferField is created using the resource tag, and perhaps even
* verify that a Store is performed to the BufferField.
*/
{
{
/* No resource tag. Descriptor is fixed and is also illegal */
}
return;
}
{
return;
}
{
return;
}
/* If specified (non-zero), ensure granularity is a power-of-two minus one */
if (Granularity)
{
if ((Granularity + 1) &
{
return;
}
}
/*
* Check the various combinations of Length, MinFixed, and MaxFixed
*/
if (Length)
{
/* Fixed non-zero length */
{
case 0:
/*
* Fixed length, variable locations (both _MIN and _MAX).
* Length must be a multiple of granularity
*/
if (Granularity & Length)
{
}
break;
case (ACPI_RESOURCE_FLAG_MIF | ACPI_RESOURCE_FLAG_MAF):
/* Fixed length, fixed location. Granularity must be zero */
if (Granularity != 0)
{
}
{
}
break;
/* All other combinations are invalid */
case ACPI_RESOURCE_FLAG_MIF:
case ACPI_RESOURCE_FLAG_MAF:
default:
}
}
else
{
/* Variable length (length==0) */
{
case 0:
/*
* Both _MIN and _MAX are variable.
* No additional requirements, just exit
*/
break;
case ACPI_RESOURCE_FLAG_MIF:
/* _MIN is fixed. _MIN must be multiple of _GRA */
/*
* The granularity is defined by the ACPI specification to be a
* power-of-two minus one, therefore the granularity is a
* bitmask which can be used to easily validate the addresses.
*/
if (Granularity & Minimum)
{
}
break;
case ACPI_RESOURCE_FLAG_MAF:
/* _MAX is fixed. (_MAX + 1) must be multiple of _GRA */
{
}
break;
case (ACPI_RESOURCE_FLAG_MIF | ACPI_RESOURCE_FLAG_MAF):
default:
}
}
}
/*******************************************************************************
*
* FUNCTION: RsGetStringDataLength
*
* PARAMETERS: InitializerOp - Start of a subtree of init nodes
*
* RETURN: Valid string length if a string node is found (otherwise 0)
*
* DESCRIPTION: In a list of peer nodes, find the first one that contains a
* string and return the length of the string.
*
******************************************************************************/
{
while (InitializerOp)
{
{
}
}
return (0);
}
/*******************************************************************************
*
* FUNCTION: RsAllocateResourceNode
*
* PARAMETERS: Size - Size of node in bytes
*
* RETURN: The allocated node - aborts on allocation failure
*
* DESCRIPTION: Allocate a resource description node and the resource
* descriptor itself (the nodes are used to link descriptors).
*
******************************************************************************/
{
/* Allocate the node */
/* Allocate the resource descriptor itself */
return (Rnode);
}
/*******************************************************************************
*
* FUNCTION: RsCreateResourceField
*
* PARAMETERS: Op - Resource field node
* Name - Name of the field (Used only to reference
* the field in the ASL, not in the AML)
* ByteOffset - Offset from the field start
* BitOffset - Additional bit offset
* BitLength - Number of bits in the field
*
* RETURN: None, sets fields within the input node
*
* DESCRIPTION: Utility function to generate a named bit field within a
* resource descriptor. Mark a node as 1) a field in a resource
* descriptor, and 2) set the value to be a BIT offset
*
******************************************************************************/
void
char *Name,
{
}
/*******************************************************************************
*
* FUNCTION: RsSetFlagBits
*
* PARAMETERS: *Flags - Pointer to the flag byte
* Op - Flag initialization node
* Position - Bit position within the flag byte
* Default - Used if the node is DEFAULT.
*
* RETURN: Sets bits within the *Flags output byte.
*
* DESCRIPTION: Set a bit in a cumulative flags word from an initialization
* node. Will use a default value if the node is DEFAULT, meaning
* that no value was specified in the ASL. Used to merge multiple
* keywords into a single flags byte.
*
******************************************************************************/
void
{
{
/* Use the default bit */
}
else
{
/* Use the bit specified in the initialization node */
}
}
void
{
{
/* Use the default bit */
}
else
{
/* Use the bit specified in the initialization node */
}
}
/*******************************************************************************
*
* FUNCTION: RsCompleteNodeAndGetNext
*
* PARAMETERS: Op - Resource node to be completed
*
* RETURN: The next peer to the input node.
*
* DESCRIPTION: Mark the current node completed and return the next peer.
* The node ParseOpcode is set to DEFAULT_ARG, meaning that
* this node is to be ignored from now on.
*
******************************************************************************/
{
/* Mark this node unused */
/* Move on to the next peer node in the initializer list */
return (ASL_GET_PEER_NODE (Op));
}
/*******************************************************************************
*
* FUNCTION: RsCheckListForDuplicates
*
* PARAMETERS: Op - First op in the initializer list
*
* RETURN: None
*
* DESCRIPTION: Check an initializer list for duplicate values. Emits an error
* if any duplicates are found.
*
******************************************************************************/
void
{
if (!Op)
{
return;
}
/* Search list once for each value in the list */
while (NextValueOp)
{
/* Compare this value to all remaining values in the list */
while (NextOp)
{
{
/* Compare values */
{
/* Emit error only once per duplicate node */
{
}
}
}
}
}
}
/*******************************************************************************
*
* FUNCTION: RsDoOneResourceDescriptor
*
* PARAMETERS: DescriptorTypeOp - Parent parse node of the descriptor
* CurrentByteOffset - Offset in the resource descriptor
* buffer.
*
* RETURN: A valid resource node for the descriptor
*
* DESCRIPTION: Dispatches the processing of one resource descriptor
*
******************************************************************************/
{
/* Construct the resource */
{
case PARSEOP_DMA:
break;
case PARSEOP_FIXEDDMA:
break;
case PARSEOP_DWORDIO:
break;
case PARSEOP_DWORDMEMORY:
break;
case PARSEOP_DWORDSPACE:
break;
case PARSEOP_ENDDEPENDENTFN:
switch (*State)
{
case ACPI_RSTATE_NORMAL:
break;
break;
default:
break;
}
break;
case PARSEOP_ENDTAG:
break;
case PARSEOP_EXTENDEDIO:
break;
case PARSEOP_EXTENDEDMEMORY:
break;
case PARSEOP_EXTENDEDSPACE:
break;
case PARSEOP_FIXEDIO:
break;
case PARSEOP_INTERRUPT:
break;
case PARSEOP_IO:
break;
case PARSEOP_IRQ:
break;
case PARSEOP_IRQNOFLAGS:
break;
case PARSEOP_MEMORY24:
break;
case PARSEOP_MEMORY32:
break;
case PARSEOP_MEMORY32FIXED:
break;
case PARSEOP_QWORDIO:
break;
case PARSEOP_QWORDMEMORY:
break;
case PARSEOP_QWORDSPACE:
break;
case PARSEOP_REGISTER:
break;
case PARSEOP_STARTDEPENDENTFN:
switch (*State)
{
break;
case ACPI_RSTATE_NORMAL:
default:
break;
}
break;
switch (*State)
{
break;
case ACPI_RSTATE_NORMAL:
default:
break;
}
break;
case PARSEOP_VENDORLONG:
break;
case PARSEOP_VENDORSHORT:
break;
case PARSEOP_WORDBUSNUMBER:
break;
case PARSEOP_WORDIO:
break;
case PARSEOP_WORDSPACE:
break;
case PARSEOP_GPIO_INT:
break;
case PARSEOP_GPIO_IO:
break;
case PARSEOP_I2C_SERIALBUS:
break;
case PARSEOP_SPI_SERIALBUS:
break;
case PARSEOP_UART_SERIALBUS:
break;
case PARSEOP_DEFAULT_ARG:
/* Just ignore any of these, they are used as fillers/placeholders */
break;
default:
printf ("Unknown resource descriptor type [%s]\n",
break;
}
/*
* Mark original node as unused, but head of a resource descriptor.
* This allows the resource to be installed in the namespace so that
* references to the descriptor can be resolved.
*/
if (Rnode)
{
}
return (Rnode);
}
/*******************************************************************************
*
* FUNCTION: RsLinkDescriptorChain
*
* PARAMETERS: PreviousRnode - Pointer to the node that will be previous
* to the linked node, At exit, set to the
* last node in the new chain.
* Rnode - Resource node to link into the list
*
* RETURN: Cumulative buffer byte offset of the new segment of chain
*
* DESCRIPTION: Link a descriptor chain at the end of an existing chain.
*
******************************************************************************/
{
/* Anything to do? */
if (!Rnode)
{
return (0);
}
/* Point the previous node to the new node */
/* Walk to the end of the chain headed by Rnode */
{
}
/* Previous node becomes the last node in the chain */
return (CurrentByteOffset);
}
/*******************************************************************************
*
* FUNCTION: RsDoResourceTemplate
*
* PARAMETERS: Op - Parent of a resource template list
*
* RETURN: None. Sets input node to point to a list of AML code
*
* DESCRIPTION: Merge a list of resource descriptors into a single AML buffer,
* in preparation for output to the AML output file.
*
******************************************************************************/
void
{
UINT32 CurrentByteOffset = 0;
/* Mark parent as containing a resource template */
{
}
/* ResourceTemplate Opcode is first (Op) */
/* Buffer Length node is first child */
/* Buffer Op is first peer */
/* First Descriptor type is next */
/*
* Process all resource descriptors in the list
* Note: It is assumed that the EndTag node has been automatically
* inserted at the end of the template by the parser.
*/
while (DescriptorTypeOp)
{
/* Save information for optional mapfile */
{
}
else
{
}
/*
* Update current byte offset to indicate the number of bytes from the
* start of the buffer. Buffer can include multiple descriptors, we
* must keep track of the offset of not only each descriptor, but each
* element (field) within each descriptor as well.
*/
/* Get the next descriptor in the list */
}
if (State == ACPI_RSTATE_DEPENDENT_LIST)
{
if (LastOp)
{
}
}
/*
* Transform the nodes into the following
*
* Op -> AML_BUFFER_OP
* First Child -> BufferLength
* Second Child -> Descriptor Buffer (raw byte data)
*/
(void) OpcSetOptimalIntegerSize (BufferLengthOp);
return;
}