| // 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_LIB_DIF_DIF_OTBN_H_ |
| #define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_OTBN_H_ |
| |
| /** |
| * @file |
| * @brief <a href="/hw/ip/otbn/doc/">OTBN</a> Device Interface Functions. |
| */ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include "sw/device/lib/base/mmio.h" |
| #include "sw/device/lib/dif/dif_base.h" |
| |
| #include "sw/device/lib/dif/autogen/dif_otbn_autogen.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif // __cplusplus |
| |
| /** |
| * OTBN commands. |
| */ |
| typedef enum dif_otbn_cmd { |
| kDifOtbnCmdExecute = 0xd8, |
| kDifOtbnCmdSecWipeDmem = 0xc3, |
| kDifOtbnCmdSecWipeImem = 0x1e, |
| } dif_otbn_cmd_t; |
| |
| /** |
| * OTBN status. |
| */ |
| typedef enum dif_otbn_status { |
| kDifOtbnStatusIdle = 0x00, |
| kDifOtbnStatusBusyExecute = 0x01, |
| kDifOtbnStatusBusySecWipeDmem = 0x02, |
| kDifOtbnStatusBusySecWipeImem = 0x03, |
| kDifOtbnStatusBusySecWipeInt = 0x04, |
| kDifOtbnStatusLocked = 0xFF, |
| } dif_otbn_status_t; |
| |
| /** |
| * OTBN Errors. |
| * |
| * OTBN uses a bitfield to indicate which errors have been seen. Multiple errors |
| * can be seen at the same time. This enum gives the individual bits that may be |
| * set for different errors. |
| */ |
| typedef enum dif_otbn_err_bits { |
| kDifOtbnErrBitsNoError = 0, |
| /** A BAD_DATA_ADDR error was observed. */ |
| kDifOtbnErrBitsBadDataAddr = (1 << 0), |
| /** A BAD_INSN_ADDR error was observed. */ |
| kDifOtbnErrBitsBadInsnAddr = (1 << 1), |
| /** A CALL_STACK error was observed. */ |
| kDifOtbnErrBitsCallStack = (1 << 2), |
| /** An ILLEGAL_INSN error was observed. */ |
| kDifOtbnErrBitsIllegalInsn = (1 << 3), |
| /** A LOOP error was observed. */ |
| kDifOtbnErrBitsLoop = (1 << 4), |
| /** A RND_FIPS_CHECK_FAIL error was observed. */ |
| kDifOtbnErrBitsRndFipsChkFail = (1 << 7), |
| /** A IMEM_INTG_VIOLATION error was observed. */ |
| kDifOtbnErrBitsImemIntgViolation = (1 << 16), |
| /** A DMEM_INTG_VIOLATION error was observed. */ |
| kDifOtbnErrBitsDmemIntgViolation = (1 << 17), |
| /** A REG_INTG_VIOLATION error was observed. */ |
| kDifOtbnErrBitsRegIntgViolation = (1 << 18), |
| /** A BUS_INTG_VIOLATION error was observed. */ |
| kDifOtbnErrBitsBusIntgViolation = (1 << 19), |
| /** A BAD_INTERNAL_STATE error was observed. */ |
| kDifOtbnErrBitsBadInternalState = (1 << 20), |
| /** An ILLEGAL_BUS_ACCESS error was observed. */ |
| kDifOtbnErrBitsIllegalBusAccess = (1 << 21), |
| /** A LIFECYCLE_ESCALATION error was observed. */ |
| kDifOtbnErrBitsLifecycleEscalation = (1 << 22), |
| /** A FATAL_SOFTWARE error was observed. */ |
| kDifOtbnErrBitsFatalSoftware = (1 << 23), |
| } dif_otbn_err_bits_t; |
| |
| /** |
| * Reset OTBN device. |
| * |
| * Resets the given OTBN device by setting its configuration registers to |
| * reset values. Disables interrupts, output, and input filter. |
| * |
| * @param otbn OTBN instance. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_reset(const dif_otbn_t *otbn); |
| |
| /** |
| * Start an operation by issuing a command. |
| * |
| * @param otbn OTBN instance. |
| * @param cmd The command. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_write_cmd(const dif_otbn_t *otbn, dif_otbn_cmd_t cmd); |
| |
| /** |
| * Gets the current status of OTBN. |
| * |
| * @param otbn OTBN instance. |
| * @param[out] status OTBN status. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_get_status(const dif_otbn_t *otbn, |
| dif_otbn_status_t *status); |
| |
| /** |
| * Get the error bits set by the device if the operation failed. |
| * |
| * @param otbn OTBN instance. |
| * @param[out] err_bits The error bits returned by the hardware. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_get_err_bits(const dif_otbn_t *otbn, |
| dif_otbn_err_bits_t *err_bits); |
| |
| /** |
| * Gets the number of executed OTBN instructions. |
| * |
| * Gets the number of instructions executed so far in the current OTBN run if |
| * there is one. Otherwise, gets the number executed in total in the previous |
| * OTBN run. |
| * |
| * @param otbn OTBN instance. |
| * @param[out] insn_cnt The number of instructions executed by OTBN. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_get_insn_cnt(const dif_otbn_t *otbn, uint32_t *insn_cnt); |
| |
| /** |
| * Write an OTBN application into its instruction memory (IMEM). |
| * |
| * Only 32b-aligned 32b word accesses are allowed. |
| * |
| * @param otbn OTBN instance. |
| * @param offset_bytes the byte offset in IMEM the first word is written to. |
| * @param src the main memory location to start reading from. |
| * @param len_bytes number of bytes to copy. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_imem_write(const dif_otbn_t *otbn, uint32_t offset_bytes, |
| const void *src, size_t len_bytes); |
| |
| /** |
| * Read from OTBN's instruction memory (IMEM). |
| * |
| * Only 32b-aligned 32b word accesses are allowed. |
| * |
| * @param otbn OTBN instance |
| * @param offset_bytes the byte offset in IMEM the first word is read from. |
| * @param[out] dest the main memory location to copy the data to (preallocated). |
| * @param len_bytes number of bytes to copy. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_imem_read(const dif_otbn_t *otbn, uint32_t offset_bytes, |
| void *dest, size_t len_bytes); |
| |
| /** |
| * Write to OTBN's data memory (DMEM). |
| * |
| * Only 32b-aligned 32b word accesses are allowed. |
| * |
| * @param otbn OTBN instance. |
| * @param offset_bytes the byte offset in DMEM the first word is written to. |
| * @param src the main memory location to start reading from. |
| * @param len_bytes number of bytes to copy. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_dmem_write(const dif_otbn_t *otbn, uint32_t offset_bytes, |
| const void *src, size_t len_bytes); |
| |
| /** |
| * Read from OTBN's data memory (DMEM). |
| * |
| * Only 32b-aligned 32b word accesses are allowed. |
| * |
| * @param otbn OTBN instance |
| * @param offset_bytes the byte offset in DMEM the first word is read from. |
| * @param[out] dest the main memory location to copy the data to (preallocated). |
| * @param len_bytes number of bytes to copy. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_dmem_read(const dif_otbn_t *otbn, uint32_t offset_bytes, |
| void *dest, size_t len_bytes); |
| |
| /** |
| * Sets the software errors are fatal bit in the control register. |
| * |
| * When set any software error becomes a fatal error. The bit can only be |
| * changed when the OTBN status is IDLE. |
| * |
| * @param otbn OTBN instance. |
| * @param enable Enable or disable whether software errors are fatal. |
| * @return The result of the operation, `kDifUnavailable` is returned when the |
| * requested change cannot be made. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_otbn_set_ctrl_software_errs_fatal(const dif_otbn_t *otbn, |
| bool enable); |
| |
| /** |
| * Get the size of OTBN's data memory in bytes. |
| * |
| * @param otbn OTBN instance. |
| * @return data memory size in bytes. |
| */ |
| size_t dif_otbn_get_dmem_size_bytes(const dif_otbn_t *otbn); |
| |
| /** |
| * Get the size of OTBN's instruction memory in bytes. |
| * |
| * @param otbn OTBN instance. |
| * @return instruction memory size in bytes. |
| */ |
| size_t dif_otbn_get_imem_size_bytes(const dif_otbn_t *otbn); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif // __cplusplus |
| |
| #endif // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_OTBN_H_ |