[PATCH] platform: Allow platforms to specify the size of tlb fifo
Xiang W
wxjstz at 126.com
Mon Aug 14 04:40:59 PDT 2023
在 2023-08-14星期一的 14:59 +0800,Xiang W写道:
> 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 at 126.com>
Sorry, I split the two patches into two emails.
Please review at:
https://lists.infradead.org/pipermail/opensbi/2023-August/005483.html
https://lists.infradead.org/pipermail/opensbi/2023-August/005484.html
https://lists.infradead.org/pipermail/opensbi/2023-August/005485.html
Regards,
Xiang W
> ---
> 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(-)
>
> diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
> index 3e9616f..5929042 100644
> --- a/include/sbi/sbi_platform.h
> +++ b/include/sbi/sbi_platform.h
> @@ -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
> 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;
> }
> --
> 2.40.1
>
>
More information about the opensbi
mailing list