[PATCH 01/17] platform: Allow platforms to specify heap size
Andrew Jones
ajones at ventanamicro.com
Wed May 31 04:17:02 PDT 2023
On Tue, Apr 25, 2023 at 06:02:14PM +0530, Anup Patel wrote:
> We extend struct sbi_platform and struct sbi_scratch to allow platforms
> specify the heap size to the OpenSBI firmwares. The OpenSBI firmwares
> will use this information to determine the location of heap and provide
> heap base address in per-HART scratch space.
>
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
> ---
> firmware/fw_base.S | 15 +++++++++++++++
> include/sbi/sbi_platform.h | 18 +++++++++++++++---
> include/sbi/sbi_scratch.h | 28 ++++++++++++++++++----------
> platform/fpga/ariane/platform.c | 1 +
> platform/fpga/openpiton/platform.c | 2 ++
> platform/generic/platform.c | 3 ++-
> platform/kendryte/k210/platform.c | 2 ++
> platform/nuclei/ux600/platform.c | 2 ++
> platform/template/platform.c | 1 +
> 9 files changed, 58 insertions(+), 14 deletions(-)
>
> diff --git a/firmware/fw_base.S b/firmware/fw_base.S
> index e37df09..fff09e1 100644
> --- a/firmware/fw_base.S
> +++ b/firmware/fw_base.S
> @@ -255,20 +255,28 @@ _bss_zero:
> /* Preload HART details
> * s7 -> HART Count
> * s8 -> HART Stack Size
> + * s9 -> Heap Size
> + * s10 -> Heap Offset
> */
> lla a4, platform
> #if __riscv_xlen > 32
> lwu s7, SBI_PLATFORM_HART_COUNT_OFFSET(a4)
> lwu s8, SBI_PLATFORM_HART_STACK_SIZE_OFFSET(a4)
> + lwu s9, SBI_PLATFORM_HEAP_SIZE_OFFSET(a4)
> #else
> lw s7, SBI_PLATFORM_HART_COUNT_OFFSET(a4)
> lw s8, SBI_PLATFORM_HART_STACK_SIZE_OFFSET(a4)
> + lw s9, SBI_PLATFORM_HEAP_SIZE_OFFSET(a4)
> #endif
>
> /* Setup scratch space for all the HARTs*/
> lla tp, _fw_end
> mul a5, s7, s8
> add tp, tp, a5
> + /* Setup heap base address */
> + lla s10, _fw_start
> + sub s10, tp, s10
> + add tp, tp, s9
> /* Keep a copy of tp */
> add t3, tp, zero
> /* Counter */
> @@ -283,8 +291,11 @@ _scratch_init:
> * t3 -> the firmware end address
> * s7 -> HART count
> * s8 -> HART stack size
> + * s9 -> Heap Size
> + * s10 -> Heap Offset
> */
> add tp, t3, zero
> + sub tp, tp, s9
> mul a5, s8, t1
> sub tp, tp, a5
> li a5, SBI_SCRATCH_SIZE
> @@ -302,6 +313,10 @@ _scratch_init:
> REG_L a5, 0(a4)
> REG_S a5, SBI_SCRATCH_FW_RW_OFFSET(tp)
>
> + /* Store fw_heap_offset and fw_heap_size in scratch space */
> + REG_S s10, SBI_SCRATCH_FW_HEAP_OFFSET(tp)
> + REG_S s9, SBI_SCRATCH_FW_HEAP_SIZE_OFFSET(tp)
> +
> /* Store next arg1 in scratch space */
> MOV_3R s0, a0, s1, a1, s2, a2
> call fw_next_arg1
> diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
> index 546c0a6..3e9616f 100644
> --- a/include/sbi/sbi_platform.h
> +++ b/include/sbi/sbi_platform.h
> @@ -29,12 +29,16 @@
> #define SBI_PLATFORM_HART_COUNT_OFFSET (0x50)
> /** Offset of hart_stack_size in struct sbi_platform */
> #define SBI_PLATFORM_HART_STACK_SIZE_OFFSET (0x54)
> +/** Offset of heap_size in struct sbi_platform */
> +#define SBI_PLATFORM_HEAP_SIZE_OFFSET (0x58)
> +/** Offset of reserved in struct sbi_platform */
> +#define SBI_PLATFORM_RESERVED_OFFSET (0x5c)
> /** Offset of platform_ops_addr in struct sbi_platform */
> -#define SBI_PLATFORM_OPS_OFFSET (0x58)
> +#define SBI_PLATFORM_OPS_OFFSET (0x60)
> /** Offset of firmware_context in struct sbi_platform */
> -#define SBI_PLATFORM_FIRMWARE_CONTEXT_OFFSET (0x58 + __SIZEOF_POINTER__)
> +#define SBI_PLATFORM_FIRMWARE_CONTEXT_OFFSET (0x60 + __SIZEOF_POINTER__)
> /** Offset of hart_index2id in struct sbi_platform */
> -#define SBI_PLATFORM_HART_INDEX2ID_OFFSET (0x58 + (__SIZEOF_POINTER__ * 2))
> +#define SBI_PLATFORM_HART_INDEX2ID_OFFSET (0x60 + (__SIZEOF_POINTER__ * 2))
>
> #define SBI_PLATFORM_TLB_RANGE_FLUSH_LIMIT_DEFAULT (1UL << 12)
>
> @@ -138,6 +142,10 @@ struct sbi_platform_operations {
> /** Platform default per-HART stack size for exception/interrupt handling */
> #define SBI_PLATFORM_DEFAULT_HART_STACK_SIZE 8192
>
> +/** Platform default heap size */
> +#define SBI_PLATFORM_DEFAULT_HEAP_SIZE(__num_hart) \
> + (0x8000 + 0x800 * (__num_hart))
> +
> /** Representation of a platform */
> struct sbi_platform {
> /**
> @@ -160,6 +168,10 @@ struct sbi_platform {
> u32 hart_count;
> /** Per-HART stack size for exception/interrupt handling */
> u32 hart_stack_size;
> + /** Size of heap shared by all HARTs */
> + u32 heap_size;
> + /** Reserved for future use */
> + u32 reserved;
> /** Pointer to sbi platform operations */
> unsigned long platform_ops_addr;
> /** Pointer to system firmware specific context */
> diff --git a/include/sbi/sbi_scratch.h b/include/sbi/sbi_scratch.h
> index 2966188..2376995 100644
> --- a/include/sbi/sbi_scratch.h
> +++ b/include/sbi/sbi_scratch.h
> @@ -20,26 +20,30 @@
> #define SBI_SCRATCH_FW_SIZE_OFFSET (1 * __SIZEOF_POINTER__)
> /** Offset (in sbi_scratch) of the R/W Offset */
> #define SBI_SCRATCH_FW_RW_OFFSET (2 * __SIZEOF_POINTER__)
> +/** Offset of fw_heap_offset member in sbi_scratch */
> +#define SBI_SCRATCH_FW_HEAP_OFFSET (3 * __SIZEOF_POINTER__)
> +/** Offset of fw_heap_size_offset member in sbi_scratch */
> +#define SBI_SCRATCH_FW_HEAP_SIZE_OFFSET (4 * __SIZEOF_POINTER__)
> /** Offset of next_arg1 member in sbi_scratch */
> -#define SBI_SCRATCH_NEXT_ARG1_OFFSET (3 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_NEXT_ARG1_OFFSET (5 * __SIZEOF_POINTER__)
> /** Offset of next_addr member in sbi_scratch */
> -#define SBI_SCRATCH_NEXT_ADDR_OFFSET (4 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_NEXT_ADDR_OFFSET (6 * __SIZEOF_POINTER__)
> /** Offset of next_mode member in sbi_scratch */
> -#define SBI_SCRATCH_NEXT_MODE_OFFSET (5 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_NEXT_MODE_OFFSET (7 * __SIZEOF_POINTER__)
> /** Offset of warmboot_addr member in sbi_scratch */
> -#define SBI_SCRATCH_WARMBOOT_ADDR_OFFSET (6 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_WARMBOOT_ADDR_OFFSET (8 * __SIZEOF_POINTER__)
> /** Offset of platform_addr member in sbi_scratch */
> -#define SBI_SCRATCH_PLATFORM_ADDR_OFFSET (7 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_PLATFORM_ADDR_OFFSET (9 * __SIZEOF_POINTER__)
> /** Offset of hartid_to_scratch member in sbi_scratch */
> -#define SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET (8 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET (10 * __SIZEOF_POINTER__)
> /** Offset of trap_exit member in sbi_scratch */
> -#define SBI_SCRATCH_TRAP_EXIT_OFFSET (9 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_TRAP_EXIT_OFFSET (11 * __SIZEOF_POINTER__)
> /** Offset of tmp0 member in sbi_scratch */
> -#define SBI_SCRATCH_TMP0_OFFSET (10 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_TMP0_OFFSET (12 * __SIZEOF_POINTER__)
> /** Offset of options member in sbi_scratch */
> -#define SBI_SCRATCH_OPTIONS_OFFSET (11 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_OPTIONS_OFFSET (13 * __SIZEOF_POINTER__)
> /** Offset of extra space in sbi_scratch */
> -#define SBI_SCRATCH_EXTRA_SPACE_OFFSET (12 * __SIZEOF_POINTER__)
> +#define SBI_SCRATCH_EXTRA_SPACE_OFFSET (14 * __SIZEOF_POINTER__)
> /** Maximum size of sbi_scratch (4KB) */
> #define SBI_SCRATCH_SIZE (0x1000)
>
> @@ -57,6 +61,10 @@ struct sbi_scratch {
> unsigned long fw_size;
> /** Offset (in bytes) of the R/W section */
> unsigned long fw_rw_offset;
> + /** Offset (in bytes) of the heap area */
> + unsigned long fw_heap_offset;
> + /** Size (in bytes) of the heap area */
> + unsigned long fw_heap_size;
> /** Arg1 (or 'a1' register) of next booting stage for this HART */
> unsigned long next_arg1;
> /** Address of next booting stage for this HART */
> diff --git a/platform/fpga/ariane/platform.c b/platform/fpga/ariane/platform.c
> index 1e341c2..975528f 100644
> --- a/platform/fpga/ariane/platform.c
> +++ b/platform/fpga/ariane/platform.c
> @@ -185,5 +185,6 @@ const struct sbi_platform platform = {
> .features = SBI_PLATFORM_DEFAULT_FEATURES,
> .hart_count = ARIANE_HART_COUNT,
> .hart_stack_size = SBI_PLATFORM_DEFAULT_HART_STACK_SIZE,
> + .heap_size = SBI_PLATFORM_DEFAULT_HEAP_SIZE(ARIANE_HART_COUNT),
> .platform_ops_addr = (unsigned long)&platform_ops
> };
> diff --git a/platform/fpga/openpiton/platform.c b/platform/fpga/openpiton/platform.c
> index 57ae698..e59dc99 100644
> --- a/platform/fpga/openpiton/platform.c
> +++ b/platform/fpga/openpiton/platform.c
> @@ -220,5 +220,7 @@ const struct sbi_platform platform = {
> .features = SBI_PLATFORM_DEFAULT_FEATURES,
> .hart_count = OPENPITON_DEFAULT_HART_COUNT,
> .hart_stack_size = SBI_PLATFORM_DEFAULT_HART_STACK_SIZE,
> + .heap_size =
> + SBI_PLATFORM_DEFAULT_HEAP_SIZE(OPENPITON_DEFAULT_HART_COUNT),
> .platform_ops_addr = (unsigned long)&platform_ops
> };
> diff --git a/platform/generic/platform.c b/platform/generic/platform.c
> index eeefef4..0c9cd95 100644
> --- a/platform/generic/platform.c
> +++ b/platform/generic/platform.c
> @@ -115,7 +115,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_has_mlevel_imsic = fdt_check_imsic_mlevel(fdt);
>
> /* Return original FDT pointer */
> @@ -315,5 +315,6 @@ struct sbi_platform platform = {
> .hart_count = SBI_HARTMASK_MAX_BITS,
> .hart_index2id = generic_hart_index2id,
> .hart_stack_size = SBI_PLATFORM_DEFAULT_HART_STACK_SIZE,
> + .heap_size = SBI_PLATFORM_DEFAULT_HEAP_SIZE(0),
Presumably I'll see later in the series how the generic platform expands
its heap for the number of harts.
> .platform_ops_addr = (unsigned long)&platform_ops
> };
> diff --git a/platform/kendryte/k210/platform.c b/platform/kendryte/k210/platform.c
> index 7eb9015..637a217 100644
> --- a/platform/kendryte/k210/platform.c
> +++ b/platform/kendryte/k210/platform.c
> @@ -196,5 +196,7 @@ const struct sbi_platform platform = {
> .features = 0,
> .hart_count = K210_HART_COUNT,
> .hart_stack_size = SBI_PLATFORM_DEFAULT_HART_STACK_SIZE,
> + .heap_size =
> + SBI_PLATFORM_DEFAULT_HEAP_SIZE(K210_HART_COUNT),
> .platform_ops_addr = (unsigned long)&platform_ops
> };
> diff --git a/platform/nuclei/ux600/platform.c b/platform/nuclei/ux600/platform.c
> index 4eccff1..6fd6cd7 100644
> --- a/platform/nuclei/ux600/platform.c
> +++ b/platform/nuclei/ux600/platform.c
> @@ -244,5 +244,7 @@ const struct sbi_platform platform = {
> .features = SBI_PLATFORM_DEFAULT_FEATURES,
> .hart_count = UX600_HART_COUNT,
> .hart_stack_size = SBI_PLATFORM_DEFAULT_HART_STACK_SIZE,
> + .heap_size =
> + SBI_PLATFORM_DEFAULT_HEAP_SIZE(UX600_HART_COUNT),
> .platform_ops_addr = (unsigned long)&platform_ops
> };
> diff --git a/platform/template/platform.c b/platform/template/platform.c
> index 8adc431..86381ca 100644
> --- a/platform/template/platform.c
> +++ b/platform/template/platform.c
> @@ -152,5 +152,6 @@ const struct sbi_platform platform = {
> .features = SBI_PLATFORM_DEFAULT_FEATURES,
> .hart_count = 1,
> .hart_stack_size = SBI_PLATFORM_DEFAULT_HART_STACK_SIZE,
> + .heap_size = SBI_PLATFORM_DEFAULT_HEAP_SIZE(1),
> .platform_ops_addr = (unsigned long)&platform_ops
> };
> --
> 2.34.1
>
>
Reviewed-by: Andrew Jones <ajones at ventanamicro.com>
More information about the opensbi
mailing list