1 /*
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2019 Western Digital Corporation or its affiliates.
5  *
6  * Authors:
7  *   Anup Patel <anup.patel@wdc.com>
8  */
9 
10 #ifndef __SBI_ECALL_H__
11 #define __SBI_ECALL_H__
12 
13 #include <sbi/sbi_types.h>
14 #include <sbi/sbi_list.h>
15 
16 #define SBI_ECALL_VERSION_MAJOR		0
17 #define SBI_ECALL_VERSION_MINOR		2
18 #define SBI_OPENSBI_IMPID		1
19 
20 struct sbi_trap_regs;
21 struct sbi_trap_info;
22 
23 struct sbi_ecall_extension {
24 	struct sbi_dlist head;
25 	unsigned long extid_start;
26 	unsigned long extid_end;
27 	int (* probe)(unsigned long extid, unsigned long *out_val);
28 	int (* handle)(unsigned long extid, unsigned long funcid,
29 		       unsigned long *args, unsigned long *out_val,
30 		       struct sbi_trap_info *out_trap);
31 };
32 
33 extern struct sbi_ecall_extension ecall_base;
34 extern struct sbi_ecall_extension ecall_legacy;
35 extern struct sbi_ecall_extension ecall_time;
36 extern struct sbi_ecall_extension ecall_rfence;
37 extern struct sbi_ecall_extension ecall_ipi;
38 extern struct sbi_ecall_extension ecall_vendor;
39 extern struct sbi_ecall_extension ecall_hsm;
40 
41 u16 sbi_ecall_version_major(void);
42 
43 u16 sbi_ecall_version_minor(void);
44 
45 unsigned long sbi_ecall_get_impid(void);
46 
47 void sbi_ecall_set_impid(unsigned long impid);
48 
49 struct sbi_ecall_extension *sbi_ecall_find_extension(unsigned long extid);
50 
51 int sbi_ecall_register_extension(struct sbi_ecall_extension *ext);
52 
53 void sbi_ecall_unregister_extension(struct sbi_ecall_extension *ext);
54 
55 int sbi_ecall_handler(struct sbi_trap_regs *regs);
56 
57 int sbi_ecall_init(void);
58 
59 #endif
60