[otbn] Make the life cycle escalation a fatal alert

Before, the incoming life cycle escalation handling was specified as
"like a fatal alert, except for XZY." This commit simplifies the
specification to handle an incoming life cycle escalation in the same
way as a fatal error that was detected within OTBN.

Fixes #7625

Signed-off-by: Philipp Wagner <phw@lowrisc.org>
diff --git a/hw/ip/otbn/data/otbn.hjson b/hw/ip/otbn/data/otbn.hjson
index ae3490e..234ce52 100644
--- a/hw/ip/otbn/data/otbn.hjson
+++ b/hw/ip/otbn/data/otbn.hjson
@@ -250,6 +250,11 @@
             it was not allowed.
             '''
         }
+        { bits: "9",
+          name: "fatal_lifecycle_escalation"
+          resval: 0,
+          desc: "OTBN received a life cycle escalation request from the system."
+        }
       ]
     } // register : err_bits
     { name: "START_ADDR",
@@ -309,6 +314,11 @@
             it was not allowed.
             '''
         }
+        { bits: "5",
+          name: "lifecycle_escalation"
+          resval: 0,
+          desc: "OTBN received a life cycle escalation request from the system."
+        }
       ]
     } // register : fatal_alert_cause
     { name: "SEC_WIPE",
diff --git a/hw/ip/otbn/doc/_index.md b/hw/ip/otbn/doc/_index.md
index 41bac73..82c1641 100644
--- a/hw/ip/otbn/doc/_index.md
+++ b/hw/ip/otbn/doc/_index.md
@@ -587,8 +587,7 @@
 ### Reaction to Life Cycle Escalation Requests
 
 OTBN receives and reacts to escalation signals from the [life cycle controller]({{< relref "/hw/ip/lc_ctrl/doc#security-escalation" >}}).
-
-An escalation request signaled through the `lc_escalate_en_i` signal results in the same action as a [fatal error](#design-details-fatal-errors) but does not raise a fatal alert.
+An incoming life cycle escalation is a fatal error of type `lifecycle_escalation` and treated as described in the section [Fatal Errors](#design-details-fatal-errors).
 
 ### Idle
 
diff --git a/hw/ip/otbn/dv/otbnsim/sim/err_bits.py b/hw/ip/otbn/dv/otbnsim/sim/err_bits.py
index e543e26..6772f9d 100644
--- a/hw/ip/otbn/dv/otbnsim/sim/err_bits.py
+++ b/hw/ip/otbn/dv/otbnsim/sim/err_bits.py
@@ -14,3 +14,4 @@
 FATAL_DMEM = 1 << 6
 FATAL_REG = 1 << 7
 FATAL_ILLEGAL_BUS_ACCESS = 1 << 8
+FATAL_LIFECYCLE_ESCALATION = 1 << 9
diff --git a/hw/ip/otbn/dv/verilator/otbn_top_sim.sv b/hw/ip/otbn/dv/verilator/otbn_top_sim.sv
index 9abd46f..e380415 100644
--- a/hw/ip/otbn/dv/verilator/otbn_top_sim.sv
+++ b/hw/ip/otbn/dv/verilator/otbn_top_sim.sv
@@ -61,43 +61,45 @@
     .ImemSizeByte ( ImemSizeByte ),
     .DmemSizeByte ( DmemSizeByte )
   ) u_otbn_core (
-    .clk_i                ( IO_CLK           ),
-    .rst_ni               ( IO_RST_N         ),
+    .clk_i                  ( IO_CLK           ),
+    .rst_ni                 ( IO_RST_N         ),
 
-    .start_i              ( otbn_start       ),
-    .done_o               ( otbn_done_d      ),
+    .start_i                ( otbn_start       ),
+    .done_o                 ( otbn_done_d      ),
 
-    .err_bits_o           ( otbn_err_bits_d  ),
+    .err_bits_o             ( otbn_err_bits_d  ),
 
-    .start_addr_i         ( ImemStartAddr    ),
+    .start_addr_i           ( ImemStartAddr    ),
 
-    .imem_req_o           ( imem_req         ),
-    .imem_addr_o          ( imem_addr        ),
-    .imem_wdata_o         (                  ),
-    .imem_rdata_i         ( imem_rdata[31:0] ),
-    .imem_rvalid_i        ( imem_rvalid      ),
-    .imem_rerror_i        ( imem_rerror      ),
+    .imem_req_o             ( imem_req         ),
+    .imem_addr_o            ( imem_addr        ),
+    .imem_wdata_o           (                  ),
+    .imem_rdata_i           ( imem_rdata[31:0] ),
+    .imem_rvalid_i          ( imem_rvalid      ),
+    .imem_rerror_i          ( imem_rerror      ),
 
-    .dmem_req_o           ( dmem_req         ),
-    .dmem_write_o         ( dmem_write       ),
-    .dmem_addr_o          ( dmem_addr        ),
-    .dmem_wdata_o         ( dmem_wdata       ),
-    .dmem_wmask_o         ( dmem_wmask       ),
-    .dmem_rmask_o         ( ),
-    .dmem_rdata_i         ( dmem_rdata       ),
-    .dmem_rvalid_i        ( dmem_rvalid      ),
-    .dmem_rerror_i        ( dmem_rerror      ),
+    .dmem_req_o             ( dmem_req         ),
+    .dmem_write_o           ( dmem_write       ),
+    .dmem_addr_o            ( dmem_addr        ),
+    .dmem_wdata_o           ( dmem_wdata       ),
+    .dmem_wmask_o           ( dmem_wmask       ),
+    .dmem_rmask_o           ( ),
+    .dmem_rdata_i           ( dmem_rdata       ),
+    .dmem_rvalid_i          ( dmem_rvalid      ),
+    .dmem_rerror_i          ( dmem_rerror      ),
 
-    .edn_rnd_req_o        ( edn_rnd_req      ),
-    .edn_rnd_ack_i        ( edn_rnd_ack      ),
-    .edn_rnd_data_i       ( edn_rnd_data     ),
+    .edn_rnd_req_o          ( edn_rnd_req      ),
+    .edn_rnd_ack_i          ( edn_rnd_ack      ),
+    .edn_rnd_data_i         ( edn_rnd_data     ),
 
-    .edn_urnd_req_o       ( edn_urnd_req     ),
-    .edn_urnd_ack_i       ( edn_urnd_ack     ),
-    .edn_urnd_data_i      ( edn_urnd_data    ),
+    .edn_urnd_req_o         ( edn_urnd_req     ),
+    .edn_urnd_ack_i         ( edn_urnd_ack     ),
+    .edn_urnd_data_i        ( edn_urnd_data    ),
 
-    .insn_cnt_o           ( insn_cnt         ),
-    .illegal_bus_access_i ( 1'b0             )
+    .insn_cnt_o             ( insn_cnt         ),
+
+    .illegal_bus_access_i   ( 1'b0             ),
+    .lifecycle_escalation_i ( 1'b0             )
   );
 
   // The top bits of IMEM rdata aren't currently used (they will eventually be used for integrity
diff --git a/hw/ip/otbn/rtl/otbn.sv b/hw/ip/otbn/rtl/otbn.sv
index af486cb..b7cceaf 100644
--- a/hw/ip/otbn/rtl/otbn.sv
+++ b/hw/ip/otbn/rtl/otbn.sv
@@ -133,9 +133,9 @@
     .lc_en_o(lc_escalate_en)
   );
 
-  // TODO: Connect lifecycle signal.
-  lc_ctrl_pkg::lc_tx_t unused_lc_escalate_en;
-  assign unused_lc_escalate_en = lc_escalate_en;
+  // Reduce the life cycle escalation signal to a single bit to be used within this cycle.
+  logic lifecycle_escalation;
+  assign lifecycle_escalation = lc_escalate_en != lc_ctrl_pkg::Off;
 
   // Interrupts ================================================================
 
@@ -628,6 +628,9 @@
   assign hw2reg.err_bits.fatal_illegal_bus_access.de = done;
   assign hw2reg.err_bits.fatal_illegal_bus_access.d = err_bits.fatal_illegal_bus_access;
 
+  assign hw2reg.err_bits.fatal_lifecycle_escalation.de = done;
+  assign hw2reg.err_bits.fatal_lifecycle_escalation.d = err_bits.fatal_lifecycle_escalation;
+
   // START_ADDR register
   assign start_addr = reg2hw.start_addr.q[ImemAddrWidth-1:0];
   logic [top_pkg::TL_DW-ImemAddrWidth-1:0] unused_start_addr_bits;
@@ -646,6 +649,8 @@
   assign hw2reg.fatal_alert_cause.reg_error.d  = 0;
   assign hw2reg.fatal_alert_cause.illegal_bus_access.de = illegal_bus_access_d;
   assign hw2reg.fatal_alert_cause.illegal_bus_access.d  = illegal_bus_access_d;
+  assign hw2reg.fatal_alert_cause.lifecycle_escalation.de = lifecycle_escalation;
+  assign hw2reg.fatal_alert_cause.lifecycle_escalation.d  = lifecycle_escalation;
 
   // INSN_CNT register
   logic [31:0] insn_cnt;
@@ -806,42 +811,44 @@
       .RndCnstUrndChunkLfsrPerm(RndCnstUrndChunkLfsrPerm)
     ) u_otbn_core (
       .clk_i,
-      .rst_ni               (rst_n),
+      .rst_ni                 (rst_n),
 
-      .start_i              (start_rtl),
-      .done_o               (done_rtl),
+      .start_i                (start_rtl),
+      .done_o                 (done_rtl),
 
-      .err_bits_o           (err_bits_rtl),
+      .err_bits_o             (err_bits_rtl),
 
-      .start_addr_i         (start_addr),
+      .start_addr_i           (start_addr),
 
-      .imem_req_o           (imem_req_core),
-      .imem_addr_o          (imem_addr_core),
-      .imem_wdata_o         (imem_wdata_core),
-      .imem_rdata_i         (imem_rdata_core),
-      .imem_rvalid_i        (imem_rvalid_core),
-      .imem_rerror_i        (imem_rerror_core),
+      .imem_req_o             (imem_req_core),
+      .imem_addr_o            (imem_addr_core),
+      .imem_wdata_o           (imem_wdata_core),
+      .imem_rdata_i           (imem_rdata_core),
+      .imem_rvalid_i          (imem_rvalid_core),
+      .imem_rerror_i          (imem_rerror_core),
 
-      .dmem_req_o           (dmem_req_core),
-      .dmem_write_o         (dmem_write_core),
-      .dmem_addr_o          (dmem_addr_core),
-      .dmem_wdata_o         (dmem_wdata_core),
-      .dmem_wmask_o         (dmem_wmask_core),
-      .dmem_rmask_o         (dmem_rmask_core_d),
-      .dmem_rdata_i         (dmem_rdata_core),
-      .dmem_rvalid_i        (dmem_rvalid_core),
-      .dmem_rerror_i        (dmem_rerror_core),
+      .dmem_req_o             (dmem_req_core),
+      .dmem_write_o           (dmem_write_core),
+      .dmem_addr_o            (dmem_addr_core),
+      .dmem_wdata_o           (dmem_wdata_core),
+      .dmem_wmask_o           (dmem_wmask_core),
+      .dmem_rmask_o           (dmem_rmask_core_d),
+      .dmem_rdata_i           (dmem_rdata_core),
+      .dmem_rvalid_i          (dmem_rvalid_core),
+      .dmem_rerror_i          (dmem_rerror_core),
 
-      .edn_rnd_req_o        (edn_rnd_req),
-      .edn_rnd_ack_i        (edn_rnd_ack),
-      .edn_rnd_data_i       (edn_rnd_data),
+      .edn_rnd_req_o          (edn_rnd_req),
+      .edn_rnd_ack_i          (edn_rnd_ack),
+      .edn_rnd_data_i         (edn_rnd_data),
 
-      .edn_urnd_req_o       (edn_urnd_req),
-      .edn_urnd_ack_i       (edn_urnd_ack),
-      .edn_urnd_data_i      (edn_urnd_data),
+      .edn_urnd_req_o         (edn_urnd_req),
+      .edn_urnd_ack_i         (edn_urnd_ack),
+      .edn_urnd_data_i        (edn_urnd_data),
 
-      .insn_cnt_o           (insn_cnt_rtl),
-      .illegal_bus_access_i (illegal_bus_access_q)
+      .insn_cnt_o             (insn_cnt_rtl),
+
+      .illegal_bus_access_i   (illegal_bus_access_q),
+      .lifecycle_escalation_i (lifecycle_escalation)
     );
   `else
     otbn_core #(
@@ -852,42 +859,44 @@
       .RndCnstUrndChunkLfsrPerm(RndCnstUrndChunkLfsrPerm)
     ) u_otbn_core (
       .clk_i,
-      .rst_ni               (rst_n),
+      .rst_ni                 (rst_n),
 
-      .start_i              (start_q),
-      .done_o               (done),
+      .start_i                (start_q),
+      .done_o                 (done),
 
-      .err_bits_o           (err_bits),
+      .err_bits_o             (err_bits),
 
-      .start_addr_i         (start_addr),
+      .start_addr_i           (start_addr),
 
-      .imem_req_o           (imem_req_core),
-      .imem_addr_o          (imem_addr_core),
-      .imem_wdata_o         (imem_wdata_core),
-      .imem_rdata_i         (imem_rdata_core),
-      .imem_rvalid_i        (imem_rvalid_core),
-      .imem_rerror_i        (imem_rerror_core),
+      .imem_req_o             (imem_req_core),
+      .imem_addr_o            (imem_addr_core),
+      .imem_wdata_o           (imem_wdata_core),
+      .imem_rdata_i           (imem_rdata_core),
+      .imem_rvalid_i          (imem_rvalid_core),
+      .imem_rerror_i          (imem_rerror_core),
 
-      .dmem_req_o           (dmem_req_core),
-      .dmem_write_o         (dmem_write_core),
-      .dmem_addr_o          (dmem_addr_core),
-      .dmem_wdata_o         (dmem_wdata_core),
-      .dmem_wmask_o         (dmem_wmask_core),
-      .dmem_rmask_o         (dmem_rmask_core_d),
-      .dmem_rdata_i         (dmem_rdata_core),
-      .dmem_rvalid_i        (dmem_rvalid_core),
-      .dmem_rerror_i        (dmem_rerror_core),
+      .dmem_req_o             (dmem_req_core),
+      .dmem_write_o           (dmem_write_core),
+      .dmem_addr_o            (dmem_addr_core),
+      .dmem_wdata_o           (dmem_wdata_core),
+      .dmem_wmask_o           (dmem_wmask_core),
+      .dmem_rmask_o           (dmem_rmask_core_d),
+      .dmem_rdata_i           (dmem_rdata_core),
+      .dmem_rvalid_i          (dmem_rvalid_core),
+      .dmem_rerror_i          (dmem_rerror_core),
 
-      .edn_rnd_req_o        (edn_rnd_req),
-      .edn_rnd_ack_i        (edn_rnd_ack),
-      .edn_rnd_data_i       (edn_rnd_data),
+      .edn_rnd_req_o          (edn_rnd_req),
+      .edn_rnd_ack_i          (edn_rnd_ack),
+      .edn_rnd_data_i         (edn_rnd_data),
 
-      .edn_urnd_req_o       (edn_urnd_req),
-      .edn_urnd_ack_i       (edn_urnd_ack),
-      .edn_urnd_data_i      (edn_urnd_data),
+      .edn_urnd_req_o         (edn_urnd_req),
+      .edn_urnd_ack_i         (edn_urnd_ack),
+      .edn_urnd_data_i        (edn_urnd_data),
 
-      .insn_cnt_o           (insn_cnt),
-      .illegal_bus_access_i (illegal_bus_access_q)
+      .insn_cnt_o             (insn_cnt),
+
+      .illegal_bus_access_i   (illegal_bus_access_q),
+      .lifecycle_escalation_i (lifecycle_escalation)
     );
   `endif
 
diff --git a/hw/ip/otbn/rtl/otbn_controller.sv b/hw/ip/otbn/rtl/otbn_controller.sv
index f5ee02a..f97960b 100644
--- a/hw/ip/otbn/rtl/otbn_controller.sv
+++ b/hw/ip/otbn/rtl/otbn_controller.sv
@@ -125,7 +125,8 @@
 
   input  logic        state_reset_i,
   output logic [31:0] insn_cnt_o,
-  input  logic        illegal_bus_access_i
+  input  logic        illegal_bus_access_i,
+  input  logic        lifecycle_escalation_i
 );
   otbn_state_e state_q, state_d, state_raw;
 
@@ -327,15 +328,16 @@
     end
   end
 
-  assign err_bits_o.fatal_illegal_bus_access = illegal_bus_access_i;
-  assign err_bits_o.fatal_reg                = rf_base_rd_data_err_i | rf_bignum_rd_data_err_i;
-  assign err_bits_o.fatal_imem               = insn_fetch_err_i;
-  assign err_bits_o.fatal_dmem               = lsu_rdata_err_i;
-  assign err_bits_o.illegal_insn             = insn_illegal_i | ispr_err | rf_indirect_err;
-  assign err_bits_o.bad_data_addr            = dmem_addr_err;
-  assign err_bits_o.loop                     = loop_err;
-  assign err_bits_o.call_stack               = rf_base_call_stack_err_i;
-  assign err_bits_o.bad_insn_addr            = imem_addr_err;
+  assign err_bits_o.fatal_lifecycle_escalation = lifecycle_escalation_i;
+  assign err_bits_o.fatal_illegal_bus_access   = illegal_bus_access_i;
+  assign err_bits_o.fatal_reg                  = rf_base_rd_data_err_i | rf_bignum_rd_data_err_i;
+  assign err_bits_o.fatal_imem                 = insn_fetch_err_i;
+  assign err_bits_o.fatal_dmem                 = lsu_rdata_err_i;
+  assign err_bits_o.illegal_insn               = insn_illegal_i | ispr_err | rf_indirect_err;
+  assign err_bits_o.bad_data_addr              = dmem_addr_err;
+  assign err_bits_o.loop                       = loop_err;
+  assign err_bits_o.call_stack                 = rf_base_call_stack_err_i;
+  assign err_bits_o.bad_insn_addr              = imem_addr_err;
 
   assign err = |err_bits_o;
 
diff --git a/hw/ip/otbn/rtl/otbn_core.sv b/hw/ip/otbn/rtl/otbn_core.sv
index 76a18f6..cc47588 100644
--- a/hw/ip/otbn/rtl/otbn_core.sv
+++ b/hw/ip/otbn/rtl/otbn_core.sv
@@ -68,9 +68,12 @@
 
   output logic [31:0]             insn_cnt_o,
 
-  // Asserted by system when bus tries to access OTBN memories whilst OTBN is active. Results in an
+  // Asserted by system when bus tries to access OTBN memories whilst OTBN is active. Results in a
   // fatal error.
-  input  logic                    illegal_bus_access_i
+  input  logic                    illegal_bus_access_i,
+
+  // Indicates an incoming escalation from the life cycle manager. Results in a fatal error.
+  input  logic                    lifecycle_escalation_i
 );
   // Fetch request (the next instruction)
   logic [ImemAddrWidth-1:0] insn_fetch_req_addr;
@@ -353,7 +356,8 @@
 
     .state_reset_i      (state_reset),
     .insn_cnt_o         (insn_cnt),
-    .illegal_bus_access_i
+    .illegal_bus_access_i,
+    .lifecycle_escalation_i
   );
 
   assign insn_cnt_o = insn_cnt;
