From: Anup Patel Date: Fri, 1 Sep 2023 16:11:48 +0000 (+0530) Subject: lib: sbi: Remove sbi_scratch_last_hartid() macro X-Git-Tag: v1.4~98 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=22d6ff86750e0e40ff5966dc4671e2845b0536cb;p=platform%2Fkernel%2Fopensbi.git lib: sbi: Remove sbi_scratch_last_hartid() macro The sbi_scratch_last_hartid() macro is not of much use on platforms with really sparse hartids so let us replace use of this macro with other approaches. Signed-off-by: Anup Patel --- diff --git a/include/sbi/sbi_scratch.h b/include/sbi/sbi_scratch.h index 9a4dce1..e6a33ba 100644 --- a/include/sbi/sbi_scratch.h +++ b/include/sbi/sbi_scratch.h @@ -244,12 +244,6 @@ u32 sbi_hartid_to_hartindex(u32 hartid); #define sbi_hartid_to_scratch(__hartid) \ sbi_hartindex_to_scratch(sbi_hartid_to_hartindex(__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 - /** Check whether particular HART id is valid or not */ #define sbi_hartid_valid(__hartid) \ sbi_hartindex_valid(sbi_hartid_to_hartindex(__hartid)) diff --git a/lib/sbi/sbi_hsm.c b/lib/sbi/sbi_hsm.c index 814130e..147f954 100644 --- a/lib/sbi/sbi_hsm.c +++ b/lib/sbi/sbi_hsm.c @@ -115,23 +115,21 @@ int sbi_hsm_hart_interruptible_mask(const struct sbi_domain *dom, { int hstate; ulong i, hmask, dmask; - ulong hend = sbi_scratch_last_hartid() + 1; *out_hmask = 0; - if (hend <= hbase) + if (!sbi_hartid_valid(hbase)) return SBI_EINVAL; - if (BITS_PER_LONG < (hend - hbase)) - hend = hbase + BITS_PER_LONG; dmask = sbi_domain_get_assigned_hartmask(dom, hbase); - for (i = hbase; i < hend; i++) { - hmask = 1UL << (i - hbase); - if (dmask & hmask) { - hstate = __sbi_hsm_hart_get_state(i); - if (hstate == SBI_HSM_STATE_STARTED || - hstate == SBI_HSM_STATE_SUSPENDED) - *out_hmask |= hmask; - } + for (i = 0; i < BITS_PER_LONG; i++) { + hmask = 1UL << i; + if (!(dmask & hmask)) + continue; + + hstate = __sbi_hsm_hart_get_state(hbase + i); + if (hstate == SBI_HSM_STATE_STARTED || + hstate == SBI_HSM_STATE_SUSPENDED) + *out_hmask |= hmask; } return 0; @@ -249,15 +247,15 @@ int sbi_hsm_init(struct sbi_scratch *scratch, u32 hartid, bool cold_boot) return SBI_ENOMEM; /* Initialize hart state data for every hart */ - for (i = 0; i <= sbi_scratch_last_hartid(); i++) { - rscratch = sbi_hartid_to_scratch(i); + for (i = 0; i <= sbi_scratch_last_hartindex(); i++) { + rscratch = sbi_hartindex_to_scratch(i); if (!rscratch) continue; hdata = sbi_scratch_offset_ptr(rscratch, hart_data_offset); ATOMIC_INIT(&hdata->state, - (i == hartid) ? + (sbi_hartindex_to_hartid(i) == hartid) ? SBI_HSM_STATE_START_PENDING : SBI_HSM_STATE_STOPPED); ATOMIC_INIT(&hdata->start_ticket, 0); diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c index a6d96e6..e723553 100644 --- a/lib/sbi/sbi_init.c +++ b/lib/sbi/sbi_init.c @@ -242,6 +242,8 @@ static void wait_for_coldboot(struct sbi_scratch *scratch, u32 hartid) static void wake_coldboot_harts(struct sbi_scratch *scratch, u32 hartid) { + u32 i, hartindex = sbi_hartid_to_hartindex(hartid); + /* Mark coldboot done */ __smp_store_release(&coldboot_done, 1); @@ -249,10 +251,10 @@ static void wake_coldboot_harts(struct sbi_scratch *scratch, u32 hartid) spin_lock(&coldboot_lock); /* Send an IPI to all HARTs waiting for coldboot */ - for (u32 i = 0; i <= sbi_scratch_last_hartid(); i++) { - if ((i != hartid) && - sbi_hartmask_test_hartid(i, &coldboot_wait_hmask)) - sbi_ipi_raw_send(sbi_hartid_to_hartindex(i)); + sbi_hartmask_for_each_hartindex(i, &coldboot_wait_hmask) { + if (i == hartindex) + continue; + sbi_ipi_raw_send(i); } /* Release coldboot lock */ diff --git a/lib/sbi/sbi_scratch.c b/lib/sbi/sbi_scratch.c index de2aa34..ccbbc68 100644 --- a/lib/sbi/sbi_scratch.c +++ b/lib/sbi/sbi_scratch.c @@ -14,7 +14,6 @@ #include #include -u32 last_hartid_having_scratch = SBI_HARTMASK_MAX_BITS - 1; u32 last_hartindex_having_scratch = 0; u32 hartindex_to_hartid_table[SBI_HARTMASK_MAX_BITS + 1] = { -1U }; struct sbi_scratch *hartindex_to_scratch_table[SBI_HARTMASK_MAX_BITS + 1] = { 0 }; @@ -45,7 +44,6 @@ int sbi_scratch_init(struct sbi_scratch *scratch) hartindex_to_hartid_table[i] = h; hartindex_to_scratch_table[i] = ((hartid2scratch)scratch->hartid_to_scratch)(h, i); - last_hartid_having_scratch = h; } last_hartindex_having_scratch = plat->hart_count - 1;