[sw, dif, aes] Remove translation of enums

 - Set the public enums with the values that can be used to set the registers.
 - Use the mode field of the transaction struct to define the aes mode.

This fixes lowRISC/OpenTitan#10487

Signed-off-by: Douglas Reis <doreis@lowrisc.org>
diff --git a/sw/device/lib/dif/dif_aes.c b/sw/device/lib/dif/dif_aes.c
index 8666cc8..e9f850d 100644
--- a/sw/device/lib/dif/dif_aes.c
+++ b/sw/device/lib/dif/dif_aes.c
@@ -16,47 +16,6 @@
  * aes.CTRL.
  */
 
-/*
- * Field to select AES operation.
- *
- * Invalid input values, i.e., value with multiple bits set - are mapped to
- * `kAesOperationFieldValEnc`.
- */
-typedef enum aes_operation_field_val {
-  kAesOperationFieldValInvalid = 0x0,
-  kAesOperationFieldValEnc = 0x1, /**< Enrcyption. */
-  kAesOperationFieldValDec = 0x2, /**< Decryption. */
-} aes_operation_field_val_t;
-
-/*
- * Field to select AES block cipher mode.
- *
- * Invalid input values, i.e., value with multiple bits set - are mapped to
- * `kAesModeFieldValNone`.
- */
-typedef enum aes_mode_field_val {
-  kAesModeFieldValEcb = 0x01,  /**< The Electronic Codebook Mode. */
-  kAesModeFieldValCbc = 0x02,  /**< The Cipher Block Chaining Mode. */
-  kAesModeFieldValCfb = 0x04,  /**< TODO */
-  kAesModeFieldValOfb = 0x08,  /**< TODO */
-  kAesModeFieldValCtr = 0x10,  /**< The Counter Mode. */
-  kAesModeFieldValNone = 0x20, /**< TODO */
-} aes_mode_field_val_t;
-
-/*
- * Field to select AES key length.
- *
- * Invalid input values, i.e., value with multiple bits set, value 3'b000, and
- * value 3'b010 in case 192-bit keys are not supported (disabled at compile
- * time) are mapped to `kAesKeyFieldVal256`.
- */
-typedef enum aes_key_field_val {
-  kAesKeyFieldValInvalid = 0x00,
-  kAesKeyFieldVal128 = 0x01,
-  kAesKeyFieldVal192 = 0x02,
-  kAesKeyFieldVal256 = 0x04,
-} aes_key_field_val_t;
-
 static bool aes_idle(const dif_aes_t *aes) {
   return mmio_region_get_bit32(aes->base_addr, AES_STATUS_REG_OFFSET,
                                AES_STATUS_IDLE_BIT);
@@ -123,101 +82,29 @@
   }
 }
 
-static aes_operation_field_val_t operation_to_field(
-    dif_aes_operation_t operation) {
-  switch (operation) {
-    case kDifAesOperationEncrypt:
-      return kAesOperationFieldValEnc;
-    case kDifAesOperationDecrypt:
-      return kAesOperationFieldValDec;
-    default:
-      return kAesOperationFieldValInvalid;
-  }
-}
-
-// TODO: We should extract the MODE from the transaction using this function and
-// not separately provide it. See
-// https://github.com/lowRISC/opentitan/issues/10487
-// static aes_mode_field_val_t mode_to_field(dif_aes_mode_t mode) {
-//  switch (mode) {
-//    case kDifAesModeEcb:
-//      return kAesModeFieldValEcb;
-//    case kDifAesModeCbc:
-//      return kAesModeFieldValCbc;
-//    case kDifAesModeCfb:
-//      return kAesModeFieldValCfb;
-//    case kDifAesModeOfb:
-//      return kAesModeFieldValOfb;
-//    case kDifAesModeCtr:
-//      return kAesModeFieldValCtr;
-//    default:
-//      return kAesModeFieldValNone;
-//  }
-//}
-
-static aes_key_field_val_t key_to_field(dif_aes_key_length_t key) {
-  switch (key) {
-    case kDifAesKey128:
-      return kAesKeyFieldVal128;
-    case kDifAesKey192:
-      return kAesKeyFieldVal192;
-    case kDifAesKey256:
-      return kAesKeyFieldVal256;
-    default:
-      return kAesKeyFieldValInvalid;
-  }
-}
-
 /**
  * Configures AES. Is used by every `dif_aes_start_<mode>` function.
  *
  * @param aes AES state data.
  * @param transaction Configuration data, common across all Cipher modes.
- * @param mode_val Block cipher mode of operation register write value.
  * @return `dif_result_t`.
  */
 static dif_result_t configure(const dif_aes_t *aes,
-                              const dif_aes_transaction_t *transaction,
-                              aes_mode_field_val_t mode_val) {
-  aes_operation_field_val_t operation_val =
-      operation_to_field(transaction->operation);
-  if (operation_val == kAesOperationFieldValInvalid) {
-    return kDifError;
-  }
-  // TODO: We should extract the mode from the transaction and not separately
-  // provide it. See https://github.com/lowRISC/opentitan/issues/10487
-  // aes_mode_field_val_t mode_val = mode_to_field(transaction->mode);
-  // if (mode_val == kAesModeFieldValNone) {
-  //  return kDifError;
-  //}
-  aes_key_field_val_t key_len_val = key_to_field(transaction->key_len);
-  if (key_len_val == kAesKeyFieldValInvalid) {
-    return kDifError;
-  }
-
+                              const dif_aes_transaction_t *transaction) {
   uint32_t reg = bitfield_field32_write(0, AES_CTRL_SHADOWED_OPERATION_FIELD,
-                                        operation_val);
+                                        transaction->operation);
 
