[flash_ctrl] Move macro_err from fatal to recoverable error

fixes #15702

Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.hjson b/hw/ip/flash_ctrl/data/flash_ctrl.hjson
index 4f3aa6b..abdc2f4 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.hjson
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.hjson
@@ -1803,6 +1803,13 @@
               This is an asynchronous error.
             '''
           },
+          { bits: "7",
+            name: "macro_err",
+            desc: '''
+              A recoverable error has been encountered in the flash macro.
+              Please read the flash macro status registers for more details.
+            '''
+          },
         ]
       },
 
@@ -1928,42 +1935,36 @@
             '''
           },
           { bits: "6",
-            name: "flash_macro_err",
-            desc: '''
-              The flash life cycle management interface encountered a native flash macro error.
-            '''
-          },
-          { bits: "7",
             name: "seed_err",
             desc: '''
               The seed reading process encountered an unexpected error.
             '''
           },
-          { bits: "8",
+          { bits: "7",
             name: "phy_relbl_err",
             desc: '''
               The flash macro encountered a storage reliability ECC error.
             '''
           },
-          { bits: "9",
+          { bits: "8",
             name: "phy_storage_err",
             desc: '''
               The flash macro encountered a storage integrity ECC error.
             '''
           },
-          { bits: "10",
+          { bits: "9",
             name: "spurious_ack",
             desc: '''
               The flash emitted an unexpected acknowledgement.
             '''
           },
-          { bits: "11",
+          { bits: "10",
             name: "arb_err",
             desc: '''
               The phy arbiter encountered inconsistent results.
             '''
           },
-          { bits: "12",
+          { bits: "11",
             name: "host_gnt_err",
             desc: '''
               A host transaction was granted with illegal properties.
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl b/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl
index 063aa9e..8854067 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl
@@ -1278,6 +1278,13 @@
               This is an asynchronous error.
             '''
           },
+          { bits: "7",
+            name: "macro_err",
+            desc: '''
+              A recoverable error has been encountered in the flash macro.
+              Please read the flash macro status registers for more details.
+            '''
+          },
         ]
       },
 
@@ -1403,42 +1410,36 @@
             '''
           },
           { bits: "6",
-            name: "flash_macro_err",
-            desc: '''
-              The flash life cycle management interface encountered a native flash macro error.
-            '''
-          },
-          { bits: "7",
             name: "seed_err",
             desc: '''
               The seed reading process encountered an unexpected error.
             '''
           },
-          { bits: "8",
+          { bits: "7",
             name: "phy_relbl_err",
             desc: '''
               The flash macro encountered a storage reliability ECC error.
             '''
           },
-          { bits: "9",
+          { bits: "8",
             name: "phy_storage_err",
             desc: '''
               The flash macro encountered a storage integrity ECC error.
             '''
           },
-          { bits: "10",
+          { bits: "9",
             name: "spurious_ack",
             desc: '''
               The flash emitted an unexpected acknowledgement.
             '''
           },
-          { bits: "11",
+          { bits: "10",
             name: "arb_err",
             desc: '''
               The phy arbiter encountered inconsistent results.
             '''
           },
-          { bits: "12",
+          { bits: "11",
             name: "host_gnt_err",
             desc: '''
               A host transaction was granted with illegal properties.
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl b/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl
index b98527d..44b21dd 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl
@@ -914,6 +914,7 @@
   // An excessive number of recoverable errors may also indicate an attack
   logic recov_err;
   assign recov_err = (sw_ctrl_done & |sw_ctrl_err) |
+                     flash_phy_rsp.macro_err |
                      update_err;
 
   logic fatal_err;
@@ -1037,6 +1038,7 @@
   assign hw2reg.err_code.prog_win_err.d     = 1'b1;
   assign hw2reg.err_code.prog_type_err.d    = 1'b1;
   assign hw2reg.err_code.update_err.d       = 1'b1;
+  assign hw2reg.err_code.macro_err.d        = 1'b1;
   assign hw2reg.err_code.op_err.de          = sw_ctrl_err.invalid_op_err;
   assign hw2reg.err_code.mp_err.de          = sw_ctrl_err.mp_err;
   assign hw2reg.err_code.rd_err.de          = sw_ctrl_err.rd_err;
@@ -1044,6 +1046,7 @@
   assign hw2reg.err_code.prog_win_err.de    = sw_ctrl_err.prog_win_err;
   assign hw2reg.err_code.prog_type_err.de   = sw_ctrl_err.prog_type_err;
   assign hw2reg.err_code.update_err.de      = update_err;
+  assign hw2reg.err_code.macro_err.de       = flash_phy_rsp.macro_err;
   assign hw2reg.err_addr.d                  = {ctrl_err_addr, {BusByteWidth{1'h0}}};
   assign hw2reg.err_addr.de                 = sw_ctrl_err.mp_err |
                                               sw_ctrl_err.rd_err |
@@ -1060,7 +1063,6 @@
   assign hw2reg.fault_status.prog_err.d         = 1'b1;
   assign hw2reg.fault_status.prog_win_err.d     = 1'b1;
   assign hw2reg.fault_status.prog_type_err.d    = 1'b1;
-  assign hw2reg.fault_status.flash_macro_err.d  = 1'b1;
   assign hw2reg.fault_status.seed_err.d         = 1'b1;
   assign hw2reg.fault_status.phy_relbl_err.d    = 1'b1;
   assign hw2reg.fault_status.phy_storage_err.d  = 1'b1;
@@ -1073,7 +1075,6 @@
   assign hw2reg.fault_status.prog_err.de        = hw_err.prog_err;
   assign hw2reg.fault_status.prog_win_err.de    = hw_err.prog_win_err;
   assign hw2reg.fault_status.prog_type_err.de   = hw_err.prog_type_err;
-  assign hw2reg.fault_status.flash_macro_err.de = flash_phy_rsp.macro_err;
   assign hw2reg.fault_status.seed_err.de        = seed_err;
   assign hw2reg.fault_status.phy_relbl_err.de   = flash_phy_rsp.storage_relbl_err;
   assign hw2reg.fault_status.phy_storage_err.de = flash_phy_rsp.storage_intg_err;
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
index 7ea5989..37d86cc 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
@@ -915,6 +915,7 @@
   // An excessive number of recoverable errors may also indicate an attack
   logic recov_err;
   assign recov_err = (sw_ctrl_done & |sw_ctrl_err) |
+                     flash_phy_rsp.macro_err |
                      update_err;
 
   logic fatal_err;
@@ -1038,6 +1039,7 @@
   assign hw2reg.err_code.prog_win_err.d     = 1'b1;
   assign hw2reg.err_code.prog_type_err.d    = 1'b1;
   assign hw2reg.err_code.update_err.d       = 1'b1;
+  assign hw2reg.err_code.macro_err.d        = 1'b1;
   assign hw2reg.err_code.op_err.de          = sw_ctrl_err.invalid_op_err;
   assign hw2reg.err_code.mp_err.de          = sw_ctrl_err.mp_err;
   assign hw2reg.err_code.rd_err.de          = sw_ctrl_err.rd_err;
@@ -1045,6 +1047,7 @@
   assign hw2reg.err_code.prog_win_err.de    = sw_ctrl_err.prog_win_err;
   assign hw2reg.err_code.prog_type_err.de   = sw_ctrl_err.prog_type_err;
   assign hw2reg.err_code.update_err.de      = update_err;
+  assign hw2reg.err_code.macro_err.de       = flash_phy_rsp.macro_err;
   assign hw2reg.err_addr.d                  = {ctrl_err_addr, {BusByteWidth{1'h0}}};
   assign hw2reg.err_addr.de                 = sw_ctrl_err.mp_err |
                                               sw_ctrl_err.rd_err |
@@ -1061,7 +1064,6 @@
   assign hw2reg.fault_status.prog_err.d         = 1'b1;
   assign hw2reg.fault_status.prog_win_err.d     = 1'b1;
   assign hw2reg.fault_status.prog_type_err.d    = 1'b1;
-  assign hw2reg.fault_status.flash_macro_err.d  = 1'b1;
   assign hw2reg.fault_status.seed_err.d         = 1'b1;
   assign hw2reg.fault_status.phy_relbl_err.d    = 1'b1;
   assign hw2reg.fault_status.phy_storage_err.d  = 1'b1;
@@ -1074,7 +1076,6 @@
   assign hw2reg.fault_status.prog_err.de        = hw_err.prog_err;
   assign hw2reg.fault_status.prog_win_err.de    = hw_err.prog_win_err;
   assign hw2reg.fault_status.prog_type_err.de   = hw_err.prog_type_err;
-  assign hw2reg.fault_status.flash_macro_err.de = flash_phy_rsp.macro_err;
   assign hw2reg.fault_status.seed_err.de        = seed_err;
   assign hw2reg.fault_status.phy_relbl_err.de   = flash_phy_rsp.storage_relbl_err;
   assign hw2reg.fault_status.phy_storage_err.de = flash_phy_rsp.storage_intg_err;
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_core_reg_top.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_core_reg_top.sv
index 6e01fc0..20aac72 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_core_reg_top.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_core_reg_top.sv
@@ -965,6 +965,8 @@
   logic err_code_prog_type_err_wd;
   logic err_code_update_err_qs;
   logic err_code_update_err_wd;
+  logic err_code_macro_err_qs;
+  logic err_code_macro_err_wd;
   logic std_fault_status_reg_intg_err_qs;
   logic std_fault_status_prog_intg_err_qs;
   logic std_fault_status_lcmgr_err_qs;
@@ -980,7 +982,6 @@
   logic fault_status_prog_err_qs;
   logic fault_status_prog_win_err_qs;
   logic fault_status_prog_type_err_qs;
-  logic fault_status_flash_macro_err_qs;
   logic fault_status_seed_err_qs;
   logic fault_status_phy_relbl_err_qs;
   logic fault_status_phy_storage_err_qs;
@@ -10373,6 +10374,32 @@
     .qs     (err_code_update_err_qs)
   );
 
+  //   F[macro_err]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_err_code_macro_err (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (err_code_we),
+    .wd     (err_code_macro_err_wd),
+
+    // from internal hardware
+    .de     (hw2reg.err_code.macro_err.de),
+    .d      (hw2reg.err_code.macro_err.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (err_code_macro_err_qs)
+  );
+
 
   // R[std_fault_status]: V(False)
   //   F[reg_intg_err]: 0:0
@@ -10767,33 +10794,7 @@
     .qs     (fault_status_prog_type_err_qs)
   );
 
-  //   F[flash_macro_err]: 6:6
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessRO),
-    .RESVAL  (1'h0)
-  ) u_fault_status_flash_macro_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (1'b0),
-    .wd     ('0),
-
-    // from internal hardware
-    .de     (hw2reg.fault_status.flash_macro_err.de),
-    .d      (hw2reg.fault_status.flash_macro_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.fault_status.flash_macro_err.q),
-    .ds     (),
-
-    // to register interface (read)
-    .qs     (fault_status_flash_macro_err_qs)
-  );
-
-  //   F[seed_err]: 7:7
+  //   F[seed_err]: 6:6
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10819,7 +10820,7 @@
     .qs     (fault_status_seed_err_qs)
   );
 
-  //   F[phy_relbl_err]: 8:8
+  //   F[phy_relbl_err]: 7:7
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10845,7 +10846,7 @@
     .qs     (fault_status_phy_relbl_err_qs)
   );
 
-  //   F[phy_storage_err]: 9:9
+  //   F[phy_storage_err]: 8:8
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10871,7 +10872,7 @@
     .qs     (fault_status_phy_storage_err_qs)
   );
 
-  //   F[spurious_ack]: 10:10
+  //   F[spurious_ack]: 9:9
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10897,7 +10898,7 @@
     .qs     (fault_status_spurious_ack_qs)
   );
 
-  //   F[arb_err]: 11:11
+  //   F[arb_err]: 10:10
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10923,7 +10924,7 @@
     .qs     (fault_status_arb_err_qs)
   );
 
-  //   F[host_gnt_err]: 12:12
+  //   F[host_gnt_err]: 11:11
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -12371,6 +12372,8 @@
   assign err_code_prog_type_err_wd = reg_wdata[5];
 
   assign err_code_update_err_wd = reg_wdata[6];
+
+  assign err_code_macro_err_wd = reg_wdata[7];
   assign ecc_single_err_cnt_we = addr_hit[98] & reg_we & !reg_error;
 
   assign ecc_single_err_cnt_ecc_single_err_cnt_0_wd = reg_wdata[7:0];
@@ -13143,6 +13146,7 @@
         reg_rdata_next[4] = err_code_prog_win_err_qs;
         reg_rdata_next[5] = err_code_prog_type_err_qs;
         reg_rdata_next[6] = err_code_update_err_qs;
+        reg_rdata_next[7] = err_code_macro_err_qs;
       end
 
       addr_hit[95]: begin
@@ -13164,13 +13168,12 @@
         reg_rdata_next[3] = fault_status_prog_err_qs;
         reg_rdata_next[4] = fault_status_prog_win_err_qs;
         reg_rdata_next[5] = fault_status_prog_type_err_qs;
-        reg_rdata_next[6] = fault_status_flash_macro_err_qs;
-        reg_rdata_next[7] = fault_status_seed_err_qs;
-        reg_rdata_next[8] = fault_status_phy_relbl_err_qs;
-        reg_rdata_next[9] = fault_status_phy_storage_err_qs;
-        reg_rdata_next[10] = fault_status_spurious_ack_qs;
-        reg_rdata_next[11] = fault_status_arb_err_qs;
-        reg_rdata_next[12] = fault_status_host_gnt_err_qs;
+        reg_rdata_next[6] = fault_status_seed_err_qs;
+        reg_rdata_next[7] = fault_status_phy_relbl_err_qs;
+        reg_rdata_next[8] = fault_status_phy_storage_err_qs;
+        reg_rdata_next[9] = fault_status_spurious_ack_qs;
+        reg_rdata_next[10] = fault_status_arb_err_qs;
+        reg_rdata_next[11] = fault_status_host_gnt_err_qs;
       end
 
       addr_hit[97]: begin
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
index 85deb10..e463e1e 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
@@ -433,9 +433,6 @@
     } prog_type_err;
     struct packed {
       logic        q;
-    } flash_macro_err;
-    struct packed {
-      logic        q;
     } seed_err;
     struct packed {
       logic        q;
@@ -594,6 +591,10 @@
       logic        d;
       logic        de;
     } update_err;
+    struct packed {
+      logic        d;
+      logic        de;
+    } macro_err;
   } flash_ctrl_hw2reg_err_code_reg_t;
 
   typedef struct packed {
@@ -663,10 +664,6 @@
     struct packed {
       logic        d;
       logic        de;
-    } flash_macro_err;
-    struct packed {
-      logic        d;
-      logic        de;
     } seed_err;
     struct packed {
       logic        d;
@@ -731,29 +728,29 @@
 
   // Register -> HW type for core interface
   typedef struct packed {
-    flash_ctrl_reg2hw_intr_state_reg_t intr_state; // [1326:1321]
-    flash_ctrl_reg2hw_intr_enable_reg_t intr_enable; // [1320:1315]
-    flash_ctrl_reg2hw_intr_test_reg_t intr_test; // [1314:1303]
-    flash_ctrl_reg2hw_alert_test_reg_t alert_test; // [1302:1293]
-    flash_ctrl_reg2hw_dis_reg_t dis; // [1292:1289]
-    flash_ctrl_reg2hw_exec_reg_t exec; // [1288:1257]
-    flash_ctrl_reg2hw_init_reg_t init; // [1256:1256]
-    flash_ctrl_reg2hw_control_reg_t control; // [1255:1236]
-    flash_ctrl_reg2hw_addr_reg_t addr; // [1235:1216]
-    flash_ctrl_reg2hw_prog_type_en_reg_t prog_type_en; // [1215:1214]
-    flash_ctrl_reg2hw_erase_suspend_reg_t erase_suspend; // [1213:1213]
-    flash_ctrl_reg2hw_mp_region_cfg_mreg_t [7:0] mp_region_cfg; // [1212:989]
-    flash_ctrl_reg2hw_mp_region_mreg_t [7:0] mp_region; // [988:837]
-    flash_ctrl_reg2hw_default_region_reg_t default_region; // [836:813]
-    flash_ctrl_reg2hw_bank0_info0_page_cfg_mreg_t [9:0] bank0_info0_page_cfg; // [812:533]
-    flash_ctrl_reg2hw_bank0_info1_page_cfg_mreg_t [0:0] bank0_info1_page_cfg; // [532:505]
-    flash_ctrl_reg2hw_bank0_info2_page_cfg_mreg_t [1:0] bank0_info2_page_cfg; // [504:449]
-    flash_ctrl_reg2hw_bank1_info0_page_cfg_mreg_t [9:0] bank1_info0_page_cfg; // [448:169]
-    flash_ctrl_reg2hw_bank1_info1_page_cfg_mreg_t [0:0] bank1_info1_page_cfg; // [168:141]
-    flash_ctrl_reg2hw_bank1_info2_page_cfg_mreg_t [1:0] bank1_info2_page_cfg; // [140:85]
-    flash_ctrl_reg2hw_mp_bank_cfg_shadowed_mreg_t [1:0] mp_bank_cfg_shadowed; // [84:83]
-    flash_ctrl_reg2hw_std_fault_status_reg_t std_fault_status; // [82:74]
-    flash_ctrl_reg2hw_fault_status_reg_t fault_status; // [73:61]
+    flash_ctrl_reg2hw_intr_state_reg_t intr_state; // [1325:1320]
+    flash_ctrl_reg2hw_intr_enable_reg_t intr_enable; // [1319:1314]
+    flash_ctrl_reg2hw_intr_test_reg_t intr_test; // [1313:1302]
+    flash_ctrl_reg2hw_alert_test_reg_t alert_test; // [1301:1292]
+    flash_ctrl_reg2hw_dis_reg_t dis; // [1291:1288]
+    flash_ctrl_reg2hw_exec_reg_t exec; // [1287:1256]
+    flash_ctrl_reg2hw_init_reg_t init; // [1255:1255]
+    flash_ctrl_reg2hw_control_reg_t control; // [1254:1235]
+    flash_ctrl_reg2hw_addr_reg_t addr; // [1234:1215]
+    flash_ctrl_reg2hw_prog_type_en_reg_t prog_type_en; // [1214:1213]
+    flash_ctrl_reg2hw_erase_suspend_reg_t erase_suspend; // [1212:1212]
+    flash_ctrl_reg2hw_mp_region_cfg_mreg_t [7:0] mp_region_cfg; // [1211:988]
+    flash_ctrl_reg2hw_mp_region_mreg_t [7:0] mp_region; // [987:836]
+    flash_ctrl_reg2hw_default_region_reg_t default_region; // [835:812]
+    flash_ctrl_reg2hw_bank0_info0_page_cfg_mreg_t [9:0] bank0_info0_page_cfg; // [811:532]
+    flash_ctrl_reg2hw_bank0_info1_page_cfg_mreg_t [0:0] bank0_info1_page_cfg; // [531:504]
+    flash_ctrl_reg2hw_bank0_info2_page_cfg_mreg_t [1:0] bank0_info2_page_cfg; // [503:448]
+    flash_ctrl_reg2hw_bank1_info0_page_cfg_mreg_t [9:0] bank1_info0_page_cfg; // [447:168]
+    flash_ctrl_reg2hw_bank1_info1_page_cfg_mreg_t [0:0] bank1_info1_page_cfg; // [167:140]
+    flash_ctrl_reg2hw_bank1_info2_page_cfg_mreg_t [1:0] bank1_info2_page_cfg; // [139:84]
+    flash_ctrl_reg2hw_mp_bank_cfg_shadowed_mreg_t [1:0] mp_bank_cfg_shadowed; // [83:82]
+    flash_ctrl_reg2hw_std_fault_status_reg_t std_fault_status; // [81:73]
+    flash_ctrl_reg2hw_fault_status_reg_t fault_status; // [72:61]
     flash_ctrl_reg2hw_ecc_single_err_cnt_mreg_t [1:0] ecc_single_err_cnt; // [60:45]
     flash_ctrl_reg2hw_phy_alert_cfg_reg_t phy_alert_cfg; // [44:43]
     flash_ctrl_reg2hw_scratch_reg_t scratch; // [42:11]
@@ -770,9 +767,9 @@
     flash_ctrl_hw2reg_op_status_reg_t op_status; // [179:176]
     flash_ctrl_hw2reg_status_reg_t status; // [175:166]
     flash_ctrl_hw2reg_debug_state_reg_t debug_state; // [165:155]
-    flash_ctrl_hw2reg_err_code_reg_t err_code; // [154:141]
-    flash_ctrl_hw2reg_std_fault_status_reg_t std_fault_status; // [140:123]
-    flash_ctrl_hw2reg_fault_status_reg_t fault_status; // [122:97]
+    flash_ctrl_hw2reg_err_code_reg_t err_code; // [154:139]
+    flash_ctrl_hw2reg_std_fault_status_reg_t std_fault_status; // [138:121]
+    flash_ctrl_hw2reg_fault_status_reg_t fault_status; // [120:97]
     flash_ctrl_hw2reg_err_addr_reg_t err_addr; // [96:76]
     flash_ctrl_hw2reg_ecc_single_err_cnt_mreg_t [1:0] ecc_single_err_cnt; // [75:58]
     flash_ctrl_hw2reg_ecc_single_err_addr_mreg_t [1:0] ecc_single_err_addr; // [57:16]
diff --git a/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson b/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson
index fc7c986..d970dd7 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson
+++ b/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson
@@ -1809,6 +1809,13 @@
               This is an asynchronous error.
             '''
           },
+          { bits: "7",
+            name: "macro_err",
+            desc: '''
+              A recoverable error has been encountered in the flash macro.
+              Please read the flash macro status registers for more details.
+            '''
+          },
         ]
       },
 
@@ -1934,42 +1941,36 @@
             '''
           },
           { bits: "6",
-            name: "flash_macro_err",
-            desc: '''
-              The flash life cycle management interface encountered a native flash macro error.
-            '''
-          },
-          { bits: "7",
             name: "seed_err",
             desc: '''
               The seed reading process encountered an unexpected error.
             '''
           },
-          { bits: "8",
+          { bits: "7",
             name: "phy_relbl_err",
             desc: '''
               The flash macro encountered a storage reliability ECC error.
             '''
           },
-          { bits: "9",
+          { bits: "8",
             name: "phy_storage_err",
             desc: '''
               The flash macro encountered a storage integrity ECC error.
             '''
           },
-          { bits: "10",
+          { bits: "9",
             name: "spurious_ack",
             desc: '''
               The flash emitted an unexpected acknowledgement.
             '''
           },
-          { bits: "11",
+          { bits: "10",
             name: "arb_err",
             desc: '''
               The phy arbiter encountered inconsistent results.
             '''
           },
-          { bits: "12",
+          { bits: "11",
             name: "host_gnt_err",
             desc: '''
               A host transaction was granted with illegal properties.
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv
index 34bf2df..1e5c205 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv
@@ -921,6 +921,7 @@
   // An excessive number of recoverable errors may also indicate an attack
   logic recov_err;
   assign recov_err = (sw_ctrl_done & |sw_ctrl_err) |
+                     flash_phy_rsp.macro_err |
                      update_err;
 
   logic fatal_err;
@@ -1044,6 +1045,7 @@
   assign hw2reg.err_code.prog_win_err.d     = 1'b1;
   assign hw2reg.err_code.prog_type_err.d    = 1'b1;
   assign hw2reg.err_code.update_err.d       = 1'b1;
+  assign hw2reg.err_code.macro_err.d        = 1'b1;
   assign hw2reg.err_code.op_err.de          = sw_ctrl_err.invalid_op_err;
   assign hw2reg.err_code.mp_err.de          = sw_ctrl_err.mp_err;
   assign hw2reg.err_code.rd_err.de          = sw_ctrl_err.rd_err;
@@ -1051,6 +1053,7 @@
   assign hw2reg.err_code.prog_win_err.de    = sw_ctrl_err.prog_win_err;
   assign hw2reg.err_code.prog_type_err.de   = sw_ctrl_err.prog_type_err;
   assign hw2reg.err_code.update_err.de      = update_err;
+  assign hw2reg.err_code.macro_err.de       = flash_phy_rsp.macro_err;
   assign hw2reg.err_addr.d                  = {ctrl_err_addr, {BusByteWidth{1'h0}}};
   assign hw2reg.err_addr.de                 = sw_ctrl_err.mp_err |
                                               sw_ctrl_err.rd_err |
@@ -1067,7 +1070,6 @@
   assign hw2reg.fault_status.prog_err.d         = 1'b1;
   assign hw2reg.fault_status.prog_win_err.d     = 1'b1;
   assign hw2reg.fault_status.prog_type_err.d    = 1'b1;
-  assign hw2reg.fault_status.flash_macro_err.d  = 1'b1;
   assign hw2reg.fault_status.seed_err.d         = 1'b1;
   assign hw2reg.fault_status.phy_relbl_err.d    = 1'b1;
   assign hw2reg.fault_status.phy_storage_err.d  = 1'b1;
@@ -1080,7 +1082,6 @@
   assign hw2reg.fault_status.prog_err.de        = hw_err.prog_err;
   assign hw2reg.fault_status.prog_win_err.de    = hw_err.prog_win_err;
   assign hw2reg.fault_status.prog_type_err.de   = hw_err.prog_type_err;
-  assign hw2reg.fault_status.flash_macro_err.de = flash_phy_rsp.macro_err;
   assign hw2reg.fault_status.seed_err.de        = seed_err;
   assign hw2reg.fault_status.phy_relbl_err.de   = flash_phy_rsp.storage_relbl_err;
   assign hw2reg.fault_status.phy_storage_err.de = flash_phy_rsp.storage_intg_err;
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_core_reg_top.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_core_reg_top.sv
index 6e01fc0..20aac72 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_core_reg_top.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_core_reg_top.sv
@@ -965,6 +965,8 @@
   logic err_code_prog_type_err_wd;
   logic err_code_update_err_qs;
   logic err_code_update_err_wd;
+  logic err_code_macro_err_qs;
+  logic err_code_macro_err_wd;
   logic std_fault_status_reg_intg_err_qs;
   logic std_fault_status_prog_intg_err_qs;
   logic std_fault_status_lcmgr_err_qs;
@@ -980,7 +982,6 @@
   logic fault_status_prog_err_qs;
   logic fault_status_prog_win_err_qs;
   logic fault_status_prog_type_err_qs;
-  logic fault_status_flash_macro_err_qs;
   logic fault_status_seed_err_qs;
   logic fault_status_phy_relbl_err_qs;
   logic fault_status_phy_storage_err_qs;
@@ -10373,6 +10374,32 @@
     .qs     (err_code_update_err_qs)
   );
 
+  //   F[macro_err]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_err_code_macro_err (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (err_code_we),
+    .wd     (err_code_macro_err_wd),
+
+    // from internal hardware
+    .de     (hw2reg.err_code.macro_err.de),
+    .d      (hw2reg.err_code.macro_err.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (err_code_macro_err_qs)
+  );
+
 
   // R[std_fault_status]: V(False)
   //   F[reg_intg_err]: 0:0
@@ -10767,33 +10794,7 @@
     .qs     (fault_status_prog_type_err_qs)
   );
 
-  //   F[flash_macro_err]: 6:6
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessRO),
-    .RESVAL  (1'h0)
-  ) u_fault_status_flash_macro_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (1'b0),
-    .wd     ('0),
-
-    // from internal hardware
-    .de     (hw2reg.fault_status.flash_macro_err.de),
-    .d      (hw2reg.fault_status.flash_macro_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.fault_status.flash_macro_err.q),
-    .ds     (),
-
-    // to register interface (read)
-    .qs     (fault_status_flash_macro_err_qs)
-  );
-
-  //   F[seed_err]: 7:7
+  //   F[seed_err]: 6:6
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10819,7 +10820,7 @@
     .qs     (fault_status_seed_err_qs)
   );
 
-  //   F[phy_relbl_err]: 8:8
+  //   F[phy_relbl_err]: 7:7
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10845,7 +10846,7 @@
     .qs     (fault_status_phy_relbl_err_qs)
   );
 
-  //   F[phy_storage_err]: 9:9
+  //   F[phy_storage_err]: 8:8
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10871,7 +10872,7 @@
     .qs     (fault_status_phy_storage_err_qs)
   );
 
-  //   F[spurious_ack]: 10:10
+  //   F[spurious_ack]: 9:9
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10897,7 +10898,7 @@
     .qs     (fault_status_spurious_ack_qs)
   );
 
-  //   F[arb_err]: 11:11
+  //   F[arb_err]: 10:10
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -10923,7 +10924,7 @@
     .qs     (fault_status_arb_err_qs)
   );
 
-  //   F[host_gnt_err]: 12:12
+  //   F[host_gnt_err]: 11:11
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
@@ -12371,6 +12372,8 @@
   assign err_code_prog_type_err_wd = reg_wdata[5];
 
   assign err_code_update_err_wd = reg_wdata[6];
+
+  assign err_code_macro_err_wd = reg_wdata[7];
   assign ecc_single_err_cnt_we = addr_hit[98] & reg_we & !reg_error;
 
   assign ecc_single_err_cnt_ecc_single_err_cnt_0_wd = reg_wdata[7:0];
@@ -13143,6 +13146,7 @@
         reg_rdata_next[4] = err_code_prog_win_err_qs;
         reg_rdata_next[5] = err_code_prog_type_err_qs;
         reg_rdata_next[6] = err_code_update_err_qs;
+        reg_rdata_next[7] = err_code_macro_err_qs;
       end
 
       addr_hit[95]: begin
@@ -13164,13 +13168,12 @@
         reg_rdata_next[3] = fault_status_prog_err_qs;
         reg_rdata_next[4] = fault_status_prog_win_err_qs;
         reg_rdata_next[5] = fault_status_prog_type_err_qs;
-        reg_rdata_next[6] = fault_status_flash_macro_err_qs;
-        reg_rdata_next[7] = fault_status_seed_err_qs;
-        reg_rdata_next[8] = fault_status_phy_relbl_err_qs;
-        reg_rdata_next[9] = fault_status_phy_storage_err_qs;
-        reg_rdata_next[10] = fault_status_spurious_ack_qs;
-        reg_rdata_next[11] = fault_status_arb_err_qs;
-        reg_rdata_next[12] = fault_status_host_gnt_err_qs;
+        reg_rdata_next[6] = fault_status_seed_err_qs;
+        reg_rdata_next[7] = fault_status_phy_relbl_err_qs;
+        reg_rdata_next[8] = fault_status_phy_storage_err_qs;
+        reg_rdata_next[9] = fault_status_spurious_ack_qs;
+        reg_rdata_next[10] = fault_status_arb_err_qs;
+        reg_rdata_next[11] = fault_status_host_gnt_err_qs;
       end
 
       addr_hit[97]: begin
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv
index 85deb10..e463e1e 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv
@@ -433,9 +433,6 @@
     } prog_type_err;
     struct packed {
       logic        q;
-    } flash_macro_err;
-    struct packed {
-      logic        q;
     } seed_err;
     struct packed {
       logic        q;
@@ -594,6 +591,10 @@
       logic        d;
       logic        de;
     } update_err;
+    struct packed {
+      logic        d;
+      logic        de;
+    } macro_err;
   } flash_ctrl_hw2reg_err_code_reg_t;
 
   typedef struct packed {
@@ -663,10 +664,6 @@
     struct packed {
       logic        d;
       logic        de;
-    } flash_macro_err;
-    struct packed {
-      logic        d;
-      logic        de;
     } seed_err;
     struct packed {
       logic        d;
@@ -731,29 +728,29 @@
 
   // Register -> HW type for core interface
   typedef struct packed {
-    flash_ctrl_reg2hw_intr_state_reg_t intr_state; // [1326:1321]
-    flash_ctrl_reg2hw_intr_enable_reg_t intr_enable; // [1320:1315]
-    flash_ctrl_reg2hw_intr_test_reg_t intr_test; // [1314:1303]
-    flash_ctrl_reg2hw_alert_test_reg_t alert_test; // [1302:1293]
-    flash_ctrl_reg2hw_dis_reg_t dis; // [1292:1289]
-    flash_ctrl_reg2hw_exec_reg_t exec; // [1288:1257]
-    flash_ctrl_reg2hw_init_reg_t init; // [1256:1256]
-    flash_ctrl_reg2hw_control_reg_t control; // [1255:1236]
-    flash_ctrl_reg2hw_addr_reg_t addr; // [1235:1216]
-    flash_ctrl_reg2hw_prog_type_en_reg_t prog_type_en; // [1215:1214]
-    flash_ctrl_reg2hw_erase_suspend_reg_t erase_suspend; // [1213:1213]
-    flash_ctrl_reg2hw_mp_region_cfg_mreg_t [7:0] mp_region_cfg; // [1212:989]
-    flash_ctrl_reg2hw_mp_region_mreg_t [7:0] mp_region; // [988:837]
-    flash_ctrl_reg2hw_default_region_reg_t default_region; // [836:813]
-    flash_ctrl_reg2hw_bank0_info0_page_cfg_mreg_t [9:0] bank0_info0_page_cfg; // [812:533]
-    flash_ctrl_reg2hw_bank0_info1_page_cfg_mreg_t [0:0] bank0_info1_page_cfg; // [532:505]
-    flash_ctrl_reg2hw_bank0_info2_page_cfg_mreg_t [1:0] bank0_info2_page_cfg; // [504:449]
-    flash_ctrl_reg2hw_bank1_info0_page_cfg_mreg_t [9:0] bank1_info0_page_cfg; // [448:169]
-    flash_ctrl_reg2hw_bank1_info1_page_cfg_mreg_t [0:0] bank1_info1_page_cfg; // [168:141]
-    flash_ctrl_reg2hw_bank1_info2_page_cfg_mreg_t [1:0] bank1_info2_page_cfg; // [140:85]
-    flash_ctrl_reg2hw_mp_bank_cfg_shadowed_mreg_t [1:0] mp_bank_cfg_shadowed; // [84:83]
-    flash_ctrl_reg2hw_std_fault_status_reg_t std_fault_status; // [82:74]
-    flash_ctrl_reg2hw_fault_status_reg_t fault_status; // [73:61]
+    flash_ctrl_reg2hw_intr_state_reg_t intr_state; // [1325:1320]
+    flash_ctrl_reg2hw_intr_enable_reg_t intr_enable; // [1319:1314]
+    flash_ctrl_reg2hw_intr_test_reg_t intr_test; // [1313:1302]
+    flash_ctrl_reg2hw_alert_test_reg_t alert_test; // [1301:1292]
+    flash_ctrl_reg2hw_dis_reg_t dis; // [1291:1288]
+    flash_ctrl_reg2hw_exec_reg_t exec; // [1287:1256]
+    flash_ctrl_reg2hw_init_reg_t init; // [1255:1255]
+    flash_ctrl_reg2hw_control_reg_t control; // [1254:1235]
+    flash_ctrl_reg2hw_addr_reg_t addr; // [1234:1215]
+    flash_ctrl_reg2hw_prog_type_en_reg_t prog_type_en; // [1214:1213]
+    flash_ctrl_reg2hw_erase_suspend_reg_t erase_suspend; // [1212:1212]
+    flash_ctrl_reg2hw_mp_region_cfg_mreg_t [7:0] mp_region_cfg; // [1211:988]
+    flash_ctrl_reg2hw_mp_region_mreg_t [7:0] mp_region; // [987:836]
+    flash_ctrl_reg2hw_default_region_reg_t default_region; // [835:812]
+    flash_ctrl_reg2hw_bank0_info0_page_cfg_mreg_t [9:0] bank0_info0_page_cfg; // [811:532]
+    flash_ctrl_reg2hw_bank0_info1_page_cfg_mreg_t [0:0] bank0_info1_page_cfg; // [531:504]
+    flash_ctrl_reg2hw_bank0_info2_page_cfg_mreg_t [1:0] bank0_info2_page_cfg; // [503:448]
+    flash_ctrl_reg2hw_bank1_info0_page_cfg_mreg_t [9:0] bank1_info0_page_cfg; // [447:168]
+    flash_ctrl_reg2hw_bank1_info1_page_cfg_mreg_t [0:0] bank1_info1_page_cfg; // [167:140]
+    flash_ctrl_reg2hw_bank1_info2_page_cfg_mreg_t [1:0] bank1_info2_page_cfg; // [139:84]
+    flash_ctrl_reg2hw_mp_bank_cfg_shadowed_mreg_t [1:0] mp_bank_cfg_shadowed; // [83:82]
+    flash_ctrl_reg2hw_std_fault_status_reg_t std_fault_status; // [81:73]
+    flash_ctrl_reg2hw_fault_status_reg_t fault_status; // [72:61]
     flash_ctrl_reg2hw_ecc_single_err_cnt_mreg_t [1:0] ecc_single_err_cnt; // [60:45]
     flash_ctrl_reg2hw_phy_alert_cfg_reg_t phy_alert_cfg; // [44:43]
     flash_ctrl_reg2hw_scratch_reg_t scratch; // [42:11]
@@ -770,9 +767,9 @@
     flash_ctrl_hw2reg_op_status_reg_t op_status; // [179:176]
     flash_ctrl_hw2reg_status_reg_t status; // [175:166]
     flash_ctrl_hw2reg_debug_state_reg_t debug_state; // [165:155]
-    flash_ctrl_hw2reg_err_code_reg_t err_code; // [154:141]
-    flash_ctrl_hw2reg_std_fault_status_reg_t std_fault_status; // [140:123]
-    flash_ctrl_hw2reg_fault_status_reg_t fault_status; // [122:97]
+    flash_ctrl_hw2reg_err_code_reg_t err_code; // [154:139]
+    flash_ctrl_hw2reg_std_fault_status_reg_t std_fault_status; // [138:121]
+    flash_ctrl_hw2reg_fault_status_reg_t fault_status; // [120:97]
     flash_ctrl_hw2reg_err_addr_reg_t err_addr; // [96:76]
     flash_ctrl_hw2reg_ecc_single_err_cnt_mreg_t [1:0] ecc_single_err_cnt; // [75:58]
     flash_ctrl_hw2reg_ecc_single_err_addr_mreg_t [1:0] ecc_single_err_addr; // [57:16]