[flash_ctrl] Connect flash / pwrmgr functions - Connect init / done - Connect idle Signed-off-by: Timothy Chen <timothytim@google.com> [flash_ctrl] update waivers Signed-off-by: Timothy Chen <timothytim@google.com> [flash_ctrl] fix typos Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_lcmgr.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_lcmgr.sv index fcf14f0..cd32191 100644 --- a/hw/ip/flash_ctrl/rtl/flash_ctrl_lcmgr.sv +++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_lcmgr.sv
@@ -11,6 +11,7 @@ // initialization command input init_i, + output logic init_done_o, // only access seeds when provisioned input provision_en_i, @@ -81,6 +82,7 @@ } state_e; state_e state_q, state_d; + logic init_done_d; logic validate_q, validate_d; logic [SeedCntWidth-1:0] seed_cnt_q; logic [CntWidth-1:0] addr_cnt_q; @@ -97,9 +99,11 @@ if (!rst_ni) begin state_q <= StIdle; validate_q <= 1'b0; + init_done_o <= 1'b0; end else begin state_q <= state_d; validate_q <= validate_d; + init_done_o <= init_done_d; end end @@ -175,6 +179,19 @@ // rma phase is erase unless we are validating assign op = seed_phase || validate_q ? FlashOpRead : FlashOpErase; + // synchronize inputs + logic init_q; + + prim_flop_2sync #( + .Width(1), + .ResetValue(0) + ) u_sync_flash_init ( + .clk_i, + .rst_ni, + .d_i(init_i), + .q_o(init_q) + ); + always_comb begin // phases of the hardware interface @@ -202,15 +219,20 @@ state_d = state_q; validate_d = validate_q; + // init status + // flash_ctrl handles its own arbitration between hardware and software. + // So once the init kicks off it is safe to ack. The done signal is still + // to give a chance to hold off further power up progression in the future + // if required. + init_done_d = 1'b1; + unique case (state_q) StIdle: begin + init_done_d = 1'b0; phase = PhaseSeed; - // TBD: provision_en is only a "good" value after otp initilization - // Need to qualify this statement with some notion that otp init has - // finished. Since power manager will kick off otp init, it should - // also be able to kick off flash_init - if (init_i) begin + // provision_en is only a "good" value after otp/lc initialization + if (init_q) begin // if provisioning is not enabled, do not read seeds and skip directly // to wait state. state_d = provision_en_i ? StReadSeeds : StWait;