blob: 134b0aa2745e50276556496d04f1a234a722c4cb [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_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_