EmulationPlatformInit.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /** @file
  2. EFI PEIM for Emulation Platform Initial
  3. @copyright
  4. Copyright 2017 - 2021 Intel Corporation. <BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include <Library/DebugLib.h>
  8. #include <Library/BaseLib.h>
  9. #include <Library/BaseMemoryLib.h>
  10. #include <Library/IoLib.h>
  11. #include <Library/PciLib.h>
  12. #include <Library/HobLib.h>
  13. #include <Library/PeiServicesLib.h>
  14. #include <Ppi/ReadOnlyVariable2.h>
  15. #include <Library/EmulationConfigurationLib.h>
  16. #include <EmulationConfiguration.h>
  17. #include <Guid/EmulationDfxVariable.h>
  18. #include <PlatformHost.h>
  19. #include <Cpu/CpuIds.h>
  20. EFI_PEI_PPI_DESCRIPTOR mPpiListEmulation = {
  21. (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
  22. &gEmulationHobGuid,
  23. NULL
  24. };
  25. #define CSR_EMULATION_FLAG_OFFSET 0xFC
  26. EFI_STATUS
  27. EFIAPI
  28. EmulationPlatformInitEntry (
  29. IN EFI_PEI_FILE_HANDLE FileHandle,
  30. IN CONST EFI_PEI_SERVICES **PeiServices
  31. )
  32. {
  33. EFI_STATUS Status;
  34. EFI_PEI_READ_ONLY_VARIABLE2_PPI *PeiVariable;
  35. EMULATION_DFX_CONFIGURATION EmulationVariable;
  36. UINTN BufferSize = sizeof(EMULATION_DFX_CONFIGURATION);
  37. EMULATION_SETTING *EmulationSetting;
  38. UINT32 RegEax;
  39. UINT16 CpuFamily;
  40. UINTN PciLibAddress;
  41. UINT32 EmulationType;
  42. //
  43. // Build the Emulation Hob
  44. //
  45. EmulationSetting = BuildGuidHob (&gEmulationHobGuid, sizeof (EMULATION_SETTING));
  46. if (EmulationSetting == NULL) {
  47. DEBUG((EFI_D_ERROR, "Emulation BuildGuidDataHob fail!\n"));
  48. return EFI_OUT_OF_RESOURCES;
  49. }
  50. EmulationSetting->UbiosGenerationSetting = EMULATION_DISABLE;
  51. EmulationSetting->HybridSystemLevelEmulationSetting = EMULATION_DISABLE;
  52. EmulationSetting->UbiosOutputMode = ASM_OUTPUT_ENABLE;
  53. EmulationSetting->LoopBackLabelNumber = 0;
  54. EmulationSetting->FnvAccessValue = FNV_ACCESS_DISABLE;
  55. EmulationSetting->MsrTraceEnable = MSR_OUTPUT_DISABLE;
  56. //
  57. // Store variable into the hob.
  58. //
  59. (*PeiServices)->LocatePpi (
  60. PeiServices,
  61. &gEfiPeiReadOnlyVariable2PpiGuid,
  62. 0,
  63. NULL,
  64. &PeiVariable
  65. );
  66. Status = PeiVariable->GetVariable (PeiVariable, EMULATION_DFX_CONFIGURATION_NAME, &gEmulationDfxVariableGuid, NULL, &BufferSize, &EmulationVariable);
  67. DEBUG ((DEBUG_INFO, "Emulation GetVariable status = %r !\n", Status));
  68. if (EFI_ERROR (Status)) {
  69. return EFI_NOT_FOUND;
  70. }
  71. EmulationSetting->UbiosGenerationSetting = EmulationVariable.DfxUbiosGeneration;
  72. EmulationSetting->HybridSystemLevelEmulationSetting = EmulationVariable.DfxHybridSystemLevelEmulation;
  73. EmulationSetting->MsrTraceEnable = EmulationVariable.DfxPmMsrTrace;
  74. //
  75. // Check the override value
  76. //
  77. AsmCpuid (1, &RegEax, NULL, NULL, NULL);
  78. CpuFamily = (UINT16) (RegEax >> 4);
  79. if (CpuFamily == CPU_FAMILY_SKX) {
  80. //
  81. // Simics flag is at B0:D0:F0 offset 0xFC for SKX.
  82. //
  83. PciLibAddress = PCI_LIB_ADDRESS(0, 0, 0, CSR_EMULATION_FLAG_OFFSET);
  84. } else {
  85. //
  86. // Simics flag is at B0:D3:F0 offset 0xFC for 10nm.
  87. //
  88. PciLibAddress = PCI_LIB_ADDRESS(0, 3, 0, CSR_EMULATION_FLAG_OFFSET);
  89. }
  90. EmulationType = PciRead32 (PciLibAddress);
  91. if (EmulationType != 0xFFFFFFFF) {
  92. if ((EmulationType & UBIOS_GENERATION_EN) != 0) {
  93. EmulationSetting->UbiosGenerationSetting = EMULATION_ENABLE;
  94. DEBUG ((DEBUG_INFO, "EmulationVariable.DfxUbiosGeneration = %d\n", EmulationSetting->UbiosGenerationSetting));
  95. }
  96. if ((EmulationType & HYBRID_SYSTEM_LEVEL_EMULATION_EN) != 0) {
  97. EmulationSetting->HybridSystemLevelEmulationSetting = EMULATION_ENABLE;
  98. DEBUG ((DEBUG_INFO, "EmulationSetting->HybridSystemLevelEmulationSetting = %d\n", EmulationSetting->HybridSystemLevelEmulationSetting));
  99. }
  100. }
  101. //
  102. // Install gEmulationHobGuid PPI to inform the Emulation Hob is ready.
  103. //
  104. Status = PeiServicesInstallPpi (&mPpiListEmulation);
  105. ASSERT_EFI_ERROR (Status);
  106. return EFI_SUCCESS;
  107. }