blob: d0ef9c6180910d1a9e6b8cc263e3b7452df5a6fd [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_LIFECYCLE_H_
#define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_LIFECYCLE_H_
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* Lifecycle states.
*
* This is a condensed version of the 24 possible life cycle states where
* TEST_UNLOCKED_* states are mapped to `kLcStateTest` and invalid states where
* CPU execution is disabled are omitted.
*
* Encoding generated with
* $ ./util/design/sparse-fsm-encode.py -d 6 -m 5 -n 32 \
* -s 2447090565 --language=c
*
* Minimum Hamming distance: 13
* Maximum Hamming distance: 19
* Minimum Hamming weight: 15
* Maximum Hamming weight: 20
*/
typedef enum lifecycle_state {
/**
* Unlocked test state where debug functions are enabled.
*
* Corresponds to TEST_UNLOCKED_* life cycle states.
*/
kLcStateTest = 0xb2865fbb,
/**
* Development life cycle state where limited debug functionality is
* available.
*/
kLcStateDev = 0x0b5a75e0,
/**
* Production life cycle state.
*/
kLcStateProd = 0x65f2520f,
/**
* Same as PROD, but transition into RMA is not possible from this state.
*/
kLcStateProdEnd = 0x91b9b68a,
/**
* RMA life cycle state.
*/
kLcStateRma = 0xcf8cfaab,
} lifecycle_state_t;
enum {
/**
* Size of the device identifier in words.
*/
kLifecycleDeviceIdNumWords = 8,
};
/**
* 256-bit device identifier that is stored in the `HW_CFG` partition in OTP.
*/
typedef struct lifecycle_device_id {
uint32_t device_id[kLifecycleDeviceIdNumWords];
} lifecycle_device_id_t;
/**
* Hardware revision.
*
* Consists of a 16-bit chip generation and a 16-bit chip revision.
*/
typedef struct lifecycle_hw_rev {
uint16_t chip_gen;
uint16_t chip_rev;
} lifecycle_hw_rev_t;
/**
* Get the life cycle state.
*
* This function checks the value read from the hardware and returns a
* `life_cycle_state_t`. See `life_cyle_state_t` for more details.
*
* @return Life cycle state.
*/
lifecycle_state_t lifecycle_state_get(void);
/**
* Get the unprocessed life cycle state value read from the hardware.
*
* This function directly returns the `uint32_t` value read from the hardware.
*
* @return Life cycle state.
*/
uint32_t lifecycle_raw_state_get(void);
/**
* Get the device identifier.
*
* @param[out] device_id 256-bit device identifier that is stored in the
* `HW_CFG` partition in OTP.
*/
void lifecycle_device_id_get(lifecycle_device_id_t *device_id);
/**
* Get the hardware revision.
*
* @param[out] hw_rev Hardware revision.
*/
void lifecycle_hw_rev_get(lifecycle_hw_rev_t *hw_rev);
#ifdef __cplusplus
}
#endif
#endif // OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_DRIVERS_LIFECYCLE_H_