aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rini2022-04-06 11:52:17 -0400
committerTom Rini2022-04-06 11:52:17 -0400
commit78df2146d2dfcbfb8713e5cafc3bc766bd10a7e6 (patch)
tree5f3d63ec3381ee4991b7afa0fefa9fa96012a0c9
parent88b6b33253ce4443f23e54ef5424eeb90482ae75 (diff)
parent776e8aca0bad2900dc9c12b87dedb732a9f8e39b (diff)
Merge https://source.denx.de/u-boot/custodians/u-boot-riscv
-rw-r--r--Kconfig2
-rw-r--r--arch/riscv/Kconfig3
-rw-r--r--arch/riscv/include/asm/sbi.h4
-rw-r--r--arch/riscv/lib/sbi.c65
-rw-r--r--board/emulation/qemu-riscv/Kconfig1
-rw-r--r--cmd/riscv/sbi.c14
6 files changed, 84 insertions, 5 deletions
diff --git a/Kconfig b/Kconfig
index 112745440b5..678317e4d3e 100644
--- a/Kconfig
+++ b/Kconfig
@@ -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 ba29e70acf7..78e964db129 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 bfcd2049537..81fcfe0b363 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 d427d1b29ea..8724e3a4600 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 02bf84725b7..d8c57e6bb05 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 c4a9c840f30..8fc8ab0ac51 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)