+++ /dev/null
-/** @file\r
-Update the _PRT and _PRW method for pci devices\r
-\r
-Copyright (c) 2013-2016 Intel Corporation.\r
-\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-\r
-**/\r
-#include "AcpiPlatform.h"\r
-\r
-PCI_DEVICE_INFO *mQNCPciInfo = NULL;\r
-\r
-/**\r
- Init Pci Device Structure\r
- @param mConfigData - Pointer of Pci Device information Structure\r
-\r
-**/\r
-VOID\r
-InitPciDeviceInfoStructure (\r
- PCI_DEVICE_SETTING *mConfigData\r
- )\r
-{\r
- //\r
- // Return 0 given that function unsupported.\r
- // Would need to parse ACPI tables and build mQNCPciInfo above\r
- // with found _PRT & _PRW methods for PCI devices.\r
- //\r
- mConfigData->PciDeviceInfoNumber = 0;\r
-}\r
-\r
-/**\r
- return Integer value.\r
-\r
- @param Data - AML data buffer\r
- @param Integer - integer value.\r
-\r
- @return Data size processed.\r
-**/\r
-UINTN\r
-SdtGetInteger (\r
- IN UINT8 *Data,\r
- OUT UINT64 *Integer\r
- )\r
-{\r
- *Integer = 0;\r
- switch (*Data) {\r
- case AML_ZERO_OP:\r
- return 1;\r
- case AML_ONE_OP:\r
- *Integer = 1;\r
- return 1;\r
- case AML_ONES_OP:\r
- *Integer = (UINTN)-1;\r
- return 1;\r
- case AML_BYTE_PREFIX:\r
- CopyMem (Integer, Data + 1, sizeof(UINT8));\r
- return 1 + sizeof(UINT8);\r
- case AML_WORD_PREFIX:\r
- CopyMem (Integer, Data + 1, sizeof(UINT16));\r
- return 1 + sizeof(UINT16);\r
- case AML_DWORD_PREFIX:\r
- CopyMem (Integer, Data + 1, sizeof(UINT32));\r
- return 1 + sizeof(UINT32);\r
- case AML_QWORD_PREFIX:\r
- CopyMem (Integer, Data + 1, sizeof(UINT64));\r
- return 1 + sizeof(UINT64);\r
- default:\r
- // Something wrong\r
- ASSERT (FALSE);\r
- return 1;\r
- }\r
-}\r
-\r
-\r
-/**\r
- Check if this handle has expected opcode.\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param Handle ACPI handle\r
- @param OpCode Expected OpCode\r
- @param SubOpCode Expected SubOpCode\r
-\r
- @retval TRUE This handle has expected opcode\r
- @retval FALSE This handle does not have expected opcode\r
-**/\r
-BOOLEAN\r
-SdtIsThisTypeObject (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE Handle,\r
- IN UINT8 OpCode,\r
- IN UINT8 SubOpCode\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ACPI_DATA_TYPE DataType;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
-\r
- Status = AcpiSdt->GetOption (Handle, 0, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);\r
-\r
- if (OpCode == AML_EXT_OP) {\r
- if (Data[1] == SubOpCode) {\r
- return TRUE;\r
- }\r
- } else {\r
- if (Data[0] == OpCode) {\r
- return TRUE;\r
- }\r
- }\r
- return FALSE;\r
-}\r
-\r
-/**\r
- Check if this handle has expected name and name value.\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param Handle ACPI handle\r
- @param Name Expected name\r
- @param Value Expected name value\r
-\r
- @retval TRUE This handle has expected name and name value.\r
- @retval FALSE This handle does not have expected name and name value.\r
-**/\r
-BOOLEAN\r
-SdtIsNameIntegerValueEqual (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE Handle,\r
- IN CHAR8 *Name,\r
- IN UINT64 Value\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ACPI_DATA_TYPE DataType;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
- UINT64 Integer;\r
-\r
- Status = AcpiSdt->GetOption (Handle, 1, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING);\r
-\r
- if (CompareMem (Data, Name, 4) != 0) {\r
- return FALSE;\r
- }\r
-\r
- //\r
- // Name match check object\r
- //\r
- Status = AcpiSdt->GetOption (Handle, 2, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Integer = 0;\r
- SdtGetInteger (Data, &Integer);\r
- if (Integer != Value) {\r
- return FALSE;\r
- }\r
-\r
- // All match\r
- return TRUE;\r
-}\r
-\r
-/**\r
- Check if this handle's children has expected name and name value.\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param ParentHandle ACPI parent handle\r
- @param Name Expected name\r
- @param Value Expected name value\r
-\r
- @retval TRUE This handle's children has expected name and name value.\r
- @retval FALSE This handle's children does not have expected name and name value.\r
-**/\r
-BOOLEAN\r
-SdtCheckNameIntegerValue (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE ParentHandle,\r
- IN CHAR8 *Name,\r
- IN UINT64 Value\r
- )\r
-{\r
- EFI_ACPI_HANDLE PreviousHandle;\r
- EFI_ACPI_HANDLE Handle;\r
- EFI_STATUS Status;\r
-\r
- Handle = NULL;\r
- while (TRUE) {\r
- PreviousHandle = Handle;\r
- Status = AcpiSdt->GetChild (ParentHandle, &Handle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- if (PreviousHandle != NULL) {\r
- Status = AcpiSdt->Close (PreviousHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- //\r
- // Done\r
- //\r
- if (Handle == NULL) {\r
- return FALSE;\r
- }\r
-\r
- //\r
- // Check this name\r
- //\r
- if (SdtIsThisTypeObject (AcpiSdt, Handle, AML_NAME_OP, 0)) {\r
- if (SdtIsNameIntegerValueEqual (AcpiSdt, Handle, Name, Value)) {\r
- return TRUE;\r
- }\r
- }\r
- }\r
-\r
- //\r
- // Should not run here\r
- //\r
-}\r
-\r
-/**\r
- Convert the pci address from VPD (bus,dev,fun) into the address that acpi table\r
- can recognize.\r
-\r
- @param PciAddress Pci address from VPD\r
-\r
- @retval return the address that acpi table can recognize\r
-**/\r
-UINT32\r
-SdtConvertToAcpiPciAdress (\r
- IN UINT32 PciAddress\r
- )\r
-{\r
- UINT32 ReturnAddress;\r
-\r
- ReturnAddress = ((PciAddress & 0x0000FF00) << 8) | (PciAddress & 0x000000FF);\r
-\r
- if ((PciAddress & 0x000000FF) == 0x000000FF)\r
- ReturnAddress |= 0x0000FFFF;\r
-\r
- return ReturnAddress;\r
-}\r
-\r
-/**\r
- return AML NameString size.\r
-\r
- @param Buffer - AML name string\r
-\r
- @return AML name string size\r
-**/\r
-UINTN\r
-SdtGetNameStringSize (\r
- IN UINT8 *Buffer\r
- )\r
-{\r
- UINTN SegCount;\r
- UINTN Length;\r
-\r
- Length = 0;\r
-\r
- //\r
- // Parse root or prefix\r
- //\r
- if (*Buffer == AML_ROOT_CHAR) {\r
- //\r
- // RootChar\r
- //\r
- Buffer ++;\r
- Length ++;\r
- } else if (*Buffer == AML_PARENT_PREFIX_CHAR) {\r
- //\r
- // ParentPrefixChar\r
- //\r
- Buffer ++;\r
- Length ++;\r
- while (*Buffer == AML_PARENT_PREFIX_CHAR) {\r
- Buffer ++;\r
- Length ++;\r
- }\r
- }\r
-\r
- //\r
- // Parse name segment\r
- //\r
- if (*Buffer == AML_DUAL_NAME_PREFIX) {\r
- //\r
- // DualName\r
- //\r
- Buffer ++;\r
- Length ++;\r
- SegCount = 2;\r
- } else if (*Buffer == AML_MULTI_NAME_PREFIX) {\r
- //\r
- // MultiName\r
- //\r
- Buffer ++;\r
- Length ++;\r
- SegCount = *Buffer;\r
- Buffer ++;\r
- Length ++;\r
- } else if (*Buffer == 0) {\r
- //\r
- // NULL Name\r
- //\r
- SegCount = 0;\r
- Length ++;\r
- } else {\r
- //\r
- // NameSeg\r
- //\r
- SegCount = 1;\r
- }\r
-\r
- Buffer += 4 * SegCount;\r
- Length += 4 * SegCount;\r
-\r
- return Length;\r
-}\r
-\r
-/**\r
- The routine to check if this device is PCI root bridge.\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param DeviceHandle ACPI device handle\r
- @param Context Context info - not used here\r
-\r
- @retval TRUE This is PCI root bridge\r
- @retval FALSE This is not PCI root bridge\r
-**/\r
-BOOLEAN\r
-SdtFindRootBridgeHandle (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE CheckHandle,\r
- IN VOID *Context\r
- )\r
-{\r
- BOOLEAN Result;\r
- EFI_ACPI_DATA_TYPE DataType;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
- EFI_STATUS Status;\r
-\r
- if (!SdtIsThisTypeObject (AcpiSdt, CheckHandle, AML_EXT_OP, AML_EXT_DEVICE_OP))\r
- return FALSE;\r
-\r
- Result = SdtCheckNameIntegerValue (AcpiSdt,CheckHandle, "_HID", (UINT64)0x080AD041); // PNP0A08\r
- if (!Result) {\r
- Result = SdtCheckNameIntegerValue (AcpiSdt, CheckHandle, "_CID", (UINT64)0x030AD041); // PNP0A03\r
- if (!Result) {\r
- return Result;\r
- }\r
- }\r
-\r
- //\r
- // Found\r
- //\r
- Status = AcpiSdt->GetOption (CheckHandle, 1, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING);\r
-\r
- return Result;\r
-}\r
-\r
-\r
-/**\r
- The routine to check if this device is wanted.\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param DeviceHandle ACPI device handle\r
- @param Context Context info - not used here\r
-\r
- @retval TRUE This is PCI device wanted\r
- @retval FALSE This is not PCI device wanted\r
-**/\r
-BOOLEAN\r
-SdtFindPciDeviceHandle (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE CheckHandle,\r
- IN VOID *Context\r
- )\r
-{\r
- BOOLEAN Result;\r
- EFI_ACPI_DATA_TYPE DataType;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
- EFI_STATUS Status;\r
-\r
- if (!SdtIsThisTypeObject (AcpiSdt, CheckHandle, AML_EXT_OP, AML_EXT_DEVICE_OP))\r
- return FALSE;\r
-\r
- Result = SdtCheckNameIntegerValue (AcpiSdt,CheckHandle, "_ADR", (UINT64)*(UINT32 *)Context);\r
- if (!Result) {\r
- return Result;\r
- }\r
-\r
- //\r
- // Found\r
- //\r
- Status = AcpiSdt->GetOption (CheckHandle, 1, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING);\r
-\r
- return Result;\r
-}\r
-\r
-/**\r
- Go through the parent handle and find the handle which pass CheckHandleInfo.\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param ParentHandle ACPI parent handle\r
- @param CheckHandleInfo The callback routine to check if this handle meet the requirement\r
- @param Context The context of CheckHandleInfo\r
-\r
- @return the handle which is first one can pass CheckHandleInfo.\r
-**/\r
-EFI_ACPI_HANDLE\r
-SdtGetHandleByScanAllChilds (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE ParentHandle,\r
- IN CHECK_HANDLE_INFO CheckHandleInfo,\r
- IN VOID *Context\r
- )\r
-{\r
- EFI_ACPI_HANDLE PreviousHandle;\r
- EFI_ACPI_HANDLE Handle;\r
- EFI_STATUS Status;\r
- EFI_ACPI_HANDLE ReturnHandle;\r
-\r
- //\r
- // Use deep first algo to enumerate all ACPI object\r
- //\r
- Handle = NULL;\r
- while (TRUE) {\r
- PreviousHandle = Handle;\r
- Status = AcpiSdt->GetChild (ParentHandle, &Handle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- if (PreviousHandle != NULL) {\r
- Status = AcpiSdt->Close (PreviousHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- //\r
- // Done\r
- //\r
- if (Handle == NULL) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Check this handle\r
- //\r
- if (CheckHandleInfo (AcpiSdt, Handle, Context)) {\r
- return Handle;\r
- }\r
-\r
- //\r
- // Enumerate\r
- //\r
- ReturnHandle = SdtGetHandleByScanAllChilds (AcpiSdt, Handle, CheckHandleInfo, Context);\r
- if (ReturnHandle != NULL) {\r
- return ReturnHandle;\r
- }\r
- }\r
-\r
- //\r
- // Should not run here\r
- //\r
-}\r
-\r
-\r
-/**\r
- Check whether the INTx package is matched\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param INTxPkgHandle ACPI INTx package handle\r
- @param PciAddress Acpi pci address\r
- @param INTx Index of INTx pin\r
- @param IsAPIC Tell whether the returned INTx package is for APIC or not\r
-\r
- @retval TRUE the INTx package is matched\r
- @retval FALSE the INTx package is not matched\r
-\r
-**/\r
-BOOLEAN\r
-SdtCheckINTxPkgIsMatch (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE INTxPkgHandle,\r
- IN UINT32 PciAddress,\r
- IN UINT8 INTx,\r
- IN BOOLEAN *IsAPIC\r
- )\r
-{\r
- EFI_ACPI_HANDLE PreviousHandle;\r
- EFI_STATUS Status;\r
- EFI_ACPI_HANDLE MemberHandle;\r
- EFI_ACPI_DATA_TYPE DataType;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
- UINT64 CurrentPciAddress;\r
- UINT64 CurrentINTx;\r
- UINTN ChildSize;\r
-\r
-\r
- //\r
- // Check the pci address\r
- //\r
- MemberHandle = NULL;\r
- Status = AcpiSdt->GetChild (INTxPkgHandle, &MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (MemberHandle != NULL);\r
-\r
- Status = AcpiSdt->GetOption (MemberHandle, 0, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);\r
-\r
- CurrentPciAddress = 0;\r
- SdtGetInteger (Data, &CurrentPciAddress);\r
-\r
- if (CurrentPciAddress != PciAddress) {\r
-\r
- Status = AcpiSdt->Close (MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- return FALSE;\r
- }\r
-\r
- //\r
- // Check the pci interrupt pin\r
- //\r
- PreviousHandle = MemberHandle;\r
- Status = AcpiSdt->GetChild (INTxPkgHandle, &MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (MemberHandle != NULL);\r
-\r
- if (PreviousHandle != NULL) {\r
- Status = AcpiSdt->Close (PreviousHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- Status = AcpiSdt->GetOption (MemberHandle, 0, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);\r
-\r
- CurrentINTx = 0;\r
- ChildSize = SdtGetInteger (Data, &CurrentINTx);\r
-\r
- Status = AcpiSdt->Close (MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- if (CurrentINTx != INTx)\r
- return FALSE;\r
-\r
- Data += ChildSize;\r
-\r
- if (*Data == AML_BYTE_PREFIX)\r
- Data += 1;\r
-\r
- //\r
- // Check the pci interrupt source\r
- //\r
- if (*Data != 0)\r
- *IsAPIC = FALSE;\r
- else\r
- *IsAPIC = TRUE;\r
-\r
- return TRUE;\r
-}\r
-\r
-\r
-\r
-\r
-/**\r
- Get the wanted INTx package inside the parent package\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param ParentPkgHandle ACPI parent package handle\r
- @param PciAddress Acpi pci address\r
- @param INTx Index of INTx pin\r
- @param INTxPkgHandle ACPI INTx package handle\r
- @param IsAPIC Tell whether the returned INTx package is for APIC or not\r
-\r
-**/\r
-VOID\r
-SdtGetINTxPkgHandle (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE ParentPkgHandle,\r
- IN UINT32 PciAddress,\r
- IN UINT8 INTx,\r
- IN EFI_ACPI_HANDLE *INTxPkgHandle,\r
- IN BOOLEAN *IsAPIC\r
- )\r
-{\r
- EFI_ACPI_HANDLE PreviousHandle;\r
- EFI_STATUS Status;\r
- EFI_ACPI_HANDLE ChildPkgHandle;\r
-\r
- ChildPkgHandle = NULL;\r
- while (TRUE) {\r
- PreviousHandle = ChildPkgHandle;\r
- Status = AcpiSdt->GetChild (ParentPkgHandle, &ChildPkgHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- if (PreviousHandle != NULL) {\r
- Status = AcpiSdt->Close (PreviousHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- if (ChildPkgHandle == NULL) {\r
- break;\r
- }\r
-\r
- if (SdtCheckINTxPkgIsMatch(AcpiSdt, ChildPkgHandle, PciAddress, INTx, IsAPIC)) {\r
- *INTxPkgHandle = ChildPkgHandle;\r
- return;\r
- }\r
- }\r
-\r
- return;\r
-}\r
-\r
-/**\r
- Update the INTx package with the correct pirq value\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param INTxPkgHandle ACPI INTx package handle\r
- @param PirqValue Correct pirq value\r
- @param IsAPIC Tell whether the INTx package is for APIC or not\r
-\r
-**/\r
-VOID\r
-SdtUpdateINTxPkg (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE INTxPkgHandle,\r
- IN UINT8 PirqValue,\r
- IN BOOLEAN IsAPIC\r
- )\r
-{\r
- EFI_ACPI_HANDLE PreviousHandle;\r
- EFI_STATUS Status;\r
- EFI_ACPI_HANDLE MemberHandle;\r
- EFI_ACPI_DATA_TYPE DataType;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
- UINT64 TempValue;\r
- UINTN ChildSize;\r
-\r
-\r
- //\r
- // Check the pci address\r
- //\r
- MemberHandle = NULL;\r
- Status = AcpiSdt->GetChild (INTxPkgHandle, &MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (MemberHandle != NULL);\r
-\r
- //\r
- // Check the pci interrupt pin\r
- //\r
- PreviousHandle = MemberHandle;\r
- Status = AcpiSdt->GetChild (INTxPkgHandle, &MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (MemberHandle != NULL);\r
-\r
- if (PreviousHandle != NULL) {\r
- Status = AcpiSdt->Close (PreviousHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- Status = AcpiSdt->GetOption (MemberHandle, 0, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);\r
-\r
- ChildSize = SdtGetInteger (Data, &TempValue);\r
-\r
- Status = AcpiSdt->Close (MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Data += ChildSize;\r
-\r
- //\r
- // update the pci interrupt source or source index\r
- //\r
- if (!IsAPIC) {\r
- ChildSize = SdtGetNameStringSize (Data);\r
- Data += (ChildSize - 1);\r
-\r
- PirqValue += 0x40; // change to ascii char\r
- if (*Data != PirqValue)\r
- *Data = PirqValue;\r
- } else {\r
-\r
- ChildSize = SdtGetInteger (Data, &TempValue);\r
- Data += ChildSize;\r
-\r
- Data += 1;\r
-\r
- if (*Data != PirqValue)\r
- *Data = PirqValue;\r
- }\r
-}\r
-\r
-/**\r
- Check every child package inside this interested parent package for update PRT\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param ParentPkgHandle ACPI parent package handle\r
- @param PciDeviceInfo Pointer to PCI_DEVICE_INFO\r
-\r
-**/\r
-VOID\r
-SdtCheckParentPackage (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE ParentPkgHandle,\r
- IN PCI_DEVICE_INFO *PciDeviceInfo\r
- )\r
-{\r
- EFI_ACPI_HANDLE INTAPkgHandle;\r
- EFI_ACPI_HANDLE INTBPkgHandle;\r
- EFI_ACPI_HANDLE INTCPkgHandle;\r
- EFI_ACPI_HANDLE INTDPkgHandle;\r
- UINT32 PciAddress = 0;\r
- BOOLEAN IsAllFunctions = FALSE;\r
- UINT8 IsAPIC = 0;\r
- EFI_STATUS Status;\r
-\r
- INTAPkgHandle = INTBPkgHandle = INTCPkgHandle = INTDPkgHandle = NULL;\r
-\r
- PciAddress = SdtConvertToAcpiPciAdress(PciDeviceInfo->DeviceAddress);\r
-\r
- if ((PciAddress & 0xFFFF) == 0xFFFF) {\r
- IsAllFunctions = TRUE;\r
- } else {\r
- IsAllFunctions = FALSE;\r
- PciAddress = (PciAddress | 0xFFFF);\r
- }\r
-\r
- SdtGetINTxPkgHandle (AcpiSdt, ParentPkgHandle, PciAddress, 0, &INTAPkgHandle, (BOOLEAN *)&IsAPIC);\r
- SdtGetINTxPkgHandle (AcpiSdt, ParentPkgHandle, PciAddress, 1, &INTBPkgHandle, (BOOLEAN *)&IsAPIC);\r
- SdtGetINTxPkgHandle (AcpiSdt, ParentPkgHandle, PciAddress, 2, &INTCPkgHandle, (BOOLEAN *)&IsAPIC);\r
- SdtGetINTxPkgHandle (AcpiSdt, ParentPkgHandle, PciAddress, 3, &INTDPkgHandle, (BOOLEAN *)&IsAPIC);\r
-\r
- //\r
- // Check INTA\r
- //\r
- if ((PciDeviceInfo->INTA[IsAPIC] != 0xFF) && (INTAPkgHandle != NULL)) {\r
- //\r
- // Find INTA package and there is valid INTA update item, update it\r
- //\r
- SdtUpdateINTxPkg (AcpiSdt, INTAPkgHandle, (PciDeviceInfo->INTA[IsAPIC]), IsAPIC);\r
- } else if ((PciDeviceInfo->INTA[IsAPIC] != 0xFF) && (INTAPkgHandle == NULL)) {\r
- //\r
- // There is valid INTA update item, but no INA package exist, should add it\r
- //\r
- DEBUG ((EFI_D_ERROR, "\n\nShould add INTA item for this device(0x%x)\n\n", PciAddress));\r
-\r
- } else if ((PciDeviceInfo->INTA[IsAPIC] == 0xFF) && (INTAPkgHandle != NULL) && IsAllFunctions) {\r
- //\r
- // For all functions senario, if there is invalid INTA update item, but INTA package does exist, should delete it\r
- //\r
- DEBUG ((EFI_D_ERROR, "\n\nShould remove INTA item for this device(0x%x)\n\n", PciAddress));\r
-\r
- }\r
-\r
- //\r
- // Check INTB\r
- //\r
- if ((PciDeviceInfo->INTB[IsAPIC] != 0xFF) && (INTBPkgHandle != NULL)) {\r
- //\r
- // Find INTB package and there is valid INTB update item, update it\r
- //\r
- SdtUpdateINTxPkg (AcpiSdt, INTBPkgHandle, (PciDeviceInfo->INTB[IsAPIC]), IsAPIC);\r
- } else if ((PciDeviceInfo->INTB[IsAPIC] != 0xFF) && (INTBPkgHandle == NULL)) {\r
- //\r
- // There is valid INTB update item, but no INTB package exist, should add it\r
- //\r
- DEBUG ((EFI_D_ERROR, "\n\nShould add INTB item for this device(0x%x)\n\n", PciAddress));\r
-\r
- } else if ((PciDeviceInfo->INTB[IsAPIC] == 0xFF) && (INTBPkgHandle != NULL) && IsAllFunctions) {\r
- //\r
- // For all functions senario, if there is invalid INTB update item, but INTB package does exist, should delete it\r
- //\r
- DEBUG ((EFI_D_ERROR, "\n\nShould remove INTB item for this device(0x%x)\n\n", PciAddress));\r
-\r
- }\r
-\r
- //\r
- // Check INTC\r
- //\r
- if ((PciDeviceInfo->INTC[IsAPIC] != 0xFF) && (INTCPkgHandle != NULL)) {\r
- //\r
- // Find INTC package and there is valid INTC update item, update it\r
- //\r
- SdtUpdateINTxPkg (AcpiSdt, INTCPkgHandle, (PciDeviceInfo->INTC[IsAPIC]), IsAPIC);\r
- } else if ((PciDeviceInfo->INTC[IsAPIC] != 0xFF) && (INTCPkgHandle == NULL)) {\r
- //\r
- // There is valid INTC update item, but no INTC package exist, should add it\r
- //\r
- DEBUG ((EFI_D_ERROR, "\n\nShould add INTC item for this device(0x%x)\n\n", PciAddress));\r
-\r
- } else if ((PciDeviceInfo->INTC[IsAPIC] == 0xFF) && (INTCPkgHandle != NULL) && IsAllFunctions) {\r
- //\r
- // For all functions senario, if there is invalid INTC update item, but INTC package does exist, should delete it\r
- //\r
- DEBUG ((EFI_D_ERROR, "\n\nShould remove INTC item for this device(0x%x)\n\n", PciAddress));\r
- }\r
-\r
- //\r
- // Check INTD\r
- //\r
- if ((PciDeviceInfo->INTD[IsAPIC] != 0xFF) && (INTDPkgHandle != NULL)) {\r
- //\r
- // Find INTD package and there is valid INTD update item, update it\r
- //\r
- SdtUpdateINTxPkg (AcpiSdt, INTDPkgHandle, (PciDeviceInfo->INTD[IsAPIC]), IsAPIC);\r
- } else if ((PciDeviceInfo->INTD[IsAPIC] != 0xFF) && (INTDPkgHandle == NULL)) {\r
- //\r
- // There is valid INTD update item, but no INTD package exist, should add it\r
- //\r
- DEBUG ((EFI_D_ERROR, "\n\nShould add INTD item for this device(0x%x)\n\n", PciAddress));\r
-\r
- } else if ((PciDeviceInfo->INTD[IsAPIC] == 0xFF) && (INTDPkgHandle != NULL) && IsAllFunctions) {\r
- //\r
- // For all functions senario, if there is invalid INTD update item, but INTD package does exist, should delete it\r
- //\r
- DEBUG ((EFI_D_ERROR, "\n\nShould remove INTD item for this device(0x%x)\n\n", PciAddress));\r
- }\r
-\r
-\r
- if (INTAPkgHandle != NULL) {\r
- Status = AcpiSdt->Close (INTAPkgHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- if (INTBPkgHandle != NULL) {\r
- Status = AcpiSdt->Close (INTBPkgHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- if (INTCPkgHandle != NULL) {\r
- Status = AcpiSdt->Close (INTCPkgHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- if (INTDPkgHandle != NULL) {\r
- Status = AcpiSdt->Close (INTDPkgHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- return;\r
-}\r
-\r
-/**\r
- Check every return package for update PRT\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param ParentHandle ACPI pci device handle\r
- @param PciDeviceInfo Pointer to PCI_DEVICE_INFO\r
-\r
-**/\r
-VOID\r
-SdtCheckReturnPackage (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE MethodHandle,\r
- IN PCI_DEVICE_INFO *PciDeviceInfo\r
- )\r
-{\r
- EFI_ACPI_HANDLE PreviousHandle;\r
- EFI_ACPI_HANDLE ReturnHandle;\r
- EFI_ACPI_HANDLE PackageHandle;\r
- EFI_ACPI_HANDLE NamePkgHandle;\r
- EFI_STATUS Status;\r
- EFI_ACPI_DATA_TYPE DataType;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
- CHAR8 NameStr[128];\r
-\r
- ReturnHandle = NULL;\r
- while (TRUE) {\r
- PreviousHandle = ReturnHandle;\r
- Status = AcpiSdt->GetChild (MethodHandle, &ReturnHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- if (PreviousHandle != NULL) {\r
- Status = AcpiSdt->Close (PreviousHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- if (ReturnHandle == NULL) {\r
- break;\r
- }\r
-\r
- Status = AcpiSdt->GetOption (ReturnHandle, 0, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);\r
-\r
- if (*Data == AML_RETURN_OP) {\r
- //\r
- // Find the return method handle, then look for the returned package data\r
- //\r
- Status = AcpiSdt->GetOption (ReturnHandle, 1, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
-\r
- if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) {\r
- ZeroMem (NameStr, 128);\r
- AsciiStrCpy (NameStr, "\\_SB.");\r
- DataSize = SdtGetNameStringSize (Data);\r
- AsciiStrnCat (NameStr, (CHAR8 *)Data, DataSize);\r
-\r
- NamePkgHandle = NULL;\r
- Status = AcpiSdt->FindPath (mDsdtHandle, NameStr, &NamePkgHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (NamePkgHandle != NULL);\r
-\r
- Status = AcpiSdt->GetOption (NamePkgHandle, 0, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);\r
- ASSERT (*Data == AML_NAME_OP);\r
-\r
- Status = AcpiSdt->GetOption (NamePkgHandle, 2, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_CHILD);\r
- }\r
-\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_CHILD);\r
-\r
- //\r
- // Get the parent package handle\r
- //\r
- PackageHandle = NULL;\r
- Status = AcpiSdt->Open (Data, &PackageHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Check the parent package for update pci routing\r
- //\r
- SdtCheckParentPackage (AcpiSdt, PackageHandle, PciDeviceInfo);\r
-\r
- Status = AcpiSdt->Close (PackageHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Status = AcpiSdt->Close (ReturnHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- break;\r
- }\r
-\r
- //\r
- // Not ReturnOp, search it as parent\r
- //\r
- SdtCheckReturnPackage (AcpiSdt, ReturnHandle, PciDeviceInfo);\r
- }\r
-\r
- //\r
- // Done\r
- //\r
- return;\r
-\r
-}\r
-\r
-/**\r
- update interrupt info inside the PRT method for the given pci device handle\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param PciHandle ACPI pci device handle\r
- @param PciDeviceInfo Pointer to PCI_DEVICE_INFO\r
-\r
-**/\r
-EFI_STATUS\r
-SdtUpdatePrtMethod (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE PciHandle,\r
- IN PCI_DEVICE_INFO *PciDeviceInfo\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ACPI_HANDLE PrtMethodHandle;\r
-\r
- //\r
- // Find the PRT method under this pci device\r
- //\r
- PrtMethodHandle = NULL;\r
- Status = AcpiSdt->FindPath (PciHandle, "_PRT", &PrtMethodHandle);\r
-\r
- if (EFI_ERROR (Status)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (PrtMethodHandle == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- SdtCheckReturnPackage(AcpiSdt, PrtMethodHandle, PciDeviceInfo);\r
-\r
- Status = AcpiSdt->Close (PrtMethodHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Update the package inside name op with correct wakeup resources\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param InPkgHandle ACPI inside package handle\r
- @param GPEPin Correct gpe pin\r
- @param SxNum Correct system state the device can wake up from\r
-\r
-**/\r
-VOID\r
-SdtUpdatePackageInName (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE INTxPkgHandle,\r
- IN UINT8 GPEPin,\r
- IN UINT8 SxNum\r
- )\r
-{\r
- EFI_ACPI_HANDLE PreviousHandle;\r
- EFI_STATUS Status;\r
- EFI_ACPI_HANDLE MemberHandle;\r
- EFI_ACPI_DATA_TYPE DataType;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
-\r
- //\r
- // Check the gpe pin\r
- //\r
- MemberHandle = NULL;\r
- Status = AcpiSdt->GetChild (INTxPkgHandle, &MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (MemberHandle != NULL);\r
-\r
- Status = AcpiSdt->GetOption (MemberHandle, 0, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);\r
-\r
- //\r
- // Skip byte prefix\r
- //\r
- Data += 1;\r
-\r
- if (*Data != GPEPin) {\r
-\r
- *Data = GPEPin;\r
- }\r
-\r
- //\r
- // Check the sx number\r
- //\r
- PreviousHandle = MemberHandle;\r
- Status = AcpiSdt->GetChild (INTxPkgHandle, &MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (MemberHandle != NULL);\r
-\r
- if (PreviousHandle != NULL) {\r
- Status = AcpiSdt->Close (PreviousHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- Status = AcpiSdt->GetOption (MemberHandle, 0, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);\r
-\r
- //\r
- // Skip byte prefix\r
- //\r
- Data += 1;\r
-\r
- if (*Data != SxNum) {\r
-\r
- *Data = SxNum;\r
- }\r
-\r
- Status = AcpiSdt->Close (MemberHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
-}\r
-\r
-/**\r
- Check the name package belonged to PRW\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param PrwPkgHandle ACPI PRW package handle\r
- @param PciDeviceInfo Pointer to PCI_DEVICE_INFO\r
-\r
-**/\r
-VOID\r
-SdtCheckNamePackage (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE PrwPkgHandle,\r
- IN PCI_DEVICE_INFO *PciDeviceInfo\r
- )\r
-{\r
- EFI_ACPI_HANDLE InPkgHandle;\r
- EFI_STATUS Status;\r
- EFI_ACPI_DATA_TYPE DataType;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
-\r
- Status = AcpiSdt->GetOption (PrwPkgHandle, 0, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_OPCODE);\r
- ASSERT (*Data == AML_NAME_OP);\r
-\r
- Status = AcpiSdt->GetOption (PrwPkgHandle, 2, &DataType, (CONST VOID **)&Data, &DataSize);\r
- ASSERT_EFI_ERROR (Status);\r
- ASSERT (DataType == EFI_ACPI_DATA_TYPE_CHILD);\r
-\r
- //\r
- // Get the inside package handle\r
- //\r
- InPkgHandle = NULL;\r
- Status = AcpiSdt->Open (Data, &InPkgHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // update the package in name op for wakeup info\r
- //\r
- if ((PciDeviceInfo->GPEPin != 0xFF) && (PciDeviceInfo->SxNum != 0xFF))\r
- SdtUpdatePackageInName (AcpiSdt, InPkgHandle, PciDeviceInfo->GPEPin, PciDeviceInfo->SxNum);\r
-\r
- Status = AcpiSdt->Close (InPkgHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return;\r
-\r
-}\r
-\r
-/**\r
- update wakeup info inside the PRW method for the given pci device handle\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param PciHandle ACPI pci device handle\r
- @param PciDeviceInfo Pointer to PCI_DEVICE_INFO\r
-\r
-**/\r
-EFI_STATUS\r
-SdtUpdatePrwPackage (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE PciHandle,\r
- IN PCI_DEVICE_INFO *PciDeviceInfo\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ACPI_HANDLE PrwPkgHandle;\r
-\r
- //\r
- // Find the PRT method under this pci device\r
- //\r
- PrwPkgHandle = NULL;\r
- Status = AcpiSdt->FindPath (PciHandle, "_PRW", &PrwPkgHandle);\r
-\r
- if (EFI_ERROR (Status)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (PrwPkgHandle == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- SdtCheckNamePackage(AcpiSdt, PrwPkgHandle, PciDeviceInfo);\r
-\r
- Status = AcpiSdt->Close (PrwPkgHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- update pci routing information in acpi table based on pcd settings\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param PciRootHandle ACPI root bridge handle\r
- @param PciDeviceInfo Pointer to PCI_DEVICE_INFO\r
-\r
-**/\r
-EFI_STATUS\r
-SdtUpdatePciRouting (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE PciRootHandle,\r
- IN PCI_DEVICE_INFO *PciDeviceInfo\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ACPI_HANDLE PciBridgeHandle;\r
- UINT32 PciAddress;\r
-\r
-\r
- PciBridgeHandle = NULL;\r
- if (PciDeviceInfo->BridgeAddress == 0x00000000) {\r
- //\r
- // Its bridge is the host root bridge\r
- //\r
- PciBridgeHandle = PciRootHandle;\r
-\r
- } else {\r
-\r
- //\r
- // Its bridge is just a pci device under the host bridge\r
- //\r
-\r
- //\r
- // Conver the bridge address into one that acpi table can recognize\r
- //\r
- PciAddress = SdtConvertToAcpiPciAdress (PciDeviceInfo->BridgeAddress);\r
-\r
- //\r
- // Scan the whole table to find the pci device\r
- //\r
- PciBridgeHandle = SdtGetHandleByScanAllChilds(AcpiSdt, PciRootHandle, SdtFindPciDeviceHandle, &PciAddress);\r
- if (PciBridgeHandle == NULL) {\r
-\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- }\r
-\r
- Status = SdtUpdatePrtMethod(AcpiSdt, PciBridgeHandle, PciDeviceInfo);\r
-\r
- if (PciDeviceInfo->BridgeAddress != 0x00000000) {\r
- Status = AcpiSdt->Close (PciBridgeHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- update power resource wake up information in acpi table based on pcd settings\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param PciRootHandle ACPI root bridge handle\r
- @param PciDeviceInfo Pointer to PCI_DEVICE_INFO\r
-\r
-**/\r
-EFI_STATUS\r
-SdtUpdatePowerWake (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE PciRootHandle,\r
- IN PCI_DEVICE_INFO *PciDeviceInfo\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ACPI_HANDLE PciBridgeHandle;\r
- EFI_ACPI_HANDLE PciDeviceHandle;\r
- UINT32 PciAddress;\r
-\r
- PciBridgeHandle = NULL;\r
- if (PciDeviceInfo->BridgeAddress == 0x00000000) {\r
- //\r
- // Its bridge is the host root bridge\r
- //\r
- PciBridgeHandle = PciRootHandle;\r
-\r
- } else {\r
-\r
- //\r
- // Its bridge is just a pci device under the host bridge\r
- //\r
-\r
- //\r
- // Conver the bridge address into one that acpi table can recognize\r
- //\r
- PciAddress = SdtConvertToAcpiPciAdress (PciDeviceInfo->BridgeAddress);\r
-\r
- //\r
- // Scan the whole table to find the pci device\r
- //\r
- PciBridgeHandle = SdtGetHandleByScanAllChilds(AcpiSdt, PciRootHandle, SdtFindPciDeviceHandle, &PciAddress);\r
-\r
- if (PciBridgeHandle == NULL) {\r
-\r
- Status = AcpiSdt->Close (PciRootHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- }\r
-\r
- PciDeviceHandle = NULL;\r
-\r
- //\r
- // Conver the device address into one that acpi table can recognize\r
- //\r
- PciAddress = SdtConvertToAcpiPciAdress (PciDeviceInfo->DeviceAddress);\r
-\r
- //\r
- // Scan the whole table to find the pci device\r
- //\r
- PciDeviceHandle = SdtGetHandleByScanAllChilds(AcpiSdt, PciBridgeHandle, SdtFindPciDeviceHandle, &PciAddress);\r
-\r
- if (PciDeviceHandle == NULL) {\r
- if (PciDeviceInfo->BridgeAddress != 0x00000000) {\r
- Status = AcpiSdt->Close (PciBridgeHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Status = SdtUpdatePrwPackage(AcpiSdt, PciDeviceHandle, PciDeviceInfo);\r
-\r
- Status = AcpiSdt->Close (PciDeviceHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- if (PciDeviceInfo->BridgeAddress != 0x00000000) {\r
- Status = AcpiSdt->Close (PciBridgeHandle);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Get the root bridge handle by scanning the acpi table\r
-\r
- @param AcpiSdt Pointer to Acpi SDT protocol\r
- @param DsdtHandle ACPI root handle\r
-\r
- @retval EFI_ACPI_HANDLE the handle of the root bridge\r
-**/\r
-EFI_ACPI_HANDLE\r
-SdtGetRootBridgeHandle (\r
- IN EFI_ACPI_SDT_PROTOCOL *AcpiSdt,\r
- IN EFI_ACPI_HANDLE DsdtHandle\r
- )\r
-{\r
- EFI_ACPI_HANDLE PciRootHandle;\r
-\r
- //\r
- // Scan the whole table to find the root bridge\r
- //\r
- PciRootHandle = NULL;\r
- PciRootHandle = SdtGetHandleByScanAllChilds(AcpiSdt, DsdtHandle, SdtFindRootBridgeHandle, NULL);\r
- ASSERT (PciRootHandle != NULL);\r
-\r
- return PciRootHandle;\r
-}\r
-\r
-\r
-/**\r
- Check input Pci device info is changed from the default values\r
- @param PciDeviceInfo Pointer to PCI_DEVICE_INFO\r
- @param UpdatePRT Pointer to BOOLEAN\r
- @param UpdatePRW Pointer to BOOLEAN\r
-\r
-**/\r
-VOID\r
-SdtCheckPciDeviceInfoChanged (\r
- IN PCI_DEVICE_INFO *PciDeviceInfo,\r
- IN BOOLEAN *UpdatePRT,\r
- IN BOOLEAN *UpdatePRW\r
- )\r
-{\r
- UINTN Index = 0;\r
-\r
- if (mQNCPciInfo == NULL) {\r
- *UpdatePRT = FALSE;\r
- *UpdatePRW = FALSE;\r
- return;\r
- }\r
-\r
- *UpdatePRT = TRUE;\r
- *UpdatePRW = TRUE;\r
-\r
- for (Index = 0;Index < CURRENT_PCI_DEVICE_NUM; Index++) {\r
- if ((mQNCPciInfo[Index].BridgeAddress == PciDeviceInfo->BridgeAddress)\r
- && (mQNCPciInfo[Index].DeviceAddress == PciDeviceInfo->DeviceAddress)) {\r
- //\r
- // Find one matched entry\r
- //\r
- if (CompareMem (&(mQNCPciInfo[Index].INTA[0]), &PciDeviceInfo->INTA[0], 10) == 0) {\r
- *UpdatePRT = FALSE;\r
- *UpdatePRW = FALSE;\r
- //DEBUG ((EFI_D_ERROR, "Find one matched entry[%d] and no change\n", Index));\r
- } else {\r
- if (CompareMem (&(mQNCPciInfo[Index].INTA[0]), &PciDeviceInfo->INTA[0], 8) == 0)\r
- *UpdatePRT = FALSE;\r
-\r
- if (CompareMem (&(mQNCPciInfo[Index].GPEPin), &PciDeviceInfo->GPEPin, 2) == 0)\r
- *UpdatePRW = FALSE;\r
-\r
- if (*(UINT64 *)(&PciDeviceInfo->INTA[0]) == 0xFFFFFFFFFFFFFFFFULL)\r
- *UpdatePRT = FALSE;\r
-\r
- if (*(UINT16 *)(&PciDeviceInfo->GPEPin) == 0xFFFF)\r
- *UpdatePRW = FALSE;\r
-\r
- //DEBUG ((EFI_D_ERROR, "Find one matched entry[%d] and but need update PRT:0x%x PRW:0x%x\n", Index, *UpdatePRT, *UpdatePRW));\r
- }\r
- break;\r
- }\r
- }\r
-\r
- //if (Index == 42) {\r
- // DEBUG ((EFI_D_ERROR, "Find No matched entry\n"));\r
- //}\r
-\r
- return;\r
-}\r