[sw] Add mubi header enums
Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/sw/device/lib/base/meson.build b/sw/device/lib/base/meson.build
index 7bd3128..5eeba33 100644
--- a/sw/device/lib/base/meson.build
+++ b/sw/device/lib/base/meson.build
@@ -37,6 +37,8 @@
sw_lib_hardened = declare_dependency(
link_with: static_library(
'hardened_ot',
- sources: ['hardened.c'],
+ sources: [
+ 'hardened.c'
+ ],
)
)
diff --git a/sw/device/lib/base/multibits.h b/sw/device/lib/base/multibits.h
new file mode 100644
index 0000000..1620411
--- /dev/null
+++ b/sw/device/lib/base/multibits.h
@@ -0,0 +1,43 @@
+// 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_BASE_MULTIBITS_H_
+#define OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
+
+/**
+ * Multi-bit boolean values
+ *
+ * Certain configuration fields in the design are multi-bits.
+ * This gives the configuration fields redundancy and ensures
+ * it is difficult to fault the values to a "good" state.
+ */
+typedef enum multi_bit_bool {
+
+ /**
+ * 4-bits boolean values
+ */
+ kMultiBitBool4True = 0xA,
+ kMultiBitBool4False = 0x5,
+
+ /**
+ * 8-bits boolean values
+ */
+ kMultiBitBool8True = 0x5A,
+ kMultiBitBool8False = 0xA5,
+
+ /**
+ * 12-bits boolean values
+ */
+ kMultiBitBool12True = 0xA5A,
+ kMultiBitBool12False = 0x5A5,
+
+ /**
+ * 16-bits boolean values
+ */
+ kMultiBitBool16True = 0x5A5A,
+ kMultiBitBool16False = 0xA5A5,
+
+} multi_bit_bool_t;
+
+#endif // OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
diff --git a/sw/device/lib/dif/dif_entropy_src.c b/sw/device/lib/dif/dif_entropy_src.c
index 90afed8..2ad5c9d 100644
--- a/sw/device/lib/dif/dif_entropy_src.c
+++ b/sw/device/lib/dif/dif_entropy_src.c
@@ -8,6 +8,7 @@
#include "sw/device/lib/base/memory.h"
#include "sw/device/lib/base/mmio.h"
+#include "sw/device/lib/base/multibits.h"
#include "sw/device/lib/dif/dif_base.h"
#include "entropy_src_regs.h" // Generated.
@@ -20,20 +21,23 @@
const dif_entropy_src_config_t *config) {
// TODO: Make this configurable at the API level.
uint32_t reg = bitfield_field32_write(
- 0, ENTROPY_SRC_CONF_BOOT_BYPASS_DISABLE_FIELD, 0x5);
+ 0, ENTROPY_SRC_CONF_BOOT_BYPASS_DISABLE_FIELD, kMultiBitBool4False);
- uint32_t health_clr_sel = config->reset_health_test_registers ? 0xa : 0x5;
+ uint32_t health_clr_sel = config->reset_health_test_registers
+ ? kMultiBitBool4True
+ : kMultiBitBool4False;
reg = bitfield_field32_write(reg, ENTROPY_SRC_CONF_HEALTH_TEST_CLR_FIELD,
health_clr_sel);
- reg = bitfield_field32_write(reg,
- ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD,
- config->route_to_firmware ? 0xa : 0x5);
+ reg = bitfield_field32_write(
+ reg, ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD,
+ config->route_to_firmware ? kMultiBitBool4True : kMultiBitBool4False);
// Configure single RNG bit mode
uint32_t rng_bit_en =
- (config->single_bit_mode == kDifEntropySrcSingleBitModeDisabled) ? 0x5
- : 0xa;
+ (config->single_bit_mode == kDifEntropySrcSingleBitModeDisabled)
+ ? kMultiBitBool4False
+ : kMultiBitBool4True;
reg = bitfield_field32_write(reg, ENTROPY_SRC_CONF_RNG_BIT_ENABLE_FIELD,
rng_bit_en);
@@ -41,12 +45,15 @@
reg = bitfield_field32_write(reg, ENTROPY_SRC_CONF_RNG_BIT_SEL_FIELD,
rng_bit_sel);
- uint32_t sw_rd_en = config->route_to_firmware ? 0xa : 0x5;
+ uint32_t sw_rd_en =
+ config->route_to_firmware ? kMultiBitBool4True : kMultiBitBool4False;
reg = bitfield_field32_write(
reg, ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD, sw_rd_en);
// Enable configuration
- uint32_t enable_val = config->mode != kDifEntropySrcModeDisabled ? 0xa : 0x5;
+ uint32_t enable_val = config->mode != kDifEntropySrcModeDisabled
+ ? kMultiBitBool4True
+ : kMultiBitBool4False;
reg = bitfield_field32_write(reg, ENTROPY_SRC_CONF_ENABLE_FIELD, enable_val);
mmio_region_write32(entropy_src->base_addr, ENTROPY_SRC_CONF_REG_OFFSET, reg);
}
@@ -104,13 +111,15 @@
// Conditioning bypass is hardcoded to disabled. Conditioning bypass is not
// intended as a regular mode of operation.
- uint32_t es_route_val = config.route_to_firmware ? 0xa : 0x5;
+ uint32_t es_route_val =
+ config.route_to_firmware ? kMultiBitBool4True : kMultiBitBool4False;
uint32_t reg = bitfield_field32_write(
0, ENTROPY_SRC_ENTROPY_CONTROL_ES_ROUTE_FIELD, es_route_val);
reg = bitfield_field32_write(reg, ENTROPY_SRC_ENTROPY_CONTROL_ES_TYPE_FIELD,
- 0x5);
+ kMultiBitBool4False);
mmio_region_write32(entropy_src->base_addr,
ENTROPY_SRC_ENTROPY_CONTROL_REG_OFFSET, reg);
+
config_register_set(entropy_src, &config);
return kDifOk;
}
diff --git a/sw/device/lib/dif/dif_entropy_src_unittest.cc b/sw/device/lib/dif/dif_entropy_src_unittest.cc
index cd173f2..132eab0 100644
--- a/sw/device/lib/dif/dif_entropy_src_unittest.cc
+++ b/sw/device/lib/dif/dif_entropy_src_unittest.cc
@@ -6,6 +6,7 @@
#include "gtest/gtest.h"
#include "sw/device/lib/base/mmio.h"
+#include "sw/device/lib/base/multibits.h"
#include "sw/device/lib/base/testing/mock_mmio.h"
#include "sw/device/lib/dif/dif_base.h"
@@ -92,34 +93,44 @@
ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET,
{
{ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_OFFSET,
- (uint32_t)(config_.fw_override.enable ? 0xa : 0x5)},
+ (uint32_t)(config_.fw_override.enable ? kMultiBitBool4True
+ : kMultiBitBool4False)},
{ENTROPY_SRC_FW_OV_CONTROL_FW_OV_ENTROPY_INSERT_OFFSET,
- (uint32_t)(config_.fw_override.entropy_insert_enable ? 0xa : 0x5)},
+ (uint32_t)(config_.fw_override.entropy_insert_enable
+ ? kMultiBitBool4True
+ : kMultiBitBool4False)},
});
- EXPECT_WRITE32(ENTROPY_SRC_ENTROPY_CONTROL_REG_OFFSET,
- {
- {ENTROPY_SRC_ENTROPY_CONTROL_ES_ROUTE_OFFSET,
- (uint32_t)(test_param.route_to_firmware ? 0xa : 0x5)},
- {ENTROPY_SRC_ENTROPY_CONTROL_ES_TYPE_OFFSET, 0x5},
- });
+ EXPECT_WRITE32(
+ ENTROPY_SRC_ENTROPY_CONTROL_REG_OFFSET,
+ {
+ {ENTROPY_SRC_ENTROPY_CONTROL_ES_ROUTE_OFFSET,
+ (uint32_t)(test_param.route_to_firmware ? kMultiBitBool4True
+ : kMultiBitBool4False)},
+ {ENTROPY_SRC_ENTROPY_CONTROL_ES_TYPE_OFFSET, kMultiBitBool4False},
+ });
// Current dif does not perform a read modified write
// EXPECT_READ32(ENTROPY_SRC_CONF_REG_OFFSET, 0);
- uint32_t rng_bit_enable = test_param.expected_rng_bit_en ? 0xa : 0x5;
- uint32_t route_to_fw = test_param.route_to_firmware ? 0xa : 0x5;
- uint32_t enable =
- test_param.expected_mode != kDifEntropySrcModeDisabled ? 0xa : 0x5;
+ uint32_t rng_bit_enable =
+ test_param.expected_rng_bit_en ? kMultiBitBool4True : kMultiBitBool4False;
+ uint32_t route_to_fw =
+ test_param.route_to_firmware ? kMultiBitBool4True : kMultiBitBool4False;
+ uint32_t enable = test_param.expected_mode != kDifEntropySrcModeDisabled
+ ? kMultiBitBool4True
+ : kMultiBitBool4False;
- uint32_t reset_ht = test_param.reset_health_test_registers ? 0xa : 0x5;
+ uint32_t reset_ht = test_param.reset_health_test_registers
+ ? kMultiBitBool4True
+ : kMultiBitBool4False;
EXPECT_WRITE32(
ENTROPY_SRC_CONF_REG_OFFSET,
{
{ENTROPY_SRC_CONF_RNG_BIT_SEL_OFFSET, test_param.expected_rng_sel},
{ENTROPY_SRC_CONF_RNG_BIT_ENABLE_OFFSET, rng_bit_enable},
{ENTROPY_SRC_CONF_HEALTH_TEST_CLR_OFFSET, reset_ht},
- {ENTROPY_SRC_CONF_BOOT_BYPASS_DISABLE_OFFSET, 0x5},
+ {ENTROPY_SRC_CONF_BOOT_BYPASS_DISABLE_OFFSET, kMultiBitBool4False},
{ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_OFFSET, route_to_fw},
{ENTROPY_SRC_CONF_ENABLE_OFFSET, enable},
});
diff --git a/util/design/data/multibits.h.tpl b/util/design/data/multibits.h.tpl
new file mode 100644
index 0000000..49f685a
--- /dev/null
+++ b/util/design/data/multibits.h.tpl
@@ -0,0 +1,33 @@
+// 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_BASE_MULTIBITS_H_
+#define OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
+
+/**
+ * Multi-bit boolean values
+ *
+ * Certain configuration fields in the design are multi-bits.
+ * This gives the configuration fields redundancy and ensures
+ * it is difficult to fault the values to a "good" state.
+ */
+typedef enum multi_bit_bool {
+<%
+from mubi import prim_mubi
+%>\
+
+% for n in range(1, n_max_nibbles + 1):
+ <%
+ nbits = n * 4
+ %>\
+ /**
+ * ${nbits}-bits boolean values
+ */
+ kMultiBitBool${nbits}True = 0x${prim_mubi.mubi_value_as_hexstr(True, nbits)},
+ kMultiBitBool${nbits}False = 0x${prim_mubi.mubi_value_as_hexstr(False, nbits)},
+
+% endfor
+} multi_bit_bool_t;
+
+#endif // OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
diff --git a/util/design/data/prim_mubi_pkg.sv.tpl b/util/design/data/prim_mubi_pkg.sv.tpl
index 9ca00f2..012ea90 100644
--- a/util/design/data/prim_mubi_pkg.sv.tpl
+++ b/util/design/data/prim_mubi_pkg.sv.tpl
@@ -13,7 +13,7 @@
package prim_mubi_pkg;
<%
-import prim_mubi as prim_mubi
+from mubi import prim_mubi
%>\
% for n in range(1, n_max_nibbles + 1):
<%
diff --git a/util/design/prim_mubi.py b/util/design/mubi/prim_mubi.py
similarity index 91%
rename from util/design/prim_mubi.py
rename to util/design/mubi/prim_mubi.py
index 66488da..4615e58 100755
--- a/util/design/prim_mubi.py
+++ b/util/design/mubi/prim_mubi.py
@@ -11,12 +11,14 @@
MUBI_SENDER_TPL_PATH = "util/design/data/prim_mubi_sender.sv.tpl"
MUBI_SYNC_TPL_PATH = "util/design/data/prim_mubi_sync.sv.tpl"
MUBI_DEC_TPL_PATH = "util/design/data/prim_mubi_dec.sv.tpl"
+MUBI_SW_TPL_PATH = "util/design/data/multibits.h.tpl"
MUBI_PKG_OUT_PATH = "hw/ip/prim/rtl/prim_mubi_pkg.sv"
MUBI_CORE_OUT_PATH = "hw/ip/prim/prim_mubi.core"
MUBI_SENDER_OUT_PATH = "hw/ip/prim/rtl/prim_mubi{}_sender.sv"
MUBI_SYNC_OUT_PATH = "hw/ip/prim/rtl/prim_mubi{}_sync.sv"
MUBI_DEC_OUT_PATH = "hw/ip/prim/rtl/prim_mubi{}_dec.sv"
+MUBI_SW_OUT_PATH = "sw/device/lib/base/multibits.h"
N_MAX_NIBBLES = 4
@@ -46,11 +48,16 @@
return int(mubi_value_as_hexstr(sel, width), 16)
-def main():
+def get_c_path():
+ return MUBI_SW_OUT_PATH
+
+
+def gen():
tpls = [
(MUBI_PKG_TPL_PATH, MUBI_PKG_OUT_PATH),
(MUBI_CORE_TPL_PATH, MUBI_CORE_OUT_PATH),
+ (MUBI_SW_TPL_PATH, MUBI_SW_OUT_PATH),
]
for tpl, out in tpls:
with open(tpl) as inf:
@@ -70,7 +77,3 @@
n_bits = n * 4
with open(out.format(n_bits), 'w') as outf:
outf.write(reg_tpl.render(n_bits=n_bits))
-
-
-if __name__ == "__main__":
- main()
diff --git a/util/reggen/field.py b/util/reggen/field.py
index a69ba67..a85fe7f 100644
--- a/util/reggen/field.py
+++ b/util/reggen/field.py
@@ -10,7 +10,7 @@
from .lib import (check_keys, check_str, check_name, check_bool,
check_list, check_str_list, check_xint)
from .params import ReggenParams
-from design.prim_mubi import is_width_valid, mubi_value_as_int # type: ignore
+from design.mubi.prim_mubi import is_width_valid, mubi_value_as_int # type: ignore
REQUIRED_FIELDS = {