blob: 305ec39c41f5195b1f2c9f9c3bbeec304bc52818 [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 = 0x01,
kDifOtbnCmdSecWipeDmem = 0x02,
kDifOtbnCmdSecWipeImem = 0x03,
} dif_otbn_cmd_t;
/**
* OTBN status
*/
typedef enum dif_otbn_status {
kDifOtbnStatusIdle = 0x00,
kDifOtbnStatusBusyExecute = 0x01,
kDifOtbnStatusBusySecWipeDmem = 0x02,
kDifOtbnStatusBusySecWipeImem = 0x03,
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 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),
/** An ILLEGAL_BUS_ACCESS error was observed. */
kDifOtbnErrBitsIllegalBusAccess = (1 << 20),
/** A LIFECYCLE_ESCALATION error was observed. */
kDifOtbnErrBitsLifecycleEscalation = (1 << 21),
/** A FATAL_SOFTWARE error was observed. */
kDifOtbnErrBitsFatalSoftware = (1 << 22),
} dif_otbn_err_bits_t;
/**
* Initialize a OTBN device using `config` and return its internal state.
*
* A particular OTBN device must first be initialized by this function
* before calling other functions of this library.
*
* @param base_addr Hardware instantiation base address.
* @param[out] otbn OTBN instance that will store the internal state of the
* initialized OTBN device.
* @return The result of the operation.
*/
dif_result_t dif_otbn_init(mmio_region_t base_addr, dif_otbn_t *otbn);
/**
* 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.
*/
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.
*/
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.
*/
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.
*/
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.
*/
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.
*/
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.
*/
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.
*/
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.
*/
dif_result_t dif_otbn_dmem_read(const dif_otbn_t *otbn, uint32_t offset_bytes,
void *dest, size_t len_bytes);
/**
* 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_