[sw/dif] Add `toggle_to_bool()` and `bool_to_toggle()` to DIF base.
Several DIF libraries had redefined the same logic to translate
`dif_toggle_t` types to/from bool types. This commit adds one shared
implementation of said functions, and removes the duplicates across
individual DIF libraries.
This partially addresses a task item in #9036.
Signed-off-by: Timothy Trippel <ttrippel@google.com>
diff --git a/sw/device/lib/dif/BUILD b/sw/device/lib/dif/BUILD
index 2379fb4..fd7fd6f 100644
--- a/sw/device/lib/dif/BUILD
+++ b/sw/device/lib/dif/BUILD
@@ -6,6 +6,9 @@
cc_library(
name = "base",
+ srcs = [
+ "dif_base.c",
+ ],
hdrs = [
"dif_base.h",
],
diff --git a/sw/device/lib/dif/autogen/meson.build b/sw/device/lib/dif/autogen/meson.build
index ed3c269..885787e 100644
--- a/sw/device/lib/dif/autogen/meson.build
+++ b/sw/device/lib/dif/autogen/meson.build
@@ -11,6 +11,7 @@
'dif_adc_ctrl_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -25,6 +26,7 @@
'dif_aes_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -39,6 +41,7 @@
'dif_alert_handler_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -53,6 +56,7 @@
'dif_aon_timer_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -67,6 +71,7 @@
'dif_clkmgr_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -81,6 +86,7 @@
'dif_csrng_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -95,6 +101,7 @@
'dif_edn_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -109,6 +116,7 @@
'dif_entropy_src_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -123,6 +131,7 @@
'dif_flash_ctrl_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -137,6 +146,7 @@
'dif_gpio_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -151,6 +161,7 @@
'dif_hmac_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -165,6 +176,7 @@
'dif_i2c_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -179,6 +191,7 @@
'dif_keymgr_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -193,6 +206,7 @@
'dif_kmac_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -207,6 +221,7 @@
'dif_lc_ctrl_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -221,6 +236,7 @@
'dif_otbn_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -235,6 +251,7 @@
'dif_otp_ctrl_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -249,6 +266,7 @@
'dif_pattgen_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -263,6 +281,7 @@
'dif_pinmux_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -277,6 +296,7 @@
'dif_pwrmgr_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -291,6 +311,7 @@
'dif_rstmgr_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -305,6 +326,7 @@
'dif_rom_ctrl_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -319,6 +341,7 @@
'dif_rv_plic_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -333,6 +356,7 @@
'dif_rv_timer_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -347,6 +371,7 @@
'dif_spi_device_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -361,6 +386,7 @@
'dif_spi_host_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -375,6 +401,7 @@
'dif_sram_ctrl_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -389,6 +416,7 @@
'dif_sysrst_ctrl_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -403,6 +431,7 @@
'dif_usbdev_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
@@ -417,6 +446,7 @@
'dif_uart_autogen.c',
],
dependencies: [
+ sw_lib_dif_base,
sw_lib_mmio,
],
)
diff --git a/sw/device/lib/dif/dif_alert_handler.c b/sw/device/lib/dif/dif_alert_handler.c
index 85963f4..4279b8a 100644
--- a/sw/device/lib/dif/dif_alert_handler.c
+++ b/sw/device/lib/dif/dif_alert_handler.c
@@ -199,26 +199,6 @@
}
/**
- * Converts a toggle_t to bool.
- *
- * Returns false if `toggle` is out of range.
- */
-OT_WARN_UNUSED_RESULT
-static bool toggle_to_bool(dif_toggle_t toggle, bool *flag) {
- switch (toggle) {
- case kDifToggleEnabled:
- *flag = true;
- break;
- case kDifToggleDisabled:
- *flag = false;
- break;
- default:
- return false;
- }
- return true;
-}
-
-/**
* Configures the control registers of a particular alert handler class.
*/
OT_WARN_UNUSED_RESULT
@@ -251,22 +231,14 @@
uint32_t ctrl_reg = 0;
// Configure the escalation protocol enable flag.
- bool use_escalation_protocol;
- if (!toggle_to_bool(class->use_escalation_protocol,
- &use_escalation_protocol)) {
- return false;
- }
ctrl_reg =
bitfield_bit32_write(ctrl_reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_EN_BIT,
- use_escalation_protocol);
+ dif_toggle_to_bool(class->use_escalation_protocol));
// Configure the escalation protocol auto-lock flag.
- bool automatic_locking;
- if (!toggle_to_bool(class->automatic_locking, &automatic_locking)) {
- return false;
- }
- ctrl_reg = bitfield_bit32_write(
- ctrl_reg, ALERT_HANDLER_CLASSA_CTRL_SHADOWED_LOCK_BIT, automatic_locking);
+ ctrl_reg = bitfield_bit32_write(ctrl_reg,
+ ALERT_HANDLER_CLASSA_CTRL_SHADOWED_LOCK_BIT,
+ dif_toggle_to_bool(class->automatic_locking));
if (class->phase_signals == NULL && class->phase_signals_len != 0) {
return false;
diff --git a/sw/device/lib/dif/dif_base.c b/sw/device/lib/dif/dif_base.c
new file mode 100644
index 0000000..ab0184c
--- /dev/null
+++ b/sw/device/lib/dif/dif_base.c
@@ -0,0 +1,13 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#include "sw/device/lib/dif/dif_base.h"
+
+#include <stdbool.h>
+
+// `extern` declarations to give the inline functions in the corresponding
+// header a link location.
+extern bool dif_is_valid_toggle(dif_toggle_t val);
+extern bool dif_toggle_to_bool(dif_toggle_t val);
+extern dif_toggle_t dif_bool_to_toggle(bool val);
diff --git a/sw/device/lib/dif/dif_base.h b/sw/device/lib/dif/dif_base.h
index d82e0a3..f801b05 100644
--- a/sw/device/lib/dif/dif_base.h
+++ b/sw/device/lib/dif/dif_base.h
@@ -10,6 +10,8 @@
* @brief Shared macros and headers for DIFs.
*/
+#include <stdbool.h>
+
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
@@ -82,6 +84,50 @@
kDifToggleEnabled = 1,
} dif_toggle_t;
+/**
+ * Checks if a DIF toggle type is valid.
+ *
+ * @param val A potential dif_toggle_t value.
+ * @return Bool indicating validity of toggle value.
+ */
+inline bool dif_is_valid_toggle(dif_toggle_t val) {
+ switch (val) {
+ case kDifToggleEnabled:
+ return true;
+ case kDifToggleDisabled:
+ return true;
+ default:
+ return false;
+ }
+}
+
+/**
+ * Converts a `dif_toggle_t` to a `bool`.
+ *
+ * @param val A dif_toggle_t value.
+ * @return Corresponding bool value.
+ */
+inline bool dif_toggle_to_bool(dif_toggle_t val) {
+ switch (val) {
+ case kDifToggleEnabled:
+ return true;
+ case kDifToggleDisabled:
+ return false;
+ default:
+ return false;
+ }
+}
+
+/**
+ * Converts a `dif_toggle_t` to a `bool`.
+ *
+ * @param val A bool value.
+ * @return Corresponding dif_toggle_t value.
+ */
+inline dif_toggle_t dif_bool_to_toggle(bool val) {
+ return val ? kDifToggleEnabled : kDifToggleDisabled;
+}
+
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
diff --git a/sw/device/lib/dif/dif_clkmgr.c b/sw/device/lib/dif/dif_clkmgr.c
index 5052ea4..aa28c86 100644
--- a/sw/device/lib/dif/dif_clkmgr.c
+++ b/sw/device/lib/dif/dif_clkmgr.c
@@ -28,13 +28,6 @@
"Expected the number of hintable clocks to be <= the width of a CSR.");
/**
- * Converts a `bool` to `dif_toggle_t`.
- */
-static dif_toggle_t bool_to_toggle(bool val) {
- return val ? kDifToggleEnabled : kDifToggleDisabled;
-}
-
-/**
* Converts a `multi_bit_bool_t` to `dif_toggle_t`.
*/
static dif_toggle_t mubi4_to_toggle(multi_bit_bool_t val) {
@@ -93,7 +86,7 @@
uint32_t clk_enables_val =
mmio_region_read32(clkmgr->base_addr, CLKMGR_CLK_ENABLES_REG_OFFSET);
- *state = bool_to_toggle(bitfield_bit32_read(clk_enables_val, clock));
+ *state = dif_bool_to_toggle(bitfield_bit32_read(clk_enables_val, clock));
return kDifOk;
}
@@ -101,22 +94,12 @@
dif_result_t dif_clkmgr_gateable_clock_set_enabled(
const dif_clkmgr_t *clkmgr, dif_clkmgr_gateable_clock_t clock,
dif_toggle_t new_state) {
- if (clkmgr == NULL || !clkmgr_valid_gateable_clock(clock)) {
+ if (clkmgr == NULL || !clkmgr_valid_gateable_clock(clock) ||
+ !dif_is_valid_toggle(new_state)) {
return kDifBadArg;
}
- bool new_clk_enables_bit;
- switch (new_state) {
- case kDifToggleEnabled:
- new_clk_enables_bit = true;
- break;
- case kDifToggleDisabled:
- new_clk_enables_bit = false;
- break;
- default:
- return kDifBadArg;
- }
-
+ bool new_clk_enables_bit = dif_toggle_to_bool(new_state);
uint32_t clk_enables_val =
mmio_region_read32(clkmgr->base_addr, CLKMGR_CLK_ENABLES_REG_OFFSET);
clk_enables_val =
@@ -136,7 +119,7 @@
uint32_t clk_hints_val =
mmio_region_read32(clkmgr->base_addr, CLKMGR_CLK_HINTS_STATUS_REG_OFFSET);
- *state = bool_to_toggle(bitfield_bit32_read(clk_hints_val, clock));
+ *state = dif_bool_to_toggle(bitfield_bit32_read(clk_hints_val, clock));
return kDifOk;
}
@@ -144,22 +127,12 @@
dif_result_t dif_clkmgr_hintable_clock_set_hint(
const dif_clkmgr_t *clkmgr, dif_clkmgr_hintable_clock_t clock,
dif_toggle_t new_state) {
- if (clkmgr == NULL || !clkmgr_valid_hintable_clock(clock)) {
+ if (clkmgr == NULL || !clkmgr_valid_hintable_clock(clock) ||
+ !dif_is_valid_toggle(new_state)) {
return kDifBadArg;
}
- bool new_clk_hints_bit;
- switch (new_state) {
- case kDifToggleEnabled:
- new_clk_hints_bit = true;
- break;
- case kDifToggleDisabled:
- new_clk_hints_bit = false;
- break;
- default:
- return kDifBadArg;
- }
-
+ bool new_clk_hints_bit = dif_toggle_to_bool(new_state);
uint32_t clk_hints_val =
mmio_region_read32(clkmgr->base_addr, CLKMGR_CLK_HINTS_REG_OFFSET);
clk_hints_val = bitfield_bit32_write(clk_hints_val, clock, new_clk_hints_bit);
@@ -178,7 +151,7 @@
uint32_t clk_hints_val =
mmio_region_read32(clkmgr->base_addr, CLKMGR_CLK_HINTS_REG_OFFSET);
- *state = bool_to_toggle(bitfield_bit32_read(clk_hints_val, clock));
+ *state = dif_bool_to_toggle(bitfield_bit32_read(clk_hints_val, clock));
return kDifOk;
}
diff --git a/sw/device/lib/dif/dif_keymgr.c b/sw/device/lib/dif/dif_keymgr.c
index f21e920..e8d0c68 100644
--- a/sw/device/lib/dif/dif_keymgr.c
+++ b/sw/device/lib/dif/dif_keymgr.c
@@ -231,31 +231,6 @@
reg_control);
}
-/**
- * Checks if a value is a valid `dif_toggle_t` and converts it to `bool`.
- */
-OT_WARN_UNUSED_RESULT
-static bool toggle_to_bool(dif_toggle_t val, bool *val_bool) {
- switch (val) {
- case kDifToggleEnabled:
- *val_bool = true;
- break;
- case kDifToggleDisabled:
- *val_bool = false;
- break;
- default:
- return false;
- }
- return true;
-}
-
-/**
- * Converts a `bool` to `dif_toggle_t`.
- */
-static dif_toggle_t bool_to_toggle(bool val) {
- return val ? kDifToggleEnabled : kDifToggleDisabled;
-}
-
dif_result_t dif_keymgr_configure(const dif_keymgr_t *keymgr,
dif_keymgr_config_t config) {
if (keymgr == NULL) {
@@ -518,8 +493,7 @@
dif_result_t dif_keymgr_sideload_clear_set_enabled(const dif_keymgr_t *keymgr,
dif_toggle_t state) {
- bool enable = false;
- if (keymgr == NULL || !toggle_to_bool(state, &enable)) {
+ if (keymgr == NULL || !dif_is_valid_toggle(state)) {
return kDifBadArg;
}
@@ -540,7 +514,7 @@
uint32_t reg_val =
mmio_region_read32(keymgr->base_addr, KEYMGR_SIDELOAD_CLEAR_REG_OFFSET);
- *state = bool_to_toggle(reg_val == kDifKeyMgrSideLoadClearAll);
+ *state = dif_bool_to_toggle(reg_val == kDifKeyMgrSideLoadClearAll);
return kDifOk;
}
diff --git a/sw/device/lib/dif/dif_pwrmgr.c b/sw/device/lib/dif/dif_pwrmgr.c
index a736edd..872a27a 100644
--- a/sw/device/lib/dif/dif_pwrmgr.c
+++ b/sw/device/lib/dif/dif_pwrmgr.c
@@ -157,31 +157,6 @@
};
/**
- * Checks if a value is a valid `dif_toggle_t` and converts it to `bool`.
- */
-OT_WARN_UNUSED_RESULT
-static bool toggle_to_bool(dif_toggle_t val, bool *val_bool) {
- switch (val) {
- case kDifToggleEnabled:
- *val_bool = true;
- break;
- case kDifToggleDisabled:
- *val_bool = false;
- break;
- default:
- return false;
- }
- return true;
-}
-
-/**
- * Converts a `bool` to `dif_toggle_t`.
- */
-static dif_toggle_t bool_to_toggle(bool val) {
- return val ? kDifToggleEnabled : kDifToggleDisabled;
-}
-
-/**
* Checks if a value is a valid `dif_pwrmgr_req_type_t`.
*/
OT_WARN_UNUSED_RESULT
@@ -244,12 +219,7 @@
dif_result_t dif_pwrmgr_low_power_set_enabled(const dif_pwrmgr_t *pwrmgr,
dif_toggle_t new_state) {
- if (pwrmgr == NULL) {
- return kDifBadArg;
- }
-
- bool enable = false;
- if (!toggle_to_bool(new_state, &enable)) {
+ if (pwrmgr == NULL || !dif_is_valid_toggle(new_state)) {
return kDifBadArg;
}
@@ -259,8 +229,8 @@
uint32_t reg_val =
mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
- reg_val =
- bitfield_bit32_write(reg_val, PWRMGR_CONTROL_LOW_POWER_HINT_BIT, enable);
+ reg_val = bitfield_bit32_write(reg_val, PWRMGR_CONTROL_LOW_POWER_HINT_BIT,
+ dif_toggle_to_bool(new_state));
mmio_region_write32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET, reg_val);
// Slow clock domain must be synced for changes to take effect.
@@ -277,7 +247,7 @@
uint32_t reg_val =
mmio_region_read32(pwrmgr->base_addr, PWRMGR_CONTROL_REG_OFFSET);
- *cur_state = bool_to_toggle(
+ *cur_state = dif_bool_to_toggle(
bitfield_bit32_read(reg_val, PWRMGR_CONTROL_LOW_POWER_HINT_BIT));
return kDifOk;
@@ -403,20 +373,14 @@
dif_result_t dif_pwrmgr_wakeup_request_recording_set_enabled(
const dif_pwrmgr_t *pwrmgr, dif_toggle_t new_state) {
- if (pwrmgr == NULL) {
- return kDifBadArg;
- }
-
- bool enable = false;
- if (!toggle_to_bool(new_state, &enable)) {
+ if (pwrmgr == NULL || !dif_is_valid_toggle(new_state)) {
return kDifBadArg;
}
// Only a single bit of this register is significant, thus we don't perform a
// read-modify-write. Setting this bit to 1 disables recording.
- uint32_t reg_val =
- bitfield_bit32_write(0, PWRMGR_WAKE_INFO_CAPTURE_DIS_VAL_BIT, !enable);
-
+ uint32_t reg_val = bitfield_bit32_write(
+ 0, PWRMGR_WAKE_INFO_CAPTURE_DIS_VAL_BIT, !dif_toggle_to_bool(new_state));
mmio_region_write32(pwrmgr->base_addr,
PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET, reg_val);
@@ -432,7 +396,7 @@
uint32_t reg_val = mmio_region_read32(
pwrmgr->base_addr, PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET);
// Recording is disabled if this bit is set to 1.
- *cur_state = bool_to_toggle(
+ *cur_state = dif_bool_to_toggle(
!bitfield_bit32_read(reg_val, PWRMGR_WAKE_INFO_CAPTURE_DIS_VAL_BIT));
return kDifOk;
diff --git a/sw/device/lib/dif/meson.build b/sw/device/lib/dif/meson.build
index b53ed1a..57eb9d2 100644
--- a/sw/device/lib/dif/meson.build
+++ b/sw/device/lib/dif/meson.build
@@ -2,6 +2,16 @@
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
+# Base DIF library
+sw_lib_dif_base = declare_dependency(
+ link_with: static_library(
+ 'sw_lib_dif_base',
+ sources: [
+ 'dif_base.c',
+ ],
+ )
+)
+
subdir('autogen')
# ADC Control Interface DIF Library (dif_adc_ctrl)
@@ -56,6 +66,7 @@
sources: [
'dif_clkmgr_unittest.cc',
'autogen/dif_clkmgr_autogen_unittest.cc',
+ meson.source_root() / 'sw/device/lib/dif/dif_base.c',
meson.source_root() / 'sw/device/lib/dif/dif_clkmgr.c',
meson.source_root() / 'sw/device/lib/dif/autogen/dif_clkmgr_autogen.c',
hw_ip_clkmgr_reg_h,
@@ -585,6 +596,7 @@
sources: [
'dif_alert_handler_unittest.cc',
'autogen/dif_alert_handler_autogen_unittest.cc',
+ meson.source_root() / 'sw/device/lib/dif/dif_base.c',
meson.source_root() / 'sw/device/lib/dif/dif_alert_handler.c',
meson.source_root() / 'sw/device/lib/dif/autogen/dif_alert_handler_autogen.c',
hw_ip_alert_handler_reg_h,
@@ -621,6 +633,7 @@
sources: [
'dif_pwrmgr_unittest.cc',
'autogen/dif_pwrmgr_autogen_unittest.cc',
+ meson.source_root() / 'sw/device/lib/dif/dif_base.c',
meson.source_root() / 'sw/device/lib/dif/dif_pwrmgr.c',
meson.source_root() / 'sw/device/lib/dif/autogen/dif_pwrmgr_autogen.c',
hw_ip_pwrmgr_reg_h,
@@ -657,6 +670,7 @@
sources: [
'dif_keymgr_unittest.cc',
'autogen/dif_keymgr_autogen_unittest.cc',
+ meson.source_root() / 'sw/device/lib/dif/dif_base.c',
meson.source_root() / 'sw/device/lib/dif/dif_keymgr.c',
meson.source_root() / 'sw/device/lib/dif/autogen/dif_keymgr_autogen.c',
hw_ip_keymgr_reg_h,