[dif/edn] Integrate autogen'd IRQ DIFs into source tree. This commit partially addresses #8142. Specifically it: 1. deprecates existing (manually implemented) Entropy Distribution Network IRQ DIFs, 2. integrates the auto-generated Entropy Distribution Network IRQ DIFs into meson build targets, and 3. refactors all existing source code to make use of the new auto-genenerated Entropy Distribution Network IRQ DIFs, and supporting shared DIF typedefs and error codes. This continues the long-term goal of auto-generating all IRQ DIFs across all IPs, as described in #8142. Signed-off-by: Timothy Trippel <ttrippel@google.com>
diff --git a/sw/device/lib/dif/autogen/meson.build b/sw/device/lib/dif/autogen/meson.build index de4db56..55eee1a 100644 --- a/sw/device/lib/dif/autogen/meson.build +++ b/sw/device/lib/dif/autogen/meson.build
@@ -2,13 +2,13 @@ # Licensed under the Apache License, Version 2.0, see LICENSE for details. # SPDX-License-Identifier: Apache-2.0 -# Autogen OTBN DIF library -sw_lib_dif_autogen_otbn = declare_dependency( +# Autogen EDN DIF library +sw_lib_dif_autogen_edn = declare_dependency( link_with: static_library( - 'sw_lib_dif_autogen_otbn', + 'sw_lib_dif_autogen_edn', sources: [ - hw_ip_otbn_reg_h, - 'dif_otbn_autogen.c', + hw_ip_edn_reg_h, + 'dif_edn_autogen.c', ], dependencies: [ sw_lib_mmio, @@ -142,6 +142,20 @@ ) ) +# Autogen OTBN DIF library +sw_lib_dif_autogen_otbn = declare_dependency( + link_with: static_library( + 'sw_lib_dif_autogen_otbn', + sources: [ + hw_ip_otbn_reg_h, + 'dif_otbn_autogen.c', + ], + dependencies: [ + sw_lib_mmio, + ], + ) +) + # Autogen UART DIF library sw_lib_dif_autogen_uart = declare_dependency( link_with: static_library(
diff --git a/sw/device/lib/dif/dif_edn.h b/sw/device/lib/dif/dif_edn.h index 0d312ad..67d7a4e 100644 --- a/sw/device/lib/dif/dif_edn.h +++ b/sw/device/lib/dif/dif_edn.h
@@ -45,6 +45,9 @@ #include "sw/device/lib/base/macros.h" #include "sw/device/lib/base/mmio.h" +#include "sw/device/lib/dif/dif_base.h" + +#include "sw/device/lib/dif/autogen/dif_edn_autogen.h" #ifdef __cplusplus extern "C" { @@ -59,77 +62,6 @@ }; /** - * A toggle state: enabled, or disabled. - * - * This enum may be used instead of a `bool` when describing an enabled/disabled - * state. - */ -typedef enum dif_edn_toggle { - /* - * The "enabled" state. - */ - kDifEdnToggleEnabled, - /** - * The "disabled" state. - */ - kDifEdnToggleDisabled, -} dif_edn_toggle_t; - -/** - * Hardware instantiation parameters for Entropy Distribution Network. - * - * 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_edn_params { - /** - * The base address for the Entropy Distribution Network hardware registers. - */ - mmio_region_t base_addr; -} dif_edn_params_t; - -/** - * A handle to Entropy Distribution Network. - * - * This type should be treated as opaque by users. - */ -typedef struct dif_edn { - dif_edn_params_t params; -} dif_edn_t; - -/** - * The result of a Entropy Distribution Network operation. - */ -typedef enum dif_edn_result { - /** - * Indicates that the operation succeeded. - */ - kDifEdnOk = 0, - /** - * Indicates some unspecified failure. - */ - kDifEdnError = 1, - /** - * Indicates that some parameter passed into a function failed a - * precondition. - * - * When this value is returned, no hardware operations occurred. - */ - kDifEdnBadArg = 2, - /** - * Indicates that this operation has been locked out, and can never - * succeed until hardware reset. - */ - kDifEdnLocked = 3, - /** - * Indicates that the device is busy and cannot perform the requested - * operation. - */ - kDifEdnBusy = 4, -} dif_edn_result_t; - -/** * CSRNG additional parameters for instantiate and generate commands. */ typedef struct dif_edn_seed_material { @@ -170,38 +102,16 @@ } dif_edn_auto_params_t; /** - * A Entropy Distribution Network interrupt request type. - */ -typedef enum dif_edn_irq { - /** - * Asserted when a CSRNG request has completed. - */ - kDifEdnCmdReqDone, - /** - * Asserted when a FIFO error occurs. - */ - kDifEdnFatalError, -} dif_edn_irq_t; - -/** - * A snapshot of the enablement state of the interrupts the device. - * - * This is an opaque type, to be used with the `dif_edn_irq_disable_all()` and - * `dif_edn_irq_restore_all()` functions. - */ -typedef uint32_t dif_edn_irq_snapshot_t; - -/** * Creates a new handle for Entropy Distribution Network. * * This function does not actuate the hardware. * - * @param params Hardware instantiation parameters. + * @param base_addr Hardware instantiation base address. * @param[out] edn Out param for the initialized handle. * @return The result of the operation. */ OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_init(dif_edn_params_t params, dif_edn_t *edn); +dif_result_t dif_edn_init(mmio_region_t base_addr, dif_edn_t *edn); /** * Configures Entropy Distribution Network with runtime information. @@ -212,7 +122,7 @@ * @return The result of the operation. */ OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_configure(const dif_edn_t *edn); +dif_result_t dif_edn_configure(const dif_edn_t *edn); /** * Enables the Entropy Distribution Network in boot-time mode. @@ -224,7 +134,7 @@ * @return The result of the operation. */ OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_boot_mode_start(const dif_edn_t *edn); +dif_result_t dif_edn_boot_mode_start(const dif_edn_t *edn); /** * Enables the Entropy Distribution Network in auto refresh mode. @@ -237,8 +147,8 @@ * @return The result of the operation. */ OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_auto_mode_start(const dif_edn_t *edn, - dif_edn_auto_params_t *config); +dif_result_t dif_edn_auto_mode_start(const dif_edn_t *edn, + dif_edn_auto_params_t *config); /** * EDN Status flags. @@ -263,8 +173,8 @@ * @param set Flag state (set/unset). * @return The result of the operation. */ -dif_edn_result_t dif_edn_get_status(const dif_edn_t *edn, dif_edn_status_t flag, - bool *set); +dif_result_t dif_edn_get_status(const dif_edn_t *edn, dif_edn_status_t flag, + bool *set); /** * Stops the current mode of operation and disables the entropy module. @@ -273,7 +183,7 @@ * @return The result of the operation. */ OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_stop(const dif_edn_t *edn); +dif_result_t dif_edn_stop(const dif_edn_t *edn); /** * Locks out Entropy Distribution Network functionality. @@ -285,7 +195,7 @@ * @return The result of the operation. */ OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_lock(const dif_edn_t *edn); +dif_result_t dif_edn_lock(const dif_edn_t *edn); /** * Checks whether this Entropy Distribution Network is locked. @@ -295,94 +205,7 @@ * @return The result of the operation. */ OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_is_locked(const dif_edn_t *edn, bool *is_locked); - -/** - * Returns whether a particular interrupt is currently pending. - * - * @param edn An Entropy Distribution Network handle. - * @param irq An interrupt type. - * @param[out] is_pending Out-param for whether the interrupt is pending. - * @return The result of the operation. - */ -OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_irq_is_pending(const dif_edn_t *edn, dif_edn_irq_t irq, - bool *is_pending); - -/** - * Acknowledges a particular interrupt, indicating to the hardware that it has - * been successfully serviced. - * - * @param edn An Entropy Distribution Network handle. - * @param irq An interrupt type. - * @return The result of the operation. - */ -OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_irq_acknowledge(const dif_edn_t *edn, - dif_edn_irq_t irq); - -/** - * Checks whether a particular interrupt is currently enabled or disabled. - * - * @param edn An Entropy Distribution Network handle. - * @param irq An interrupt type. - * @param[out] state Out-param toggle state of the interrupt. - * @return The result of the operation. - */ -OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_irq_get_enabled(const dif_edn_t *edn, - dif_edn_irq_t irq, - dif_edn_toggle_t *state); - -/** - * Sets whether a particular interrupt is currently enabled or disabled. - * - * @param edn An Entropy Distribution Network handle. - * @param irq An interrupt type. - * @param state The new toggle state for the interrupt. - * @return The result of the operation. - */ -OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_irq_set_enabled(const dif_edn_t *edn, - dif_edn_irq_t irq, - dif_edn_toggle_t state); - -/** - * Forces a particular interrupt, causing it to be serviced as if hardware had - * asserted it. - * - * @param edn An Entropy Distribution Network handle. - * @param irq An interrupt type. - * @return The result of the operation. - */ -OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_irq_force(const dif_edn_t *edn, dif_edn_irq_t irq); - -/** - * Disables all interrupts, optionally snapshotting all toggle state for later - * restoration. - * - * @param edn An Entropy Distribution Network handle. - * @param[out] snapshot Out-param for the snapshot; may be `NULL`. - * @return The result of the operation. - */ -OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_irq_disable_all(const dif_edn_t *edn, - dif_edn_irq_snapshot_t *snapshot); - -/** - * Restores interrupts from the given snapshot. - * - * This function can be used with `dif_edn_irq_disable_all()` to temporary - * interrupt save-and-restore. - * - * @param edn An Entropy Distribution Network handle. - * @param snapshot A snapshot to restore from. - * @return The result of the operation. - */ -OT_WARN_UNUSED_RESULT -dif_edn_result_t dif_edn_irq_restore_all( - const dif_edn_t *edn, const dif_edn_irq_snapshot_t *snapshot); +dif_result_t dif_edn_is_locked(const dif_edn_t *edn, bool *is_locked); #ifdef __cplusplus } // extern "C"
diff --git a/sw/device/lib/dif/meson.build b/sw/device/lib/dif/meson.build index 783c7b0..32089d2 100644 --- a/sw/device/lib/dif/meson.build +++ b/sw/device/lib/dif/meson.build
@@ -81,10 +81,29 @@ ], dependencies: [ sw_lib_mmio, + sw_lib_dif_autogen_edn, ], ) ) +test('dif_edn_unittest', executable( + 'dif_edn_unittest', + sources: [ + 'autogen/dif_edn_autogen_unittest.cc', + meson.source_root() / 'sw/device/lib/dif/dif_edn.c', + meson.source_root() / 'sw/device/lib/dif/autogen/dif_edn_autogen.c', + hw_ip_edn_reg_h, + ], + dependencies: [ + sw_vendor_gtest, + sw_lib_base_testing_mock_mmio, + ], + native: true, + c_args: ['-DMOCK_MMIO'], + cpp_args: ['-DMOCK_MMIO'], + ), + suite: 'dif', +) # UART DIF library (dif_uart) sw_lib_dif_uart = declare_dependency(