Skip to content

Commit

Permalink
DynamicTablesPkg: AcpiSsdtPcieLibArm: Create support library
Browse files Browse the repository at this point in the history
Add support library to allow for customization of _OSC and slot info.
The functions in the library are unchanged,
with the exception of adding PciInfo pointer to the APIs.

Signed-off-by: Jeff Brasen <jbrasen@nvidia.com>
Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>
Reviewed-by: Vidya Sagar <vidyas@nvidia.com>
Reviewed-by: Ashish Singhal <ashishsingha@nvidia.com>
  • Loading branch information
jbrasen authored and jgarver committed Aug 11, 2022
1 parent dcbe1f2 commit 7d82301
Show file tree
Hide file tree
Showing 11 changed files with 337 additions and 187 deletions.
1 change: 1 addition & 0 deletions DynamicTablesPkg/DynamicTables.dsc.inc
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
[LibraryClasses.common]
AcpiHelperLib|DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf
AmlLib|DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf
SsdtPcieSupportLib|DynamicTablesPkg/Library/Common/SsdtPcieSupportLib/SsdtPcieSupportLib.inf
SsdtSerialPortFixupLib|DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf
TableHelperLib|DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf

Expand Down
3 changes: 3 additions & 0 deletions DynamicTablesPkg/DynamicTablesPkg.dec
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
## @libraryclass Defines a set of APIs to a hardware information parser.
HwInfoParserLib|Include/Library/HwInfoParserLib.h

## @libraryclass Defines functions for customizing the generation of _OSC and slot info.
SsdtPcieSupportLib|Include/Library/SsdtPcieSupportLib.h

## @libraryclass Defines a set of methods for fixing up a SSDT Serial Port.
SsdtSerialPortFixupLib|Include/Library/SsdtSerialPortFixupLib.h

Expand Down
1 change: 1 addition & 0 deletions DynamicTablesPkg/DynamicTablesPkg.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
[Components.common]
DynamicTablesPkg/Library/Common/AcpiHelperLib/AcpiHelperLib.inf
DynamicTablesPkg/Library/Common/AmlLib/AmlLib.inf
DynamicTablesPkg/Library/Common/SsdtPcieSupportLib/SsdtPcieSupportLib.inf
DynamicTablesPkg/Library/Common/SsdtSerialPortFixupLib/SsdtSerialPortFixupLib.inf
DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf
DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf
Expand Down
73 changes: 73 additions & 0 deletions DynamicTablesPkg/Include/Library/SsdtPcieSupportLib.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/** @file
Ssdt PCIe Support Library
Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#ifndef SSDT_PCIE_SUPPORT_LIB_H_
#define SSDT_PCIE_SUPPORT_LIB_H_

#pragma pack(1)

/** Structure used to map integer to an index.
*/
typedef struct MappingTable {
/// Mapping table.
/// Contains the Index <-> integer mapping
UINT32 *Table;

/// Last used index of the Table.
/// Bound by MaxIndex.
UINT32 LastIndex;

/// Number of entries in the Table.
UINT32 MaxIndex;
} MAPPING_TABLE;

#pragma pack()

/** Add an _OSC template method to the PciNode.
The _OSC method is provided as an AML blob. The blob is
parsed and attached at the end of the PciNode list of variable elements.
@param [in] PciInfo Pci device information.
@param [in, out] PciNode Pci node to amend.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_INVALID_PARAMETER Invalid parameter.
@retval EFI_OUT_OF_RESOURCES Could not allocate memory.
**/
EFI_STATUS
EFIAPI
AddOscMethod (
IN CONST CM_ARM_PCI_CONFIG_SPACE_INFO *PciInfo,
IN OUT AML_OBJECT_NODE_HANDLE PciNode
);