diff --git a/hw/ip/otbn/rtl/otbn_pkg.sv b/hw/ip/otbn/rtl/otbn_pkg.sv
index 6c1c48a..6707749 100644
--- a/hw/ip/otbn/rtl/otbn_pkg.sv
+++ b/hw/ip/otbn/rtl/otbn_pkg.sv
@@ -54,6 +54,7 @@
   //
   // Note: These errors are duplicated in other places. If updating them here, update those too.
   typedef struct packed {
+    logic fatal_lifecycle_escalation;
     logic fatal_illegal_bus_access;
     logic fatal_reg;
     logic fatal_dmem;
diff --git a/hw/ip/otbn/rtl/otbn_reg_pkg.sv b/hw/ip/otbn/rtl/otbn_reg_pkg.sv
index 840d2b7..cca1fc1 100644
--- a/hw/ip/otbn/rtl/otbn_reg_pkg.sv
+++ b/hw/ip/otbn/rtl/otbn_reg_pkg.sv
@@ -104,6 +104,10 @@
       logic        d;
       logic        de;
     } fatal_illegal_bus_access;
+    struct packed {
+      logic        d;
+      logic        de;
+    } fatal_lifecycle_escalation;
   } otbn_hw2reg_err_bits_reg_t;
 
   typedef struct packed {
@@ -127,6 +131,10 @@
       logic        d;
       logic        de;
     } illegal_bus_access;
