lib: sbi_scratch: Introduce sbi_scratch_last_hartid() API

The patch adds sbi_scratch_last_hartid() API which returns
last HART id having a scratch space. We can use this new API
to optimize places where we iterate over HART id from 0 to
SBI_HARTMASK_MAX_BITS.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
Anup Patel 2020-03-26 18:35:38 +05:30 committed by Anup Patel
parent 5b6957eed7
commit dd0f21c560
4 changed files with 13 additions and 4 deletions

View File

@ -113,6 +113,12 @@ extern struct sbi_scratch *hartid_to_scratch_table[];
#define sbi_hartid_to_scratch(__hartid) \ #define sbi_hartid_to_scratch(__hartid) \
hartid_to_scratch_table[__hartid] hartid_to_scratch_table[__hartid]
/** Last HART id having a sbi_scratch pointer */
extern u32 last_hartid_having_scratch;
/** Get last HART id having a sbi_scratch pointer */
#define sbi_scratch_last_hartid() last_hartid_having_scratch
#endif #endif
#endif #endif

View File

@ -88,7 +88,7 @@ bool sbi_hsm_hart_started(u32 hartid)
int sbi_hsm_hart_started_mask(ulong hbase, ulong *out_hmask) int sbi_hsm_hart_started_mask(ulong hbase, ulong *out_hmask)
{ {
ulong i; ulong i;
ulong hcount = SBI_HARTMASK_MAX_BITS; ulong hcount = sbi_scratch_last_hartid() + 1;
*out_hmask = 0; *out_hmask = 0;
if (hcount <= hbase) if (hcount <= hbase)
@ -153,7 +153,7 @@ int sbi_hsm_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot)
return SBI_ENOMEM; return SBI_ENOMEM;
/* Initialize hart state data for every hart */ /* Initialize hart state data for every hart */
for (i = 0; i < SBI_HARTMASK_MAX_BITS; i++) { for (i = 0; i <= sbi_scratch_last_hartid(); i++) {
rscratch = sbi_hartid_to_scratch(i); rscratch = sbi_hartid_to_scratch(i);
if (!rscratch) if (!rscratch)
continue; continue;

View File

@ -128,7 +128,7 @@ static void wake_coldboot_harts(struct sbi_scratch *scratch, u32 hartid)
coldboot_done = 1; coldboot_done = 1;
/* Send an IPI to all HARTs waiting for coldboot */ /* Send an IPI to all HARTs waiting for coldboot */
for (int i = 0; i < SBI_HARTMASK_MAX_BITS; i++) { for (int i = 0; i <= sbi_scratch_last_hartid(); i++) {
if ((i != hartid) && if ((i != hartid) &&
sbi_hartmask_test_hart(i, &coldboot_wait_hmask)) sbi_hartmask_test_hart(i, &coldboot_wait_hmask))
sbi_platform_ipi_send(plat, i); sbi_platform_ipi_send(plat, i);

View File

@ -14,6 +14,7 @@
#include <sbi/sbi_scratch.h> #include <sbi/sbi_scratch.h>
#include <sbi/sbi_string.h> #include <sbi/sbi_string.h>
u32 last_hartid_having_scratch = SBI_HARTMASK_MAX_BITS;
struct sbi_scratch *hartid_to_scratch_table[SBI_HARTMASK_MAX_BITS] = { 0 }; struct sbi_scratch *hartid_to_scratch_table[SBI_HARTMASK_MAX_BITS] = { 0 };
static spinlock_t extra_lock = SPIN_LOCK_INITIALIZER; static spinlock_t extra_lock = SPIN_LOCK_INITIALIZER;
@ -32,6 +33,8 @@ int sbi_scratch_init(struct sbi_scratch *scratch)
hartid_to_scratch_table[i] = hartid_to_scratch_table[i] =
((hartid2scratch)scratch->hartid_to_scratch)(i, ((hartid2scratch)scratch->hartid_to_scratch)(i,
sbi_platform_hart_index(plat, i)); sbi_platform_hart_index(plat, i));
if (hartid_to_scratch_table[i])
last_hartid_having_scratch = i;
} }
return 0; return 0;
@ -71,7 +74,7 @@ done:
spin_unlock(&extra_lock); spin_unlock(&extra_lock);
if (ret) { if (ret) {
for (i = 0; i < SBI_HARTMASK_MAX_BITS; i++) { for (i = 0; i < sbi_scratch_last_hartid(); i++) {
rscratch = sbi_hartid_to_scratch(i); rscratch = sbi_hartid_to_scratch(i);
if (!rscratch) if (!rscratch)
continue; continue;