aboutsummaryrefslogtreecommitdiff
path: root/lib/sbi/sbi_hsm.c
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-03-02 16:13:50 +0530
committerAnup Patel <anup@brainfault.org>2020-03-11 15:30:16 +0530
commit2db381fc7401c3ca1637e18ec0258b9e1eff3f93 (patch)
treecd0da8298a6269ef18cbb19276fe064a70744dcb /lib/sbi/sbi_hsm.c
parent44ce5b99e97eb0c3695414cdb64c61f07d9a76a4 (diff)
lib: Introduce sbi_hsm_hart_started_mask() API
This patch introduce sbi_hsm_hart_started_mask() API as a replacement of sbi_hart_available_mask() API. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Diffstat (limited to 'lib/sbi/sbi_hsm.c')
-rw-r--r--lib/sbi/sbi_hsm.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
index 14a2d84..713dbaf 100644
--- a/lib/sbi/sbi_hsm.c
+++ b/lib/sbi/sbi_hsm.c
@@ -77,6 +77,44 @@ bool sbi_hsm_hart_started(struct sbi_scratch *scratch, u32 hartid)
return FALSE;
}
+/**
+ * Get ulong HART mask for given HART base ID
+ * @param scratch the per-HART scratch pointer
+ * @param hbase the HART base ID
+ * @param out_hmask the output ulong HART mask
+ * @return 0 on success and SBI_Exxx (< 0) on failure
+ * Note: the output HART mask will be set to zero on failure as well.
+ */
+int sbi_hsm_hart_started_mask(struct sbi_scratch *scratch,
+ ulong hbase, ulong *out_hmask)
+{
+ ulong i;
+ ulong hcount = sbi_platform_hart_count(sbi_platform_ptr(scratch));
+
+ /*
+ * The SBI_HARTMASK_MAX_BITS represents the maximum HART ids generic
+ * OpenSBI can handle whereas sbi_platform_hart_count() represents
+ * the maximum HART ids (or HARTs) on underlying platform.
+ *
+ * Currently, we only support continuous HART ids so this function
+ * is written with same assumption. In future, this function will
+ * change when we support discontinuous and sparse HART ids.
+ */
+
+ *out_hmask = 0;
+ if (hcount <= hbase)
+ return SBI_EINVAL;
+ if (BITS_PER_LONG < (hcount - hbase))
+ hcount = BITS_PER_LONG;
+
+ for (i = hbase; i < hcount; i++) {
+ if (sbi_hsm_hart_get_state(scratch, i) == SBI_HART_STARTED)
+ *out_hmask |= 1UL << (i - hbase);
+ }
+
+ return 0;
+}
+
void sbi_hsm_prepare_next_jump(struct sbi_scratch *scratch, u32 hartid)
{
u32 oldstate;