+    struct packed {
+      logic        d;
+      logic        de;
+    } lifecycle_escalation;
   } otbn_hw2reg_fatal_alert_cause_reg_t;
 
   typedef struct packed {
@@ -146,10 +154,10 @@
 
   // HW -> register type
   typedef struct packed {
-    otbn_hw2reg_intr_state_reg_t intr_state; // [62:61]
-    otbn_hw2reg_status_reg_t status; // [60:60]
-    otbn_hw2reg_err_bits_reg_t err_bits; // [59:42]
-    otbn_hw2reg_fatal_alert_cause_reg_t fatal_alert_cause; // [41:32]
+    otbn_hw2reg_intr_state_reg_t intr_state; // [66:65]
+    otbn_hw2reg_status_reg_t status; // [64:64]
+    otbn_hw2reg_err_bits_reg_t err_bits; // [63:44]
+    otbn_hw2reg_fatal_alert_cause_reg_t fatal_alert_cause; // [43:32]
     otbn_hw2reg_insn_cnt_reg_t insn_cnt; // [31:0]
   } otbn_hw2reg_t;
 
diff --git a/hw/ip/otbn/rtl/otbn_reg_top.sv b/hw/ip/otbn/rtl/otbn_reg_top.sv
index 63ca15e..3e0010e 100644
--- a/hw/ip/otbn/rtl/otbn_reg_top.sv
+++ b/hw/ip/otbn/rtl/otbn_reg_top.sv
@@ -185,6 +185,7 @@
   logic err_bits_fatal_dmem_qs;
   logic err_bits_fatal_reg_qs;
   logic err_bits_fatal_illegal_bus_access_qs;
+  logic err_bits_fatal_lifecycle_escalation_qs;
   logic start_addr_we;
   logic [31:0] start_addr_wd;
   logic fatal_alert_cause_bus_integrity_error_qs;
@@ -192,6 +193,7 @@
   logic fatal_alert_cause_dmem_error_qs;
   logic fatal_alert_cause_reg_error_qs;
   logic fatal_alert_cause_illegal_bus_access_qs;
+  logic fatal_alert_cause_lifecycle_escalation_qs;
   logic sec_wipe_we;
   logic sec_wipe_dmem_wd;
   logic sec_wipe_imem_wd;
@@ -569,6 +571,32 @@
   );
 
 