-  reg = bitfield_field32_write(reg, AES_CTRL_SHADOWED_MODE_FIELD, mode_val);
+  reg = bitfield_field32_write(reg, AES_CTRL_SHADOWED_MODE_FIELD,
+                               transaction->mode);
 
-  reg =
-      bitfield_field32_write(reg, AES_CTRL_SHADOWED_KEY_LEN_FIELD, key_len_val);
+  reg = bitfield_field32_write(reg, AES_CTRL_SHADOWED_KEY_LEN_FIELD,
+                               transaction->key_len);
 
-  if (transaction->manual_operation == kDifAesManualOperationManual) {
-    reg =
-        bitfield_bit32_write(reg, AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, true);
-  } else {
-    reg = bitfield_bit32_write(reg, AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT,
-                               false);
-  }
+  bool flag = transaction->manual_operation == kDifAesManualOperationManual;
+  reg = bitfield_bit32_write(reg, AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, flag);
 
-  if (transaction->masking == kDifAesMaskingForceZero) {
-    reg =
-        bitfield_bit32_write(reg, AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, true);
-  } else {
-    reg = bitfield_bit32_write(reg, AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT,
-                               false);
-  }
+  flag = transaction->masking == kDifAesMaskingForceZero;
+  reg = bitfield_bit32_write(reg, AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, flag);
 
   aes_shadowed_write(aes->base_addr, AES_CTRL_SHADOWED_REG_OFFSET, reg);
 
@@ -276,7 +163,7 @@
     return kDifUnavailable;
   }
 
-  dif_result_t result = configure(aes, transaction, kAesModeFieldValEcb);
+  dif_result_t result = configure(aes, transaction);
   if (result != kDifOk) {
     return result;
   }
@@ -301,7 +188,7 @@
     return kDifUnavailable;
   }
 
-  dif_result_t result = configure(aes, transaction, kAesModeFieldValCbc);
+  dif_result_t result = configure(aes, transaction);
   if (result != kDifOk) {
     return result;
   }
@@ -328,7 +215,7 @@
     return kDifUnavailable;
   }
 
-  dif_result_t result = configure(aes, transaction, kAesModeFieldValCtr);
+  dif_result_t result = configure(aes, transaction);
   if (result != kDifOk) {
     return result;
   }
@@ -355,7 +242,7 @@
     return kDifUnavailable;
   }
 
-  dif_result_t result = configure(aes, transaction, kAesModeFieldValOfb);
+  dif_result_t result = configure(aes, transaction);
   if (result != kDifOk) {
     return result;
   }
@@ -382,7 +269,7 @@
     return kDifUnavailable;
   }
 
-  dif_result_t result = configure(aes, transaction, kAesModeFieldValCfb);
+  dif_result_t result = configure(aes, transaction);
   if (result != kDifOk) {
     return result;
   }
diff --git a/sw/device/lib/dif/dif_aes.h b/sw/device/lib/dif/dif_aes.h
index f75a7ce..e2231f9 100644
--- a/sw/device/lib/dif/dif_aes.h
+++ b/sw/device/lib/dif/dif_aes.h
@@ -88,11 +88,11 @@
   /**
    * AES encryption.
    */
-  kDifAesOperationEncrypt = 0,
+  kDifAesOperationEncrypt = 1,
   /**
    * AES decryption.
    */
