/** @file Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include GLOBAL_REMOVE_IF_UNREFERENCED TBT_NVS_AREA_PROTOCOL mTbtNvsAreaProtocol; GLOBAL_REMOVE_IF_UNREFERENCED TBT_INFO_HOB *gTbtInfoHob = NULL; /** TBT NVS Area Initialize **/ VOID TbtNvsAreaInit ( IN VOID **mTbtNvsAreaPtr ) { UINTN Pages; EFI_PHYSICAL_ADDRESS Address; EFI_STATUS Status; TBT_NVS_AREA_PROTOCOL *TbtNvsAreaProtocol; DXE_TBT_POLICY_PROTOCOL *DxeTbtConfig; DEBUG ((DEBUG_INFO, "TbtNvsAreaInit Start\n")); Status = gBS->LocateProtocol ( &gDxeTbtPolicyProtocolGuid, NULL, (VOID **) &DxeTbtConfig ); ASSERT_EFI_ERROR (Status); Pages = EFI_SIZE_TO_PAGES (sizeof (TBT_NVS_AREA)); Address = 0xffffffff; // allocate address below 4G. Status = gBS->AllocatePages ( AllocateMaxAddress, EfiACPIMemoryNVS, Pages, &Address ); ASSERT_EFI_ERROR (Status); *mTbtNvsAreaPtr = (VOID *) (UINTN) Address; SetMem (*mTbtNvsAreaPtr, sizeof (TBT_NVS_AREA), 0); // // TBTNvsAreaProtocol default value init here // TbtNvsAreaProtocol = (TBT_NVS_AREA_PROTOCOL *) &Address; // // Initialize default values // TbtNvsAreaProtocol->Area->WAKFinished = 0; TbtNvsAreaProtocol->Area->DiscreteTbtSupport = ((gTbtInfoHob-> DTbtControllerConfig.DTbtControllerEn == 1 ) ? TRUE : FALSE); TbtNvsAreaProtocol->Area->TbtAcpiRemovalSupport = 0; TbtNvsAreaProtocol->Area->TbtGpioFilter = (UINT8) DxeTbtConfig->TbtCommonConfig.Gpio5Filter; // TbtNvsAreaProtocol->Area->TrOsup = (UINT8) DxeTbtConfig->TbtCommonConfig.TrA0OsupWa; TbtNvsAreaProtocol->Area->TbtFrcPwrEn = gTbtInfoHob->DTbtCommonConfig.Gpio3ForcePwr; TbtNvsAreaProtocol->Area->TbtAspm = (UINT8) DxeTbtConfig->TbtCommonConfig.TbtAspm; // TbtNvsAreaProtocol->Area->TbtL1SubStates = (UINT8) DxeTbtConfig->TbtCommonConfig.TbtL1SubStates; TbtNvsAreaProtocol->Area->TbtSetClkReq = (UINT8) DxeTbtConfig->TbtCommonConfig.TbtSetClkReq; TbtNvsAreaProtocol->Area->TbtLtr = (UINT8) DxeTbtConfig->TbtCommonConfig.TbtLtr; // TbtNvsAreaProtocol->Area->TbtPtm = (UINT8) DxeTbtConfig->TbtCommonConfig.TbtPtm; TbtNvsAreaProtocol->Area->TbtWakeupSupport = (UINT8) DxeTbtConfig->TbtCommonConfig.TbtWakeupSupport; TbtNvsAreaProtocol->Area->TbtAcDcSwitch = (UINT8) DxeTbtConfig->TbtCommonConfig.TbtAcDcSwitch; TbtNvsAreaProtocol->Area->Rtd3TbtSupport = (UINT8) DxeTbtConfig->TbtCommonConfig.Rtd3Tbt; // TBT RTD3 Enable. TbtNvsAreaProtocol->Area->Rtd3TbtOffDelay = (UINT16) DxeTbtConfig->TbtCommonConfig.Rtd3TbtOffDelay; // TBT RTD3 Off delay in ms. TbtNvsAreaProtocol->Area->Rtd3TbtClkReq = (UINT8) DxeTbtConfig->TbtCommonConfig.Rtd3TbtClkReq; // TBT RTD3 ClkReq Mask Enable. TbtNvsAreaProtocol->Area->Rtd3TbtClkReqDelay = (UINT16) DxeTbtConfig->TbtCommonConfig.Rtd3TbtClkReqDelay; // TBT RTD3 ClkReq mask delay in ms. TbtNvsAreaProtocol->Area->TbtWin10Support = (UINT8) DxeTbtConfig->TbtCommonConfig.Win10Support; // TBT FW Execution Mode // // DTBT Controller 1 // TbtNvsAreaProtocol->Area->DTbtControllerEn0 = gTbtInfoHob-> DTbtControllerConfig.DTbtControllerEn; TbtNvsAreaProtocol->Area->RootportSelected0 = gTbtInfoHob-> DTbtControllerConfig.PcieRpNumber; TbtNvsAreaProtocol->Area->RootportSelected0Type = gTbtInfoHob-> DTbtControllerConfig.Type; TbtNvsAreaProtocol->Area->RootportEnabled0 = gTbtInfoHob-> DTbtControllerConfig.DTbtControllerEn; TbtNvsAreaProtocol->Area->TbtFrcPwrGpioNo0 = gTbtInfoHob-> DTbtControllerConfig.ForcePwrGpio.GpioPad; TbtNvsAreaProtocol->Area->TbtFrcPwrGpioLevel0 = gTbtInfoHob-> DTbtControllerConfig.ForcePwrGpio.GpioLevel; TbtNvsAreaProtocol->Area->TbtCioPlugEventGpioNo0 = gTbtInfoHob-> DTbtControllerConfig.CioPlugEventGpio.GpioPad; TbtNvsAreaProtocol->Area->TbtPcieRstGpioNo0 = gTbtInfoHob-> DTbtControllerConfig.PcieRstGpio.GpioPad; TbtNvsAreaProtocol->Area->TbtPcieRstGpioLevel0 = gTbtInfoHob-> DTbtControllerConfig.PcieRstGpio.GpioLevel; TbtNvsAreaProtocol->Area->TBtCommonGpioSupport = gTbtInfoHob->DTbtCommonConfig.DTbtSharedGpioConfiguration; DEBUG ((DEBUG_INFO, "TbtNvsAreaInit End\n")); } /** This function gets registered as a callback to patch TBT ASL code @param[in] Event - A pointer to the Event that triggered the callback. @param[in] Context - A pointer to private data registered with the callback function. can we put this also in read me **/ VOID EFIAPI TbtAcpiEndOfDxeCallback ( IN EFI_EVENT Event, IN VOID *Context ) { EFI_STATUS Status; UINT32 Address; UINT16 Length; UINT32 Signature; Status = InitializeAslUpdateLib (); ASSERT_EFI_ERROR (Status); Address = (UINT32) (UINTN) mTbtNvsAreaProtocol.Area; Length = (UINT16) sizeof (TBT_NVS_AREA); DEBUG ((DEBUG_INFO, "Patch TBT NvsAreaAddress: TBT NVS Address %x Length %x\n", Address, Length)); Status = UpdateNameAslCode (SIGNATURE_32 ('T','N','V','B'), &Address, sizeof (Address)); ASSERT_EFI_ERROR (Status); Status = UpdateNameAslCode (SIGNATURE_32 ('T','N','V','L'), &Length, sizeof (Length)); ASSERT_EFI_ERROR (Status); if (gTbtInfoHob != NULL) { if (gTbtInfoHob-> DTbtControllerConfig.DTbtControllerEn == 1) { if (gTbtInfoHob-> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignaturePorting == TRUE) { DEBUG ((DEBUG_INFO, "Patch ATBT Method Name\n")); Signature = gTbtInfoHob-> DTbtControllerConfig.CioPlugEventGpio.AcpiGpeSignature; Status = UpdateNameAslCode (SIGNATURE_32 ('A','T','B','T'), &Signature, sizeof (Signature)); ASSERT_EFI_ERROR (Status); } } } return; } /** Initialize Thunderbolt(TM) SSDT ACPI tables @retval EFI_SUCCESS ACPI tables are initialized successfully @retval EFI_NOT_FOUND ACPI tables not found **/ EFI_STATUS EFIAPI TbtDxeEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; EFI_HANDLE Handle; // EFI_EVENT EndOfDxeEvent; DEBUG ((DEBUG_INFO, "TbtDxeEntryPoint \n")); // // Get TBT INFO HOB // gTbtInfoHob = (TBT_INFO_HOB *) GetFirstGuidHob (&gTbtInfoHobGuid); if (gTbtInfoHob == NULL) { return EFI_NOT_FOUND; } InstallTbtPolicy (ImageHandle); // // Update DXE TBT Policy // UpdateTbtPolicyCallback (); // // Print DXE TBT Policy // TbtPrintDxePolicyConfig (); // // Initialize Tbt Nvs Area // TbtNvsAreaInit ((VOID **) &mTbtNvsAreaProtocol.Area); // // [ACPI] Thunderbolt ACPI table // Handle = NULL; Status = gBS->InstallMultipleProtocolInterfaces ( &Handle, &gTbtNvsAreaProtocolGuid, &mTbtNvsAreaProtocol, NULL ); ASSERT_EFI_ERROR (Status); // // Register an end of DXE event for TBT ACPI to do some patch can be put as description // /** Status = gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, TbtAcpiEndOfDxeCallback, NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent ); ASSERT_EFI_ERROR (Status); **/ return EFI_SUCCESS; }