@@ -39,6 +39,8 @@
#define SBI_PLATFORM_FIRMWARE_CONTEXT_OFFSET (0x60 + __SIZEOF_POINTER__)
/** Offset of hart_index2id in struct sbi_platform */
#define SBI_PLATFORM_HART_INDEX2ID_OFFSET (0x60 + (__SIZEOF_POINTER__ * 2))
+/** Offset of tlb_fifo_num_entries in struct sbi_platform */
+#define SBI_PLARFORM_TLB_FIFO_NUM_ENTRIES (0x60 + (__SIZEOF_POINTER__ * 3))
#define SBI_PLATFORM_TLB_RANGE_FLUSH_LIMIT_DEFAULT (1UL << 12)
@@ -192,6 +194,15 @@ struct sbi_platform {
* 2. HART id < SBI_HARTMASK_MAX_BITS
*/
const u32 *hart_index2id;
+
+ /**
+ * For some systems with too many harts, too small tlb fifo
+ * may cause harts to wait. For such systems, this number
+ * can be increased.
+ *
+ * This value can be change in platform_override->fw_init
+ */
+ u32 tlb_fifo_num_entries;
};
/**
@@ -243,6 +254,11 @@ _Static_assert(
== SBI_PLATFORM_HART_INDEX2ID_OFFSET,
"struct sbi_platform definition has changed, please redefine "
"SBI_PLATFORM_HART_INDEX2ID_OFFSET");
+_Static_assert(
+ offsetof(struct sbi_platform, tlb_fifo_num_entries)
+ == SBI_PLARFORM_TLB_FIFO_NUM_ENTRIES,
+ "struct sbi_platform definition has changed, please redefine "
+ "SBI_PLARFORM_TLB_FIFO_NUM_ENTRIES");
/** Get pointer to sbi_platform for sbi_scratch pointer */
#define sbi_platform_ptr(__s) \
@@ -370,6 +386,19 @@ static inline bool sbi_platform_hart_invalid(const struct sbi_platform *plat,
return true;
return false;
}
+/**
+ * Get number of tlb fifo entries
+ *
+ * @param plat pointer to struct sbi_platform
+ *
+ * @return number of tlb fifo entries
+*/
+static inline u32 sbi_platform_tlb_fifo_num_entries(const struct sbi_platform *plat)
+{
+ if(plat && plat->tlb_fifo_num_entries)
+ return plat->tlb_fifo_num_entries;
+ return 8;
+}
/**
* Check whether given HART is allowed to do cold boot
@@ -20,8 +20,6 @@
/* clang-format on */
-#define SBI_TLB_FIFO_NUM_ENTRIES 8
-
struct sbi_scratch;
struct sbi_tlb_info {
@@ -422,7 +422,7 @@ int sbi_tlb_init(struct sbi_scratch *scratch, bool cold_boot)
return SBI_ENOMEM;
}
tlb_fifo_mem_off = sbi_scratch_alloc_offset(
- SBI_TLB_FIFO_NUM_ENTRIES * SBI_TLB_INFO_SIZE);
+ sbi_platform_tlb_fifo_num_entries(plat) * SBI_TLB_INFO_SIZE);
if (!tlb_fifo_mem_off) {
sbi_scratch_free_offset(tlb_fifo_off);
sbi_scratch_free_offset(tlb_sync_off);
@@ -453,7 +453,7 @@ int sbi_tlb_init(struct sbi_scratch *scratch, bool cold_boot)
ATOMIC_INIT(tlb_sync, 0);
sbi_fifo_init(tlb_q, tlb_mem,
- SBI_TLB_FIFO_NUM_ENTRIES, SBI_TLB_INFO_SIZE);
+ sbi_platform_tlb_fifo_num_entries(plat), SBI_TLB_INFO_SIZE);
return 0;
}
For some platforms with a particularly high number of harts, if the tlb fifo is too small, it case harts to wait. Platforms should be allowed to specify the size of the tlb fifo. Signed-off-by: Xiang W <wxjstz@126.com> --- include/sbi/sbi_platform.h | 29 +++++++++++++++++++++++++++++ include/sbi/sbi_tlb.h | 2 -- lib/sbi/sbi_tlb.c | 4 ++-- 3 files changed, 31 insertions(+), 4 deletions(-)