risc-v/mpfs: ihc: fix performance issue

nxsig_usleep() will wait for the next timer tick which is way
too much here. It's not sleeping 100 us, but rather, near 1/60 s.

This causes severe performance problems. Fix this by polling the
register for a while if the remote end is busy.

Signed-off-by: Eero Nurkkala <eero.nurkkala@offcode.fi>
This commit is contained in:
Eero Nurkkala 2022-08-25 15:30:09 +03:00 committed by Xiang Xiao
parent 130b196876
commit 71ace555f2

View File

@ -785,22 +785,18 @@ static int mpfs_ihc_tx_message(ihc_channel_t channel, uint32_t *message)
uint32_t mhartid = mpfs_ihc_context_to_local_hart_id(channel);
uint32_t rhartid = mpfs_ihc_context_to_remote_hart_id(channel);
uint32_t message_size = getreg32(MPFS_IHC_MSG_SIZE(mhartid, rhartid));
uint32_t ctrl_reg = getreg32(MPFS_IHC_CTRL(mhartid, rhartid));
uint32_t ctrl_reg;
uint32_t retries = 10000;
DEBUGASSERT(message_size <= IHC_MAX_MESSAGE_SIZE);
/* Check if the system is busy. All we can try is wait. */
if ((RMP_MESSAGE_PRESENT | ACK_INT) & ctrl_reg)
do
{
#ifndef CONFIG_MPFS_OPENSBI
nxsig_usleep(100);
#endif
/* Give it a one more try */
ctrl_reg = getreg32(MPFS_IHC_CTRL(mhartid, rhartid));
}
while ((ctrl_reg & (RMP_MESSAGE_PRESENT | ACK_INT)) && --retries);
/* Return if RMP bit 1 indicating busy */