Files
linux-legacy-genesi/include/linux/mxc_scc_driver.h
Rob Herring be0524d38f ENGR00117389 Port 5.0.0 release to 2.6.31
This is i.MX BSP 5.0.0 release ported to 2.6.31

Signed-off-by: Rob Herring <r.herring@freescale.com>
Signed-off-by: Alan Tull <r80115@freescale.com>
Signed-off-by: Xinyu Chen <xinyu.chen@freescale.com>
2010-08-10 11:44:41 -05:00

1032 lines
39 KiB
C

/*
* Copyright 2004-2009 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
* The code contained herein is licensed under the GNU General Public
* License. You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations:
*
* http://www.opensource.org/licenses/gpl-license.html
* http://www.gnu.org/copyleft/gpl.html
*/
#ifndef __ASM_ARCH_MXC_SCC_DRIVER_H__
#define __ASM_ARCH_MXC_SCC_DRIVER_H__
/* Start marker for C++ compilers */
#ifdef __cplusplus
extern "C" {
#endif
/*
* NAMING CONVENTIONS
* ==================
* (A note to maintainers and other interested parties)
*
* Use scc_ or SCC_ prefix for 'high-level' interface routines and the types
* passed to those routines. Try to avoid #defines in these interfaces.
*
* Use SMN_ or SCM_ prefix for the #defines used with scc_read_register() and
* scc_write_register, or values passed/retrieved from those routines.
*/
/*!
* @defgroup MXCSCC SCC Driver
*
* @ingroup MXCSECDRVRS
*/
/*!
* @file arch-mxc/mxc_scc_driver.h
*
* @brief (Header file to use the SCC driver.)
*
* The SCC driver will only be available to other kernel modules. That is,
* there will be no node file in /dev, no way for a user-mode program to access
* the driver, no way for a user program to access the device directly.
*
* With the exception of #scc_monitor_security_failure(), all routines are
* 'synchronous', i.e. they will not return to their caller until the requested
* action is complete, or fails to complete. Some of these functions could
* take quite a while to perform, depending upon the request.
*
* Routines are provided to:
* @li encrypt or decrypt secrets - #scc_crypt()
* @li trigger a security-violation alarm - #scc_set_sw_alarm()
* @li get configuration and version information - #scc_get_configuration()
* @li zeroize memory - #scc_zeroize_memories()
* @li Work on wrapped and stored secret values: #scc_alloc_slot(),
* #scc_dealloc_slot(), scc_load_slot(), #scc_decrypt_slot(),
* #scc_encrypt_slot(), #scc_get_slot_info()
* @li monitor the Security Failure alarm - #scc_monitor_security_failure()
* @li stop monitoring Security Failure alarm -
* #scc_stop_monitoring_security_failure()
* @li write registers of the SCC - #scc_write_register()
* @li read registers of the SCC - #scc_read_register()
*
* The driver does not allow "storage" of data in either the Red or Black
* memories. Any decrypted secret is returned to the user, and if the user
* wants to use it at a later point, the encrypted form must again be passed
* to the driver, and it must be decrypted again.
*
* The SCC encrypts and decrypts using Triple DES with an internally stored
* key. When the SCC is in Secure mode, it uses its secret, unique-per-chip
* key. When it is in Non-Secure mode, it uses a default key. This ensures
* that secrets stay secret if the SCC is not in Secure mode.
*
* Not all functions that could be provided in a 'high level' manner have been
* implemented. Among the missing are interfaces to the ASC/AIC components and
* the timer functions. These and other features must be accessed through
* #scc_read_register() and #scc_write_register(), using the @c \#define values
* provided.
*
* Here is a glossary of acronyms used in the SCC driver documentation:
* - CBC - Cipher Block Chaining. A method of performing a block cipher.
* Each block is encrypted using some part of the result of the previous
* block's encryption. It needs an 'initialization vector' to seed the
* operation.
* - ECB - Electronic Code Book. A method of performing a block cipher.
* With a given key, a given block will always encrypt to the same value.
* - DES - Data Encryption Standard. (8-byte) Block cipher algorithm which
* uses 56-bit keys. In SCC, this key is constant and unique to the device.
* SCC uses the "triple DES" form of this algorithm.
* - AIC - Algorithm Integrity Checker.
* - ASC - Algorithm Sequence Checker.
* - SMN - Security Monitor. The part of the SCC responsible for monitoring
* for security problems and notifying the CPU and other PISA components.
* - SCM - Secure Memory. The part of the SCC which handles the cryptography.
* - SCC - Security Controller. Central security mechanism for PISA.
* - PISA - Platform-Independent Security Architecture.
*/
/* Temporarily define compile-time flags to make Doxygen happy. */
#ifdef DOXYGEN_HACK
/*! @defgroup scccompileflags SCC Driver compile-time flags
*
* These preprocessor flags should be set, if desired, in a makefile so
* that they show up on the compiler command line.
*/
/*! @addtogroup scccompileflags */
/*! @{ */
/*!
* Compile-time flag to change @ref smnregs and @ref scmregs
* offset values for the SCC's implementation on the MX.21 board.
*
* This must also be set properly for any code which calls the
* scc_read_register() or scc_write_register() functions or references the
* register offsets.
*/
#define TAHITI
/*! @} */
#undef TAHITI
#endif /* DOXYGEN_HACK */
/*! Major Version of the driver. Used for
scc_configuration->driver_major_version */
#define SCC_DRIVER_MAJOR_VERSION_1 1
/*! Old Minor Version of the driver. */
#define SCC_DRIVER_MINOR_VERSION_0 0
/*! Old Minor Version of the driver. */
#define SCC_DRIVER_MINOR_VERSION_4 4
/*! Old Minor Version of the driver. */
#define SCC_DRIVER_MINOR_VERSION_5 5
/*! Old Minor Version of the driver. */
#define SCC_DRIVER_MINOR_VERSION_6 6
/*! Minor Version of the driver. Used for
scc_configuration->driver_minor_version */
#define SCC_DRIVER_MINOR_VERSION_8 8
/*!
* @typedef scc_return_t
*/
/*! Common status return values from SCC driver functions. */
typedef enum scc_return_t {
SCC_RET_OK = 0, /*!< Function succeeded */
SCC_RET_FAIL, /*!< Non-specific failure */
SCC_RET_VERIFICATION_FAILED, /*!< Decrypt validation failed */
SCC_RET_TOO_MANY_FUNCTIONS, /*!< At maximum registered functions */
SCC_RET_BUSY, /*!< SCC is busy and cannot handle request */
SCC_RET_INSUFFICIENT_SPACE, /*!< Encryption or decryption failed because
@c count_out_bytes says that @c data_out is
too small to hold the value. */
} scc_return_t;
/*!
* Configuration information about SCC and the driver.
*
* This struct/typedef contains information from the SCC and the driver to
* allow the user of the driver to determine the size of the SCC's memories and
* the version of the SCC and the driver.
*/
typedef struct scc_config_t {
int driver_major_version; /*!< Major version of the SCC driver code */
int driver_minor_version; /*!< Minor version of the SCC driver code */
int scm_version; /*!< Version from SCM Configuration register */
int smn_version; /*!< Version from SMN Status register */
int block_size_bytes; /*!< Number of bytes per block of RAM; also
block size of the crypto algorithm. */
int black_ram_size_blocks; /*!< Number of blocks of Black RAM */
int red_ram_size_blocks; /*!< Number of blocks of Red RAM */
} scc_config_t;
/*!
* @typedef scc_enc_dec_t
*/
/*!
* Determine whether SCC will run its cryptographic
* function as an encryption or decryption. Used as an argument to
* #scc_crypt().
*/
typedef enum scc_enc_dec_t {
SCC_ENCRYPT, /*!< Encrypt (from Red to Black) */
SCC_DECRYPT /*!< Decrypt (from Black to Red) */
} scc_enc_dec_t;
/*
* @typedef scc_crypto_mode_t
*/
/*!
* Determine whether SCC will run its cryptographic function in ECB (electronic
* codebook) or CBC (cipher-block chaining) mode. Used as an argument to
* #scc_crypt().
*/
typedef enum scc_crypto_mode_t {
SCC_ECB_MODE, /*!< Electronic Codebook Mode */
SCC_CBC_MODE /*!< Cipher Block Chaining Mode */
} scc_crypto_mode_t;
/*!
* @typedef scc_verify_t
*/
/*!
* Tell the driver whether it is responsible for verifying the integrity of a
* secret. During an encryption, using other than #SCC_VERIFY_MODE_NONE will
* cause a check value to be generated and appended to the plaintext before
* encryption. During decryption, the check value will be verified after
* decryption, and then stripped from the message.
*/
typedef enum scc_verify_t {
/*! No verification value added or checked. Input plaintext data must be
* be a multiple of the blocksize (#scc_get_configuration()). */
SCC_VERIFY_MODE_NONE,
/*! Driver will generate/validate a 2-byte CCITT CRC. Input plaintext will
be padded to a multiple of the blocksize, adding 3-10 bytes to the
resulting output ciphertext. Upon decryption, this padding will be
stripped, and the CRC will be verified. */
SCC_VERIFY_MODE_CCITT_CRC
} scc_verify_t;
/*!
* Determine if the given credentials match that of the key slot.
*
* @param[in] owner_id A value which will control access to the slot.
* @param[in] slot Key Slot to query
* @param[in] access_len Length of the key
*
* @return 0 on success, non-zero on failure. See #scc_return_t.
*/
scc_return_t
scc_verify_slot_access(uint64_t owner_id, uint32_t slot,
uint32_t access_len);
/*!
* Retrieve configuration information from the SCC.
*
* This function always succeeds.
*
* @return A pointer to the configuration information. This is a pointer to
* static memory and must not be freed. The values never change, and
* the return value will never be null.
*/
extern scc_config_t *scc_get_configuration(void);
/*!
* Zeroize Red and Black memories of the SCC. This will start the Zeroizing
* process. The routine will return when the memories have zeroized or failed
* to do so. The driver will poll waiting for this to occur, so this
* routine must not be called from interrupt level. Some future version of
* driver may elect instead to sleep.
*
* @return 0 or error if initialization fails.
*/
extern scc_return_t scc_zeroize_memories(void);
/*!
* Perform a Triple DES encryption or decryption operation.
*
* This routine will cause the SCM to perform an encryption or decryption with
* its internal key. If the SCC's #SMN_STATUS register shows that the SCC is
* in #SMN_STATE_SECURE, then the Secret Key will be used. If it is
* #SMN_STATE_NON_SECURE (or health check), then the Default Key will be used.
*
* This function will perform in a variety of ways, depending upon the values
* of @c direction, @c crypto_mode, and @c check_mode. If
* #SCC_VERIFY_MODE_CCITT_CRC mode is requested, upon successful completion,
* the @c count_in_bytes will be different from the returned value of @c
* count_out_bytes. This is because the two-byte CRC and some amount of
* padding (at least one byte) will either be added or stripped.
*
* This function will not return until the SCC has performed the operation (or
* reported failure to do so). It must therefore not be called from interrupt
* level. In the current version, it will poll the SCC for completion. In
* future versions, it may sleep.
*
* @param[in] count_in_bytes The number of bytes to move through the crypto
* function. Must be greater than zero.
*
* @param[in] data_in Pointer to the array of bytes to be used as input
* to the crypto function.
*
* @param[in] init_vector Pointer to the block-sized (8 byte) array of
* bytes which form the initialization vector for
* this operation. A non-null value is required
* when @c crypto_mode has the value #SCC_CBC_MODE;
* the value is ignored in #SCC_ECB_MODE.
*
* @param[in] direction Direct the driver to perform encryption or
* decryption.
*
* @param[in] crypto_mode Run the crypto function in ECB or CBC mode.
*
* @param[in] check_mode During encryption, generate and append a check
* value to the plaintext and pad the resulting
* data. During decryption, validate the plaintext
* with that check value and remove the padding.
*
* @param[in,out] count_out_bytes On input, the number of bytes available for
* copying to @c data_out. On return, the number of
* bytes copied to @c data_out.
*
* @param[out] data_out Pointer to the array of bytes that are where the
* output of the crypto function are to be placed.
* For encryption, this must be able to hold a
* longer ciphertext than the plaintext message at
* @c data_in. The driver will append a 'pad' of
* 1-8 bytes to the message, and if @c check_mode is
* used, additional bytes may be added, the number
* depending upon the type of check being requested.
*
* @return 0 on success, non-zero on failure. See #scc_return_t.
*
* @internal
* This function will verify SCC state and the functions parameters. It will
* acquire the crypto lock, and set up some SCC registers and variables common
* to encryption and decryption. A rough check will be made to verify that
* enough space is available in @c count_out_bytes. Upon success, either the
* #scc_encrypt or #scc_decrypt routine will be called to do the actual work.
* The crypto lock will then be released.
*/
extern scc_return_t scc_crypt(unsigned long count_in_bytes,
const uint8_t * data_in,
const uint8_t * init_vector,
scc_enc_dec_t direction,
scc_crypto_mode_t crypto_mode,
scc_verify_t check_mode,
uint8_t * data_out,
unsigned long *count_out_bytes);
/*!
* Allocate a key slot for a stored key (or other stored value).
*
* This feature is to allow decrypted secret values to be kept in RED RAM.
* This can all visibility of the data only by Sahara.
*
* @param value_size_bytes Size, in bytes, of RED key/value. Currently only
* a size up to 32 bytes is supported.
*
* @param owner_id A value which will control access to the slot.
* It must be passed into to any subsequent calls to
* use the assigned slot.
*
* @param[out] slot The slot number for the key.
*
* @return 0 on success, non-zero on failure. See #scc_return_t.
*/
extern scc_return_t scc_alloc_slot(uint32_t value_size_bytes,
uint64_t owner_id, uint32_t * slot);
/*!
* Deallocate the key slot of a stored key or secret value.
*
* @param owner_id The id which owns the @c slot.
*
* @param slot The slot number for the key.
* @return 0 on success, non-zero on failure. See #scc_return_t.
*/
extern scc_return_t scc_dealloc_slot(uint64_t owner_id, uint32_t slot);
/*!
* Load a value into a slot.
*
* @param owner_id Value of owner of slot
* @param slot Handle of slot
* @param key_data Data to load into the slot
* @param key_length Length, in bytes, of @c key_data to copy to SCC.
*
* @return SCC_RET_OK on success. SCC_RET_FAIL will be returned if slot
* specified cannot be accessed for any reason, or SCC_RET_INSUFFICIENT_SPACE
* if @c key_length exceeds the size of the slot.
*/
extern scc_return_t scc_load_slot(uint64_t owner_id, uint32_t slot,
const uint8_t * key_data,
uint32_t key_length);
/*!
* Read a value from a slot.
*
* @param owner_id Value of owner of slot
* @param slot Handle of slot
* @param key_length Length, in bytes, of @c key_data to copy from SCC.
* @param key_data Location to write the key
*
* @return SCC_RET_OK on success. SCC_RET_FAIL will be returned if slot
* specified cannot be accessed for any reason, or SCC_RET_INSUFFICIENT_SPACE
* if @c key_length exceeds the size of the slot.
*/
extern scc_return_t scc_read_slot(uint64_t owner_id, uint32_t slot,
uint32_t key_length,
uint8_t * key_data);
/*!
* Allocate a key slot to fit the requested size.
*
* @param owner_id Value of owner of slot
* @param slot Handle of slot
* @param length Length, in bytes, of @c black_data
* @param black_data Location to store result of encrypting RED data in slot
*
* @return SCC_RET_OK on success, SCC_RET_FAIL if slot specified cannot be
* accessed for any reason.
*/
extern scc_return_t scc_encrypt_slot(uint64_t owner_id, uint32_t slot,
uint32_t length,
uint8_t * black_data);
/*!
* Decrypt some black data and leave result in the slot.
*
* @param owner_id Value of owner of slot
* @param slot Handle of slot
* @param length Length, in bytes, of @c black_data
* @param black_data Location of data to dencrypt and store in slot
*
* @return SCC_RET_OK on success, SCC_RET_FAIL if slot specified cannot be
* accessed for any reason.
*/
extern scc_return_t scc_decrypt_slot(uint64_t owner_id, uint32_t slot,
uint32_t length,
const uint8_t * black_data);
/*!
* Get attributes of data in RED slot.
*
* @param owner_id The id which owns the @c slot.
*
* @param slot The slot number for the key.
*
* @param[out] address Physical address of RED value.
*
* @param[out] value_size_bytes Length, in bytes, of RED value,
* or NULL if unneeded..
*
* @param[out] slot_size_bytes Length, in bytes, of slot size,
* or NULL if unneeded..
*
* @return 0 on success, non-zero on failure. See #scc_return_t.
*/
extern scc_return_t scc_get_slot_info(uint64_t owner_id, uint32_t slot,
uint32_t *address,
uint32_t *value_size_bytes,
uint32_t *slot_size_bytes);
/*!
* Signal a software alarm to the SCC. This will take the SCC and other PISA
* parts out of Secure mode and into Security Failure mode. The SCC will stay
* in failed mode until a reboot.
*
* @internal
* If the SCC is not already in fail state, simply write the
* #SMN_COMMAND_SET_SOFTWARE_ALARM bit in #SMN_COMMAND. Since there is no
* reason to wait for the interrupt to bounce back, simply act as though
* one did.
*/
extern void scc_set_sw_alarm(void);
/*!
* This routine will register a function to be called should a Security Failure
* be signalled by the SCC (Security Monitor).
*
* The callback function may be called from interrupt level, it may be called
* from some process' task. It should therefore not take a long time to
* perform its operation, and it may not sleep.
*
* @param callback_func Function pointer to routine which will receive
* notification of the security failure.
* @return 0 if function was successfully registered, non-zero on
* failure. See #scc_return_t.
*
* @internal
* There is a fixed global static array which keeps track of the requests to
* monitor the failure.
*
* Add @c callback_func to the first empty slot in #scc_callbacks[]. If there
* is no room, return #SCC_RET_TOO_MANY_FUNCTIONS.
*/
extern scc_return_t scc_monitor_security_failure(void
callback_func(void));
/*!
* This routine will deregister a function previously registered with
* #scc_monitor_security_failure().
*
* @param callback_func Function pointer to routine previously registered with
* #scc_stop_monitoring_security_failure().
*/
extern void scc_stop_monitoring_security_failure(void
callback_func(void));
/*!
* Read value from an SCC register.
* The offset will be checked for validity (range) as well as whether it is
* accessible (e.g. not busy, not in failed state) at the time of the call.
*
* @param[in] register_offset The (byte) offset within the SCC block
* of the register to be queried. See
* @ref scmregs and @ref smnregs.
* @param[out] value Pointer to where value from the register
* should be placed.
* @return 0 if OK, non-zero on error. See #scc_return_t.
*
* @internal
* Verify that the register_offset is a) valid, b) refers to a readable
* register, and c) the SCC is in a state which would allow a read of this
* register.
*/
extern scc_return_t scc_read_register(int register_offset,
uint32_t * value);
/*!
* Write a new value into an SCC register.
* The offset will be checked for validity (range) as well as whether it is
* accessible (e.g. not busy, not in failed state) at the time of the call.
*
* @param[in] register_offset The (byte) offset within the SCC block
* of the register to be modified. See
* @ref scmregs and @ref smnregs.
* @param[in] value The value to store into the register.
* @return 0 if OK, non-zero on error. See #scc_return_t.
*
* @internal
* Verify that the register_offset is a) valid, b) refers to a writeable
* register, and c) the SCC is in a state which would allow a write to this
* register.
*/
extern scc_return_t scc_write_register(int register_offset,
uint32_t value);
/*
* NOTE TO MAINTAINERS
*
* All of the doxygen comments for the register offset values are in this the
* following comment section. Any changes to register names or definitions
* must be reflected in this section and in both the TAHITI and non-TAHITI
*version of the memory map.
*/
/*!
* @defgroup scmregs SCM Registers
*
* These values are offsets into the SCC for the Secure Memory
* (SCM) registers. They are used in the @c register_offset parameter of
* #scc_read_register() and #scc_write_register().
*/
/*! @addtogroup scmregs */
/*! @{ */
/*! @def SCM_RED_START
* Starting block offset in red memory for cipher function. */
/*! @def SCM_BLACK_START
* Starting block offset in black memory for cipher function. */
/*! @def SCM_LENGTH
* Number of blocks to process during cipher function */
/*! @def SCM_CONTROL
* SCM Control register.
* See @ref scmcontrolregdefs "SCM Control Register definitions" for details.
*/
/*! @def SCM_STATUS
* SCM Status register.
* See @ref scmstatusregdefs "SCM Status Register Definitions" for details.
*/
/*! @def SCM_ERROR_STATUS
* SCM Error Status Register.
* See @ref scmerrstatdefs "SCM Error Status Register definitions" for
* details. */
/*! @def SCM_INTERRUPT_CTRL
* SCM Interrupt Control Register.
* See @ref scminterruptcontroldefs "SCM Interrupt Control Register definitions"
* for details.
*/
/*! @def SCM_CONFIGURATION
* SCM Configuration Register.
* See @ref scmconfigdefs "SCM Configuration Register Definitions" for
* details.
*/
/*! @def SCM_INIT_VECTOR_0
* Upper Half of the Initialization Vector */
/*! @def SCM_INIT_VECTOR_1
* Lower Half of the Initialization Vector */
/*! @def SCM_RED_MEMORY
* Starting location of first block of Red memory */
/*! @def SCM_BLACK_MEMORY
* Starting location of first block of Black memory */
/*! @} *//* end of SCM group */
/*!
* @defgroup smnregs SMN Registers
*
* These values are offsets into the SCC for the Security Monitor
* (SMN) registers. They are used in the @c register_offset parameter of the
* #scc_read_register() and #scc_write_register().
*/
/*! @addtogroup smnregs */
/*! @{ */
/*! @def SMN_STATUS
* Status register for SMN.
* See @ref smnstatusregdefs "SMN Status Register definitions" for further
* information.
*/
/*! @def SMN_COMMAND
* Command register for SMN. See
* @ref smncommandregdefs "Command Register Definitions" for further
* information.
*/
/*! @def SMN_SEQUENCE_START
* Sequence Start register for ASC. See #SMN_SEQUENCE_START_MASK
*/
/*! @def SMN_SEQUENCE_END
* Sequence End register for ASC. See #SMN_SEQUENCE_CHECK_MASK
*/
/*! @def SMN_SEQUENCE_CHECK
* Sequence Check register for ASC. See #SMN_SEQUENCE_END_MASK
*/
/*! @def SMN_BIT_COUNT
* Bit Bank Repository for AIC. See #SMN_BIT_COUNT_MASK
*/
/*! @def SMN_BITBANK_INC_SIZE
* Bit Bank Increment Size for AIC. See #SMN_BITBANK_INC_SIZE_MASK
*/
/*! @def SMN_BITBANK_DECREMENT
* Bit Bank Decrement for AIC. See #SMN_BITBANK_DECREMENT_MASK
*/
/*! @def SMN_COMPARE_SIZE
* Compare Size register for Plaintext/Ciphertext checker. See
* #SMN_COMPARE_SIZE_MASK */
/*! @def SMN_PLAINTEXT_CHECK
* Plaintext Check register for Plaintext/Ciphertext checker.
*/
/*! @def SMN_CIPHERTEXT_CHECK
* Ciphertext Check register for Plaintext/Ciphertext checker.
*/
/*! @def SMN_TIMER_IV
* Timer Initial Value register
*/
/*! @def SMN_TIMER_CONTROL
* Timer Control register.
* See @ref smntimercontroldefs "SMN Timer Control Register definitions".
*/
/*! @def SMN_DEBUG_DETECT_STAT
* Debug Detector Status Register
* See @ref smndbgdetdefs "SMN Debug Detector Status Register"for definitions.
*/
/*! @def SMN_TIMER
* Current value of the Timer Register
*/
/*! @} *//* end of SMN group */
/*
* SCC MEMORY MAP
*
*/
/* SCM registers */
#define SCM_RED_START 0x00000000 /* read/write */
#define SCM_BLACK_START 0x00000004 /* read/write */
#define SCM_LENGTH 0x00000008 /* read/write */
#define SCM_CONTROL 0x0000000C /* read/write */
#define SCM_STATUS 0x00000010 /* read only */
#define SCM_ERROR_STATUS 0x00000014 /* read/write */
#define SCM_INTERRUPT_CTRL 0x00000018 /* read/write */
#define SCM_CONFIGURATION 0x0000001C /* read only */
#define SCM_INIT_VECTOR_0 0x00000020 /* read/write */
#define SCM_INIT_VECTOR_1 0x00000024 /* read/write */
#define SCM_RED_MEMORY 0x00000400 /* read/write */
#define SCM_BLACK_MEMORY 0x00000800 /* read/write */
/* SMN Registers */
#define SMN_STATUS 0x00001000 /* read/write */
#define SMN_COMMAND 0x00001004 /* read/write */
#define SMN_SEQUENCE_START 0x00001008 /* read/write */
#define SMN_SEQUENCE_END 0x0000100C /* read/write */
#define SMN_SEQUENCE_CHECK 0x00001010 /* read/write */
#define SMN_BIT_COUNT 0x00001014 /* read only */
#define SMN_BITBANK_INC_SIZE 0x00001018 /* read/write */
#define SMN_BITBANK_DECREMENT 0x0000101C /* write only */
#define SMN_COMPARE_SIZE 0x00001020 /* read/write */
#define SMN_PLAINTEXT_CHECK 0x00001024 /* read/write */
#define SMN_CIPHERTEXT_CHECK 0x00001028 /* read/write */
#define SMN_TIMER_IV 0x0000102C /* read/write */
#define SMN_TIMER_CONTROL 0x00001030 /* read/write */
#define SMN_DEBUG_DETECT_STAT 0x00001034 /* read/write */
#define SMN_TIMER 0x00001038 /* read only */
/*! Total address space of the SCC, in bytes */
#define SCC_ADDRESS_RANGE 0x103c
/*!
* @defgroup smnstatusregdefs SMN Status Register definitions (SMN_STATUS)
*/
/*! @addtogroup smnstatusregdefs */
/*! @{ */
/*! SMN version id. */
#define SMN_STATUS_VERSION_ID_MASK 0xfc000000
/*! number of bits to shift #SMN_STATUS_VERSION_ID_MASK to get it to LSB */
#define SMN_STATUS_VERSION_ID_SHIFT 26
/*! Cacheable access to SMN attempted. */
#define SMN_STATUS_CACHEABLE_ACCESS 0x02000000
/*! Illegal bus master access attempted. */
#define SMN_STATUS_ILLEGAL_MASTER 0x01000000
/*! Scan mode entered/exited since last reset. */
#define SMN_STATUS_SCAN_EXIT 0x00800000
/*! Unaligned access attempted. */
#define SMN_STATUS_UNALIGNED_ACCESS 0x00400000
/*! Bad byte offset access attempted. */
#define SMN_STATUS_BYTE_ACCESS 0x00200000
/*! Illegal address access attempted. */
#define SMN_STATUS_ILLEGAL_ADDRESS 0x00100000
/*! User access attempted. */
#define SMN_STATUS_USER_ACCESS 0x00080000
/*! SCM is using DEFAULT key. */
#define SMN_STATUS_DEFAULT_KEY 0x00040000
/*! SCM detects weak or bad key. */
#define SMN_STATUS_BAD_KEY 0x00020000
/*! Illegal access to SCM detected. */
#define SMN_STATUS_ILLEGAL_ACCESS 0x00010000
/*! Internal error detected in SCM. */
#define SMN_STATUS_SCM_ERROR 0x00008000
/*! SMN has an outstanding interrupt. */
#define SMN_STATUS_SMN_STATUS_IRQ 0x00004000
/*! Software Alarm was triggered. */
#define SMN_STATUS_SOFTWARE_ALARM 0x00002000
/*! Timer has expired. */
#define SMN_STATUS_TIMER_ERROR 0x00001000
/*! Plaintext/Ciphertext compare failed. */
#define SMN_STATUS_PC_ERROR 0x00000800
/*! Bit Bank detected overflow or underflow */
#define SMN_STATUS_BITBANK_ERROR 0x00000400
/*! Algorithm Sequence Check failed. */
#define SMN_STATUS_ASC_ERROR 0x00000200
/*! Security Policy Block detected error. */
#define SMN_STATUS_SECURITY_POLICY_ERROR 0x00000100
/*! At least one Debug signal is active. */
#define SMN_STATUS_DEBUG_ACTIVE 0x00000080
/*! SCM failed to zeroize its memory. */
#define SMN_STATUS_ZEROIZE_FAIL 0x00000040
/*! Processor booted from internal ROM. */
#define SMN_STATUS_INTERNAL_BOOT 0x00000020
/*! SMN's internal state. */
#define SMN_STATUS_STATE_MASK 0x0000001F
/*! Number of bits to shift #SMN_STATUS_STATE_MASK to get it to LSB. */
#define SMN_STATUS_STATE_SHIFT 0
/*! @} */
/*!
* @defgroup sccscmstates SMN Model Secure State Controller States (SMN_STATE_MASK)
*/
/*! @addtogroup sccscmstates */
/*! @{ */
/*! This is the first state of the SMN after power-on reset */
#define SMN_STATE_START 0x0
/*! The SMN is zeroizing its RAM during reset */
#define SMN_STATE_ZEROIZE_RAM 0x5
/*! SMN has passed internal checks, and is waiting for Software check-in */
#define SMN_STATE_HEALTH_CHECK 0x6
/*! Fatal Security Violation. SMN is locked, SCM is inoperative. */
#define SMN_STATE_FAIL 0x9
/*! SCC is in secure state. SCM is using secret key. */
#define SMN_STATE_SECURE 0xA
/*! Due to non-fatal error, device is not secure. SCM is using default key. */
#define SMN_STATE_NON_SECURE 0xC
/*! @} */
/*!
* @defgroup scmconfigdefs SCM Configuration Register definitions (SCM_CONFIGURATION)
**/
/*! @addtogroup scmconfigdefs */
/*! @{ */
/*! Version number of the Secure Memory. */
#define SCM_CFG_VERSION_ID_MASK 0xf8000000
/*! Number of bits to shift #SCM_CFG_VERSION_ID_MASK to get it to LSB. */
#define SCM_CFG_VERSION_ID_SHIFT 27
/*! Version one value for SCC configuration */
#define SCM_VERSION_1 1
/*! Size, in blocks, of Red memory. */
#define SCM_CFG_BLACK_SIZE_MASK 0x07fe0000
/*! Number of bits to shift #SCM_CFG_BLACK_SIZE_MASK to get it to LSB. */
#define SCM_CFG_BLACK_SIZE_SHIFT 17
/*! Size, in blocks, of Black memory. */
#define SCM_CFG_RED_SIZE_MASK 0x0001ff80
/*! Number of bits to shift #SCM_CFG_RED_SIZE_MASK to get it to LSB. */
#define SCM_CFG_RED_SIZE_SHIFT 7
/*! Number of bytes per block. */
#define SCM_CFG_BLOCK_SIZE_MASK 0x0000007f
/*! Number of bits to shift #SCM_CFG_BLOCK_SIZE_MASK to get it to LSB. */
#define SCM_CFG_BLOCK_SIZE_SHIFT 0
/*! @} */
/*!
* @defgroup smncommandregdefs SMN Command Register Definitions (SMN_COMMAND)
*/
/*! @addtogroup smncommandregdefs */
/*! @{ */
#define SMN_COMMAND_ZEROS_MASK 0xffffff70 /*!< These bits are unimplemented
or reserved */
#define SMN_COMMAND_TAMPER_LOCK 0x10 /*!< Lock Tamper Detect Bit */
#define SMN_COMMAND_CLEAR_INTERRUPT 0x8 /*!< Clear SMN Interrupt */
#define SMN_COMMAND_CLEAR_BIT_BANK 0x4 /*!< Clear SMN Bit Bank */
#define SMN_COMMAND_ENABLE_INTERRUPT 0x2 /*!< Enable SMN Interrupts */
#define SMN_COMMAND_SET_SOFTWARE_ALARM 0x1 /*!< Set Software Alarm */
/*! @} */
/*!
* @defgroup smntimercontroldefs SMN Timer Control Register definitions (SMN_TIMER_CONTROL)
*/
/*! @addtogroup smntimercontroldefs */
/*! @{ */
/*! These bits are reserved or zero */
#define SMN_TIMER_CTRL_ZEROS_MASK 0xfffffffc
/*! Load the timer from #SMN_TIMER_IV */
#define SMN_TIMER_LOAD_TIMER 0x2
/*! Setting to zero stops the Timer */
#define SMN_TIMER_STOP_MASK 0x1
/*! Setting this value starts the timer */
#define SMN_TIMER_START_TIMER 0x1
/*! @} */
/*!
* @defgroup scminterruptcontroldefs SCM Interrupt Control Register definitions (SCM_INTERRUPT_CTRL)
*
* These are the bit definitions for the #SCM_INTERRUPT_CTRL register.
*/
/*! @addtogroup scminterruptcontroldefs */
/*! @{ */
/*! Clear SCM memory */
#define SCM_INTERRUPT_CTRL_ZEROIZE_MEMORY 0x4
/*! Clear outstanding SCM interrupt */
#define SCM_INTERRUPT_CTRL_CLEAR_INTERRUPT 0x2
/*! Inhibit SCM interrupts */
#define SCM_INTERRUPT_CTRL_MASK_INTERRUPTS 0x1
/*! @} */
/*!
* @defgroup scmcontrolregdefs SCM Control Register definitions (SCM_CONTROL).
* These values are used with the #SCM_CONTROL register.
*/
/*! @addtogroup scmcontrolregdefs */
/*! @{ */
/*! These bits are zero or reserved */
#define SCM_CONTROL_ZEROS_MASK 0xfffffff8
/*! Setting this will start encrypt/decrypt */
#define SCM_CONTROL_START_CIPHER 0x04
/*! CBC/ECB flag.
* See @ref scmchainmodedefs "Chaining Mode bit definitions."
*/
#define SCM_CONTROL_CHAINING_MODE_MASK 0x02
/*! Encrypt/decrypt choice.
* See @ref scmciphermodedefs "Cipher Mode bit definitions." */
#define SCM_CONTROL_CIPHER_MODE_MASK 0x01
/*! @} */
/*!
* @defgroup scmchainmodedefs SCM_CHAINING_MODE_MASK - Bit definitions
*/
/*! @addtogroup scmchainmodedefs */
/*! @{ */
#define SCM_CBC_MODE 0x2 /*!< Cipher block chaining */
#define SCM_ECB_MODE 0x0 /*!< Electronic codebook. */
/*! @} */
/* Bit definitions in the SCM_CIPHER_MODE_MASK */
/*!
* @defgroup scmciphermodedefs SCM_CIPHER_MODE_MASK - Bit definitions
*/
/*! @{ */
#define SCM_DECRYPT_MODE 0x1 /*!< decrypt from black to red memory */
#define SCM_ENCRYPT_MODE 0x0 /*!< encrypt from red to black memory */
/*! @} */
/*!
* @defgroup scmstatusregdefs SCM Status Register (SCM_STATUS).
* Bit and field definitions of the SCM_STATUS register.
*/
/*! @addtogroup scmstatusregdefs */
/*! @{ */
/*! These bits are zero or reserved */
#define SCM_STATUS_ZEROS_MASK 0xffffe000
/*! Ciphering failed due to length error. */
#define SCM_STATUS_LENGTH_ERROR 0x1000
/*! SMN has stopped blocking access to the SCM */
#define SCM_STATUS_BLOCK_ACCESS_REMOVED 0x0800
/*! Ciphering done. */
#define SCM_STATUS_CIPHERING_DONE 0x0400
/*! Zeroizing done. */
#define SCM_STATUS_ZEROIZING_DONE 0x0200
/*! SCM wants attention. Interrupt status is available. */
#define SCM_STATUS_INTERRUPT_STATUS 0x0100
/*! Secret Key is in use. */
#define SCM_STATUS_SECRET_KEY 0x0080
/*! Secret Key is in use. Deprecated. Use #SCM_STATUS_SECRET_KEY. */
#define SCM_STATUS_DEFAULT_KEY 0x0080
/*! Internal error to SCM. */
#define SCM_STATUS_INTERNAL_ERROR 0x0040
/*! Secret key is not valid. */
#define SCM_STATUS_BAD_SECRET_KEY 0x0020
/*! Failed to zeroize memory. */
#define SCM_STATUS_ZEROIZE_FAILED 0x0010
/*! SMN is blocking access to Secure Memory. */
#define SCM_STATUS_SMN_BLOCKING_ACCESS 0x0008
/*! SCM is current encrypting or decrypting data. */
#define SCM_STATUS_CIPHERING 0x0004
/*! SCM is currently zeroizing data. */
#define SCM_STATUS_ZEROIZING 0x0002
/*! SCM is busy and access to memory is blocked. */
#define SCM_STATUS_BUSY 0x0001
/*! @} */
/*!
* @defgroup scmerrstatdefs SCM Error Status Register (SCM_ERROR_STATUS)
*
* These definitions are associated with the SCM Error Status Register
* (SCM_ERROR_STATUS).
*/
/*! @addtogroup scmerrstatdefs */
/*! @{ */
/*! These bits are zero or reserved */
#define SCM_ERR_ZEROS_MASK 0xffffc000
/*! Cacheable access to SCM was attempted */
#define SCM_ERR_CACHEABLE_ACCESS 0x2000
/*! Access attempted by illegal bus master */
#define SCM_ERR_ILLEGAL_MASTER 0x1000
/*! Unaligned access attempted */
#define SCM_ERR_UNALIGNED_ACCESS 0x0800
/*! Byte or half-word access attempted */
#define SCM_ERR_BYTE_ACCESS 0x0400
/*! Illegal address attempted */
#define SCM_ERR_ILLEGAL_ADDRESS 0x0200
/*! User access attempted */
#define SCM_ERR_USER_ACCESS 0x0100
/*! Access attempted while SCM was using default key */
#define SCM_ERR_SECRET_KEY_IN_USE 0x0080
/*! Access attempted while SCM had internal error */
#define SCM_ERR_INTERNAL_ERROR 0x0040
/*! Access attempted while SCM was detecting Bad Key */
#define SCM_ERR_BAD_SECRET_KEY 0x0020
/*! The SCM failed to Zeroize memory */
#define SCM_ERR_ZEROIZE_FAILED 0x0010
/*! Access attempted while SMN was Blocking Access */
#define SCM_ERR_SMN_BLOCKING_ACCESS 0x0008
/*! Access attempted while SCM was CIPHERING */
#define SCM_ERR_CIPHERING 0x0004
/*! Access attempted while SCM was ZEROIZING */
#define SCM_ERR_ZEROIZING 0x0002
/*! Access attempted while SCM was BUSY */
#define SCM_ERR_BUSY 0x0001
/*! @} */
/*!
* @defgroup smndbgdetdefs SMN Debug Detector Status Register
* (SCM_DEBUG_DETECT_STAT)
*/
/*! @addtogroup smndbgdetdefs */
/*! @{ */
#define SMN_DBG_ZEROS_MASK 0xfffff000 /*!< These bits are zero or reserved */
#define SMN_DBG_D12 0x0800 /*!< Error detected on Debug Port D12 */
#define SMN_DBG_D11 0x0400 /*!< Error detected on Debug Port D11 */
#define SMN_DBG_D10 0x0200 /*!< Error detected on Debug Port D10 */
#define SMN_DBG_D9 0x0100 /*!< Error detected on Debug Port D9 */
#define SMN_DBG_D8 0x0080 /*!< Error detected on Debug Port D8 */
#define SMN_DBG_D7 0x0040 /*!< Error detected on Debug Port D7 */
#define SMN_DBG_D6 0x0020 /*!< Error detected on Debug Port D6 */
#define SMN_DBG_D5 0x0010 /*!< Error detected on Debug Port D5 */
#define SMN_DBG_D4 0x0008 /*!< Error detected on Debug Port D4 */
#define SMN_DBG_D3 0x0004 /*!< Error detected on Debug Port D3 */
#define SMN_DBG_D2 0x0002 /*!< Error detected on Debug Port D2 */
#define SMN_DBG_D1 0x0001 /*!< Error detected on Debug Port D1 */
/*! @} */
/*! Mask for the usable bits of the Sequence Start Register
(#SMN_SEQUENCE_START) */
#define SMN_SEQUENCE_START_MASK 0x0000ffff
/*! Mask for the usable bits of the Sequence End Register
(#SMN_SEQUENCE_END) */
#define SMN_SEQUENCE_END_MASK 0x0000ffff
/*! Mask for the usable bits of the Sequence Check Register
(#SMN_SEQUENCE_CHECK) */
#define SMN_SEQUENCE_CHECK_MASK 0x0000ffff
/*! Mask for the usable bits of the Bit Counter Register
(#SMN_BIT_COUNT) */
#define SMN_BIT_COUNT_MASK 0x000007ff
/*! Mask for the usable bits of the Bit Bank Increment Size Register
(#SMN_BITBANK_INC_SIZE) */
#define SMN_BITBANK_INC_SIZE_MASK 0x000007ff
/*! Mask for the usable bits of the Bit Bank Decrement Register
(#SMN_BITBANK_DECREMENT) */
#define SMN_BITBANK_DECREMENT_MASK 0x000007ff
/*! Mask for the usable bits of the Compare Size Register
(#SMN_COMPARE_SIZE) */
#define SMN_COMPARE_SIZE_MASK 0x0000003f
/* Close out marker for C++ compilers */
#ifdef __cplusplus
}
#endif
#endif /* __ASM_ARCH_MXC_SCC_DRIVER_H__ */