Skip to content

Commit

Permalink
platform: recalculate heap size to support new tlb entry number
Browse files Browse the repository at this point in the history
Previous patch introduced a change that using hart count as the default
number of tlb entries in the fifo. This makes the default tlb fifo size
grow in square with the number of harts. So the default heap size is
not enough to allocate tlb fifo when the hart count is big.

Fixes: 52fd64b ("platform: Uses hart count as the default size of tlb info")
Signed-off-by: Inochi Amaoto <inochiama@outlook.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
  • Loading branch information
inochisa authored and avpatel committed Dec 11, 2023
1 parent a25fc74 commit 87aa306
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 3 deletions.
1 change: 1 addition & 0 deletions include/sbi/sbi_bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
#define BIT_WORD(bit) ((bit) / BITS_PER_LONG)
#define BIT_WORD_OFFSET(bit) ((bit) & (BITS_PER_LONG - 1))
#define BIT_ALIGN(bit, align) (((bit) + ((align) - 1)) & ~((align) - 1))

#define GENMASK(h, l) \
(((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
Expand Down
3 changes: 3 additions & 0 deletions include/sbi/sbi_heap.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@

#include <sbi/sbi_types.h>

/* Alignment of heap base address and size */
#define HEAP_BASE_ALIGN 1024

struct sbi_scratch;

/** Allocate from heap area */
Expand Down
2 changes: 0 additions & 2 deletions lib/sbi/sbi_heap.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
#include <sbi/sbi_scratch.h>
#include <sbi/sbi_string.h>

/* Alignment of heap base address and size */
#define HEAP_BASE_ALIGN 1024
/* Minimum size and alignment of heap allocations */
#define HEAP_ALLOC_ALIGN 64
#define HEAP_HOUSEKEEPING_FACTOR 16
Expand Down
16 changes: 15 additions & 1 deletion platform/generic/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
#include <libfdt.h>
#include <platform_override.h>
#include <sbi/riscv_asm.h>
#include <sbi/sbi_bitops.h>
#include <sbi/sbi_hartmask.h>
#include <sbi/sbi_heap.h>
#include <sbi/sbi_platform.h>
#include <sbi/sbi_string.h>
#include <sbi/sbi_system.h>
Expand Down Expand Up @@ -54,6 +56,18 @@ static void fw_platform_lookup_special(void *fdt, int root_offset)
}
}

static u32 fw_platform_calculate_heap_size(u32 hart_count)
{
u32 heap_size;

heap_size = SBI_PLATFORM_DEFAULT_HEAP_SIZE(hart_count);

/* For TLB fifo */
heap_size += 0x40 * (hart_count) * (hart_count);

return BIT_ALIGN(heap_size, HEAP_BASE_ALIGN);
}

extern struct sbi_platform platform;
static bool platform_has_mlevel_imsic = false;
static u32 generic_hart_index2id[SBI_HARTMASK_MAX_BITS] = { 0 };
Expand Down Expand Up @@ -115,7 +129,7 @@ unsigned long fw_platform_init(unsigned long arg0, unsigned long arg1,
}

platform.hart_count = hart_count;
platform.heap_size = SBI_PLATFORM_DEFAULT_HEAP_SIZE(hart_count);
platform.heap_size = fw_platform_calculate_heap_size(hart_count);
platform_has_mlevel_imsic = fdt_check_imsic_mlevel(fdt);

/* Return original FDT pointer */
Expand Down

0 comments on commit 87aa306

Please sign in to comment.