diff options
author | Anup Patel <anup.patel@wdc.com> | 2020-03-02 16:13:50 +0530 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-03-11 15:30:16 +0530 |
commit | 2db381fc7401c3ca1637e18ec0258b9e1eff3f93 (patch) | |
tree | cd0da8298a6269ef18cbb19276fe064a70744dcb /lib/sbi/sbi_hsm.c | |
parent | 44ce5b99e97eb0c3695414cdb64c61f07d9a76a4 (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.c | 38 |
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; |