forked from Mirrors/opensbi
		
	lib: sbi_ecall: Generate extensions list with carray
Instead of hard-coding the list of extensions in C code, use carray to generate the list of extensions. Using carray makes adding and removing extensions slightly cleaner. This also paves the way for using Kconfig to disable unneeded extensions. Signed-off-by: Vivian Wang <dramforever@live.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
		@@ -12,17 +12,31 @@ libsbi-objs-y += riscv_atomic.o
 | 
			
		||||
libsbi-objs-y += riscv_hardfp.o
 | 
			
		||||
libsbi-objs-y += riscv_locks.o
 | 
			
		||||
 | 
			
		||||
libsbi-objs-y += sbi_bitmap.o
 | 
			
		||||
libsbi-objs-y += sbi_bitops.o
 | 
			
		||||
libsbi-objs-y += sbi_console.o
 | 
			
		||||
libsbi-objs-y += sbi_domain.o
 | 
			
		||||
libsbi-objs-y += sbi_ecall.o
 | 
			
		||||
libsbi-objs-y += sbi_ecall_exts.o
 | 
			
		||||
 | 
			
		||||
# The order of below extensions is performance optimized
 | 
			
		||||
carray-sbi_ecall_exts-y += ecall_time
 | 
			
		||||
carray-sbi_ecall_exts-y += ecall_rfence
 | 
			
		||||
carray-sbi_ecall_exts-y += ecall_ipi
 | 
			
		||||
carray-sbi_ecall_exts-y += ecall_base
 | 
			
		||||
carray-sbi_ecall_exts-y += ecall_hsm
 | 
			
		||||
carray-sbi_ecall_exts-y += ecall_srst
 | 
			
		||||
carray-sbi_ecall_exts-y += ecall_pmu
 | 
			
		||||
carray-sbi_ecall_exts-y += ecall_legacy
 | 
			
		||||
carray-sbi_ecall_exts-y += ecall_vendor
 | 
			
		||||
 | 
			
		||||
libsbi-objs-y += sbi_ecall_base.o
 | 
			
		||||
libsbi-objs-y += sbi_ecall_hsm.o
 | 
			
		||||
libsbi-objs-y += sbi_ecall_legacy.o
 | 
			
		||||
libsbi-objs-y += sbi_ecall_pmu.o
 | 
			
		||||
libsbi-objs-y += sbi_ecall_replace.o
 | 
			
		||||
libsbi-objs-y += sbi_ecall_vendor.o
 | 
			
		||||
 | 
			
		||||
libsbi-objs-y += sbi_bitmap.o
 | 
			
		||||
libsbi-objs-y += sbi_bitops.o
 | 
			
		||||
libsbi-objs-y += sbi_console.o
 | 
			
		||||
libsbi-objs-y += sbi_domain.o
 | 
			
		||||
libsbi-objs-y += sbi_emulate_csr.o
 | 
			
		||||
libsbi-objs-y += sbi_fifo.o
 | 
			
		||||
libsbi-objs-y += sbi_hart.o
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,9 @@
 | 
			
		||||
#include <sbi/sbi_error.h>
 | 
			
		||||
#include <sbi/sbi_trap.h>
 | 
			
		||||
 | 
			
		||||
extern struct sbi_ecall_extension *sbi_ecall_exts[];
 | 
			
		||||
extern unsigned long sbi_ecall_exts_size;
 | 
			
		||||
 | 
			
		||||
u16 sbi_ecall_version_major(void)
 | 
			
		||||
{
 | 
			
		||||
	return SBI_ECALL_VERSION_MAJOR;
 | 
			
		||||
@@ -144,35 +147,15 @@ int sbi_ecall_handler(struct sbi_trap_regs *regs)
 | 
			
		||||
int sbi_ecall_init(void)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
	struct sbi_ecall_extension *ext;
 | 
			
		||||
	unsigned long i;
 | 
			
		||||
 | 
			
		||||
	/* The order of below registrations is performance optimized */
 | 
			
		||||
	ret = sbi_ecall_register_extension(&ecall_time);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
	ret = sbi_ecall_register_extension(&ecall_rfence);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
	ret = sbi_ecall_register_extension(&ecall_ipi);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
	ret = sbi_ecall_register_extension(&ecall_base);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
	ret = sbi_ecall_register_extension(&ecall_hsm);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
	ret = sbi_ecall_register_extension(&ecall_srst);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
	ret = sbi_ecall_register_extension(&ecall_pmu);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
	ret = sbi_ecall_register_extension(&ecall_legacy);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
	ret = sbi_ecall_register_extension(&ecall_vendor);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
	for (i = 0; i < sbi_ecall_exts_size; i++) {
 | 
			
		||||
		ext = sbi_ecall_exts[i];
 | 
			
		||||
		ret = sbi_ecall_register_extension(ext);
 | 
			
		||||
		if (ret)
 | 
			
		||||
			return ret;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								lib/sbi/sbi_ecall_exts.carray
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								lib/sbi/sbi_ecall_exts.carray
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
HEADER: sbi/sbi_ecall.h
 | 
			
		||||
TYPE: struct sbi_ecall_extension
 | 
			
		||||
NAME: sbi_ecall_exts
 | 
			
		||||
		Reference in New Issue
	
	Block a user