+/** @file\r
+ This file abstract internal interfaces of which implementation differs per library instance.\r
+\r
+Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved. <BR>\r
+Copyright (c) Microsoft Corporation.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Library/Tpm2DeviceLib.h>\r
+#include <Library/PcdLib.h>\r
+\r
+#include "Tpm2DeviceLibDTpm.h"\r
+\r
+/**\r
+ Return cached PTP CRB interface IdleByPass state.\r
+\r
+ @return Cached PTP CRB interface IdleByPass state.\r
+**/\r
+UINT8\r
+GetCachedIdleByPass (\r
+ VOID\r
+ )\r
+{\r
+ return PcdGet8(PcdCRBIdleByPass);\r
+}\r
+\r
+/**\r
+ Return cached PTP interface type.\r
+\r
+ @return Cached PTP interface type.\r
+**/\r
+TPM2_PTP_INTERFACE_TYPE\r
+GetCachedPtpInterface (\r
+ VOID\r
+ )\r
+{\r
+ return PcdGet8(PcdActiveTpmInterfaceType);\r
+}\r
+\r
+/**\r
+ The common function cache current active TpmInterfaceType when needed.\r
+\r
+ @retval EFI_SUCCESS DTPM2.0 instance is registered, or system does not support register DTPM2.0 instance\r
+**/\r
+EFI_STATUS\r
+InternalTpm2DeviceLibDTpmCommonConstructor (\r
+ VOID\r
+ )\r
+{\r
+ TPM2_PTP_INTERFACE_TYPE PtpInterface;\r
+ UINT8 IdleByPass;\r
+\r
+ //\r
+ // Cache current active TpmInterfaceType only when needed\r
+ //\r
+ if (PcdGet8(PcdActiveTpmInterfaceType) == 0xFF) {\r
+ PtpInterface = Tpm2GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
+ PcdSet8S(PcdActiveTpmInterfaceType, PtpInterface);\r
+ }\r
+\r
+ if (PcdGet8(PcdActiveTpmInterfaceType) == Tpm2PtpInterfaceCrb && PcdGet8(PcdCRBIdleByPass) == 0xFF) {\r
+ IdleByPass = Tpm2GetIdleByPass((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
+ PcdSet8S(PcdCRBIdleByPass, IdleByPass);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r