-  kDifAesOperationDecrypt,
+  kDifAesOperationDecrypt = 2,
 } dif_aes_operation_t;
 
 /**
@@ -102,23 +102,27 @@
   /**
    * The Electronic Codebook Mode.
    */
-  kDifAesModeEcb = 0,
+  kDifAesModeEcb = 1,
+
   /**
    * The Cipher Block Chaining Mode.
    */
-  kDifAesModeCbc,
+  kDifAesModeCbc = (1 << 1),
+
   /**
    * The Cipher Feedback Mode.
    */
-  kDifAesModeCfb,
+  kDifAesModeCfb = (1 << 2),
+
   /**
    * The Output Feedback Mode.
    */
-  kDifAesModeOfb,
+  kDifAesModeOfb = (1 << 3),
+
   /**
    * The Counter Mode.
    */
-  kDifAesModeCtr,
+  kDifAesModeCtr = (1 << 4),
 } dif_aes_mode_t;
 
 /**
@@ -128,15 +132,15 @@
   /**
    * 128 bit wide AES key.
    */
-  kDifAesKey128 = 0,
+  kDifAesKey128 = 1,
   /**
    * 192 bit wide AES key.
    */
-  kDifAesKey192,
+  kDifAesKey192 = (1 << 1),
   /**
    * 256 bit wide AES key.
    */
