1 #ifndef __LIBHVCALL_H__
2 #define __LIBHVCALL_H__
3 
4 #define H_SUCCESS		0
5 #define H_HARDWARE		-1
6 #define H_PRIVILEGE		-3   /* Caller not privileged */
7 
8 #define H_GET_TCE		0x1C
9 #define H_PUT_TCE		0x20
10 #define H_LOGICAL_CI_LOAD	0x3c
11 #define H_LOGICAL_CI_STORE	0x40
12 #define H_GET_TERM_CHAR		0x54
13 #define H_PUT_TERM_CHAR		0x58
14 #define H_REG_CRQ		0xFC
15 #define H_FREE_CRQ		0x100
16 #define H_SEND_CRQ		0x108
17 #define H_REGISTER_LOGICAL_LAN	0x114
18 #define H_FREE_LOGICAL_LAN	0x118
19 #define H_ADD_LOGICAL_LAN_BUFFER 0x11C
20 #define H_SEND_LOGICAL_LAN	0x120
21 
22 /* KVM specific ones */
23 #define KVMPPC_HCALL_BASE       0xf000
24 #define KVMPPC_H_RTAS           (KVMPPC_HCALL_BASE + 0x0)
25 #define KVMPPC_H_LOGICAL_MEMOP  (KVMPPC_HCALL_BASE + 0x1)
26 /* Client Architecture support */
27 #define KVMPPC_H_CAS            (KVMPPC_HCALL_BASE + 0x2)
28 #define KVMPPC_H_UPDATE_DT      (KVMPPC_HCALL_BASE + 0x3)
29 #define KVMPPC_HCALL_MAX        KVMPPC_H_UPDATE_DT
30 
31 #ifndef __ASSEMBLY__
32 
33 extern long hv_generic(unsigned long opcode, ...);
34 
35 extern void hv_putchar(char c, int hvtermno);
36 extern char hv_getchar(int hvtermno);
37 extern char hv_haschar(int hvtermno);
38 extern void get_print_banner(unsigned long addr);
39 
40 extern int hv_send_crq(unsigned int unit, uint64_t *msgaddr);
41 
hv_reg_crq(unsigned int unit,unsigned long qaddr,unsigned long qsize)42 static inline long hv_reg_crq(unsigned int unit, unsigned long qaddr,
43 			      unsigned long qsize)
44 {
45 	return hv_generic(H_REG_CRQ, unit, qaddr, qsize);
46 }
47 
hv_free_crq(unsigned int unit)48 static inline void hv_free_crq(unsigned int unit)
49 {
50 	hv_generic(H_FREE_CRQ, unit);
51 }
52 
53 extern long  hv_send_logical_lan(unsigned long unit_address,
54 				 unsigned long desc1, unsigned long desc2,
55 				 unsigned long desc3, unsigned long desc4,
56 				 unsigned long desc5, unsigned long desc6);
57 
h_register_logical_lan(unsigned long unit_address,unsigned long buf_list,unsigned long rec_q,unsigned long filter_list,unsigned long mac_address)58 static inline long h_register_logical_lan(unsigned long unit_address,
59 					  unsigned long buf_list,
60 					  unsigned long rec_q,
61 					  unsigned long filter_list,
62 					  unsigned long mac_address)
63 {
64 	return hv_generic(H_REGISTER_LOGICAL_LAN, unit_address,
65 			  buf_list, rec_q, filter_list, mac_address);
66 }
67 
h_free_logical_lan(unsigned long unit_address)68 static inline long h_free_logical_lan(unsigned long unit_address)
69 {
70 	return hv_generic(H_FREE_LOGICAL_LAN, unit_address);
71 }
72 
h_add_logical_lan_buffer(unsigned long unit_address,unsigned long buffer)73 static inline long h_add_logical_lan_buffer(unsigned long unit_address,
74 					    unsigned long buffer)
75 {
76 	return hv_generic(H_ADD_LOGICAL_LAN_BUFFER, unit_address, buffer);
77 }
78 
79 #define HV_RTAS_MAX_ARGRET	5
80 
81 struct hv_rtas_call {
82 	uint32_t token;
83 	uint32_t nargs;
84 	uint32_t nrets;
85 	uint32_t argret[HV_RTAS_MAX_ARGRET];
86 };
87 
h_rtas(struct hv_rtas_call * rtas_buf)88 static inline unsigned long h_rtas(struct hv_rtas_call *rtas_buf)
89 {
90 	return hv_generic(KVMPPC_H_RTAS, (unsigned long)rtas_buf);
91 }
92 
93 extern unsigned long hv_logical_ci_load(unsigned long size, unsigned long addr);
94 extern unsigned long hv_logical_ci_store(unsigned long size, unsigned long addr,
95 					 unsigned long value);
96 
97 extern unsigned long hv_logical_memop(unsigned long dst, unsigned long src,
98 				      unsigned long esize, unsigned long count,
99 				      unsigned long op);
100 extern int check_broken_sc1(void);
101 extern int patch_broken_sc1(void *start, void *end, uint32_t *test_ins);
102 
103 extern unsigned long hv_cas(unsigned long vec, unsigned long buf,
104 			unsigned long size);
105 
106 extern unsigned long hv_rtas(unsigned long params);
107 extern unsigned long hv_rtas_broken_sc1(unsigned long params);
108 extern unsigned int hv_rtas_size, hv_rtas_broken_sc1_size;
109 
110 #endif /* __ASSEMBLY__ */
111 
112 #endif /* __LIBHVCALL_H__ */
113