xref: /openbmc/linux/drivers/virt/acrn/hypercall.h (revision ce011e13)
19c5137aeSShuo Liu /* SPDX-License-Identifier: GPL-2.0 */
29c5137aeSShuo Liu /*
39c5137aeSShuo Liu  * ACRN HSM: hypercalls of ACRN Hypervisor
49c5137aeSShuo Liu  */
59c5137aeSShuo Liu #ifndef __ACRN_HSM_HYPERCALL_H
69c5137aeSShuo Liu #define __ACRN_HSM_HYPERCALL_H
79c5137aeSShuo Liu #include <asm/acrn.h>
89c5137aeSShuo Liu 
99c5137aeSShuo Liu /*
109c5137aeSShuo Liu  * Hypercall IDs of the ACRN Hypervisor
119c5137aeSShuo Liu  */
129c5137aeSShuo Liu #define _HC_ID(x, y) (((x) << 24) | (y))
139c5137aeSShuo Liu 
149c5137aeSShuo Liu #define HC_ID 0x80UL
159c5137aeSShuo Liu 
169c5137aeSShuo Liu #define HC_ID_VM_BASE			0x10UL
179c5137aeSShuo Liu #define HC_CREATE_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x00)
189c5137aeSShuo Liu #define HC_DESTROY_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x01)
199c5137aeSShuo Liu #define HC_START_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x02)
209c5137aeSShuo Liu #define HC_PAUSE_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x03)
219c5137aeSShuo Liu #define HC_RESET_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x05)
222ad2aaeeSShuo Liu #define HC_SET_VCPU_REGS		_HC_ID(HC_ID, HC_ID_VM_BASE + 0x06)
239c5137aeSShuo Liu 
2472f293deSShuo Liu #define HC_ID_IOREQ_BASE		0x30UL
2572f293deSShuo Liu #define HC_SET_IOREQ_BUFFER		_HC_ID(HC_ID, HC_ID_IOREQ_BASE + 0x00)
2672f293deSShuo Liu #define HC_NOTIFY_REQUEST_FINISH	_HC_ID(HC_ID, HC_ID_IOREQ_BASE + 0x01)
2772f293deSShuo Liu 
2888f537d5SShuo Liu #define HC_ID_MEM_BASE			0x40UL
2988f537d5SShuo Liu #define HC_VM_SET_MEMORY_REGIONS	_HC_ID(HC_ID, HC_ID_MEM_BASE + 0x02)
3088f537d5SShuo Liu 
31*ce011e13SShuo Liu #define HC_ID_PCI_BASE			0x50UL
32*ce011e13SShuo Liu #define HC_SET_PTDEV_INTR		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x03)
33*ce011e13SShuo Liu #define HC_RESET_PTDEV_INTR		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x04)
34*ce011e13SShuo Liu #define HC_ASSIGN_PCIDEV		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x05)
35*ce011e13SShuo Liu #define HC_DEASSIGN_PCIDEV		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x06)
36*ce011e13SShuo Liu 
379c5137aeSShuo Liu /**
389c5137aeSShuo Liu  * hcall_create_vm() - Create a User VM
399c5137aeSShuo Liu  * @vminfo:	Service VM GPA of info of User VM creation
409c5137aeSShuo Liu  *
419c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
429c5137aeSShuo Liu  */
439c5137aeSShuo Liu static inline long hcall_create_vm(u64 vminfo)
449c5137aeSShuo Liu {
459c5137aeSShuo Liu 	return acrn_hypercall1(HC_CREATE_VM, vminfo);
469c5137aeSShuo Liu }
479c5137aeSShuo Liu 
489c5137aeSShuo Liu /**
499c5137aeSShuo Liu  * hcall_start_vm() - Start a User VM
509c5137aeSShuo Liu  * @vmid:	User VM ID
519c5137aeSShuo Liu  *
529c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
539c5137aeSShuo Liu  */
549c5137aeSShuo Liu static inline long hcall_start_vm(u64 vmid)
559c5137aeSShuo Liu {
569c5137aeSShuo Liu 	return acrn_hypercall1(HC_START_VM, vmid);
579c5137aeSShuo Liu }
589c5137aeSShuo Liu 
599c5137aeSShuo Liu /**
609c5137aeSShuo Liu  * hcall_pause_vm() - Pause a User VM
619c5137aeSShuo Liu  * @vmid:	User VM ID
629c5137aeSShuo Liu  *
639c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
649c5137aeSShuo Liu  */
659c5137aeSShuo Liu static inline long hcall_pause_vm(u64 vmid)
669c5137aeSShuo Liu {
679c5137aeSShuo Liu 	return acrn_hypercall1(HC_PAUSE_VM, vmid);
689c5137aeSShuo Liu }
699c5137aeSShuo Liu 
709c5137aeSShuo Liu /**
719c5137aeSShuo Liu  * hcall_destroy_vm() - Destroy a User VM
729c5137aeSShuo Liu  * @vmid:	User VM ID
739c5137aeSShuo Liu  *
749c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
759c5137aeSShuo Liu  */
769c5137aeSShuo Liu static inline long hcall_destroy_vm(u64 vmid)
779c5137aeSShuo Liu {
789c5137aeSShuo Liu 	return acrn_hypercall1(HC_DESTROY_VM, vmid);
799c5137aeSShuo Liu }
809c5137aeSShuo Liu 
819c5137aeSShuo Liu /**
829c5137aeSShuo Liu  * hcall_reset_vm() - Reset a User VM
839c5137aeSShuo Liu  * @vmid:	User VM ID
849c5137aeSShuo Liu  *
859c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
869c5137aeSShuo Liu  */
879c5137aeSShuo Liu static inline long hcall_reset_vm(u64 vmid)
889c5137aeSShuo Liu {
899c5137aeSShuo Liu 	return acrn_hypercall1(HC_RESET_VM, vmid);
909c5137aeSShuo Liu }
919c5137aeSShuo Liu 
922ad2aaeeSShuo Liu /**
932ad2aaeeSShuo Liu  * hcall_set_vcpu_regs() - Set up registers of virtual CPU of a User VM
942ad2aaeeSShuo Liu  * @vmid:	User VM ID
952ad2aaeeSShuo Liu  * @regs_state:	Service VM GPA of registers state
962ad2aaeeSShuo Liu  *
972ad2aaeeSShuo Liu  * Return: 0 on success, <0 on failure
982ad2aaeeSShuo Liu  */
992ad2aaeeSShuo Liu static inline long hcall_set_vcpu_regs(u64 vmid, u64 regs_state)
1002ad2aaeeSShuo Liu {
1012ad2aaeeSShuo Liu 	return acrn_hypercall2(HC_SET_VCPU_REGS, vmid, regs_state);
1022ad2aaeeSShuo Liu }
1032ad2aaeeSShuo Liu 
10488f537d5SShuo Liu /**
10572f293deSShuo Liu  * hcall_set_ioreq_buffer() - Set up the shared buffer for I/O Requests.
10672f293deSShuo Liu  * @vmid:	User VM ID
10772f293deSShuo Liu  * @buffer:	Service VM GPA of the shared buffer
10872f293deSShuo Liu  *
10972f293deSShuo Liu  * Return: 0 on success, <0 on failure
11072f293deSShuo Liu  */
11172f293deSShuo Liu static inline long hcall_set_ioreq_buffer(u64 vmid, u64 buffer)
11272f293deSShuo Liu {
11372f293deSShuo Liu 	return acrn_hypercall2(HC_SET_IOREQ_BUFFER, vmid, buffer);
11472f293deSShuo Liu }
11572f293deSShuo Liu 
11672f293deSShuo Liu /**
11772f293deSShuo Liu  * hcall_notify_req_finish() - Notify ACRN Hypervisor of I/O request completion.
11872f293deSShuo Liu  * @vmid:	User VM ID
11972f293deSShuo Liu  * @vcpu:	The vCPU which initiated the I/O request
12072f293deSShuo Liu  *
12172f293deSShuo Liu  * Return: 0 on success, <0 on failure
12272f293deSShuo Liu  */
12372f293deSShuo Liu static inline long hcall_notify_req_finish(u64 vmid, u64 vcpu)
12472f293deSShuo Liu {
12572f293deSShuo Liu 	return acrn_hypercall2(HC_NOTIFY_REQUEST_FINISH, vmid, vcpu);
12672f293deSShuo Liu }
12772f293deSShuo Liu 
12872f293deSShuo Liu /**
12988f537d5SShuo Liu  * hcall_set_memory_regions() - Inform the hypervisor to set up EPT mappings
13088f537d5SShuo Liu  * @regions_pa:	Service VM GPA of &struct vm_memory_region_batch
13188f537d5SShuo Liu  *
13288f537d5SShuo Liu  * Return: 0 on success, <0 on failure
13388f537d5SShuo Liu  */
13488f537d5SShuo Liu static inline long hcall_set_memory_regions(u64 regions_pa)
13588f537d5SShuo Liu {
13688f537d5SShuo Liu 	return acrn_hypercall1(HC_VM_SET_MEMORY_REGIONS, regions_pa);
13788f537d5SShuo Liu }
13888f537d5SShuo Liu 
139*ce011e13SShuo Liu /**
140*ce011e13SShuo Liu  * hcall_assign_pcidev() - Assign a PCI device to a User VM
141*ce011e13SShuo Liu  * @vmid:	User VM ID
142*ce011e13SShuo Liu  * @addr:	Service VM GPA of the &struct acrn_pcidev
143*ce011e13SShuo Liu  *
144*ce011e13SShuo Liu  * Return: 0 on success, <0 on failure
145*ce011e13SShuo Liu  */
146*ce011e13SShuo Liu static inline long hcall_assign_pcidev(u64 vmid, u64 addr)
147*ce011e13SShuo Liu {
148*ce011e13SShuo Liu 	return acrn_hypercall2(HC_ASSIGN_PCIDEV, vmid, addr);
149*ce011e13SShuo Liu }
150*ce011e13SShuo Liu 
151*ce011e13SShuo Liu /**
152*ce011e13SShuo Liu  * hcall_deassign_pcidev() - De-assign a PCI device from a User VM
153*ce011e13SShuo Liu  * @vmid:	User VM ID
154*ce011e13SShuo Liu  * @addr:	Service VM GPA of the &struct acrn_pcidev
155*ce011e13SShuo Liu  *
156*ce011e13SShuo Liu  * Return: 0 on success, <0 on failure
157*ce011e13SShuo Liu  */
158*ce011e13SShuo Liu static inline long hcall_deassign_pcidev(u64 vmid, u64 addr)
159*ce011e13SShuo Liu {
160*ce011e13SShuo Liu 	return acrn_hypercall2(HC_DEASSIGN_PCIDEV, vmid, addr);
161*ce011e13SShuo Liu }
162*ce011e13SShuo Liu 
163*ce011e13SShuo Liu /**
164*ce011e13SShuo Liu  * hcall_set_ptdev_intr() - Configure an interrupt for an assigned PCI device.
165*ce011e13SShuo Liu  * @vmid:	User VM ID
166*ce011e13SShuo Liu  * @irq:	Service VM GPA of the &struct acrn_ptdev_irq
167*ce011e13SShuo Liu  *
168*ce011e13SShuo Liu  * Return: 0 on success, <0 on failure
169*ce011e13SShuo Liu  */
170*ce011e13SShuo Liu static inline long hcall_set_ptdev_intr(u64 vmid, u64 irq)
171*ce011e13SShuo Liu {
172*ce011e13SShuo Liu 	return acrn_hypercall2(HC_SET_PTDEV_INTR, vmid, irq);
173*ce011e13SShuo Liu }
174*ce011e13SShuo Liu 
175*ce011e13SShuo Liu /**
176*ce011e13SShuo Liu  * hcall_reset_ptdev_intr() - Reset an interrupt for an assigned PCI device.
177*ce011e13SShuo Liu  * @vmid:	User VM ID
178*ce011e13SShuo Liu  * @irq:	Service VM GPA of the &struct acrn_ptdev_irq
179*ce011e13SShuo Liu  *
180*ce011e13SShuo Liu  * Return: 0 on success, <0 on failure
181*ce011e13SShuo Liu  */
182*ce011e13SShuo Liu static inline long hcall_reset_ptdev_intr(u64 vmid, u64 irq)
183*ce011e13SShuo Liu {
184*ce011e13SShuo Liu 	return acrn_hypercall2(HC_RESET_PTDEV_INTR, vmid, irq);
185*ce011e13SShuo Liu }
186*ce011e13SShuo Liu 
1879c5137aeSShuo Liu #endif /* __ACRN_HSM_HYPERCALL_H */
188