Skip to content

Commit 17e2011

Browse files
mkurc-antkgugala
authored andcommitted
Make recovery mode enable/disable dependent entirely on target address of a transfer
Internal-tag: [#72196] Signed-off-by: Maciej Kurc <[email protected]>
1 parent be566ad commit 17e2011

File tree

10 files changed

+118
-112
lines changed

10 files changed

+118
-112
lines changed

src/ctrl/controller.sv

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,9 @@ module controller
239239

240240
output logic err_o,
241241
input logic recovery_mode_enter_i,
242-
output logic virtual_device_tx_o,
243-
input logic virtual_device_tx_done_i
242+
output logic virtual_device_sel_o,
243+
input logic virtual_device_rdy_i,
244+
output logic xfer_in_progress_o
244245
);
245246

246247
logic phy_en;
@@ -565,9 +566,9 @@ module controller
565566
.peripheral_reset_done_i,
566567
.escalated_reset_o,
567568
.recovery_mode_enter_i(recovery_mode_enter_i),
568-
.virtual_device_tx_o(virtual_device_tx_o),
569-
.virtual_device_tx_done_i(virtual_device_tx_done_i),
570-
.recovery_mode_i(recovery_mode)
569+
.virtual_device_sel_o(virtual_device_sel_o),
570+
.virtual_device_rdy_i(virtual_device_rdy_i),
571+
.xfer_in_progress_o(xfer_in_progress_o)
571572
);
572573

573574
endmodule

src/ctrl/controller_standby.sv

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,9 @@ module controller_standby
170170

171171
output logic err_o,
172172
input logic recovery_mode_enter_i,
173-
output logic virtual_device_tx_o,
174-
input logic virtual_device_tx_done_i,
175-
input logic recovery_mode_i
173+
output logic virtual_device_sel_o,
174+
input logic virtual_device_rdy_i,
175+
output logic xfer_in_progress_o
176176
);
177177

178178
logic sel_i2c_i3c; // i2c = 0; i3c = 1;
@@ -421,9 +421,9 @@ module controller_standby
421421
.peripheral_reset_done_i,
422422
.escalated_reset_o,
423423
.recovery_mode_enter_i(recovery_mode_enter_i),
424-
.virtual_device_tx_o(virtual_device_tx_o),
425-
.virtual_device_tx_done_i(virtual_device_tx_done_i),
426-
.recovery_mode_i(recovery_mode_i)
424+
.virtual_device_sel_o(virtual_device_sel_o),
425+
.virtual_device_rdy_i(virtual_device_rdy_i),
426+
.xfer_in_progress_o(xfer_in_progress_o)
427427
);
428428

429429
always_comb begin

src/ctrl/controller_standby_i3c.sv

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ module controller_standby_i3c
125125

126126
// recovery mode
127127
input logic recovery_mode_enter_i,
128-
output logic virtual_device_tx_o,
129-
input logic virtual_device_tx_done_i,
130-
input logic recovery_mode_i
128+
output logic virtual_device_sel_o,
129+
input logic virtual_device_rdy_i,
130+
output logic xfer_in_progress_o
131131
);
132132
logic i3c_standby_en;
133133
assign i3c_standby_en = i3c_standby_en_i;
@@ -456,9 +456,9 @@ module controller_standby_i3c
456456
.sda_posedge_i (ctrl_bus_i.sda.pos_edge),
457457
.parity_err_o,
458458
.rx_overflow_err_o (rx_overflow_err),
459-
.virtual_device_tx_o (virtual_device_tx_o),
460-
.virtual_device_tx_done_i (virtual_device_tx_done_i),
461-
.recovery_mode_i (recovery_mode_i)
459+
.virtual_device_sel_o (virtual_device_sel_o),
460+
.virtual_device_rdy_i (virtual_device_rdy_i),
461+
.xfer_in_progress_o (xfer_in_progress_o)
462462
);
463463

