lib: Use available hart mask for correct hbase value
authorAtish Patra <atish.patra@wdc.com>
Fri, 21 Feb 2020 23:47:54 +0000 (15:47 -0800)
committerAnup Patel <anup@brainfault.org>
Sat, 22 Feb 2020 04:36:51 +0000 (10:06 +0530)
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>
lib/sbi/sbi_ipi.c

index 206931c..62eba87 100644 (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))