diff mbox series

[v5,2/2] lib: sbi: alloc tlb fifo by sbi_malloc

Message ID 20230906131004.427047-3-wxjstz@126.com
State Accepted
Headers show
Series Some changes about tlb fifo | expand

Commit Message

Xiang W Sept. 6, 2023, 1:10 p.m. UTC
If the system is defined from tlb_fifo_num_entries, the scratch may be
too small to hold the fifo, so it is alloc through the heap.

Signed-off-by: Xiang W <wxjstz@126.com>
Signed-off-by: Xing Xiaoguang <xiaoguang.xing@sophgo.com>
---
 lib/sbi/sbi_tlb.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

Comments

Anup Patel Sept. 10, 2023, 8:46 a.m. UTC | #1
On Wed, Sep 6, 2023 at 6:55 PM Xiang W <wxjstz@126.com> wrote:
>
> If the system is defined from tlb_fifo_num_entries, the scratch may be
> too small to hold the fifo, so it is alloc through the heap.
>
> Signed-off-by: Xiang W <wxjstz@126.com>
> Signed-off-by: Xing Xiaoguang <xiaoguang.xing@sophgo.com>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  lib/sbi/sbi_tlb.c | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/lib/sbi/sbi_tlb.c b/lib/sbi/sbi_tlb.c
> index 92648da..24bf76b 100644
> --- a/lib/sbi/sbi_tlb.c
> +++ b/lib/sbi/sbi_tlb.c
> @@ -14,6 +14,7 @@
>  #include <sbi/sbi_error.h>
>  #include <sbi/sbi_fifo.h>
>  #include <sbi/sbi_hart.h>
> +#include <sbi/sbi_heap.h>
>  #include <sbi/sbi_ipi.h>
>  #include <sbi/sbi_scratch.h>
>  #include <sbi/sbi_tlb.h>
> @@ -421,8 +422,7 @@ int sbi_tlb_init(struct sbi_scratch *scratch, bool cold_boot)
>                         sbi_scratch_free_offset(tlb_sync_off);
>                         return SBI_ENOMEM;
>                 }
> -               tlb_fifo_mem_off = sbi_scratch_alloc_offset(
> -                               sbi_platform_tlb_fifo_num_entries(plat) * SBI_TLB_INFO_SIZE);
> +               tlb_fifo_mem_off = sbi_scratch_alloc_offset(sizeof(tlb_mem));
>                 if (!tlb_fifo_mem_off) {
>                         sbi_scratch_free_offset(tlb_fifo_off);
>                         sbi_scratch_free_offset(tlb_sync_off);
> @@ -448,7 +448,14 @@ int sbi_tlb_init(struct sbi_scratch *scratch, bool cold_boot)
>
>         tlb_sync = sbi_scratch_offset_ptr(scratch, tlb_sync_off);
>         tlb_q = sbi_scratch_offset_ptr(scratch, tlb_fifo_off);
> -       tlb_mem = sbi_scratch_offset_ptr(scratch, tlb_fifo_mem_off);
> +       tlb_mem = sbi_scratch_read_type(scratch, void*, tlb_fifo_mem_off);
> +       if (!tlb_mem) {
> +               tlb_mem = sbi_malloc(
> +                               sbi_platform_tlb_fifo_num_entries(plat) * SBI_TLB_INFO_SIZE);
> +               if (!tlb_mem)
> +                       return SBI_ENOMEM;
> +               sbi_scratch_write_type(scratch, void*, tlb_fifo_mem_off, tlb_mem);
> +       }
>
>         ATOMIC_INIT(tlb_sync, 0);
>
> --
> 2.40.1
>
>
> --
> opensbi mailing list
> opensbi@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
diff mbox series

Patch

diff --git a/lib/sbi/sbi_tlb.c b/lib/sbi/sbi_tlb.c
index 92648da..24bf76b 100644
--- a/lib/sbi/sbi_tlb.c
+++ b/lib/sbi/sbi_tlb.c
@@ -14,6 +14,7 @@ 
 #include <sbi/sbi_error.h>
 #include <sbi/sbi_fifo.h>
 #include <sbi/sbi_hart.h>
+#include <sbi/sbi_heap.h>
 #include <sbi/sbi_ipi.h>
 #include <sbi/sbi_scratch.h>
 #include <sbi/sbi_tlb.h>
@@ -421,8 +422,7 @@  int sbi_tlb_init(struct sbi_scratch *scratch, bool cold_boot)
 			sbi_scratch_free_offset(tlb_sync_off);
 			return SBI_ENOMEM;
 		}
-		tlb_fifo_mem_off = sbi_scratch_alloc_offset(
-				sbi_platform_tlb_fifo_num_entries(plat) * SBI_TLB_INFO_SIZE);
+		tlb_fifo_mem_off = sbi_scratch_alloc_offset(sizeof(tlb_mem));
 		if (!tlb_fifo_mem_off) {
 			sbi_scratch_free_offset(tlb_fifo_off);
 			sbi_scratch_free_offset(tlb_sync_off);
@@ -448,7 +448,14 @@  int sbi_tlb_init(struct sbi_scratch *scratch, bool cold_boot)
 
 	tlb_sync = sbi_scratch_offset_ptr(scratch, tlb_sync_off);
 	tlb_q = sbi_scratch_offset_ptr(scratch, tlb_fifo_off);
-	tlb_mem = sbi_scratch_offset_ptr(scratch, tlb_fifo_mem_off);
+	tlb_mem = sbi_scratch_read_type(scratch, void*, tlb_fifo_mem_off);
+	if (!tlb_mem) {
+		tlb_mem = sbi_malloc(
+				sbi_platform_tlb_fifo_num_entries(plat) * SBI_TLB_INFO_SIZE);
+		if (!tlb_mem)
+			return SBI_ENOMEM;
+		sbi_scratch_write_type(scratch, void*, tlb_fifo_mem_off, tlb_mem);
+	}
 
 	ATOMIC_INIT(tlb_sync, 0);