blob: a0bdeb114ef8f57a7c2c8464ed67ddd0b6a40fa5 [file] [log] [blame]
// This file was extracted from the TCG Published
// Trusted Platform Module Library
// Part 4: Supporting Routines
// Family "2.0"
// Level 00 Revision 01.16
// October 30, 2014
#ifndef PLATFORM_H
#define PLATFORM_H
//
//
// Includes and Defines
//
#include "bool.h"
#include "stdint.h"
#include "TpmError.h"
#include "TpmBuildSwitches.h"
#define UNREFERENCED(a) ((void)(a))
//
//
// Power Functions
//
// _plat__Signal_PowerOn
//
// Signal power on This signal is simulate by a RPC call
//
LIB_EXPORT int
_plat__Signal_PowerOn(void);
//
//
// _plat__Signal_Reset
//
// Signal reset This signal is simulate by a RPC call
//
LIB_EXPORT int
_plat__Signal_Reset(void);
//
//
// _plat__WasPowerLost()
//
// Indicates if the power was lost before a _TPM__Init().
//
LIB_EXPORT BOOL
_plat__WasPowerLost(BOOL clear);
//
//
// _plat__Signal_PowerOff()
//
// Signal power off This signal is simulate by a RPC call
//
LIB_EXPORT void
_plat__Signal_PowerOff(void);
//
//
// Physical Presence Functions
//
// _plat__PhysicalPresenceAsserted()
//
// Check if physical presence is signaled
//
//
//
//
// Return Value Meaning
//
// TRUE if physical presence is signaled
// FALSE if physical presence is not signaled
//
LIB_EXPORT BOOL
_plat__PhysicalPresenceAsserted(void);
//
//
// _plat__Signal_PhysicalPresenceOn
//
// Signal physical presence on This signal is simulate by a RPC call
//
LIB_EXPORT void
_plat__Signal_PhysicalPresenceOn(void);
//
//
// _plat__Signal_PhysicalPresenceOff()
//
// Signal physical presence off This signal is simulate by a RPC call
//
LIB_EXPORT void
_plat__Signal_PhysicalPresenceOff(void);
//
//
// Command Canceling Functions
//
// _plat__IsCanceled()
//
// Check if the cancel flag is set
//
// Return Value Meaning
//
// TRUE if cancel flag is set
// FALSE if cancel flag is not set
//
LIB_EXPORT BOOL
_plat__IsCanceled(void);
//
//
// _plat__SetCancel()
//
// Set cancel flag.
//
LIB_EXPORT void
_plat__SetCancel(void);
//
//
// _plat__ClearCancel()
//
// Clear cancel flag
//
LIB_EXPORT void
_plat__ClearCancel( void);
//
//
//
// NV memory functions
//
// _plat__NvErrors()
//
// This function is used by the simulator to set the error flags in the NV subsystem to simulate an error in the
// NV loading process
//
LIB_EXPORT void
_plat__NvErrors(
BOOL recoverable,
BOOL unrecoverable
);
//
//
// _plat__NVEnable()
//
// Enable platform NV memory NV memory is automatically enabled at power on event. This function is
// mostly for TPM_Manufacture() to access NV memory without a power on event
//
// Return Value Meaning
//
// 0 if success
// non-0 if fail
//
LIB_EXPORT int
_plat__NVEnable(
void *platParameter // IN: platform specific parameters
);
//
//
// _plat__NVDisable()
//
// Disable platform NV memory NV memory is automatically disabled at power off event. This function is
// mostly for TPM_Manufacture() to disable NV memory without a power off event
//
LIB_EXPORT void
_plat__NVDisable(void);
//
//
// _plat__IsNvAvailable()
//
// Check if NV is available
//
// Return Value Meaning
//
// 0 NV is available
// 1 NV is not available due to write failure
// 2 NV is not available due to rate limit
//
LIB_EXPORT int
_plat__IsNvAvailable(void);
//
//
// _plat__NvCommit()
//
// Update NV chip
//
//
//
//
// Return Value Meaning
//
// 0 NV write success
// non-0 NV write fail
//
LIB_EXPORT int
_plat__NvCommit(void);
//
//
// _plat__NvMemoryRead()
//
// Read a chunk of NV memory
//
LIB_EXPORT void
_plat__NvMemoryRead(
unsigned int startOffset, // IN: read start
unsigned int size, // IN: size of bytes to read
void *data // OUT: data buffer
);
//
//
// _plat__NvIsDifferent()
//
// This function checks to see if the NV is different from the test value. This is so that NV will not be written if
// it has not changed.
//
// Return Value Meaning
//
// TRUE the NV location is different from the test value
// FALSE the NV location is the same as the test value
//
LIB_EXPORT BOOL
_plat__NvIsDifferent(
unsigned int startOffset, // IN: read start
unsigned int size, // IN: size of bytes to compare
void *data // IN: data buffer
);
//
//
// _plat__NvMemoryWrite()
//
// Write a chunk of NV memory
//
LIB_EXPORT void
_plat__NvMemoryWrite(
unsigned int startOffset, // IN: read start
unsigned int size, // IN: size of bytes to read
void *data // OUT: data buffer
);
//
//
// _plat__NvMemoryMove()
//
// 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
//
LIB_EXPORT void
_plat__NvMemoryMove(
unsigned int sourceOffset, // IN: source offset
unsigned int destOffset, // IN: destination offset
unsigned int size // IN: size of data being moved
);
//
//
// _plat__SetNvAvail()
//
// Set the current NV state to available. This function is for testing purposes only. It is not part of the
// platform NV logic
//
LIB_EXPORT void
_plat__SetNvAvail(void);
//
//
// _plat__ClearNvAvail()
//
// Set the current NV state to unavailable. This function is for testing purposes only. It is not part of the
// platform NV logic
//
LIB_EXPORT void
_plat__ClearNvAvail(void);
//
//
// _plat__NvGetHandleVirtualOffset()
//
// If the specified handle represents a virtual NV index, this function returns
// the corresponding virtual offset. For all other handles, 0 is returned.
//
LIB_EXPORT uint32_t
_plat__NvGetHandleVirtualOffset(uint32_t handle);
//
//
// _plat__NvOffsetIsVirtual()
//
//
// Returns true iff the specified offset corresponds to virtual NV memory; if
// so, this offset must only be read using the _plat__NvVirtualMemoryRead()
// function below.
//
LIB_EXPORT BOOL
_plat__NvOffsetIsVirtual(unsigned int startOffset);
//
//
// _plat__NvVirtualMemoryRead()
//
//
// Equivalent of _plat__NvMemoryRead, but for virtual NV memory. Only offsets
// for which _plat__NvOffsetIsVirtual() returns true should be passed to this
// function.
//
LIB_EXPORT void
_plat__NvVirtualMemoryRead(
unsigned int startOffset,
unsigned int size,
void *data
);
//
//
// Locality Functions
//
// _plat__LocalityGet()
//
// Get the most recent command locality in locality value form
//
LIB_EXPORT unsigned char
_plat__LocalityGet(void);
//
//
// _plat__LocalitySet()
//
// Set the most recent command locality in locality value form
//
LIB_EXPORT void
_plat__LocalitySet(
unsigned char locality
);
//
//
// _plat__IsRsaKeyCacheEnabled()
//
// This function is used to check if the RSA key cache is enabled or not.
//
LIB_EXPORT int
_plat__IsRsaKeyCacheEnabled(
void
);
//
//
// Clock Constants and Functions
//
// Assume that the nominal divisor is 30000
//
#define CLOCK_NOMINAL 30000
//
// A 1% change in rate is 300 counts
//
#define CLOCK_ADJUST_COARSE 300
//
//
// A .1 change in rate is 30 counts
//
#define CLOCK_ADJUST_MEDIUM 30
//
// A minimum change in rate is 1 count
//
#define CLOCK_ADJUST_FINE 1
//
// The clock tolerance is +/-15% (4500 counts) Allow some guard band (16.7%)
//
#define CLOCK_ADJUST_LIMIT 5000
//
//
// _plat__ClockReset()
//
// This function sets the current clock time as initial time. This function is called at a power on event to reset
// the clock
//
LIB_EXPORT void
_plat__ClockReset(void);
//
//
// _plat__ClockTimeFromStart()
//
// Function returns the compensated time from the start of the command when
// _plat__ClockTimeFromStart() was called.
//
LIB_EXPORT unsigned long long
_plat__ClockTimeFromStart(
void
);
//
//
// _plat__ClockTimeElapsed()
//
// Get the time elapsed from current to the last time the _plat__ClockTimeElapsed() is called. For the first
// _plat__ClockTimeElapsed() call after a power on event, this call report the elapsed time from power on to
// the current call
//
LIB_EXPORT unsigned long long
_plat__ClockTimeElapsed(void);
//
//
// _plat__ClockAdjustRate()
//
// Adjust the clock rate
//
LIB_EXPORT void
_plat__ClockAdjustRate(
int adjust // IN: the adjust number. It could be
// positive or negative
);
//
//
//
// Single Function Files
//
// _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. If the caller does not ask for any entropy, then this is
// a startup indication and firstValue should be reset.
//
// Return Value Meaning
//
// <0 hardware failure of the entropy generator, this is sticky
// >= 0 the returned amount of entropy (bytes)
//
LIB_EXPORT int32_t
_plat__GetEntropy(
unsigned char *entropy, // output buffer
uint32_t amount // amount requested
);
//
// Get firmware version numbers from the platform.
//
LIB_EXPORT void
_plat__GetFwVersion(
uint32_t *fw1,
uint32_t *fw2
);
// A function to call after every successful TPM2_Startup.
LIB_EXPORT void
_plat__StartupCallback(
void
);
//
// Check if a non-PLATFORMCREATE index shall nevertheless be retained when
// performing TPM2_Clear.
//
LIB_EXPORT BOOL
_plat__ShallSurviveOwnerClear(
uint32_t index
);
// A function to call as part of every TPM2_Clear.
LIB_EXPORT void
_plat__OwnerClearCallback(
void
);
// A function to inform CR50 that NvIndexData (handle) has been changed.
LIB_EXPORT void
_plat__NvInformIndexDataChanged(uint32_t handle);
int uart_printf(const char *format, ...);
#define ecprintf(format, args...) uart_printf(format, ## args);
#endif