464464
ccc xccc (

src/ctrl/i3c_target_fsm.sv

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@ module i3c_target_fsm #(
122122

123123
output logic parity_err_o,
124124
output logic rx_overflow_err_o,
125-
output logic virtual_device_tx_o,
126-
input logic virtual_device_tx_done_i,
127-
input logic recovery_mode_i,
125+
output logic virtual_device_sel_o,
126+
input logic virtual_device_rdy_i,
127+
output logic xfer_in_progress_o,
128128

129129
output logic tx_pr_start_o,
130130
output logic tx_pr_abort_o
@@ -235,13 +235,15 @@ module i3c_target_fsm #(
235235
logic bus_rnw_d, bus_rnw_q;
236236
logic [6:0] bus_addr_d, bus_addr_q;
237237
logic is_our_addr_match, is_rsvd_byte_match, is_virtual_addr_match;
238-
assign is_our_addr_match = recovery_mode_i ? 1'b0 :
239-
target_dyn_address_valid_i ? (target_dyn_address_i == bus_addr_q) :
238+
239+
assign is_our_addr_match = target_dyn_address_valid_i ? (target_dyn_address_i == bus_addr_q) :
240240
target_sta_address_valid_i ? (target_sta_address_i == bus_addr_q) :
241241
1'b0;
242+
242243
assign is_virtual_addr_match = virtual_target_dyn_address_valid_i ? (virtual_target_dyn_address_i == bus_addr_q) :
243-
virtual_target_sta_address_valid_i ? (virtual_target_sta_address_i == bus_addr_q) :
244-
1'b0;
244+
virtual_target_sta_address_valid_i ? (virtual_target_sta_address_i == bus_addr_q) :
245+
1'b0;
246+
245247
assign is_rsvd_byte_match = ({bus_addr_q, bus_rnw_q} == 8'hFC);
246248

247249
always_ff @(posedge clk_i or negedge rst_ni) begin : update_bus_addr_matcher
@@ -580,15 +582,36 @@ module i3c_target_fsm #(
580582

581583
assign target_idle_o = (state_q == Idle);
582584

583-
always_ff @(posedge clk_i or negedge rst_ni) begin : virtual_device_tx_latch
585+
always_ff @(posedge clk_i or negedge rst_ni) begin : virtual_device_sel_latch
584586
if (!rst_ni) begin
585-
virtual_device_tx_o <= 1'b0;
586-
end else begin
587-
if ((state_q == TxAckSByte) && is_virtual_addr_match) begin
588-
virtual_device_tx_o <= 1'b1;
589-
end else if (state_q == Idle) virtual_device_tx_o <= 1'b0;
590-
end
587+
virtual_device_sel_o <= '0;
588+
end else unique case(state_q)
589+
CheckFByte:
590+
if (!is_rsvd_byte_match && virtual_device_sel_o != is_virtual_addr_match)
591+
virtual_device_sel_o <= is_virtual_addr_match;
592+
CheckSByte:
593+
if (!is_rsvd_byte_match && virtual_device_sel_o != is_virtual_addr_match)
594+
virtual_device_sel_o <= is_virtual_addr_match;
595+
default:
596+
virtual_device_sel_o <= virtual_device_sel_o;
597+
endcase
591598
end
599+
600+
always_ff @(posedge clk_i or negedge rst_ni) begin
601+
if (!rst_ni) begin
602+
xfer_in_progress_o <= '0;
603+
end else unique case(state_q)
604+
Idle:
605+
xfer_in_progress_o <= '0;
606+
CheckFByte:
607+
xfer_in_progress_o <= (is_our_addr_match || is_virtual_addr_match);
608+
CheckSByte:
609+
xfer_in_progress_o <= (is_our_addr_match || is_virtual_addr_match);
610+
default:
611+
xfer_in_progress_o <= xfer_in_progress_o;
612+
endcase
613+
end
614+
592615
// TODO: Also sub FSM should contribute
593616
// TODO: Maybe we can do it based on write module rather than states
594617
assign target_transmitting_o =

src/i3c.sv

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -506,8 +506,9 @@ module i3c
506506

507507
logic recovery_mode_enter;
508508
logic recovery_mode_enabled;
509-
logic virtual_device_tx;
510-
logic virtual_device_tx_done;
509+
logic virtual_device_sel;
510+
logic virtual_device_rdy;
511+
logic xfer_in_progress;
511512

512513
// HCI
513514
I3CCSR_pkg::I3CCSR__I3C_EC__TTI__out_t hwif_tti_out;
@@ -695,8 +696,9 @@ module i3c
695696

696697
.err_o(controller_error),
697698
.recovery_mode_enter_i(recovery_mode_enter),
698-
.virtual_device_tx_o(virtual_device_tx),
699-
.virtual_device_tx_done_i(virtual_device_tx_done)
699+
.virtual_device_sel_o(virtual_device_sel),
700+
.virtual_device_rdy_i(virtual_device_rdy),
701+
.xfer_in_progress_o(xfer_in_progress)
700702
);
701703

702704
// HCI
@@ -1104,8 +1106,8 @@ module i3c
11041106
.ctl_bus_addr_valid_i(rx_bus_addr_valid),
11051107
.recovery_mode_enter_o(recovery_mode_enter),
11061108
.recovery_mode_enabled_o(recovery_mode_enabled),
1107-
.virtual_device_tx_i(virtual_device_tx),
1108-
.virtual_device_tx_done_o(virtual_device_tx_done)
1109+
.virtual_device_sel_i(virtual_device_sel),
1110+
.xfer_in_progress_i(xfer_in_progress)
11091111
);
11101112

