diff --git a/TcgTpmPkg/Include/Library/PlatformTpmLib.h b/TcgTpmPkg/Include/Library/PlatformTpmLib.h
new file mode 100644
index 0000000000..03dc08207f
--- /dev/null
+++ b/TcgTpmPkg/Include/Library/PlatformTpmLib.h
@@ -0,0 +1,769 @@
+/** @file
+ This file connects the platform specific functions of
+ the TCG TPM reference code to the corresponding functions in PlatformTpmLib.
+
+ To use TPM reference code as software based TPM, each Platform should
+ implements TpmPlatformLib.
+
+ For the __plat_XXX interface, Please see the:
+ - https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src
+ - https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/tpm/include/platform_interface
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#pragma once
+
+#include
+
+//
+// ClockRateAdjust uses predefined signal values and encapsulates the platform
+// specifics regarding the number of ticks the underlying clock is running at.
+//
+// The adjustment must be one of these values. A COARSE adjustment is 1%, MEDIUM
+// is 0.1%, and FINE is the smallest amount supported by the platform. The
+// total (cumulative) adjustment is limited to ~15% total. Attempts to adjust
+// the clock further are silently ignored as are any invalid values. These
+// values are defined here to insulate them from spec changes and to avoid
+// needing visibility to the doc-generated structure headers.
+typedef enum {
+ TpmClockAdjustCoarseSlower = -3,
+ TpmClockAdjustMediumSlower = -2,
+ TpmClockAdjustFineSlower = -1,
+ TpmClockAdjustFineFaster = 1,
+ TpmClockAdjustMediumFaster = 2,
+ TpmClockAdjustCoarseFaster = 3
+} PLATFORM_TPM_CLOCK_ADJUST_STEP;
+
+#define PLATFORM_TPM_TYPE_UNKNOWN 0x00
+#define PLATFORM_TPM_TYPE_DISCRETE_CHIP 0x01
+#define PLATFORM_TPM_TYPE_INTEGRATE_SOC 0x02
+#define PLATFORM_TPM_TYPE_FTPM 0x03
+#define PLATFORM_TPM_TYPE_VTPM 0x04
+
+// ** From EPS.c
+
+/**
+ _plat__GetEPS()
+
+ This function used to generate Endorsement Seed when
+ first initailization of TPM.
+
+ EPS can be generated, for example, as follows:
+
+ EPS = SHA-512(TRNG_output || nonce || optional_mixing || DeviceUnique)
+
+ Alternatively, EPS can be generated using DRBG_Generate(),
+ as done in the TCG TPM 2.0 reference implementation.
+
+ This function is not expected to fail; however,
+ if it does have the potential to fail,
+ the platform should handle the failure appropriately,
+ for example by disabling TPM functionality or
+ retrying the manufacturing process.
+
+ @param [in] Size Size of endorsement seed
+ @param [out] EndorsementSeed Endorsement Seed.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibGetEPS (
+ IN UINT16 Size,
+ OUT UINT8 *EndorsementSeed
+ );
+
+// ** From Clock.c
+
+/**
+ _plat__TimerReset()
+
+ This function sets current system clock time as t0 for counting TPM time.
+ This function is called at a power on event to reset the clock. When the clock
+ is reset, the indication that the clock was stopped is also set.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibTimerReset (
+ VOID
+ );
+
+/**
+ _plat__TimerRestart()
+
+ This function should be called in order to simulate the restart of the timer
+ should it be stopped while power is still applied.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibTimerRestart (
+ VOID
+ );
+
+/**
+ _plat__RealTime()
+
+ This is another, probably futile, attempt to define a portable function
+ that will return a 64-bit clock value that has mSec resolution.
+
+ @return value realtime
+
+**/
+UINT64
+EFIAPI
+PlatformTpmLibRealTime (
+ VOID
+ );
+
+/**
+ _plat__TimerRead()
+
+ This function provides access to the tick timer of the platform. The TPM code
+ uses this value to drive the TPM Clock.
+
+ The tick timer is supposed to run when power is applied to the device. This timer
+ should not be reset by time events including _TPM_Init. It should only be reset
+ when TPM power is re-applied.
+
+ If the TPM is run in a protected environment, that environment may provide the
+ tick time to the TPM as long as the time provided by the environment is not
+ allowed to go backwards. If the time provided by the system can go backwards
+ during a power discontinuity, then the _plat__Signal_PowerOn should call
+ _plat__TimerReset().
+
+ @return value timeval
+
+**/
+UINT64
+EFIAPI
+PlatformTpmLibTimerRead (
+ VOID
+ );
+
+/**
+ _plat__TimerWasReset()
+
+ This function is used to interrogate the flag indicating if the tick timer has
+ been reset.
+
+ If the resetFlag parameter is SET, then the flag will be CLEAR before the
+ function returns.
+
+ @return TRUE Timer was reset.
+ @return FALSE Timer wasn't reset.
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibTimerWasReset (
+ VOID
+ );
+
+/**
+ _plat__TimerWasStopped()
+
+ This function is used to interrogate the flag indicating if the tick timer has
+ been stopped. If so, this is typically a reason to roll the nonce.
+
+ This function will CLEAR the s_timerStopped flag before returning. This provides
+ functionality that is similar to status register that is cleared when read. This
+ is the model used here because it is the one that has the most impact on the TPM
+ code as the flag can only be accessed by one entity in the TPM. Any other
+ implementation of the hardware can be made to look like a read-once register.
+
+ @return TRUE timer was stopped
+ @return FALSE timer wasn't stopped
+
+**/
+BOOLEAN
+EFIAPI
+PlatformTpmLibTimerWasStopped (
+ VOID
+ );
+
+/**
+ _plat__ClockAdjustRate()
+
+ Adjust the clock rate.
+
+ @param [in] Adjust The adjust number. It could be positive
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibClockAdjustRate (
+ IN INT32 Adjust
+ );
+
+/**
+ _plat__GetEntropy()
+
+ This function is used to get available hardware entropy. In a hardware
+ implementation of this function, there would be no call to the system
+ to get entropy.
+
+ @param [out] Entropy output buffer
+ @param [in] Amount amount reuqested.
+
+ @return < 0 Failed to generate entropy
+ @return >= 0 The returned amount of entropy (bytes)
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibGetEntropy (
+ OUT UINT8 *Entropy,
+ IN UINT32 Amount
+ );
+
+// ** From NVMem.c
+
+/**
+ _plat__NVEnable()
+
+ Enable NV memory.
+
+ the NV state would be read in, decrypted and integrity checked if needs.
+
+ The recovery from an integrity failure depends on where the error occurred. It
+ it was in the state that is discarded by TPM Reset, then the error is
+ recoverable if the TPM is reset. Otherwise, the TPM must go into failure mode.
+
+ @param [in] PlatParameter Platform parameter to enable NV storage
+ @param [in] ParamSize Size of PlatParameter
+
+ @return 0 if success
+ @return > 0 if receive recoverable error
+ @return < 0 if unrecoverable error
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNVEnable (
+ IN VOID *PlatParameter,
+ IN UINTN ParamSize
+ );
+
+/**
+ _plat__NVDisable()
+
+ Disable NV memory.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibNVDisable (
+ VOID
+ );
+
+/**
+ _plat__GetNvReadyState()
+
+ Check if NV is available.
+
+ @return 0 NV is available
+ @return 1 NV is not available due to write failure
+ @return 2 NV is not available due to rate limit
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibGetNvReadyState (
+ VOID
+ );
+
+/**
+ _plat__NvMemoryRead()
+
+ Read a chunk of NV memory.
+
+ @param [in] StartOffset Read start offset
+ @param [in] Size Size to read
+ @param [out] Data Data buffer
+
+ @return 1 Success to read
+ @return 0 Failed to read
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvMemoryRead (
+ IN UINT32 StartOffset,
+ IN UINT32 Size,
+ OUT VOID *Data
+ );
+
+/**
+ _plat__NvGetChangedStatus()
+
+ This function checks to see if the NV is different from the test value
+ so that NV will not be written if it has not changed.
+
+ @param [in] StartOffset Start offset to compare
+ @param [in] Size Size for compare
+ @param [in] Data Data to be compared
+
+ @return NV_HAS_CHANGED(1) the NV location is different from the test value
+ @return NV_IS_SAME(0) the NV location is the same as the test value
+ @return NV_INVALID_LOCATION(-1) the NV location is invalid; also triggers failure mode
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvGetChangedStatus (
+ IN UINT32 StartOffset,
+ IN UINT32 Size,
+ IN VOID *Data
+ );
+
+/**
+ _plat__NvMemoryWrite()
+
+ This function is used to update NV memory. The "write" is to a memory copy of
+ NV. At the end of the current command, any changes are written to
+ the actual NV memory.
+
+ NOTE: A useful optimization would be for this code to compare the current
+ contents of NV with the local copy and note the blocks that have changed. Then
+ only write those blocks when _plat__NvCommit() is called.
+
+ @param [in] StartOffset Start Offset to write
+ @param [in] Size Size to wrrite
+ @param [in] Data Data
+
+ @return 0 Failed to write
+ @return 1 Success to write
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvMemoryWrite (
+ IN UINT32 StartOffset,
+ IN UINT32 Size,
+ IN VOID *Data
+ );
+
+/**
+ _plat__NvMemoryClear()
+
+ Function is used to set a range of NV memory bytes to an implementation-dependent
+ value. The value represents the erase state of the memory.
+
+ @param [in] StartOffset Start offset to clear
+ @param [in] SIze Size to be clear
+
+
+ @return 0 Failed to clear
+ @return 1 Success
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvMemoryClear (
+ IN UINT32 StartOffset,
+ IN UINT32 Size
+ );
+
+/**
+ _plat__NvMemoryMove()
+
+ Function: Move a chunk of NV memory from source to destination
+ This function should ensure that if there overlap, the original data is
+ copied before it is written.
+
+ @param [in] SourceOffset Source offset to move
+ @param [in] DestOffset Destination offset to move
+ @param [in] Size Size to be moved
+
+ @return 0 Failed to move
+ @return 1 Success
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvMemoryMove (
+ IN UINT32 SourceOffset,
+ IN UINT32 DestOffset,
+ IN UINT32 Size
+ );
+
+/**
+ _plat__NvCommit()
+
+ This function writes the local copy of NV to NV for permanent store.
+ It will write TPM_NV_MEMORY_SIZE bytes to NV.
+
+ @return 0 NV write success
+ @return non-0 NV write fail
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvCommit (
+ VOID
+ );
+
+/**
+ _plat__SetNvAvail()
+
+ Set the current NV state to available.
+ This function is for testing purpose only.
+ It is not part of the platform NV logic
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibSetNvAvail (
+ VOID
+ );
+
+/**
+ _plat__ClearNvAvail()
+
+ Set the current NV state to unavailable.
+ This function is for testing purpose only.
+ It is not part of the platform NV logic.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibClearNvAvail (
+ VOID
+ );
+
+/**
+ _plat__NVNeedsManufacture()
+
+ This function checks whether TPM's NV state needs to be manufactured.
+
+ @return TRUE TPM's NV storage should be manufactured
+ @return FALSE TPM's NV storage is already manufactured
+
+**/
+BOOLEAN
+EFIAPI
+PlatformTpmLibNVNeedsManufacture (
+ VOID
+ );
+
+// ** From Unique.c
+
+/**
+ _plat__GetUnique()
+
+ This function is used to access the platform-specific unique value.
+ This function places the unique value in the provided Buffer ('b')
+ and returns the number of bytes transferred. The function will not
+ copy more data than 'Size'.
+
+ NOTE: If a platform unique value has unequal distribution of uniqueness
+ and 'Size' is smaller than the size of the unique value, the 'Size'
+ portion with the most uniqueness should be returned.
+
+ @param [in] Which if == 0, Copy unique value from start
+ otherwise, copy from end
+ @param [in] Size Size of Buffer
+ @param [out] Buffer Output Buffer
+
+ @return Size of unique value.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetUnique (
+ IN UINT32 Which,
+ IN UINT32 Size,
+ OUT UINT8 *Buffer
+ );
+
+/**
+ _plat__GetManufacturerCapabilityCode()
+
+ return the 4 character Manufacturer Capability code.
+ This should come from the platform library since
+ that is provided by the manufacturer.
+
+
+ @return Manufacturer capability Code.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetManufacturerCapabilityCode (
+ VOID
+ );
+
+/**
+ _plat__GetVendorCapabilityCode()
+
+ return the 4 character VendorStrings for Capabilities.
+ Index is ONE-BASED, and may be in the range [1,4] inclusive.
+ Any other index returns all zeros. The return value will be interpreted
+ as an array of 4 ASCII characters (with no null terminator).
+
+ @param[in] Index index
+
+ @return Vendor specific capability code.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetVendorCapabilityCode (
+ IN INT32 Index
+ );
+
+/**
+ _plat__GetTpmFirmwareVersionHigh()
+
+ return the most-significant 32-bits of the TPM Firmware Version
+
+ @return High 32-bits of TPM Firmware Version.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetTpmFirmwareVersionHigh (
+ VOID
+ );
+
+/**
+ _plat__GetTpmFirmwareVersionLow()
+
+ return the least-significant 32-bits of the TPM Firmware Version
+
+ @return Low 32-bits of TPM Firmware Version.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetTpmFirmwareVersionLow (
+ VOID
+ );
+
+/**
+ _plat__GetTpmFirmwareSvn()
+
+ return the TPM Firmware current SVN.
+
+ @return current SVN.
+
+**/
+UINT16
+EFIAPI
+PlatformTpmLibGetTpmFirmwareSvn (
+ VOID
+ );
+
+/**
+ _plat__GetTpmFirmwareMaxSvn()
+
+ return the TPM Firmware maximum SVN.
+
+ @return Maximum SVN.
+
+**/
+UINT16
+EFIAPI
+PlatformTpmLibGetTpmFirmwareMaxSvn (
+ VOID
+ );
+
+/**
+ _plat__GetTpmFirmwareSvnSecret()
+
+ return the TPM Firmware SVN Secret value associated with SVN
+
+ @param[in] Svn Svn
+ @param[in] SecretBufferSize Secret Buffer Size
+ @param[out] SecretBuffer Secret Buffer
+ @param[out] SecretSize Secret Svn Size
+
+ @return 0 Success
+ @return < 0 Error
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibGetTpmFirmwareSvnSecret (
+ IN UINT16 Svn,
+ IN UINT16 SecretBufferSize,
+ OUT UINT8 *SecretBuffer,
+ OUT UINT16 *SecretSize
+ );
+
+/**
+ _plat__GetTpmFirmwareSecret()
+
+ return the TPM Firmware Secret value associated with SVN
+
+ @param[in] SecretBufferSize Secret Buffer Size
+ @param[out] SecretBuffer Secret Buffer
+ @param[out] SecretSize Secret Svn Size
+
+ @return 0 Success
+ @return < 0 Error
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibGetTpmFirmwareSecret (
+ IN UINT16 SecretBufferSize,
+ OUT UINT8 *SecretBuffer,
+ OUT UINT16 *SecretSize
+ );
+
+/**
+ _plat__GetVendorTpmType()
+
+ return the Platform TPM type.
+
+ @return TPM type.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetVendorTpmType (
+ VOID
+ );
+
+/**
+ _plat__GetPlatformManufactureData
+
+ This function allows the platform to provide a small amount of data to be
+ stored as part of the TPM's PERSISTENT_DATA structure during manufacture.
+ Of course the platform can store data separately as well,
+ but this allows a simple platform implementation to store
+ a few bytes of data without implementing a multi-layer storage system.
+ This function is called on manufacture and CLEAR.
+ The buffer will contain the last value provided
+ to the Core library.
+
+ @param[out] PlatformPersistentData Platform data.
+ @param[in] Size Size of PlatformPersistentData.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibGetPlatformManufactureData (
+ UINT8 *PlatformPersistentData,
+ UINT32 Size
+ );
+
+/**
+ _plat_internal_resetFailureData()
+
+ Reset platform specific failure data.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibInternalResetFailureData (
+ VOID
+ );
+
+/**
+ _plat__InFailureMode()
+
+ Check whether platform is in the failure mode.
+
+ @return whether TPM is in failure mode or not
+
+**/
+BOOLEAN
+EFIAPI
+PlatformTpmLibInFailureMode (
+ VOID
+ );
+
+/**
+ _plat__Fail()
+
+ This is the platform depended failure exit for the TPM.
+
+ @param[in] Function Function name where failure happens.
+ @param[in] Line line number where failure happens.
+ @param[in] LocationCode Location code where failure happens.
+ @param[in] FailureCode Fail reson.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibFail (
+ IN CONST CHAR8 *Function,
+ IN INT32 Line,
+ IN UINT64 LocationCode,
+ IN INT32 FailureCode
+ );
+
+/**
+ _plat__GetFailureCode()
+
+ Get last failure code.
+
+ @return Last failure code.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetFailureCode (
+ VOID
+ );
+
+/**
+ _plat__GetFailureLocation()
+
+ Get last failure location.
+
+ @return Last failure location code.
+
+**/
+UINT64
+EFIAPI
+PlatformTpmLibGetFailureLocation (
+ VOID
+ );
+
+/**
+ _plat__GetFailureFunctionName()
+
+ Get last function name where failed.
+
+ @return Last function name where failed.
+
+**/
+CONST CHAR8 *
+EFIAPI
+PlatformTpmLibGetFailureFunctionName (
+ VOID
+ );
+
+/**
+ _plat__GetFailureLine()
+
+ Get last failure line.
+
+ @return Last line number where failed.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetFailureLine (
+ VOID
+ );
+
+/**
+ This function is called in TpmLibConstructor() to
+ initialise PlatformTpmLib once.
+
+ @return EFI_SUCCESS Success
+ @return Others Errors
+
+**/
+EFI_STATUS
+EFIAPI
+PlatformTpmLibInit (
+ VOID
+ );
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/Clock.c b/TcgTpmPkg/Library/PlatformTpmNullLib/Clock.c
new file mode 100644
index 0000000000..3805d4e75c
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/Clock.c
@@ -0,0 +1,160 @@
+/** @file
+ Clock part of PlatformTpmLib to use TpmLib.
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include
+#include
+
+/**
+ _plat__TimerReset()
+
+ This function sets current system clock time as t0 for counting TPM time.
+ This function is called at a power on event to reset the clock. When the clock
+ is reset, the indication that the clock was stopped is also set.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibTimerReset (
+ VOID
+ )
+{
+ return;
+}
+
+/**
+ _plat__TimerRestart()
+
+ This function should be called in order to simulate the restart of the timer
+ should it be stopped while power is still applied.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibTimerRestart (
+ VOID
+ )
+{
+ return;
+}
+
+/**
+ _plat__RealTime()
+
+ This is another, probably futile, attempt to define a portable function
+ that will return a 64-bit clock value that has mSec resolution.
+
+ @return value realtime
+
+**/
+UINT64
+EFIAPI
+PlatformTpmLibRealTime (
+ VOID
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__TimerRead()
+
+ This function provides access to the tick timer of the platform. The TPM code
+ uses this value to drive the TPM Clock.
+
+ The tick timer is supposed to run when power is applied to the device. This timer
+ should not be reset by time events including _TPM_Init. It should only be reset
+ when TPM power is re-applied.
+
+ If the TPM is run in a protected environment, that environment may provide the
+ tick time to the TPM as long as the time provided by the environment is not
+ allowed to go backwards. If the time provided by the system can go backwards
+ during a power discontinuity, then the _plat__Signal_PowerOn should call
+ _plat__TimerReset().
+
+ @return value timeval
+
+**/
+UINT64
+EFIAPI
+PlatformTpmLibTimerRead (
+ VOID
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__TimerWasReset()
+
+ This function is used to interrogate the flag indicating if the tick timer has
+ been reset.
+
+ If the resetFlag parameter is SET, then the flag will be CLEAR before the
+ function returns.
+
+ @return 0 Timer wasn't reset.
+ @return others Timer was reset.
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibTimerWasReset (
+ VOID
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__TimerWasStopped()
+
+ This function is used to interrogate the flag indicating if the tick timer has
+ been stopped. If so, this is typically a reason to roll the nonce.
+
+ This function will CLEAR the s_timerStopped flag before returning. This provides
+ functionality that is similar to status register that is cleared when read. This
+ is the model used here because it is the one that has the most impact on the TPM
+ code as the flag can only be accessed by one entity in the TPM. Any other
+ implementation of the hardware can be made to look like a read-once register.
+
+ @return TRUE timer was stopped
+ @return FALSE timer wasn't stopped
+
+**/
+BOOLEAN
+EFIAPI
+PlatformTpmLibTimerWasStopped (
+ VOID
+ )
+{
+ return FALSE;
+}
+
+/**
+ _plat__ClockAdjustRate()
+
+ ClockRateAdjust uses predefined signal values and encapsulates the platform
+ specifics regarding the number of ticks the underlying clock is running at.
+
+ The adjustment must be one of these values. A COARSE adjustment is 1%, MEDIUM
+ is 0.1%, and FINE is the smallest amount supported by the platform. The
+ total (cumulative) adjustment is limited to ~15% total. Attempts to adjust
+ the clock further are silently ignored as are any invalid values. These
+ values are defined here to insulate them from spec changes and to avoid
+ needing visibility to the doc-generated structure headers.
+
+ @param [in] Adjust The adjust number. It could be positive
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibClockAdjustRate (
+ IN INT32 Adjust
+ )
+{
+ return;
+}
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/EPS.c b/TcgTpmPkg/Library/PlatformTpmNullLib/EPS.c
new file mode 100644
index 0000000000..ae5c31c27e
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/EPS.c
@@ -0,0 +1,45 @@
+/** @file
+ Endoresment Seed generation part of PlatformTpmLib to use TpmLib.
+
+ To see the plat_XXX interface in TPM reference library, see:
+ - https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include
+#include
+
+/**
+ _plat__GetEPS()
+
+ This function used to generate Endorsement Seed when
+ first initailization of TPM.
+
+ EPS can be generated, for example, as follows:
+
+ EPS = SHA-512(TRNG_output || nonce || optional_mixing || DeviceUnique)
+
+ Alternatively, EPS can be generated using DRBG_Generate(),
+ as done in the TCG TPM 2.0 reference implementation.
+
+ This function is not expected to fail; however,
+ if it does have the potential to fail,
+ the platform should handle the failure appropriately,
+ for example by disabling TPM functionality or
+ retrying the manufacturing process.
+
+ @param [in] Size Size of endorsement seed
+ @param [out] EndorsementSeed Endorsement Seed.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibGetEPS (
+ IN UINT16 Size,
+ OUT UINT8 *EndorsementSeed
+ )
+{
+ return;
+}
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/Entropy.c b/TcgTpmPkg/Library/PlatformTpmNullLib/Entropy.c
new file mode 100644
index 0000000000..aa2d5a8e89
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/Entropy.c
@@ -0,0 +1,36 @@
+/** @file
+ Get entropy part of PlatformTpmLib to use TpmLib.
+
+ To see the plat_XXX interfaces in TPM reference library, see:
+ - https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include
+#include
+
+/**
+ _plat__GetEntropy()
+
+ This function is used to get available hardware entropy. In a hardware
+ implementation of this function, there would be no call to the system
+ to get entropy.
+
+ @param [out] Entropy output buffer.
+ @param [in] Amount amount reuqested.
+
+ @return < 0 Failed to generate entropy
+ @return >= 0 The returned amount of entropy (bytes)
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibGetEntropy (
+ OUT UINT8 *Entropy,
+ IN UINT32 Amount
+ )
+{
+ return -1;
+}
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/ExtraData.c b/TcgTpmPkg/Library/PlatformTpmNullLib/ExtraData.c
new file mode 100644
index 0000000000..d7dd92481a
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/ExtraData.c
@@ -0,0 +1,45 @@
+/** @file
+ Endoresment Seed generation part of PlatformTpmLib to use TpmLib.
+
+ To see the plat_XXX interface in TPM reference library, see:
+ - https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include
+#include
+#include
+
+/**
+ _plat__GetPlatformManufactureData
+
+ This function allows the platform to provide a small amount of data to be
+ stored as part of the TPM's PERSISTENT_DATA structure during manufacture.
+ Of course the platform can store data separately as well,
+ but this allows a simple platform implementation to store
+ a few bytes of data without implementing a multi-layer storage system.
+ This function is called on manufacture and CLEAR.
+ The buffer will contain the last value provided
+ to the Core library.
+
+ @param[out] PlatformPersistentData Platform data.
+ @param[in] Size Size of PlatformPersistentData.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibGetPlatformManufactureData (
+ UINT8 *PlatformPersistentData,
+ UINT32 Size
+ )
+{
+ /*
+ * Using TCG Tpm library's implementation.
+ * See TPMCmd/Platform/src/ExtraData.c
+ */
+ if ((PlatformPersistentData != NULL) && (Size != 0)) {
+ SetMem (PlatformPersistentData, Size, 0xFF);
+ }
+}
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/Failure.c b/TcgTpmPkg/Library/PlatformTpmNullLib/Failure.c
new file mode 100644
index 0000000000..3a4df988f6
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/Failure.c
@@ -0,0 +1,161 @@
+/** @file
+ This module provides the platform specific entry and fail processing. The
+ PlatformTpmLibFail() function is used to call to ExecuteCommand() in the TPM code.
+ This function does whatever processing is necessary to set up the platform
+ in anticipation of the call to the TPM including settup for error processing.
+
+ The PlatformTpmLib() function is called when there is a failure in the TPM.
+ The TPM code will have set the flag to indicate that the TPM is in failure mode.
+ This call will then recursively call ExecuteCommand in order to build the
+ failure mode response. When ExecuteCommand() returns to PlatformTpmLib(), the
+ platform will do some platform specific operation to return to the environment in
+ which the TPM is executing.
+
+ To see the plat_XXX interfaces in TPM reference library, see:
+ - https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include
+#include
+
+STATIC BOOLEAN InFailureMode;
+STATIC CONST CHAR8 *LastFailedFuncName;
+STATIC UINT32 LastFailedLineNumber;
+STATIC UINT64 LastFailedLocation;
+STATIC UINT32 LastFailedCode;
+
+/**
+ _plat_internal_resetFailureData()
+
+ Reset platform specific failure data.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibInternalResetFailureData (
+ VOID
+ )
+{
+ InFailureMode = FALSE;
+ LastFailedFuncName = NULL;
+ LastFailedLineNumber = 0;
+ LastFailedLocation = 0;
+ LastFailedCode = 0;
+}
+
+/**
+ _plat__InFailureMode()
+
+ Check whether platform is in the failure mode.
+
+ @return whether TPM is in failure mode or not
+
+**/
+BOOLEAN
+EFIAPI
+PlatformTpmLibInFailureMode (
+ VOID
+ )
+{
+ return InFailureMode;
+}
+
+/**
+ _plat__Fail()
+
+ This is the platform depended failure exit for the TPM.
+
+ @param[in] Function Function name where failure happens.
+ @param[in] Line line number where failure happens.
+ @param[in] LocationCode Location code where failure happens.
+ @param[in] FailureCode Fail reson.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibFail (
+ IN CONST CHAR8 *Function,
+ IN INT32 Line,
+ IN UINT64 LocationCode,
+ IN INT32 FailureCode
+ )
+{
+ InFailureMode = TRUE;
+ LastFailedFuncName = Function;
+ LastFailedLineNumber = Line;
+ LastFailedLocation = LocationCode;
+ LastFailedCode = FailureCode;
+
+ CpuDeadLoop ();
+}
+
+/**
+ _plat__GetFailureCode()
+
+ Get last failure code.
+
+ @return Last failure code.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetFailureCode (
+ VOID
+ )
+{
+ return LastFailedCode;
+}
+
+/**
+ _plat__GetFailureLocation()
+
+ Get last failure location.
+
+ @return Last failure location code.
+
+**/
+UINT64
+EFIAPI
+PlatformTpmLibGetFailureLocation (
+ VOID
+ )
+{
+ return LastFailedLocation;
+}
+
+/**
+ _plat__GetFailureFunctionName()
+
+ Get last failure location.
+
+ @return Last function name where failed.
+
+**/
+CONST CHAR8 *
+EFIAPI
+PlatformTpmLibGetFailureFunctionName (
+ VOID
+ )
+{
+ return LastFailedFuncName;
+}
+
+/**
+ _plat__GetFailureLine()
+
+ Get last failure line.
+
+ @return Last line number where failed.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetFailureLine (
+ VOID
+ )
+{
+ return LastFailedLineNumber;
+}
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/Init.c b/TcgTpmPkg/Library/PlatformTpmNullLib/Init.c
new file mode 100644
index 0000000000..8cebd6d0f4
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/Init.c
@@ -0,0 +1,26 @@
+/** @file
+ Platform specific Initialisation for PlatformTpmLib.
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include
+#include
+
+/**
+ This function is called in TpmLibConstructor() to
+ initialise PlatformTpmLib once.
+
+ @return EFI_SUCCESS Success
+ @return Others Errors
+
+**/
+EFI_STATUS
+EFIAPI
+PlatformTpmLibInit (
+ VOID
+ )
+{
+ return EFI_SUCCESS;
+}
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/NVMem.c b/TcgTpmPkg/Library/PlatformTpmNullLib/NVMem.c
new file mode 100644
index 0000000000..a9f403d54a
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/NVMem.c
@@ -0,0 +1,277 @@
+/** @file
+ Tpm Nv Storage part of PlatformTpmLib to use TpmLib.
+
+ To see the plat_XXX interfaces in TPM reference library, see:
+ - https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include
+#include
+
+/**
+ _plat__NVNeedsManufacture()
+
+ This function checks whether TPM's NV state needs to be manufactured.
+
+ @return TRUE TPM's NV storage should be manufactured
+ @return FALSE TPM's NV storage is already manufactured
+
+**/
+BOOLEAN
+EFIAPI
+PlatformTpmLibNVNeedsManufacture (
+ VOID
+ )
+{
+ return FALSE;
+}
+
+/**
+ _plat__NVEnable()
+
+ Enable NV memory.
+
+ the NV state would be read in, decrypted and integrity checked if needs.
+
+ The recovery from an integrity failure depends on where the error occurred. It
+ it was in the state that is discarded by TPM Reset, then the error is
+ recoverable if the TPM is reset. Otherwise, the TPM must go into failure mode.
+
+ @param [in] PlatParameter Platform parameter to enable NV storage
+ @param [in] ParamSize Size of PlatParameter
+
+ @return 0 if success
+ @return > 0 if receive recoverable error
+ @return < 0 if unrecoverable error
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNVEnable (
+ IN VOID *PlatParameter,
+ IN UINTN ParamSize
+ )
+{
+ return -1;
+}
+
+/**
+ _plat__NVDisable()
+
+ Disable NV memory.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibNVDisable (
+ VOID
+ )
+{
+ return;
+}
+
+/**
+ _plat__GetNvReadyState()
+
+ Check if NV is available.
+
+ @return 0 NV is available
+ @return 1 NV is not available due to write failure
+ @return 2 NV is not available due to rate limit
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibGetNvReadyState (
+ VOID
+ )
+{
+ return 1;
+}
+
+/**
+ _plat__NvMemoryRead()
+
+ Read a chunk of NV memory.
+
+ @param [in] StartOffset Read start offset
+ @param [in] Size Size to read
+ @param [out] Data Data buffer
+
+ @return 1 Success to read
+ @return 0 Failed to read
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvMemoryRead (
+ IN UINT32 StartOffset,
+ IN UINT32 Size,
+ OUT VOID *Data
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__NvGetChangedStatus()
+
+ This function checks to see if the NV is different from the test value
+ so that NV will not be written if it has not changed.
+
+ @param [in] StartOffset Start offset to compare
+ @param [in] Size Size for compare
+ @param [in] Data Data to be compared
+
+ @return NV_HAS_CHANGED(1) the NV location is different from the test value
+ @return NV_IS_SAME(0) the NV location is the same as the test value
+ @return NV_INVALID_LOCATION(-1) the NV location is invalid; also triggers failure mode
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvGetChangedStatus (
+ IN UINT32 StartOffset,
+ IN UINT32 Size,
+ IN VOID *Data
+ )
+{
+ return -1;
+}
+
+/**
+ _plat__NvMemoryWrite()
+
+ This function is used to update NV memory. The "write" is to a memory copy of
+ NV. At the end of the current command, any changes are written to
+ the actual NV memory.
+
+ NOTE: A useful optimization would be for this code to compare the current
+ contents of NV with the local copy and note the blocks that have changed. Then
+ only write those blocks when _plat__NvCommit() is called.
+
+ @param [in] StartOffset Start Offset to write
+ @param [in] Size Size to wrrite
+ @param [in] Data Data
+
+ @return 0 Failed to write
+ @return 1 Success to write
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvMemoryWrite (
+ IN UINT32 StartOffset,
+ IN UINT32 Size,
+ IN VOID *Data
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__NvMemoryClear()
+
+ Function is used to set a range of NV memory bytes to an implementation-dependent
+ value. The value represents the erase state of the memory.
+
+ @param [in] StartOffset Start offset to clear
+ @param [in] SIze Size to be clear
+
+
+ @return 0 Failed to clear
+ @return 1 Success
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvMemoryClear (
+ IN UINT32 StartOffset,
+ IN UINT32 Size
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__NvMemoryMove()
+
+ Function: Move a chunk of NV memory from source to destination
+ This function should ensure that if there overlap, the original data is
+ copied before it is written.
+
+ @param [in] SourceOffset Source offset to move
+ @param [in] DestOffset Destination offset to move
+ @param [in] Size Size to be moved
+
+ @return 0 Failed to move
+ @return 1 Success
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvMemoryMove (
+ IN UINT32 SourceOffset,
+ IN UINT32 DestOffset,
+ IN UINT32 Size
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__NvCommit()
+
+ This function writes the local copy of NV to NV for permanent store.
+ It will write TPM_NV_MEMORY_SIZE bytes to NV.
+
+ @return 0 NV write success
+ @return non-0 NV write fail
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibNvCommit (
+ VOID
+ )
+{
+ return -1;
+}
+
+/**
+ _plat__SetNvAvail()
+
+ Set the current NV state to available.
+ This function is for testing purpose only.
+ It is not part of the platform NV logic.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibSetNvAvail (
+ VOID
+ )
+{
+ // NV will not be made unavailable on this platform
+ return;
+}
+
+/**
+ _plat__ClearNvAvail()
+
+ Set the current NV state to unavailable.
+ This function is for testing purpose only.
+ It is not part of the platform NV logic.
+
+**/
+VOID
+EFIAPI
+PlatformTpmLibClearNvAvail (
+ VOID
+ )
+{
+ // The anti-set; not on this platform.
+ return;
+}
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/PlatformTpmNullLib.inf b/TcgTpmPkg/Library/PlatformTpmNullLib/PlatformTpmNullLib.inf
new file mode 100644
index 0000000000..9f8bc950a9
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/PlatformTpmNullLib.inf
@@ -0,0 +1,42 @@
+## @file
+# NULL instance library of the PlatformTpmLib used in TpmLib.
+#
+# Copyright (c) 2025, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = PlatformTpmNullLib
+ FILE_GUID = 14992892-1dc5-11ef-b21c-97fa7f4b3198
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ PI_SPECIFICATION_VERSION = 0x00010032
+ LIBRARY_CLASS = PlatformTpmLib
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = ARM AARCH64
+#
+
+[Sources]
+ Clock.c
+ Entropy.c
+ EPS.c
+ ExtraData.c
+ Failure.c
+ Init.c
+ NVMem.c
+ Unique.c
+ VendorInfo.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ TcgTpmPkg/TcgTpmPkg.dec
+
+[LibraryClasses]
+ BaseLib
+ BaseMemoryLib
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/Unique.c b/TcgTpmPkg/Library/PlatformTpmNullLib/Unique.c
new file mode 100644
index 0000000000..e90559d2dd
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/Unique.c
@@ -0,0 +1,46 @@
+/** @file
+ In some implementations of the TPM, the hardware can provide a secret
+ value to the TPM. This secret value is statistically unique to the
+ instance of the TPM. Typical uses of this value are to provide
+ personalization to the random number generation and as a shared secret
+ between the TPM and the manufacturer.
+
+ To see the plat_XXX interfaces in TPM reference library, see:
+ - https://github.com/TrustedComputingGroup/TPM/tree/main/TPMCmd/Platform/src
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include
+#include
+
+/**
+ _plat__GetUnique()
+
+ This function is used to access the platform-specific unique value.
+ This function places the unique value in the provided buffer
+ and returns the number of bytes transferred. The function will not
+ copy more data than 'Size'.
+
+ NOTE: If a platform unique value has unequal distribution of uniqueness
+ and 'Size' is smaller than the size of the unique value, the 'Size'
+ portion with the most uniqueness should be returned.
+
+ @param [in] Which 0: reserved, 1: permanent vendor unique value.
+ @param [in] Size Size of Buffer
+ @param [out] Buffer Output Buffer
+
+ @return Size of unique value.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetUnique (
+ IN UINT32 Which,
+ IN UINT32 Size,
+ OUT UINT8 *Buffer
+ )
+{
+ return 0;
+}
diff --git a/TcgTpmPkg/Library/PlatformTpmNullLib/VendorInfo.c b/TcgTpmPkg/Library/PlatformTpmNullLib/VendorInfo.c
new file mode 100644
index 0000000000..9bdb9f2eda
--- /dev/null
+++ b/TcgTpmPkg/Library/PlatformTpmNullLib/VendorInfo.c
@@ -0,0 +1,190 @@
+/** @file
+ Provide vendor-specific version and identifiers to core TPM library
+ for return in capabilities. These may not be compile time constants and
+ therefore are provided by platform callbacks.
+ These platform functions are expected to always be available,
+ even in failure mode.
+
+ Copyright (c) 2025, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include
+#include
+
+/**
+ _plat__GetManufacturerCapabilityCode()
+
+ return the 4 character Manufacturer Capability code.
+ This should come from the platform library since
+ that is provided by the manufacturer.
+
+
+ @return Manufacturer capability Code.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetManufacturerCapabilityCode (
+ VOID
+ )
+{
+ return 0x58595A20; // "XYZ "
+}
+
+/**
+ _plat__GetVendorCapabilityCode()
+
+ return the 4 character VendorStrings for Capabilities.
+ Index is ONE-BASED, and may be in the range [1,4] inclusive.
+ Any other index returns all zeros. The return value will be interpreted
+ as an array of 4 ASCII characters (with no null terminator).
+
+ @param[in] Index index
+
+ @return Vendor specific capability code.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetVendorCapabilityCode (
+ IN INT32 Index
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__GetTpmFirmwareVersionHigh()
+
+ return the most-significant 32-bits of the TPM Firmware Version
+
+ @return High 32-bits of TPM Firmware Version.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetTpmFirmwareVersionHigh (
+ VOID
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__GetTpmFirmwareVersionLow()
+
+ return the least-significant 32-bits of the TPM Firmware Version
+
+ @return Low 32-bits of TPM Firmware Version.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetTpmFirmwareVersionLow (
+ VOID
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__GetTpmFirmwareSvn()
+
+ return the TPM Firmware current SVN.
+
+ @return current SVN.
+
+**/
+UINT16
+EFIAPI
+PlatformTpmLibGetTpmFirmwareSvn (
+ VOID
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__GetTpmFirmwareMaxSvn()
+
+ return the TPM Firmware maximum SVN.
+
+ @return Maximum SVN.
+
+**/
+UINT16
+EFIAPI
+PlatformTpmLibGetTpmFirmwareMaxSvn (
+ VOID
+ )
+{
+ return 0;
+}
+
+/**
+ _plat__GetTpmFirmwareSvnSecret().
+
+ return the TPM Firmware SVN Secret value associated with SVN.
+
+ @param[in] Svn Svn.
+ @param[in] SecretBufferSize Secret Buffer Size.
+ @param[out] SecretBuffer Secret Buffer.
+ @param[out] SecretSize Secret Svn Size.
+
+ @return 0 Success.
+ @return < 0 Error.
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibGetTpmFirmwareSvnSecret (
+ IN UINT16 Svn,
+ IN UINT16 SecretBufferSize,
+ OUT UINT8 *SecretBuffer,
+ OUT UINT16 *SecretSize
+ )
+{
+ return -1;
+}
+
+/**
+ _plat__GetTpmFirmwareSecret().
+
+ return the TPM Firmware Secret value associated with SVN.
+
+ @param[in] SecretBufferSize Secret Buffer Size.
+ @param[out] SecretBuffer Secret Buffer.
+ @param[out] SecretSize Secret Svn Size.
+
+ @return 0 Success.
+ @return < 0 Error.
+
+**/
+INT32
+EFIAPI
+PlatformTpmLibGetTpmFirmwareSecret (
+ IN UINT16 SecretBufferSize,
+ OUT UINT8 *SecretBuffer,
+ OUT UINT16 *SecretSize
+ )
+{
+ return -1;
+}
+
+/**
+ _plat__GetVendorTpmType().
+
+ return the Platform TPM type.
+
+ @return TPM type.
+
+**/
+UINT32
+EFIAPI
+PlatformTpmLibGetVendorTpmType (
+ VOID
+ )
+{
+ return PLATFORM_TPM_TYPE_UNKNOWN;
+}
diff --git a/TcgTpmPkg/TcgTpmPkg.ci.yaml b/TcgTpmPkg/TcgTpmPkg.ci.yaml
new file mode 100644
index 0000000000..7ef3a0e94f
--- /dev/null
+++ b/TcgTpmPkg/TcgTpmPkg.ci.yaml
@@ -0,0 +1,75 @@
+## @file
+# CI configuration for TcgTpmPkg
+#
+# Copyright (c) 2025, Arm Ltd. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+{
+ "PrEval": {
+ "DscPath": "TcgTpmPkg.dsc",
+ },
+ "LicenseCheck": {
+ "IgnoreFiles": [
+ # These directories are symbolic link or submodule
+ ]
+ },
+ "EccCheck": {
+ ## Exception sample looks like below:
+ ## "ExceptionList": [
+ ## "", ""
+ ## ]
+ "ExceptionList": [
+ ],
+ ## Both file path and directory path are accepted.
+ "IgnoreFiles": [
+ ]
+ },
+ "CompilerPlugin": {
+ "DscPath": "TcgTpmPkg.dsc"
+ },
+ ## options defined .pytool/Plugin/HostUnitTestCompilerPlugin
+ "HostUnitTestCompilerPlugin": {
+ },
+ "CharEncodingCheck": {
+ "IgnoreFiles": []
+ },
+ "DependencyCheck": {
+ "AcceptableDependencies": [
+ "MdePkg/MdePkg.dec",
+ "MdeModulePkg/MdeModulePkg.dec",
+ "CryptoPkg/CryptoPkg.dec",
+ ],
+ # For host based unit tests
+ "AcceptableDependencies-HOST_APPLICATION":[],
+ # For UEFI shell based apps
+ "AcceptableDependencies-UEFI_APPLICATION":[],
+ "IgnoreInf": []
+ },
+ "DscCompleteCheck": {
+ "DscPath": "TcgTpmPkg.dsc",
+ "IgnoreInf": []
+ },
+ "GuidCheck": {
+ "IgnoreGuidName": [],
+ "IgnoreGuidValue": [],
+ "IgnoreFoldersAndFiles": []
+ },
+ "LibraryClassCheck": {
+ "IgnoreHeaderFile": []
+ },
+
+ ## options defined ci/Plugin/SpellCheck
+ "SpellCheck": {
+ "skip": True,
+ "IgnoreFiles": [], # use gitignore syntax to ignore errors in matching files
+ "ExtendWords": [], # words to extend to the dictionary for this package
+ "IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignore
+ "AdditionalIncludePaths": [] # Additional paths to spell check (wildcards supported)
+ },
+
+ # options defined in .pytool/Plugin/UncrustifyCheck
+ "UncrustifyCheck": {
+ "IgnoreFiles": [
+ ]
+ }
+}
diff --git a/TcgTpmPkg/TcgTpmPkg.dec b/TcgTpmPkg/TcgTpmPkg.dec
new file mode 100644
index 0000000000..1c2bd274d2
--- /dev/null
+++ b/TcgTpmPkg/TcgTpmPkg.dec
@@ -0,0 +1,31 @@
+## @file
+# Package for TCG TPM modules.
+#
+# This Package provides softwared-based TPM libraries using TCG TPM v2.0
+# Reference Library (https://github.com/TrustedComputingGroup/TPM).
+#
+# Copyright (c) 2025, Arm ltd. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+
+[Defines]
+ DEC_SPECIFICATION = 0x00010005
+ PACKAGE_NAME = TcgTpmPkg
+ PACKAGE_UNI_FILE = TcgTpmPkg.uni
+ PACKAGE_GUID = d2140d58-d992-11f0-a174-6718da082438
+ PACKAGE_VERSION = 0.98
+
+[Includes]
+ Include
+
+[Includes.Common.Private]
+
+[LibraryClasses]
+ ## @libraryclass Provides platform specific APIs used by TpmLib.
+ #
+ PlatformTpmLib|Include/Library/PlatformTpmLib.h
+
+[LibraryClasses.common.Private]
diff --git a/TcgTpmPkg/TcgTpmPkg.dsc b/TcgTpmPkg/TcgTpmPkg.dsc
new file mode 100644
index 0000000000..43e716304c
--- /dev/null
+++ b/TcgTpmPkg/TcgTpmPkg.dsc
@@ -0,0 +1,91 @@
+## @file
+# TCG TPM Library Package for softwared based TPM.
+#
+# Copyright (c) 2025, Arm Ltd. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+ PLATFORM_NAME = TcgTpmPkg
+ PLATFORM_GUID = fbaf24d0-d9a7-11f0-89be-3fbf4120ee76
+ PLATFORM_VERSION = 0.98
+ DSC_SPECIFICATION = 0x00010005
+ SUPPORTED_ARCHITECTURES = AARCH64
+ BUILD_TARGETS = DEBUG|RELEASE|NOOPT
+ SKUID_IDENTIFIER = DEFAULT
+
+
+###############################################################################
+#
+# Library Class section - list of all Library Classes needed by this Platform.
+#
+################################################################################
+
+!include MdePkg/MdeLibs.dsc.inc
+
+[LibraryClasses]
+ BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
+ BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+ DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
+ SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
+ SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
+ TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
+ RngLib|MdePkg/Library/BaseRngLibNull/BaseRngLibNull.inf
+ PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
+ DebugLib|MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
+ DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
+ OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
+ HashApiLib|CryptoPkg/Library/BaseHashApiLib/BaseHashApiLib.inf
+ OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibFull.inf
+ IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
+
+[LibraryClasses.AARCH64]
+ ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
+
+[LibraryClasses.common.SEC]
+ BaseCryptLib|CryptoPkg/Library/BaseCryptLib/SecCryptLib.inf
+ TlsLib|CryptoPkg/Library/TlsLibNull/TlsLibNull.inf
+
+[LibraryClasses.common.PEIM]
+ PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
+ PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
+ PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
+ MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
+ HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
+ PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
+ ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
+ BaseCryptLib|CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
+
+[LibraryClasses.common.DXE_DRIVER]
+ UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
+ UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
+ UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
+ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
+ BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
+ TlsLib|CryptoPkg/Library/TlsLib/TlsLib.inf
+
+[LibraryClasses.common.MM_STANDALONE]
+ BaseCryptLib|CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf
+ MmServicesTableLib|MdePkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf
+ StandaloneMmDriverEntryPoint|MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntryPoint.inf
+ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf
+ MemoryAllocationLib|StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf
+
+[Components]
+ #
+ # Build verification of all library instances
+ #
+ TcgTpmPkg/Library/PlatformTpmNullLib/PlatformTpmNullLib.inf
+
+[BuildOptions]
+ RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG
+ *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES
diff --git a/TcgTpmPkg/TcgTpmPkg.uni b/TcgTpmPkg/TcgTpmPkg.uni
new file mode 100644
index 0000000000..b3917609e3
--- /dev/null
+++ b/TcgTpmPkg/TcgTpmPkg.uni
@@ -0,0 +1,12 @@
+// /** @file
+// Package for TCG TPM modules.
+//
+// This Package provides softwared-based TPM libraries using TCG TPM v2.0
+// Reference Library (https://github.com/TrustedComputingGroup/TPM).
+//
+// Copyright (c) 2025, Arm ltd. All rights reserved.
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+// **/
+