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 struct sbi_scratch;
23 
24 struct sbi_ecall_extension {
25 	struct sbi_dlist head;
26 	unsigned long extid_start;
27 	unsigned long extid_end;
28 	int (* probe)(struct sbi_scratch *scratch,
29 		      unsigned long extid, unsigned long *out_val);
30 	int (* handle)(struct sbi_scratch *scratch,
31 		       unsigned long extid, unsigned long funcid,
32 		       unsigned long *args, unsigned long *out_val,
33 		       struct sbi_trap_info *out_trap);
34 };
35 
36 extern struct sbi_ecall_extension ecall_base;
37 extern struct sbi_ecall_extension ecall_legacy;
38 extern struct sbi_ecall_extension ecall_time;
39 extern struct sbi_ecall_extension ecall_rfence;
40 extern struct sbi_ecall_extension ecall_ipi;
41 extern struct sbi_ecall_extension ecall_vendor;
42 
43 u16 sbi_ecall_version_major(void);
44 
45 u16 sbi_ecall_version_minor(void);
46 
47 struct sbi_ecall_extension *sbi_ecall_find_extension(unsigned long extid);
48 
49 int sbi_ecall_register_extension(struct sbi_ecall_extension *ext);
50 
51 void sbi_ecall_unregister_extension(struct sbi_ecall_extension *ext);
52 
53 int sbi_ecall_handler(u32 hartid, ulong mcause, struct sbi_trap_regs *regs,
54 		      struct sbi_scratch *scratch);
55 
56 int sbi_ecall_init(void);
57 
58 #endif
59