diff mbox series

[v4,1/2] platform: Allow platforms to specify the size of tlb fifo

Message ID 20230815071516.422658-2-wxjstz@126.com
State Changes Requested
Headers show
Series Some changes about tlb fifo | expand

Commit Message

Xiang W Aug. 15, 2023, 7:15 a.m. UTC
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>
Signed-off-by: Xing Xiaoguang <xiaoguang.xing@sophgo.com>
---
 include/sbi/sbi_platform.h                   | 18 ++++++++++++++++++
 include/sbi/sbi_tlb.h                        |  2 --
 lib/sbi/sbi_tlb.c                            |  4 ++--
 platform/generic/include/platform_override.h |  1 +
 platform/generic/platform.c                  |  8 ++++++++
 5 files changed, 29 insertions(+), 4 deletions(-)

Comments

Anup Patel Sept. 6, 2023, 11:53 a.m. UTC | #1
On Tue, Aug 15, 2023 at 12:45 PM Xiang W <wxjstz@126.com> wrote:
>
> 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>
> Signed-off-by: Xing Xiaoguang <xiaoguang.xing@sophgo.com>

Looks good to me.

Reviewed-by: Anup Patel <anup@brainfault.org>

Regards,
Anup

> ---
>  include/sbi/sbi_platform.h                   | 18 ++++++++++++++++++
>  include/sbi/sbi_tlb.h                        |  2 --
>  lib/sbi/sbi_tlb.c                            |  4 ++--
>  platform/generic/include/platform_override.h |  1 +
>  platform/generic/platform.c                  |  8 ++++++++
>  5 files changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
> index 3e9616f..e6a4a31 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 */
> @@ -325,6 +329,20 @@ static inline u64 sbi_platform_tlbr_flush_limit(const struct sbi_platform *plat)
>         return SBI_PLATFORM_TLB_RANGE_FLUSH_LIMIT_DEFAULT;
>  }
>
> +/**
> + * 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
>   *
> diff --git a/include/sbi/sbi_tlb.h b/include/sbi/sbi_tlb.h
> index 48f1962..55dcab0 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 26a87f3..92648da 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 0d9e5ee..bf4b112 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 34b87f7..66a0b77 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,
> --
> 2.40.1
>
>
> --
> opensbi mailing list
> opensbi@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
diff mbox series

Patch

diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
index 3e9616f..e6a4a31 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 */
@@ -325,6 +329,20 @@  static inline u64 sbi_platform_tlbr_flush_limit(const struct sbi_platform *plat)
 	return SBI_PLATFORM_TLB_RANGE_FLUSH_LIMIT_DEFAULT;
 }
 
+/**
+ * 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
  *
diff --git a/include/sbi/sbi_tlb.h b/include/sbi/sbi_tlb.h
index 48f1962..55dcab0 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 26a87f3..92648da 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 0d9e5ee..bf4b112 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 34b87f7..66a0b77 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,