summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <[email protected]>2020-03-02 16:13:50 +0530
committerAnup Patel <[email protected]>2020-03-11 15:30:16 +0530
commit2db381fc7401c3ca1637e18ec0258b9e1eff3f93 (patch)
treecd0da8298a6269ef18cbb19276fe064a70744dcb
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 <[email protected]> Reviewed-by: Bin Meng <[email protected]>
-rw-r--r--include/sbi/sbi_hsm.h3
-rw-r--r--lib/sbi/sbi_hsm.c38
2 files changed, 41 insertions, 0 deletions
diff --git a/include/sbi/sbi_hsm.h b/include/sbi/sbi_hsm.h
index a68eafbc..227bb6b1 100644
--- a/include/sbi/sbi_hsm.h
+++ b/include/sbi/sbi_hsm.h
@@ -27,5 +27,8 @@ int sbi_hsm_hart_stop(struct sbi_scratch *scratch, bool exitnow);
int sbi_hsm_hart_get_state(struct sbi_scratch *scratch, u32 hartid);
int sbi_hsm_hart_state_to_status(int state);
bool sbi_hsm_hart_started(struct sbi_scratch *scratch, u32 hartid);
+int sbi_hsm_hart_started_mask(struct sbi_scratch *scratch,
+ ulong hbase, ulong *out_hmask);
void sbi_hsm_prepare_next_jump(struct sbi_scratch *scratch, u32 hartid);
+
#endif
diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c
index 14a2d845..713dbaf9 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;