diff options
author | Tom Rini <trini@konsulko.com> | 2022-04-06 11:52:17 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2022-04-06 11:52:17 -0400 |
commit | 78df2146d2dfcbfb8713e5cafc3bc766bd10a7e6 (patch) | |
tree | 5f3d63ec3381ee4991b7afa0fefa9fa96012a0c9 | |
parent | 88b6b33253ce4443f23e54ef5424eeb90482ae75 (diff) | |
parent | 776e8aca0bad2900dc9c12b87dedb732a9f8e39b (diff) |
Merge https://source.denx.de/u-boot/custodians/u-boot-riscv
-rw-r--r-- | Kconfig | 2 | ||||
-rw-r--r-- | arch/riscv/Kconfig | 3 | ||||
-rw-r--r-- | arch/riscv/include/asm/sbi.h | 4 | ||||
-rw-r--r-- | arch/riscv/lib/sbi.c | 65 | ||||
-rw-r--r-- | board/emulation/qemu-riscv/Kconfig | 1 | ||||
-rw-r--r-- | cmd/riscv/sbi.c | 14 |
6 files changed, 84 insertions, 5 deletions
@@ -248,7 +248,7 @@ config SYS_MALLOC_F_LEN hex "Size of malloc() pool before relocation" depends on SYS_MALLOC_F default 0x1000 if AM33XX - default 0x4000 if SANDBOX + default 0x4000 if SANDBOX || RISCV default 0x2000 if (ARCH_IMX8 || ARCH_IMX8M || ARCH_MX7 || \ ARCH_MX7ULP || ARCH_MX6 || ARCH_MX5 || \ ARCH_LS1012A || ARCH_LS1021A || ARCH_LS1043A || \ diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index ba29e70acf..78e964db12 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -195,9 +195,6 @@ config ANDES_PLIC The Andes PLIC block holds memory-mapped claim and pending registers associated with software interrupt. -config SYS_MALLOC_F_LEN - default 0x1000 - config SMP bool "Symmetric Multi-Processing" depends on SBI_V01 || !RISCV_SMODE diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index bfcd204953..81fcfe0b36 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -27,6 +27,7 @@ enum sbi_ext_id { SBI_EXT_RFENCE = 0x52464E43, SBI_EXT_HSM = 0x48534D, SBI_EXT_SRST = 0x53525354, + SBI_EXT_PMU = 0x504D55, }; enum sbi_ext_base_fid { @@ -154,6 +155,9 @@ long sbi_get_spec_version(void); int sbi_get_impl_id(void); int sbi_get_impl_version(long *version); int sbi_probe_extension(int ext); +int sbi_get_mvendorid(long *mvendorid); +int sbi_get_marchid(long *marchid); +int sbi_get_mimpid(long *mimpid); void sbi_srst_reset(unsigned long type, unsigned long reason); #endif diff --git a/arch/riscv/lib/sbi.c b/arch/riscv/lib/sbi.c index d427d1b29e..8724e3a460 100644 --- a/arch/riscv/lib/sbi.c +++ b/arch/riscv/lib/sbi.c @@ -128,6 +128,71 @@ int sbi_probe_extension(int extid) } /** + * sbi_get_mvendorid() - get machine vendor ID + * + * @mimpid: on return machine vendor ID + * Return: 0 on success + */ +int sbi_get_mvendorid(long *mvendorid) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_MVENDORID, + 0, 0, 0, 0, 0, 0); + if (ret.error) + return -ENOTSUPP; + + if (mvendorid) + *mvendorid = ret.value; + + return 0; +} + +/** + * sbi_get_marchid() - get machine architecture ID + * + * @mimpid: on return machine architecture ID + * Return: 0 on success + */ +int sbi_get_marchid(long *marchid) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_MARCHID, + 0, 0, 0, 0, 0, 0); + + if (ret.error) + return -ENOTSUPP; + + if (marchid) + *marchid = ret.value; + + return 0; +} + +/** + * sbi_get_mimpid() - get machine implementation ID + * + * @mimpid: on return machine implementation ID + * Return: 0 on success + */ +int sbi_get_mimpid(long *mimpid) +{ + struct sbiret ret; + + ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_GET_MIMPID, + 0, 0, 0, 0, 0, 0); + + if (ret.error) + return -ENOTSUPP; + + if (mimpid) + *mimpid = ret.value; + + return 0; +} + +/** * sbi_srst_reset() - invoke system reset extension * * @type: type of reset diff --git a/board/emulation/qemu-riscv/Kconfig b/board/emulation/qemu-riscv/Kconfig index 02bf84725b..d8c57e6bb0 100644 --- a/board/emulation/qemu-riscv/Kconfig +++ b/board/emulation/qemu-riscv/Kconfig @@ -37,6 +37,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy imply SPL_RAM_DEVICE imply CMD_PCI imply CMD_POWEROFF + imply CMD_SBI imply CMD_SCSI imply CMD_PING imply CMD_EXT2 diff --git a/cmd/riscv/sbi.c b/cmd/riscv/sbi.c index c4a9c840f3..8fc8ab0ac5 100644 --- a/cmd/riscv/sbi.c +++ b/cmd/riscv/sbi.c @@ -44,6 +44,7 @@ static struct sbi_ext extensions[] = { { SBI_EXT_RFENCE, "RFENCE Extension" }, { SBI_EXT_HSM, "Hart State Management Extension" }, { SBI_EXT_SRST, "System Reset Extension" }, + { SBI_EXT_PMU, "Performance Monitoring Unit Extension" }, }; static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, @@ -51,6 +52,7 @@ static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, { int i, impl_id; long ret; + long mvendorid, marchid, mimpid; ret = sbi_get_spec_version(); if (ret >= 0) @@ -76,7 +78,17 @@ static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc, if (i == ARRAY_SIZE(implementations)) printf("Unknown implementation ID %ld", ret); } - printf("\nExtensions:\n"); + printf("\nMachine:\n"); + ret = sbi_get_mvendorid(&mvendorid); + if (!ret) + printf(" Vendor ID %lx\n", mvendorid); + ret = sbi_get_marchid(&marchid); + if (!ret) + printf(" Architecture ID %lx\n", marchid); + ret = sbi_get_mimpid(&mimpid); + if (!ret) + printf(" Implementation ID %lx\n", mimpid); + printf("Extensions:\n"); for (i = 0; i < ARRAY_SIZE(extensions); ++i) { ret = sbi_probe_extension(extensions[i].id); if (ret > 0) |