From 6d77d9deb2457b4aea0bc59e7e2c0826f79cd1b9 Mon Sep 17 00:00:00 2001 From: Karol Gugala Date: Thu, 9 Jan 2025 22:03:33 +0100 Subject: [PATCH] recovery: clear tx_desc on recovery mode enter --- src/ctrl/controller.sv | 6 ++++-- src/ctrl/controller_standby.sv | 6 ++++-- src/ctrl/controller_standby_i3c.sv | 8 ++++++-- src/ctrl/descriptor_tx.sv | 11 +++++++++-- src/i3c.sv | 8 ++++++-- src/recovery/recovery_handler.sv | 14 +++++++++++++- 6 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/ctrl/controller.sv b/src/ctrl/controller.sv index 9094416f..e4be7b54 100644 --- a/src/ctrl/controller.sv +++ b/src/ctrl/controller.sv @@ -234,7 +234,8 @@ module controller input logic peripheral_reset_done_i, output logic escalated_reset_o, - output logic err_o + output logic err_o, + input recovery_mode_enter_i ); logic phy_en; @@ -515,7 +516,8 @@ module controller .mrl_o(mrl), .peripheral_reset_o, .peripheral_reset_done_i, - .escalated_reset_o + .escalated_reset_o, + .recovery_mode_enter_i(recovery_mode_enter_i) ); endmodule diff --git a/src/ctrl/controller_standby.sv b/src/ctrl/controller_standby.sv index ff62b5fa..4b3caf11 100644 --- a/src/ctrl/controller_standby.sv +++ b/src/ctrl/controller_standby.sv @@ -163,7 +163,8 @@ module controller_standby input logic peripheral_reset_done_i, output logic escalated_reset_o, - output logic err_o + output logic err_o, + input recovery_mode_enter_i ); logic sel_i2c_i3c; // i2c = 0; i3c = 1; @@ -408,7 +409,8 @@ module controller_standby .parity_err_o(parity_err), .peripheral_reset_o, .peripheral_reset_done_i, - .escalated_reset_o + .escalated_reset_o, + .recovery_mode_enter_i(recovery_mode_enter_i) ); endmodule diff --git a/src/ctrl/controller_standby_i3c.sv b/src/ctrl/controller_standby_i3c.sv index 9653a017..afa288a8 100644 --- a/src/ctrl/controller_standby_i3c.sv +++ b/src/ctrl/controller_standby_i3c.sv @@ -120,7 +120,10 @@ module controller_standby_i3c output logic peripheral_reset_o, input logic peripheral_reset_done_i, - output logic escalated_reset_o + output logic escalated_reset_o, + + // recovery mode + input recovery_mode_enter_i ); logic i3c_standby_en; assign i3c_standby_en = i3c_standby_en_i; @@ -674,7 +677,8 @@ module controller_standby_i3c .tx_byte_last_o (tx_last_byte), .tx_byte_valid_o (tx_fifo_rvalid), .tx_byte_ready_i (tx_fifo_rready), - .tx_byte_err_i (tx_host_nack) + .tx_byte_err_i (tx_host_nack), + .recovery_mode_enter_i (recovery_mode_enter_i) ); descriptor_ibi #( diff --git a/src/ctrl/descriptor_tx.sv b/src/ctrl/descriptor_tx.sv index 4c401d2e..3b4d56e6 100644 --- a/src/ctrl/descriptor_tx.sv +++ b/src/ctrl/descriptor_tx.sv @@ -36,7 +36,10 @@ module descriptor_tx #( output logic tx_byte_last_o, output logic tx_byte_valid_o, input logic tx_byte_ready_i, - input logic tx_byte_err_i + input logic tx_byte_err_i, + + // recovery mode + input recovery_mode_enter_i ); logic [31:0] tx_descriptor; @@ -56,10 +59,14 @@ module descriptor_tx #( tx_descriptor <= '0; end else begin if (tx_end) descriptor_valid <= '0; - else if (tti_tx_desc_queue_rready_o) begin + else if (tti_tx_desc_queue_rready_o && !recovery_mode_enter_i) begin tx_descriptor <= tti_tx_desc_queue_rdata_i; descriptor_valid <= '1; end + else if (recovery_mode_enter_i) begin + descriptor_valid <= '0; + tx_descriptor <= '0; + end end end diff --git a/src/i3c.sv b/src/i3c.sv index c8ae3c64..c0cdc421 100644 --- a/src/i3c.sv +++ b/src/i3c.sv @@ -496,6 +496,8 @@ module i3c logic controller_error; + logic recovery_mode_enter; + controller #( .DatAw(DatAw), .DctAw(DctAw) @@ -672,7 +674,8 @@ module i3c .peripheral_reset_done_i, .escalated_reset_o, - .err_o(controller_error) + .err_o(controller_error), + .recovery_mode_enter_i(recovery_mode_enter) ); // HCI @@ -1062,7 +1065,8 @@ module i3c // Received I2C/I3C address along with RnW# bit .ctl_bus_addr_i(rx_bus_addr), - .ctl_bus_addr_valid_i(rx_bus_addr_valid) + .ctl_bus_addr_valid_i(rx_bus_addr_valid), + .recovery_mode_enter_o(recovery_mode_enter) ); // I3C PHY diff --git a/src/recovery/recovery_handler.sv b/src/recovery/recovery_handler.sv index cea18495..84c6da5f 100644 --- a/src/recovery/recovery_handler.sv +++ b/src/recovery/recovery_handler.sv @@ -171,17 +171,29 @@ module recovery_handler // Recovery status output logic payload_available_o, - output logic image_activated_o + output logic image_activated_o, + output logic recovery_mode_enter_o ); assign irq_o = '0; // .................................................... logic recovery_enable; + logic [1:0] recovery_mode_enter_shreg; localparam int unsigned RecoveryMode = 'h3; assign recovery_enable = hwif_rec_i.DEVICE_STATUS_0.PLACEHOLDER.value[7:0] == RecoveryMode; + // generate recovery enter pulse + assign recovery_mode_enter_o = recovery_mode_enter_shreg[0]; + always @(posedge clk_i or negedge rst_ni) + if (~rst_ni) begin + recovery_mode_enter_shreg <= 2'b10; + end else if (recovery_enable) begin + recovery_mode_enter_shreg <= {1'b0, recovery_mode_enter_shreg[1]}; + end else begin + recovery_mode_enter_shreg <= 2'b10; + end // .................................................... // TTI Queues