11111113
// I3C PHY

src/recovery/recovery_executor.sv

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ module recovery_executor
6161
output logic indirect_rx_clr_o,
6262

6363
// Others
64+
output logic pending_o,
6465
input logic host_abort_i,
6566

6667
// queues clr signals
@@ -77,9 +78,7 @@ module recovery_executor
7778
input I3CCSR_pkg::I3CCSR__I3C_EC__SecFwRecoveryIf__out_t hwif_rec_i,
7879
output I3CCSR_pkg::I3CCSR__I3C_EC__SecFwRecoveryIf__in_t hwif_rec_o,
7980

80-
// virtual device interface
81-
input logic virtual_device_tx_i,
82-
output logic virtual_device_tx_done_o,
81+
// Recovery mode enabled via a CSR
8382
input recovery_mode_enabled_i
8483
);
8584

@@ -220,19 +219,6 @@ module recovery_executor
220219

221220
// ....................................................
222221

223-
// Queue flush
224-
logic flush_queues;
225-
226-
always_ff @(posedge clk_i or negedge rst_ni)
227-
if (!rst_ni) flush_queues <= 1'b0;
228-
else begin
229-
unique case (state_q)
230-
Idle:
231-
if (cmd_valid_i) flush_queues <= 1'b1;
232-
default: flush_queues <= 1'b0;
233-
endcase
234-
end
235-
236222
// Data counter
237223
assign dcnt_next = (|cmd_len_i[1:0]) ? (cmd_len_i / 4 + 1) : (cmd_len_i / 4); // Divide by 4, round up
238224

@@ -397,7 +383,6 @@ module recovery_executor
397383

398384
// Update status on command done
399385
assign status_protocol_we = (state_q == Done);
400-
assign virtual_device_tx_done_o = (state_q == Done) & virtual_device_tx_i;
401386

402387
// ....................................................
403388

@@ -496,8 +481,8 @@ module recovery_executor
496481
assign tti_rx_sel_o = 1'b1;
497482
assign rx_data_queue_clr_o = (state_q == Error);
498483
assign rx_desc_queue_clr_o = (state_q == Error);
499-
assign tx_data_queue_clr_o = (state_q == Error) | flush_queues;
500-
assign tx_desc_queue_clr_o = (state_q == Error) | flush_queues;
484+
assign tx_data_queue_clr_o = '0;
485+
assign tx_desc_queue_clr_o = '0;
501486

502487
// RX TTI FIFO data request
503488
always_ff @(posedge clk_i)

0 commit comments

Comments
 (0)