lib: Use available hart mask for correct hbase value

As per the latest SBI specification, all online harts should receive
IPI if hbase is set to -1.

Set the target mask to all available hart mask if hbase is -1.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Anup Patel <anup.patel@wdc.com>
This commit is contained in:
Atish Patra
2020-02-21 15:47:54 -08:00
committed by Anup Patel
parent c3b3b8f43b
commit 393624377a

View File

@@ -79,20 +79,23 @@ int sbi_ipi_send_many(struct sbi_scratch *scratch, ulong hmask, ulong hbase,
u32 hartid = sbi_current_hartid();
unsigned long last_bit = __fls(mask);
if (hbase > last_bit)
/* hart base is not available */
return SBI_EINVAL;
/**
* FIXME: This check is valid only ULONG size. This is oka for now as
* avaialble hart mask can support upto ULONG size only.
*/
tempmask = hmask << hbase;
tempmask = ~mask & tempmask;
if (tempmask)
/* at least one of the hart in hmask is not available */
return SBI_EINVAL;
if (hbase != -1UL) {
if (hbase > last_bit)
/* hart base is not available */
return SBI_EINVAL;
/**
* FIXME: This check is valid only ULONG size. This is okay for
* now as avaialble hart mask can support upto ULONG size only.
*/
tempmask = hmask << hbase;
tempmask = ~mask & tempmask;
if (tempmask)
/* at least one of the hart in hmask is not available */
return SBI_EINVAL;
mask &= (hmask << hbase);
}
mask &= (hmask << hbase);
/* Send IPIs to every other hart on the set */
for (i = 0, m = mask; m; i++, m >>= 1)
if ((m & 1UL) && (i != hartid))