/** Generate Pci slots devices.
PCI Firmware Specification - Revision 3.3,
s4.8 "Generic ACPI PCI Slot Description" requests to describe the PCI slot
used. It should be possible to enumerate them, but this is additional
information.
@param [in] PciInfo Pci device information.
@param [in] MappingTable The mapping table structure.
@param [in, out] PciNode Pci node to amend.
@retval EFI_SUCCESS Success.
@retval EFI_INVALID_PARAMETER Invalid parameter.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
**/
EFI_STATUS
EFIAPI
GeneratePciSlots (
IN CONST CM_ARM_PCI_CONFIG_SPACE_INFO *PciInfo,
IN CONST MAPPING_TABLE *MappingTable,
IN OUT AML_OBJECT_NODE_HANDLE PciNode
);

#endif // SSDT_PCIE_SUPPORT_LIB_H_
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <Library/AcpiHelperLib.h>
#include <Library/TableHelperLib.h>
#include <Library/AmlLib/AmlLib.h>
#include <Library/SsdtPcieSupportLib.h>
#include <Protocol/ConfigurationManagerProtocol.h>

#include "SsdtPcieGenerator.h"
Expand Down Expand Up @@ -280,86 +281,6 @@ GeneratePciDeviceInfo (
return Status;
}

/** Generate Pci slots devices.
PCI Firmware Specification - Revision 3.3,
s4.8 "Generic ACPI PCI Slot Description" requests to describe the PCI slot
used. It should be possible to enumerate them, but this is additional
information.
@param [in] MappingTable The mapping table structure.
@param [in, out] PciNode Pci node to amend.
@retval EFI_SUCCESS Success.
@retval EFI_INVALID_PARAMETER Invalid parameter.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
**/
STATIC
EFI_STATUS
EFIAPI
GeneratePciSlots (
IN CONST MAPPING_TABLE *MappingTable,
IN OUT AML_OBJECT_NODE_HANDLE PciNode
)
{
EFI_STATUS Status;
UINT32 Index;
UINT32 LastIndex;
UINT32 DeviceId;
CHAR8 AslName[AML_NAME_SEG_SIZE + 1];
AML_OBJECT_NODE_HANDLE DeviceNode;

ASSERT (MappingTable != NULL);
ASSERT (PciNode != NULL);

// Generic device name is "Dxx".
CopyMem (AslName, "Dxx_", AML_NAME_SEG_SIZE + 1);

LastIndex = MappingTable->LastIndex;

// There are at most 32 devices on a Pci bus.
if (LastIndex >= 32) {
ASSERT (0);
return EFI_INVALID_PARAMETER;
}

for (Index = 0; Index < LastIndex; Index++) {
DeviceId = MappingTable->Table[Index];
AslName[AML_NAME_SEG_SIZE - 3] = AsciiFromHex (DeviceId & 0xF);
AslName[AML_NAME_SEG_SIZE - 2] = AsciiFromHex ((DeviceId >> 4) & 0xF);

// ASL:
// Device (Dxx) {
// Name (_ADR, <address value>)
// }
Status = AmlCodeGenDevice (AslName, PciNode, &DeviceNode);
if (EFI_ERROR (Status)) {
ASSERT (0);
return Status;
}

/* ACPI 6.4 specification, Table 6.2: "ADR Object Address Encodings"
High word-Device #, Low word-Function #. (for example, device 3,
function 2 is 0x00030002). To refer to all the functions on a device #,
use a function number of FFFF).
*/
Status = AmlCodeGenNameInteger (
"_ADR",
(DeviceId << 16) | 0xFFFF,
DeviceNode,
NULL
);
if (EFI_ERROR (Status)) {
ASSERT (0);
return Status;
}

// _SUN object is not generated as we don't know which slot will be used.
}

return Status;
}

