enum sh_css_err sh_css_hrt_sp_wait(void) { #if defined(HAS_IRQ_MAP_VERSION_2) irq_sw_channel_id_t irq_id = IRQ_SW_CHANNEL0_ID; #else irq_sw_channel_id_t irq_id = IRQ_SW_CHANNEL2_ID; #endif /* * Wait till SP is idle or till there is a SW2 interrupt * The SW2 interrupt will be used when frameloop runs on SP * and signals an event with similar meaning as SP idle * (e.g. frame_done) */ while (!sp_ctrl_getbit(SP0_ID, SP_SC_REG, SP_IDLE_BIT) && ((irq_reg_load(IRQ0_ID, _HRT_IRQ_CONTROLLER_STATUS_REG_IDX) & (1U<<(irq_id + IRQ_SW_CHANNEL_OFFSET))) == 0)) { hrt_sleep(); } return sh_css_success; }
void sp_get_state( const sp_ID_t ID, sp_state_t *state, sp_stall_t *stall) { hrt_data sc = sp_ctrl_load(ID, SP_SC_REG); assert(state != NULL); assert(stall != NULL); state->pc = sp_ctrl_load(ID, SP_PC_REG); state->status_register = sc; state->is_broken = (sc & (1U << SP_BROKEN_BIT)) != 0; state->is_idle = (sc & (1U << SP_IDLE_BIT)) != 0; state->is_sleeping = (sc & (1U << SP_SLEEPING_BIT)) != 0; state->is_stalling = (sc & (1U << SP_STALLING_BIT)) != 0; stall->fifo0 = !sp_ctrl_getbit(ID, SP_FIFO0_SINK_REG, SP_FIFO0_SINK_BIT); stall->fifo1 = !sp_ctrl_getbit(ID, SP_FIFO1_SINK_REG, SP_FIFO1_SINK_BIT); stall->fifo2 = !sp_ctrl_getbit(ID, SP_FIFO2_SINK_REG, SP_FIFO2_SINK_BIT); stall->fifo3 = !sp_ctrl_getbit(ID, SP_FIFO3_SINK_REG, SP_FIFO3_SINK_BIT); stall->fifo4 = !sp_ctrl_getbit(ID, SP_FIFO4_SINK_REG, SP_FIFO4_SINK_BIT); stall->fifo5 = !sp_ctrl_getbit(ID, SP_FIFO5_SINK_REG, SP_FIFO5_SINK_BIT); stall->fifo6 = !sp_ctrl_getbit(ID, SP_FIFO6_SINK_REG, SP_FIFO6_SINK_BIT); stall->fifo7 = !sp_ctrl_getbit(ID, SP_FIFO7_SINK_REG, SP_FIFO7_SINK_BIT); stall->fifo8 = !sp_ctrl_getbit(ID, SP_FIFO8_SINK_REG, SP_FIFO8_SINK_BIT); stall->fifo9 = !sp_ctrl_getbit(ID, SP_FIFO9_SINK_REG, SP_FIFO9_SINK_BIT); stall->fifoa = !sp_ctrl_getbit(ID, SP_FIFOA_SINK_REG, SP_FIFOA_SINK_BIT); stall->dmem = !sp_ctrl_getbit(ID, SP_DMEM_SINK_REG, SP_DMEM_SINK_BIT); stall->control_master = !sp_ctrl_getbit(ID, SP_CTRL_MT_SINK_REG, SP_CTRL_MT_SINK_BIT); stall->icache_master = !sp_ctrl_getbit(ID, SP_ICACHE_MT_SINK_REG, SP_ICACHE_MT_SINK_BIT); return; }