summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang W <[email protected]>2023-09-06 21:10:03 +0800
committerAnup Patel <[email protected]>2023-09-10 11:21:05 +0530
commitcacfba32cc9541b7b9f838df43c1f2bd43222d3a (patch)
tree5b38c9301bee234437581f4c8603a496e2165066
parent901d3d7bff5a511b5f320aad8a0d65e79c95d09c (diff)
platform: Allow platforms to specify the size of tlb fifo
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 <[email protected]> Signed-off-by: Xing Xiaoguang <[email protected]> Reviewed-by: Anup Patel <[email protected]>
-rw-r--r--include/sbi/sbi_platform.h18
-rw-r--r--include/sbi/sbi_tlb.h2
-rw-r--r--lib/sbi/sbi_tlb.c4
-rw-r--r--platform/generic/include/platform_override.h1
-rw-r--r--platform/generic/platform.c8
5 files changed, 29 insertions, 4 deletions
diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
index 3e9616f6..e6a4a317 100644
--- a/include/sbi/sbi_platform.h
+++ b/include/sbi/sbi_platform.h
@@ -41,6 +41,7 @@
#define SBI_PLATFORM_HART_INDEX2ID_OFFSET (0x60 + (__SIZEOF_POINTER__ * 2))
#define SBI_PLATFORM_TLB_RANGE_FLUSH_LIMIT_DEFAULT (1UL << 12)
+#define SBI_PLATFORM_TLB_FIFO_NUM_ENTRIES 8
#ifndef __ASSEMBLER__
@@ -125,6 +126,9 @@ struct sbi_platform_operations {
/** Get tlb flush limit value **/
u64 (*get_tlbr_flush_limit)(void);
+ /** Get tlb fifo num entries*/
+ u32 (*get_tlb_num_entries)(void);
+
/** Initialize platform timer for current HART */
int (*timer_init)(bool cold_boot);
/** Exit platform timer for current HART */
@@ -326,6 +330,20 @@ static inline u64 sbi_platform_tlbr_flush_limit(const struct sbi_platform *plat)
}
/**
+ * Get platform specific tlb fifo num 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 && sbi_platform_ops(plat)->get_tlb_num_entries)
+ return sbi_platform_ops(plat)->get_tlb_num_entries();
+ return SBI_PLATFORM_TLB_FIFO_NUM_ENTRIES;
+}
+
+/**
* Get total number of HARTs supported by the platform
*
* @param plat pointer to struct sbi_platform
diff --git a/include/sbi/sbi_tlb.h b/include/sbi/sbi_tlb.h
index 48f1962d..55dcab08 100644
--- a/include/sbi/sbi_tlb.h
+++ b/include/sbi/sbi_tlb.h
@@ -20,8 +20,6 @@
/* clang-format on */
-#define SBI_TLB_FIFO_NUM_ENTRIES 8
-
struct sbi_scratch;
struct sbi_tlb_info {
diff --git a/lib/sbi/sbi_tlb.c b/lib/sbi/sbi_tlb.c
index 26a87f32..92648da0 100644
--- a/lib/sbi/sbi_tlb.c
+++ b/lib/sbi/sbi_tlb.c
@@ -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;
}
diff --git a/platform/generic/include/platform_override.h b/platform/generic/include/platform_override.h
index 0d9e5ee6..bf4b1125 100644
--- a/platform/generic/include/platform_override.h
+++ b/platform/generic/include/platform_override.h
@@ -18,6 +18,7 @@ struct platform_override {
const struct fdt_match *match_table;
u64 (*features)(const struct fdt_match *match);
u64 (*tlbr_flush_limit)(const struct fdt_match *match);
+ u32 (*tlb_num_entries)(const struct fdt_match *match);
bool (*cold_boot_allowed)(u32 hartid, const struct fdt_match *match);
int (*early_init)(bool cold_boot, const struct fdt_match *match);
int (*final_init)(bool cold_boot, const struct fdt_match *match);
diff --git a/platform/generic/platform.c b/platform/generic/platform.c
index 34b87f74..66a0b77c 100644
--- a/platform/generic/platform.c
+++ b/platform/generic/platform.c
@@ -256,6 +256,13 @@ static u64 generic_tlbr_flush_limit(void)
return SBI_PLATFORM_TLB_RANGE_FLUSH_LIMIT_DEFAULT;
}
+static u32 generic_tlb_num_entries(void)
+{
+ if (generic_plat && generic_plat->tlb_num_entries)
+ return generic_plat->tlb_num_entries(generic_plat_match);
+ return SBI_PLATFORM_TLB_FIFO_NUM_ENTRIES;
+}
+
static int generic_pmu_init(void)
{
return fdt_pmu_setup(fdt_get_address());
@@ -308,6 +315,7 @@ const struct sbi_platform_operations platform_ops = {
.pmu_init = generic_pmu_init,
.pmu_xlate_to_mhpmevent = generic_pmu_xlate_to_mhpmevent,
.get_tlbr_flush_limit = generic_tlbr_flush_limit,
+ .get_tlb_num_entries = generic_tlb_num_entries,
.timer_init = fdt_timer_init,
.timer_exit = fdt_timer_exit,
.vendor_ext_check = generic_vendor_ext_check,