-  kDifAesKey256,
+  kDifAesKey256 = (1 << 2)
 } dif_aes_key_length_t;
 
 /**
diff --git a/sw/device/lib/dif/dif_aes_unittest.cc b/sw/device/lib/dif/dif_aes_unittest.cc
index 0c13bd2..d9db2f4 100644
--- a/sw/device/lib/dif/dif_aes_unittest.cc
+++ b/sw/device/lib/dif/dif_aes_unittest.cc
@@ -59,7 +59,7 @@
  protected:
   dif_aes_t aes_;
 
-  const dif_aes_transaction_t kTransaction = {
+  dif_aes_transaction_t transaction = {
       .operation = kDifAesOperationEncrypt,
       .mode = kDifAesModeEcb,
       .key_len = kDifAesKey128,
@@ -79,94 +79,112 @@
 };
 
 // ECB tests
-class EcbTest : public AesTestInitialized {};
+class EcbTest : public AesTestInitialized {
+ protected:
+  EcbTest() { transaction.mode = kDifAesModeEcb; }
+};
 
 TEST_F(EcbTest, start) {
   EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
   for (int i = 0; i < 2; i++) {
-    EXPECT_WRITE32(AES_CTRL_SHADOWED_REG_OFFSET,
-                   {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, 0x01},
-                    {AES_CTRL_SHADOWED_MODE_OFFSET, 0x01},
-                    {AES_CTRL_SHADOWED_OPERATION_OFFSET, 0x1},
-                    {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
-                    {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
+    EXPECT_WRITE32(
+        AES_CTRL_SHADOWED_REG_OFFSET,
+        {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, kDifAesKey128},
+         {AES_CTRL_SHADOWED_MODE_OFFSET, kDifAesModeEcb},
+         {AES_CTRL_SHADOWED_OPERATION_OFFSET, kDifAesOperationEncrypt},
+         {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
+         {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
   }
 
   setExpectedKey(kKey_, 8);
 
-  EXPECT_EQ(dif_aes_start_ecb(&aes_, &kTransaction, kKey_), kDifOk);
+  EXPECT_EQ(dif_aes_start_ecb(&aes_, &transaction, kKey_), kDifOk);
 }
 
-// CBC tests
-class CbcTest : public AesTestInitialized {};
+class CbcTest : public AesTestInitialized {
+ protected:
+  CbcTest() { transaction.mode = kDifAesModeCbc; }
+};
 
 TEST_F(CbcTest, start) {
   EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
   for (int i = 0; i < 2; i++) {
-    EXPECT_WRITE32(AES_CTRL_SHADOWED_REG_OFFSET,
-                   {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, 0x01},
-                    {AES_CTRL_SHADOWED_MODE_OFFSET, 0x02},
-                    {AES_CTRL_SHADOWED_OPERATION_OFFSET, 0x1},
-                    {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
-                    {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
+    EXPECT_WRITE32(
+        AES_CTRL_SHADOWED_REG_OFFSET,
+        {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, kDifAesKey128},
+         {AES_CTRL_SHADOWED_MODE_OFFSET, kDifAesModeCbc},
+         {AES_CTRL_SHADOWED_OPERATION_OFFSET, kDifAesOperationEncrypt},
+         {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
+         {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
   }
 
   setExpectedKey(kKey_, 8);
   setExpectedIv(kIv_);
 
-  EXPECT_EQ(dif_aes_start_cbc(&aes_, &kTransaction, kKey_, kIv_), kDifOk);
+  EXPECT_EQ(dif_aes_start_cbc(&aes_, &transaction, kKey_, kIv_), kDifOk);
 }
 
 // CFB tests
-class CFBTest : public AesTestInitialized {};
+class CFBTest : public AesTestInitialized {
+ protected:
+  CFBTest() { transaction.mode = kDifAesModeCfb; }
+};
 
 TEST_F(CFBTest, start) {
   EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
   for (int i = 0; i < 2; i++) {
-    EXPECT_WRITE32(AES_CTRL_SHADOWED_REG_OFFSET,
-                   {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, 0x01},
-                    {AES_CTRL_SHADOWED_MODE_OFFSET, 0x04},
-                    {AES_CTRL_SHADOWED_OPERATION_OFFSET, 0x1},
-                    {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
-                    {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
+    EXPECT_WRITE32(
+        AES_CTRL_SHADOWED_REG_OFFSET,
+        {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, kDifAesKey128},
+         {AES_CTRL_SHADOWED_MODE_OFFSET, kDifAesModeCfb},
+         {AES_CTRL_SHADOWED_OPERATION_OFFSET, kDifAesOperationEncrypt},
+         {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
+         {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
   }
 
   setExpectedKey(kKey_, 8);
   setExpectedIv(kIv_);
 
-  EXPECT_EQ(dif_aes_start_cfb(&aes_, &kTransaction, kKey_, kIv_), kDifOk);
+  EXPECT_EQ(dif_aes_start_cfb(&aes_, &transaction, kKey_, kIv_), kDifOk);
 }
 
 // OFB tests
-class OFBTest : public AesTestInitialized {};
+class OFBTest : public AesTestInitialized {
+ protected:
+  OFBTest() { transaction.mode = kDifAesModeOfb; }
+};
 
 TEST_F(OFBTest, start) {
   EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
   for (int i = 0; i < 2; i++) {
-    EXPECT_WRITE32(AES_CTRL_SHADOWED_REG_OFFSET,
-                   {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, 0x01},
-                    {AES_CTRL_SHADOWED_MODE_OFFSET, 0x08},
-                    {AES_CTRL_SHADOWED_OPERATION_OFFSET, 0x1},
-                    {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
-                    {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
+    EXPECT_WRITE32(
+        AES_CTRL_SHADOWED_REG_OFFSET,
+        {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, kDifAesKey128},
+         {AES_CTRL_SHADOWED_MODE_OFFSET, kDifAesModeOfb},
+         {AES_CTRL_SHADOWED_OPERATION_OFFSET, kDifAesOperationEncrypt},
+         {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
+         {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
   }
 
   setExpectedKey(kKey_, 8);
   setExpectedIv(kIv_);
 
-  EXPECT_EQ(dif_aes_start_ofb(&aes_, &kTransaction, kKey_, kIv_), kDifOk);
+  EXPECT_EQ(dif_aes_start_ofb(&aes_, &transaction, kKey_, kIv_), kDifOk);
 }
 
 // CTR tests
-class CTRTest : public AesTestInitialized {};
+class CTRTest : public AesTestInitialized {
+ protected:
+  CTRTest() { transaction.mode = kDifAesModeCtr; }
+};
 
 TEST_F(CTRTest, start) {
   EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
   for (int i = 0; i < 2; i++) {
     EXPECT_WRITE32(AES_CTRL_SHADOWED_REG_OFFSET,
-                   {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, 0x01},
-                    {AES_CTRL_SHADOWED_MODE_OFFSET, 0x10},
-                    {AES_CTRL_SHADOWED_OPERATION_OFFSET, 0x1},
+                   {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, kDifAesKey128},
+                    {AES_CTRL_SHADOWED_MODE_OFFSET, kDifAesModeCtr},
+                    {AES_CTRL_SHADOWED_OPERATION_OFFSET, kDifAesOperationEncrypt},
                     {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
                     {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
   }
@@ -174,7 +192,7 @@
   setExpectedKey(kKey_, 8);
   setExpectedIv(kIv_);
 
-  EXPECT_EQ(dif_aes_start_ctr(&aes_, &kTransaction, kKey_, kIv_), kDifOk);
+  EXPECT_EQ(dif_aes_start_ctr(&aes_, &transaction, kKey_, kIv_), kDifOk);
 }
 
 }  // namespace