/** Generate a _PRT object (Pci Routing Table) for the Pci device.
Cf. ACPI 6.4 specification, s6.2.13 "_PRT (PCI Routing Table)"
Expand Down Expand Up @@ -495,7 +416,7 @@ GeneratePrt (
PrtNode = NULL;

// Generate the Pci slots once all the device have been added.
Status = GeneratePciSlots (&Generator->DeviceTable, PciNode);
Status = GeneratePciSlots (PciInfo, &Generator->DeviceTable, PciNode);
if (EFI_ERROR (Status)) {
ASSERT (0);
goto exit_handler;
Expand Down Expand Up @@ -695,89 +616,6 @@ GeneratePciCrs (
return Status;
}

/** Add an _OSC template method to the PciNode.
The _OSC method is provided as an AML blob. The blob is
parsed and attached at the end of the PciNode list of variable elements.
@param [in, out] PciNode Pci node to amend.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_INVALID_PARAMETER Invalid parameter.
@retval EFI_OUT_OF_RESOURCES Could not allocate memory.
**/
STATIC
EFI_STATUS
EFIAPI
AddOscMethod (
IN OUT AML_OBJECT_NODE_HANDLE PciNode
)
{
EFI_STATUS Status;
EFI_STATUS Status1;
EFI_ACPI_DESCRIPTION_HEADER *SsdtPcieOscTemplate;
AML_ROOT_NODE_HANDLE OscTemplateRoot;
AML_OBJECT_NODE_HANDLE OscNode;

ASSERT (PciNode != NULL);

// Parse the Ssdt Pci Osc Template.
SsdtPcieOscTemplate = (EFI_ACPI_DESCRIPTION_HEADER *)
ssdtpcieosctemplate_aml_code;

OscNode = NULL;
OscTemplateRoot = NULL;
Status = AmlParseDefinitionBlock (
SsdtPcieOscTemplate,
&OscTemplateRoot
);
if (EFI_ERROR (Status)) {
DEBUG ((
DEBUG_ERROR,
"ERROR: SSDT-PCI-OSC: Failed to parse SSDT PCI OSC Template."
" Status = %r\n",
Status
));
return Status;
}

Status = AmlFindNode (OscTemplateRoot, "\\_OSC", &OscNode);
if (EFI_ERROR (Status)) {
goto error_handler;
}

Status = AmlDetachNode (OscNode);
if (EFI_ERROR (Status)) {
goto error_handler;
}

Status = AmlAttachNode (PciNode, OscNode);
if (EFI_ERROR (Status)) {
// Free the detached node.
AmlDeleteTree (OscNode);
goto error_handler;
}

error_handler:
// Cleanup
Status1 = AmlDeleteTree (OscTemplateRoot);
if (EFI_ERROR (Status1)) {
DEBUG ((
DEBUG_ERROR,
"ERROR: SSDT-PCI-OSC: Failed to cleanup AML tree."
" Status = %r\n",
Status1
));
// If Status was success but we failed to delete the AML Tree
// return Status1 else return the original error code, i.e. Status.
if (!EFI_ERROR (Status)) {
return Status1;
}
}

return Status;
}

/** Generate a Pci device.
@param [in] Generator The SSDT Pci generator.
Expand Down Expand Up @@ -865,7 +703,7 @@ GeneratePciDevice (
}

// Add the template _OSC method.
Status = AddOscMethod (PciNode);
Status = AddOscMethod (PciInfo, PciNode);
ASSERT_EFI_ERROR (Status);
return Status;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,29 +36,8 @@
// _SB scope of the AML namespace.
#define SB_SCOPE "\\_SB_"

/** C array containing the compiled AML template.
This symbol is defined in the auto generated C file
containing the AML bytecode array.
*/
extern CHAR8 ssdtpcieosctemplate_aml_code[];

#pragma pack(1)

/** Structure used to map integer to an index.
*/
typedef struct MappingTable {
/// Mapping table.
/// Contains the Index <-> integer mapping
UINT32 *Table;

/// Last used index of the Table.
/// Bound by MaxIndex.
UINT32 LastIndex;

/// Number of entries in the Table.
UINT32 MaxIndex;
} MAPPING_TABLE;

/** A structure holding the Pcie generator and additional private data.
*/
typedef struct AcpiPcieGenerator {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
[Sources]
SsdtPcieGenerator.c
SsdtPcieGenerator.h
SsdtPcieOscTemplate.asl

[Packages]
DynamicTablesPkg/DynamicTablesPkg.dec
Expand All @@ -30,3 +29,4 @@
AcpiHelperLib
AmlLib
BaseLib
SsdtPcieSupportLib
Loading

0 comments on commit 7d82301

Please sign in to comment.