+  //   F[fatal_lifecycle_escalation]: 9:9
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_err_bits_fatal_lifecycle_escalation (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.err_bits.fatal_lifecycle_escalation.de),
+    .d      (hw2reg.err_bits.fatal_lifecycle_escalation.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (err_bits_fatal_lifecycle_escalation_qs)
+  );
+
+
   // R[start_addr]: V(False)
 
   prim_subreg #(
@@ -728,6 +756,32 @@
   );
 
 
+  //   F[lifecycle_escalation]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_cause_lifecycle_escalation (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert_cause.lifecycle_escalation.de),
+    .d      (hw2reg.fatal_alert_cause.lifecycle_escalation.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (fatal_alert_cause_lifecycle_escalation_qs)
+  );
+
+
   // R[sec_wipe]: V(False)
 
   //   F[dmem]: 0:0
@@ -900,6 +954,7 @@
         reg_rdata_next[6] = err_bits_fatal_dmem_qs;
         reg_rdata_next[7] = err_bits_fatal_reg_qs;
         reg_rdata_next[8] = err_bits_fatal_illegal_bus_access_qs;
+        reg_rdata_next[9] = err_bits_fatal_lifecycle_escalation_qs;
       end
 
       addr_hit[7]: begin
@@ -912,6 +967,7 @@
         reg_rdata_next[2] = fatal_alert_cause_dmem_error_qs;
         reg_rdata_next[3] = fatal_alert_cause_reg_error_qs;
         reg_rdata_next[4] = fatal_alert_cause_illegal_bus_access_qs;
