summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <[email protected]>2020-03-04 14:21:42 +0530
committerAnup Patel <[email protected]>2020-03-11 15:29:57 +0530
commitd96316481dbc9a52e7e97c4cef70957507c2845f (patch)
treed786e665940f2cebd911be703fec3329fc0b6db2
parenta4a6a81b7d69b39f4d806e96e6b54a9e0e36d3f3 (diff)
lib: sbi_tlb: Use sbi_hartmask in sbi_tlb_info
Instead of using single ulong as source mask for sbi_tlb_info, we use sbi_hartmask. This way sbi_tlb_info can easily scale for large number of HARTs. Signed-off-by: Anup Patel <[email protected]> Reviewed-by: Bin Meng <[email protected]> Reviewed-by: Atish Patra <[email protected]>
-rw-r--r--include/sbi/sbi_tlb.h5
-rw-r--r--lib/sbi/sbi_tlb.c17
2 files changed, 10 insertions, 12 deletions
diff --git a/include/sbi/sbi_tlb.h b/include/sbi/sbi_tlb.h
index 3d52636f..67c39000 100644
--- a/include/sbi/sbi_tlb.h
+++ b/include/sbi/sbi_tlb.h
@@ -12,6 +12,7 @@
#define __SBI_TLB_H__
#include <sbi/sbi_types.h>
+#include <sbi/sbi_hartmask.h>
/* clang-format off */
@@ -38,7 +39,7 @@ struct sbi_tlb_info {
unsigned long size;
unsigned long asid;
unsigned long type;
- unsigned long shart_mask;
+ struct sbi_hartmask smask;
};
#define SBI_TLB_INFO_INIT(__ptr, __start, __size, __asid, __type, __src_hart) \
@@ -47,7 +48,7 @@ do { \
(__ptr)->size = (__size); \
(__ptr)->asid = (__asid); \
(__ptr)->type = (__type); \
- (__ptr)->shart_mask = 1UL << (__src_hart); \
+ SBI_HARTMASK_INIT_EXCEPT(&(__ptr)->smask, (__src_hart)); \
} while (0)
#define SBI_TLB_INFO_SIZE sizeof(struct sbi_tlb_info)
diff --git a/lib/sbi/sbi_tlb.c b/lib/sbi/sbi_tlb.c
index 21e24365..3cae7eec 100644
--- a/lib/sbi/sbi_tlb.c
+++ b/lib/sbi/sbi_tlb.c
@@ -190,17 +190,14 @@ static void sbi_tlb_local_flush(struct sbi_tlb_info *tinfo)
static void sbi_tlb_entry_process(struct sbi_scratch *scratch,
struct sbi_tlb_info *tinfo)
{
- u32 i;
- u64 m;
+ u32 rhartid;
struct sbi_scratch *rscratch = NULL;
unsigned long *rtlb_sync = NULL;
sbi_tlb_local_flush(tinfo);
- for (i = 0, m = tinfo->shart_mask; m; i++, m >>= 1) {
- if (!(m & 1UL))
- continue;
- rscratch = sbi_hart_id_to_scratch(scratch, i);
+ sbi_hartmask_for_each_hart(rhartid, &tinfo->smask) {
+ rscratch = sbi_hart_id_to_scratch(scratch, rhartid);
rtlb_sync = sbi_scratch_offset_ptr(rscratch, tlb_sync_off);
while (atomic_raw_xchg_ulong(rtlb_sync, 1)) ;
}
@@ -263,11 +260,11 @@ static inline int __sbi_tlb_range_check(struct sbi_tlb_info *curr,
if (next->start <= curr->start && next_end > curr_end) {
curr->start = next->start;
curr->size = next->size;
- curr->shart_mask = curr->shart_mask | next->shart_mask;
- ret = SBI_FIFO_UPDATED;
+ sbi_hartmask_or(&curr->smask, &curr->smask, &next->smask);
+ ret = SBI_FIFO_UPDATED;
} else if (next->start >= curr->start && next_end <= curr_end) {
- curr->shart_mask = curr->shart_mask | next->shart_mask;
- ret = SBI_FIFO_SKIP;
+ sbi_hartmask_or(&curr->smask, &curr->smask, &next->smask);
+ ret = SBI_FIFO_SKIP;
}
return ret;