OTP Device Interface Functions More...
#include <stdint.h>
#include "sw/device/lib/base/mmio.h"
#include "sw/device/lib/dif/dif_warn_unused_result.h"
Go to the source code of this file.
Data Structures | |
struct | dif_otp_ctrl_params |
Hardware instantiation parameters for OTP. More... | |
struct | dif_otp_ctrl_config |
Runtime configuration for OTP. More... | |
struct | dif_otp_ctrl |
A handle to OTP. More... | |
struct | dif_otp_ctrl_status |
The overall status of the OTP controller. More... | |
Typedefs | |
typedef enum dif_otp_ctrl_toggle | dif_otp_ctrl_toggle_t |
A toggle state: enabled, or disabled. More... | |
typedef enum dif_otp_ctrl_partition | dif_otp_ctrl_partition_t |
A partition within OTP memory. | |
typedef struct dif_otp_ctrl_params | dif_otp_ctrl_params_t |
Hardware instantiation parameters for OTP. More... | |
typedef struct dif_otp_ctrl_config | dif_otp_ctrl_config_t |
Runtime configuration for OTP. More... | |
typedef struct dif_otp_ctrl | dif_otp_ctrl_t |
A handle to OTP. More... | |
typedef enum dif_otp_ctrl_result | dif_otp_ctrl_result_t |
The result of an OTP operation. | |
typedef enum dif_otp_ctrl_lockable_result | dif_otp_ctrl_lockable_result_t |
The result of a lockable operation. | |
typedef enum dif_otp_ctrl_dai_result | dif_otp_ctrl_dai_result_t |
The result of a Direct Access Interface (DAI) operation. | |
typedef enum dif_otp_ctrl_digest_result | dif_otp_ctrl_digest_result_t |
The result of a digest operation. | |
typedef enum dif_otp_ctrl_irq | dif_otp_ctrl_irq_t |
An OTP interrupt request type. | |
typedef uint32_t | dif_otp_ctrl_irq_snapshot_t |
A snapshot of the enablement state of the interrupts for OTP. More... | |
typedef enum dif_otp_ctrl_status_code | dif_otp_ctrl_status_code_t |
A hardware-level status code. | |
typedef enum dif_otp_ctrl_error | dif_otp_ctrl_error_t |
A hardware-level error code, associated with a particular error defined in dif_otp_ctrl_status_t . | |
typedef struct dif_otp_ctrl_status | dif_otp_ctrl_status_t |
The overall status of the OTP controller. More... | |
OTP Device Interface Functions
Definition in file dif_otp_ctrl.h.
struct dif_otp_ctrl_params |
Hardware instantiation parameters for OTP.
This struct describes information about the underlying hardware that is not determined until the hardware design is used as part of a top-level design.
Definition at line 91 of file dif_otp_ctrl.h.
Data Fields | ||
---|---|---|
mmio_region_t | base_addr | The base address for the OTP hardware registers. |
struct dif_otp_ctrl_config |
Runtime configuration for OTP.
This struct describes runtime information for one-time configuration of the hardware.
Definition at line 104 of file dif_otp_ctrl.h.
struct dif_otp_ctrl |
A handle to OTP.
This type should be treated as opaque by users.
Definition at line 140 of file dif_otp_ctrl.h.
Data Fields | ||
---|---|---|
dif_otp_ctrl_params_t | params |
struct dif_otp_ctrl_status |
The overall status of the OTP controller.
See dif_otp_ctrl_get_status()
.
Definition at line 428 of file dif_otp_ctrl.h.
Data Fields | ||
---|---|---|
dif_otp_ctrl_error_t | causes[kDifOtpCtrlStatusCodeHasCauseLast+1] |
A list of root causes for each error status code. If the error status code |
uint32_t | codes |
Currently active statuses, given as a bit vector. To check whether a particular status code was returned, write bool has_code = (status.codes >> kMyStatusCode) & 1; Note that it is possible to quickly check that the controller is idle and error-free by writing bool is_ok = status.codes == (1 << kDifOtpStatusCodeDaiIdle); |
typedef struct dif_otp_ctrl_config dif_otp_ctrl_config_t |
Runtime configuration for OTP.
This struct describes runtime information for one-time configuration of the hardware.
typedef uint32_t dif_otp_ctrl_irq_snapshot_t |
A snapshot of the enablement state of the interrupts for OTP.
This is an opaque type, to be used with the dif_otp_ctrl_irq_disable_all()
and dif_otp_ctrl_irq_restore_all()
functions.
Definition at line 276 of file dif_otp_ctrl.h.
typedef struct dif_otp_ctrl_params dif_otp_ctrl_params_t |
Hardware instantiation parameters for OTP.
This struct describes information about the underlying hardware that is not determined until the hardware design is used as part of a top-level design.
typedef struct dif_otp_ctrl_status dif_otp_ctrl_status_t |
The overall status of the OTP controller.
typedef struct dif_otp_ctrl dif_otp_ctrl_t |
A handle to OTP.
This type should be treated as opaque by users.
typedef enum dif_otp_ctrl_toggle dif_otp_ctrl_toggle_t |
A toggle state: enabled, or disabled.
This enum may be used instead of a bool
when describing an enabled/disabled state.
The result of a Direct Access Interface (DAI) operation.
Definition at line 194 of file dif_otp_ctrl.h.
The result of a digest operation.
Definition at line 232 of file dif_otp_ctrl.h.
enum dif_otp_ctrl_error |
A hardware-level error code, associated with a particular error defined in dif_otp_ctrl_status_t
.
Definition at line 374 of file dif_otp_ctrl.h.
enum dif_otp_ctrl_irq |
An OTP interrupt request type.
Enumerator | |
---|---|
kDifOtpCtrlIrqDone | Indicates that an asynchronous transaction completed. |
kDifOtpCtrlIrqError | Indicates that an error has occurred in the OTP controller. |
Definition at line 258 of file dif_otp_ctrl.h.
The result of a lockable operation.
Definition at line 168 of file dif_otp_ctrl.h.
A partition within OTP memory.
Definition at line 43 of file dif_otp_ctrl.h.
enum dif_otp_ctrl_result |
The result of an OTP operation.
Definition at line 147 of file dif_otp_ctrl.h.
A hardware-level status code.
Definition at line 281 of file dif_otp_ctrl.h.
enum dif_otp_ctrl_toggle |
A toggle state: enabled, or disabled.
This enum may be used instead of a bool
when describing an enabled/disabled state.
Enumerator | |
---|---|
kDifOtpCtrlToggleDisabled | The "disabled" state. |
Definition at line 29 of file dif_otp_ctrl.h.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_lockable_result_t dif_otp_ctrl_check_consistency | ( | const dif_otp_ctrl_t * | otp | ) |
Runs a consistency check on the OTP hardware.
This function can be used to trigger a consistency check independent of the pseudo-random hardware-generated checks.
otp | An OTP handle. |
Definition at line 74 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_lockable_result_t dif_otp_ctrl_check_integrity | ( | const dif_otp_ctrl_t * | otp | ) |
Runs an integrity check on the OTP hardware.
This function can be used to trigger an integrity check independent of the pseudo-random hardware-generated checks.
otp | An OTP handle. |
Definition at line 57 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_config_is_locked | ( | const dif_otp_ctrl_t * | otp, |
bool * | is_locked | ||
) |
Checks whether dif_otp_ctrl_configure()
and the dif_otp_ctrl_check_*()
functions are locked-out.
otp | An OTP handle. | |
[out] | is_locked | Out-param for the locked state. |
Definition at line 104 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_lockable_result_t dif_otp_ctrl_configure | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_config_t | config | ||
) |
Configures OTP with runtime information.
This function should need to be called at most once for the lifetime of otp
.
otp | An OTP handle. |
config | Runtime configuration parameters. |
Definition at line 36 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_dai_result_t dif_otp_ctrl_dai_digest | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_partition_t | partition, | ||
uint64_t | digest | ||
) |
Schedules a hardware digest operation on the Direct Access Interface.
This operation will also lock writes for the given partition.
If partition
is a SW partition, digest
must be non-zero; if it is a partition with a hardware-managed digest, digest
must be zero (since the digest will be generated by the hardware). An error is returned if either precondition is not met.
This function does not work with the lifecycle state partition, and will return an error in that case.
otp | An OTP handle. |
partition | The partition to digest and lock. |
digest | The digest to program (for SW partitions). |
Definition at line 706 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_dai_result_t dif_otp_ctrl_dai_program32 | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_partition_t | partition, | ||
uint32_t | address, | ||
uint32_t | value | ||
) |
Schedules a 32-bit write on the Direct Access Interface.
Writes are performed relative to a partition; address
should be given relative to the start of partition
. An error is returned for out-of-bounds access.
Furthermore, address
must be four-byte-aligned, and partition
must not be a secret partition. An error is returned if neither condition is met.
Note that this function cannot be used to program the digest at the end of a SW
partition; dif_otp_ctrl_dai_digest()
must be used instead.
otp | An OTP handle. |
partition | The partition to program. |
address | A partition-relative address to program. |
value | The value to program into the OTP. |
Definition at line 607 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_dai_result_t dif_otp_ctrl_dai_program64 | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_partition_t | partition, | ||
uint32_t | address, | ||
uint64_t | value | ||
) |
Schedules a 64-bit write on the Direct Access Interface.
Writes are performed relative to a partition; address
should be given relative to the start of partition
. An error is returned for out-of-bounds access.
Furthermore, address
must be eight-byte-aligned, and partition
must be a secret partition. An error is returned if neither condition is met.
otp | An OTP handle. |
partition | The partition to program. |
address | A partition-relative address to program. |
value | The value to program into the OTP. |
Definition at line 657 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_dai_result_t dif_otp_ctrl_dai_read32_end | ( | const dif_otp_ctrl_t * | otp, |
uint32_t * | value | ||
) |
Gets the result of a completed 32-bit read operation on the Direct Access Interface.
Whether this function or its 64-bit variant should be called is dependent on the most recent partition read from.
otp | An OTP handle. | |
[out] | value | Out-param for the read value. |
Definition at line 568 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_dai_result_t dif_otp_ctrl_dai_read64_end | ( | const dif_otp_ctrl_t * | otp, |
uint64_t * | value | ||
) |
Gets the result of a completed 64-bit read operation on the Direct Access Interface.
Whether this function or its 32-bit variant should be called is dependent on the most recent partition read from.
otp | An OTP handle. | |
[out] | value | Out-param for the read value. |
Definition at line 586 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_dai_result_t dif_otp_ctrl_dai_read_start | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_partition_t | partition, | ||
uint32_t | address | ||
) |
Schedules a read on the Direct Access Interface.
Reads are performed relative to a partition; address
should be given relative to the start of partition
. An error is returned for out-of-bounds access.
Furthermore, address
must be well-aligned: it must be four-byte aligned for normal paritions and eight-byte-aligned for secret partitions. An error is returned for unaligned access.
otp | An OTP handle. |
partition | The partition to read from. |
address | A partition-relative address to read from. |
Definition at line 534 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_digest_result_t dif_otp_ctrl_get_digest | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_partition_t | partition, | ||
uint64_t * | digest | ||
) |
Gets the buffered digest value for the given partition.
Note that this value is only updated when the device is reset; if the digest has not been computed yet, or has been computed but not since device reset, this function will return an error.
The lifecycle partition does not have a digest and will result in an error being returned.
otp | An OTP handle. | |
partition | The partition to get a digest for. | |
[out] | digest | Out-param for the digest. |
Definition at line 758 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_get_status | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_status_t * | status | ||
) |
Gets the current status of the OTP controller.
otp | An OTP handle. | |
[out] | status | Out-param for the controller's status. |
Definition at line 317 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_init | ( | dif_otp_ctrl_params_t | params, |
dif_otp_ctrl_t * | otp | ||
) |
Creates a new handle for OTP.
This function does not actuate the hardware.
params | Hardware instantiation parameters. | |
[out] | otp | Out param for the initialized handle. |
Definition at line 14 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_irq_acknowledge | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_irq_t | irq | ||
) |
Acknowledges a particular interrupt, indicating to the hardware that it has been successfully serviced.
otp | An OTP handle. |
irq | An interrupt type. |
Definition at line 201 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_irq_disable_all | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_irq_snapshot_t * | snapshot | ||
) |
Disables all interrupts, optionally snapshotting all toggle state for later restoration.
otp | An OTP handle. | |
[out] | snapshot | Out-param for the snapshot; may be NULL . |
Definition at line 290 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_irq_force | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_irq_t | irq | ||
) |
Forces a particular interrupt, causing it to be serviced as if hardware had asserted it.
otp | An OTP handle. |
irq | An interrupt type. |
Definition at line 272 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_irq_get_enabled | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_irq_t | irq, | ||
dif_otp_ctrl_toggle_t * | state | ||
) |
Checks whether a particular interrupt is currently enabled or disabled.
otp | An OTP handle. | |
irq | An interrupt type. | |
[out] | state | Out-param toggle state of the interrupt. |
Definition at line 219 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_irq_is_pending | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_irq_t | irq, | ||
bool * | is_pending | ||
) |
Returns whether a particular interrupt is currently pending.
otp | An OTP handle. | |
irq | An interrupt type. | |
[out] | is_pending | Out-param for whether the interrupt is pending. |
Definition at line 182 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_irq_restore_all | ( | const dif_otp_ctrl_t * | otp, |
const dif_otp_ctrl_irq_snapshot_t * | snapshot | ||
) |
Restores interrupts from the given snapshot.
This function can be used with dif_otp_ctrl_irq_disable_all()
to temporary interrupt save-and-restore.
otp | An OTP handle. |
snapshot | A snapshot to restore from. |
Definition at line 306 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_irq_set_enabled | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_irq_t | irq, | ||
dif_otp_ctrl_toggle_t | state | ||
) |
Sets whether a particular interrupt is currently enabled or disabled.
otp | An OTP handle. |
irq | An interrupt type. |
state | The new toggle state for the interrupt. |
Definition at line 239 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_lock_config | ( | const dif_otp_ctrl_t * | otp | ) |
Locks out dif_otp_ctrl_configure()
and the dif_otp_ctrl_check_*()
functions.
This function is reentrant: calling it while functionality is locked will have no effect and return kDifOtpCtrlOk
.
otp | An OTP handle. |
Definition at line 91 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_lock_reading | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_partition_t | partition | ||
) |
Locks out reads to a SW partition.
This function should only be called on SW partitions; doing otherwise will return an error.
Note that this is distinct from the write-locking performed by calling dif_otp_ctrl_dai_digest()
. In particular, the effects of this function will not persist past a system reset.
This function is reentrant: calling it while functionality is locked will have no effect and return kDifOtpCtrlOk
.
otp | An OTP handle. |
partition | The SW partition to lock. |
Definition at line 132 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_dai_result_t dif_otp_ctrl_read_blocking | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_partition_t | partition, | ||
uint32_t | address, | ||
uint32_t * | buf, | ||
size_t | len | ||
) |
Performs a memory-mapped read of the given partition, if it supports them.
In particular, this function will read len
words, starting at address
, relative to the start of partition
.
The same caveats for dif_otp_ctrl_dai_read_start()
apply to address
; in addition, address + len
must also be in-range and must not overflow.
This function will block until the read completes, unlike Direct Access Interface functions.
otp | An OTP handle. | |
partition | The partition to read from. | |
address | A partition-relative address to read from. | |
[out] | buf | A buffer of words to write read values to. |
len | The number of words to read. |
Definition at line 812 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_read_test | ( | const dif_otp_ctrl_t * | otp, |
uint32_t | address, | ||
uint32_t * | buf, | ||
size_t | len | ||
) |
Performs a memory-mapped read of the TEST region.
In particular, this function will read len
words, starting at address
.
The same caveats for dif_otp_ctrl_dai_read_start()
apply to address
; in addition, address + len
must also be in-range and must not overflow.
otp | An OTP handle. | |
address | The address to read from. | |
[out] | buf | A buffer of words to write read values to. |
len | The number of words to read. |
Definition at line 838 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_reading_is_locked | ( | const dif_otp_ctrl_t * | otp, |
dif_otp_ctrl_partition_t | partition, | ||
bool * | is_locked | ||
) |
Checks whether reads to a SW partition are locked out.
This function should only be called on SW partitions; doing otherwise will return an error.
otp | An OTP handle. | |
partition | the SW partition to check for locking. | |
[out] | is_locked | Out-param for the locked state. |
Definition at line 150 of file dif_otp_ctrl.c.
DIF_WARN_UNUSED_RESULT dif_otp_ctrl_result_t dif_otp_ctrl_write_test | ( | const dif_otp_ctrl_t * | otp, |
uint32_t | address, | ||
const uint32_t * | buf, | ||
size_t | len | ||
) |
Performs a memory-mapped write of the TEST region.
In particular, this function will write len
words, starting at address
.
The same caveats for dif_otp_ctrl_dai_program32()
apply to address
; in addition, address + len
must also be in-range and must not overflow.
otp | An OTP handle. |
address | An absolute address to write to. |
buf | A buffer of words to write write values from. |
len | The number of words to write. |
Definition at line 851 of file dif_otp_ctrl.c.