+        reg_rdata_next[5] = fatal_alert_cause_lifecycle_escalation_qs;
       end
 
       addr_hit[9]: begin
diff --git a/sw/device/lib/dif/dif_otbn.c b/sw/device/lib/dif/dif_otbn.c
index d8485ed..bef2a76 100644
--- a/sw/device/lib/dif/dif_otbn.c
+++ b/sw/device/lib/dif/dif_otbn.c
@@ -32,6 +32,9 @@
 static_assert(kDifOtbnErrBitsFatalIllegalBusAccess ==
                   (1 << OTBN_ERR_BITS_FATAL_ILLEGAL_BUS_ACCESS_BIT),
               "Layout of error bits changed.");
+static_assert(kDifOtbnErrBitsFatalLifecycleEscalation ==
+                  (1 << OTBN_ERR_BITS_FATAL_LIFECYCLE_ESCALATION_BIT),
+              "Layout of error bits changed.");
 
 /**
  * Data width of big number subset, in bytes.
diff --git a/sw/device/lib/dif/dif_otbn.h b/sw/device/lib/dif/dif_otbn.h
index 1a335c9..ff6dc54 100644
--- a/sw/device/lib/dif/dif_otbn.h
+++ b/sw/device/lib/dif/dif_otbn.h
@@ -95,6 +95,8 @@
    * not allowed.
    */
   kDifOtbnErrBitsFatalIllegalBusAccess = (1 << 8),
+  /** OTBN received a life cycle escalation request from the system */
+  kDifOtbnErrBitsFatalLifecycleEscalation = (1 << 9),
 } dif_otbn_err_bits_t;
 
 /**
diff --git a/sw/device/silicon_creator/lib/drivers/otbn.c b/sw/device/silicon_creator/lib/drivers/otbn.c
index 095b08d..be2babe 100644
--- a/sw/device/silicon_creator/lib/drivers/otbn.c
+++ b/sw/device/silicon_creator/lib/drivers/otbn.c
@@ -29,6 +29,8 @@
 ASSERT_ERR_BIT_MATCH(kOtbnErrBitsFatalReg, OTBN_ERR_BITS_FATAL_REG_BIT);
 ASSERT_ERR_BIT_MATCH(kOtbnErrBitsFatalIllegalBusAccess,
                      OTBN_ERR_BITS_FATAL_ILLEGAL_BUS_ACCESS_BIT);
+ASSERT_ERR_BIT_MATCH(kOtbnErrBitsFatalLifecycleEscalation,
+                     OTBN_ERR_BITS_FATAL_LIFECYCLE_ESCALATION_BIT);
 
 const size_t kOtbnDMemSizeBytes = OTBN_DMEM_SIZE_BYTES;
 const size_t kOtbnIMemSizeBytes = OTBN_IMEM_SIZE_BYTES;
diff --git a/sw/device/silicon_creator/lib/drivers/otbn.h b/sw/device/silicon_creator/lib/drivers/otbn.h
index 48a1ccf..9f3c8db 100644
--- a/sw/device/silicon_creator/lib/drivers/otbn.h
+++ b/sw/device/silicon_creator/lib/drivers/otbn.h
@@ -71,6 +71,8 @@
    * not allowed.
    */
   kOtbnErrBitsFatalIllegalBusAccess = (1 << 8),
+  /** OTBN received a life cycle escalation request from the system */
+  kOtbnErrBitsFatalLifecycleEscalation = (1 << 9),
 } otbn_err_bits_t;
 
 /**