xref: /openbmc/linux/drivers/virt/acrn/hypercall.h (revision 424f1ac2)
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 
16279dcf69SShuo Liu #define HC_ID_GEN_BASE			0x0UL
17279dcf69SShuo Liu #define HC_SOS_REMOVE_CPU		_HC_ID(HC_ID, HC_ID_GEN_BASE + 0x01)
18279dcf69SShuo Liu 
199c5137aeSShuo Liu #define HC_ID_VM_BASE			0x10UL
209c5137aeSShuo Liu #define HC_CREATE_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x00)
219c5137aeSShuo Liu #define HC_DESTROY_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x01)
229c5137aeSShuo Liu #define HC_START_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x02)
239c5137aeSShuo Liu #define HC_PAUSE_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x03)
249c5137aeSShuo Liu #define HC_RESET_VM			_HC_ID(HC_ID, HC_ID_VM_BASE + 0x05)
252ad2aaeeSShuo Liu #define HC_SET_VCPU_REGS		_HC_ID(HC_ID, HC_ID_VM_BASE + 0x06)
269c5137aeSShuo Liu 
27c7cf8d27SShuo Liu #define HC_ID_IRQ_BASE			0x20UL
28c7cf8d27SShuo Liu #define HC_INJECT_MSI			_HC_ID(HC_ID, HC_ID_IRQ_BASE + 0x03)
29c7cf8d27SShuo Liu #define HC_VM_INTR_MONITOR		_HC_ID(HC_ID, HC_ID_IRQ_BASE + 0x04)
30c7cf8d27SShuo Liu #define HC_SET_IRQLINE			_HC_ID(HC_ID, HC_ID_IRQ_BASE + 0x05)
31c7cf8d27SShuo Liu 
3272f293deSShuo Liu #define HC_ID_IOREQ_BASE		0x30UL
3372f293deSShuo Liu #define HC_SET_IOREQ_BUFFER		_HC_ID(HC_ID, HC_ID_IOREQ_BASE + 0x00)
3472f293deSShuo Liu #define HC_NOTIFY_REQUEST_FINISH	_HC_ID(HC_ID, HC_ID_IOREQ_BASE + 0x01)
3572f293deSShuo Liu 
3688f537d5SShuo Liu #define HC_ID_MEM_BASE			0x40UL
3788f537d5SShuo Liu #define HC_VM_SET_MEMORY_REGIONS	_HC_ID(HC_ID, HC_ID_MEM_BASE + 0x02)
3888f537d5SShuo Liu 
39ce011e13SShuo Liu #define HC_ID_PCI_BASE			0x50UL
40ce011e13SShuo Liu #define HC_SET_PTDEV_INTR		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x03)
41ce011e13SShuo Liu #define HC_RESET_PTDEV_INTR		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x04)
42ce011e13SShuo Liu #define HC_ASSIGN_PCIDEV		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x05)
43ce011e13SShuo Liu #define HC_DEASSIGN_PCIDEV		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x06)
4429a9f275SShuo Liu #define HC_ASSIGN_MMIODEV		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x07)
4529a9f275SShuo Liu #define HC_DEASSIGN_MMIODEV		_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x08)
46*424f1ac2SShuo Liu #define HC_CREATE_VDEV			_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x09)
47*424f1ac2SShuo Liu #define HC_DESTROY_VDEV			_HC_ID(HC_ID, HC_ID_PCI_BASE + 0x0A)
48ce011e13SShuo Liu 
493d679d5aSShuo Liu #define HC_ID_PM_BASE			0x80UL
503d679d5aSShuo Liu #define HC_PM_GET_CPU_STATE		_HC_ID(HC_ID, HC_ID_PM_BASE + 0x00)
513d679d5aSShuo Liu 
529c5137aeSShuo Liu /**
53279dcf69SShuo Liu  * hcall_sos_remove_cpu() - Remove a vCPU of Service VM
54279dcf69SShuo Liu  * @cpu: The vCPU to be removed
55279dcf69SShuo Liu  *
56279dcf69SShuo Liu  * Return: 0 on success, <0 on failure
57279dcf69SShuo Liu  */
hcall_sos_remove_cpu(u64 cpu)58279dcf69SShuo Liu static inline long hcall_sos_remove_cpu(u64 cpu)
59279dcf69SShuo Liu {
60279dcf69SShuo Liu 	return acrn_hypercall1(HC_SOS_REMOVE_CPU, cpu);
61279dcf69SShuo Liu }
62279dcf69SShuo Liu 
63279dcf69SShuo Liu /**
649c5137aeSShuo Liu  * hcall_create_vm() - Create a User VM
659c5137aeSShuo Liu  * @vminfo:	Service VM GPA of info of User VM creation
669c5137aeSShuo Liu  *
679c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
689c5137aeSShuo Liu  */
hcall_create_vm(u64 vminfo)699c5137aeSShuo Liu static inline long hcall_create_vm(u64 vminfo)
709c5137aeSShuo Liu {
719c5137aeSShuo Liu 	return acrn_hypercall1(HC_CREATE_VM, vminfo);
729c5137aeSShuo Liu }
739c5137aeSShuo Liu 
749c5137aeSShuo Liu /**
759c5137aeSShuo Liu  * hcall_start_vm() - Start a User VM
769c5137aeSShuo Liu  * @vmid:	User VM ID
779c5137aeSShuo Liu  *
789c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
799c5137aeSShuo Liu  */
hcall_start_vm(u64 vmid)809c5137aeSShuo Liu static inline long hcall_start_vm(u64 vmid)
819c5137aeSShuo Liu {
829c5137aeSShuo Liu 	return acrn_hypercall1(HC_START_VM, vmid);
839c5137aeSShuo Liu }
849c5137aeSShuo Liu 
859c5137aeSShuo Liu /**
869c5137aeSShuo Liu  * hcall_pause_vm() - Pause a User VM
879c5137aeSShuo Liu  * @vmid:	User VM ID
889c5137aeSShuo Liu  *
899c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
909c5137aeSShuo Liu  */
hcall_pause_vm(u64 vmid)919c5137aeSShuo Liu static inline long hcall_pause_vm(u64 vmid)
929c5137aeSShuo Liu {
939c5137aeSShuo Liu 	return acrn_hypercall1(HC_PAUSE_VM, vmid);
949c5137aeSShuo Liu }
959c5137aeSShuo Liu 
969c5137aeSShuo Liu /**
979c5137aeSShuo Liu  * hcall_destroy_vm() - Destroy a User VM
989c5137aeSShuo Liu  * @vmid:	User VM ID
999c5137aeSShuo Liu  *
1009c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
1019c5137aeSShuo Liu  */
hcall_destroy_vm(u64 vmid)1029c5137aeSShuo Liu static inline long hcall_destroy_vm(u64 vmid)
1039c5137aeSShuo Liu {
1049c5137aeSShuo Liu 	return acrn_hypercall1(HC_DESTROY_VM, vmid);
1059c5137aeSShuo Liu }
1069c5137aeSShuo Liu 
1079c5137aeSShuo Liu /**
1089c5137aeSShuo Liu  * hcall_reset_vm() - Reset a User VM
1099c5137aeSShuo Liu  * @vmid:	User VM ID
1109c5137aeSShuo Liu  *
1119c5137aeSShuo Liu  * Return: 0 on success, <0 on failure
1129c5137aeSShuo Liu  */
hcall_reset_vm(u64 vmid)1139c5137aeSShuo Liu static inline long hcall_reset_vm(u64 vmid)
1149c5137aeSShuo Liu {
1159c5137aeSShuo Liu 	return acrn_hypercall1(HC_RESET_VM, vmid);
1169c5137aeSShuo Liu }
1179c5137aeSShuo Liu 
1182ad2aaeeSShuo Liu /**
1192ad2aaeeSShuo Liu  * hcall_set_vcpu_regs() - Set up registers of virtual CPU of a User VM
1202ad2aaeeSShuo Liu  * @vmid:	User VM ID
1212ad2aaeeSShuo Liu  * @regs_state:	Service VM GPA of registers state
1222ad2aaeeSShuo Liu  *
1232ad2aaeeSShuo Liu  * Return: 0 on success, <0 on failure
1242ad2aaeeSShuo Liu  */
hcall_set_vcpu_regs(u64 vmid,u64 regs_state)1252ad2aaeeSShuo Liu static inline long hcall_set_vcpu_regs(u64 vmid, u64 regs_state)
1262ad2aaeeSShuo Liu {
1272ad2aaeeSShuo Liu 	return acrn_hypercall2(HC_SET_VCPU_REGS, vmid, regs_state);
1282ad2aaeeSShuo Liu }
1292ad2aaeeSShuo Liu 
13088f537d5SShuo Liu /**
131c7cf8d27SShuo Liu  * hcall_inject_msi() - Deliver a MSI interrupt to a User VM
132c7cf8d27SShuo Liu  * @vmid:	User VM ID
133c7cf8d27SShuo Liu  * @msi:	Service VM GPA of MSI message
134c7cf8d27SShuo Liu  *
135c7cf8d27SShuo Liu  * Return: 0 on success, <0 on failure
136c7cf8d27SShuo Liu  */
hcall_inject_msi(u64 vmid,u64 msi)137c7cf8d27SShuo Liu static inline long hcall_inject_msi(u64 vmid, u64 msi)
138c7cf8d27SShuo Liu {
139c7cf8d27SShuo Liu 	return acrn_hypercall2(HC_INJECT_MSI, vmid, msi);
140c7cf8d27SShuo Liu }
141c7cf8d27SShuo Liu 
142c7cf8d27SShuo Liu /**
143c7cf8d27SShuo Liu  * hcall_vm_intr_monitor() - Set a shared page for User VM interrupt statistics
144c7cf8d27SShuo Liu  * @vmid:	User VM ID
145c7cf8d27SShuo Liu  * @addr:	Service VM GPA of the shared page
146c7cf8d27SShuo Liu  *
147c7cf8d27SShuo Liu  * Return: 0 on success, <0 on failure
148c7cf8d27SShuo Liu  */
hcall_vm_intr_monitor(u64 vmid,u64 addr)149c7cf8d27SShuo Liu static inline long hcall_vm_intr_monitor(u64 vmid, u64 addr)
150c7cf8d27SShuo Liu {
151c7cf8d27SShuo Liu 	return acrn_hypercall2(HC_VM_INTR_MONITOR, vmid, addr);
152c7cf8d27SShuo Liu }
153c7cf8d27SShuo Liu 
154c7cf8d27SShuo Liu /**
155c7cf8d27SShuo Liu  * hcall_set_irqline() - Set or clear an interrupt line
156c7cf8d27SShuo Liu  * @vmid:	User VM ID
157c7cf8d27SShuo Liu  * @op:		Service VM GPA of interrupt line operations
158c7cf8d27SShuo Liu  *
159c7cf8d27SShuo Liu  * Return: 0 on success, <0 on failure
160c7cf8d27SShuo Liu  */
hcall_set_irqline(u64 vmid,u64 op)161c7cf8d27SShuo Liu static inline long hcall_set_irqline(u64 vmid, u64 op)
162c7cf8d27SShuo Liu {
163c7cf8d27SShuo Liu 	return acrn_hypercall2(HC_SET_IRQLINE, vmid, op);
164c7cf8d27SShuo Liu }
165c7cf8d27SShuo Liu 
166c7cf8d27SShuo Liu /**
16772f293deSShuo Liu  * hcall_set_ioreq_buffer() - Set up the shared buffer for I/O Requests.
16872f293deSShuo Liu  * @vmid:	User VM ID
16972f293deSShuo Liu  * @buffer:	Service VM GPA of the shared buffer
17072f293deSShuo Liu  *
17172f293deSShuo Liu  * Return: 0 on success, <0 on failure
17272f293deSShuo Liu  */
hcall_set_ioreq_buffer(u64 vmid,u64 buffer)17372f293deSShuo Liu static inline long hcall_set_ioreq_buffer(u64 vmid, u64 buffer)
17472f293deSShuo Liu {
17572f293deSShuo Liu 	return acrn_hypercall2(HC_SET_IOREQ_BUFFER, vmid, buffer);
17672f293deSShuo Liu }
17772f293deSShuo Liu 
17872f293deSShuo Liu /**
17972f293deSShuo Liu  * hcall_notify_req_finish() - Notify ACRN Hypervisor of I/O request completion.
18072f293deSShuo Liu  * @vmid:	User VM ID
18172f293deSShuo Liu  * @vcpu:	The vCPU which initiated the I/O request
18272f293deSShuo Liu  *
18372f293deSShuo Liu  * Return: 0 on success, <0 on failure
18472f293deSShuo Liu  */
hcall_notify_req_finish(u64 vmid,u64 vcpu)18572f293deSShuo Liu static inline long hcall_notify_req_finish(u64 vmid, u64 vcpu)
18672f293deSShuo Liu {
18772f293deSShuo Liu 	return acrn_hypercall2(HC_NOTIFY_REQUEST_FINISH, vmid, vcpu);
18872f293deSShuo Liu }
18972f293deSShuo Liu 
19072f293deSShuo Liu /**
19188f537d5SShuo Liu  * hcall_set_memory_regions() - Inform the hypervisor to set up EPT mappings
19288f537d5SShuo Liu  * @regions_pa:	Service VM GPA of &struct vm_memory_region_batch
19388f537d5SShuo Liu  *
19488f537d5SShuo Liu  * Return: 0 on success, <0 on failure
19588f537d5SShuo Liu  */
hcall_set_memory_regions(u64 regions_pa)19688f537d5SShuo Liu static inline long hcall_set_memory_regions(u64 regions_pa)
19788f537d5SShuo Liu {
19888f537d5SShuo Liu 	return acrn_hypercall1(HC_VM_SET_MEMORY_REGIONS, regions_pa);
19988f537d5SShuo Liu }
20088f537d5SShuo Liu 
201ce011e13SShuo Liu /**
202*424f1ac2SShuo Liu  * hcall_create_vdev() - Create a virtual device for a User VM
203*424f1ac2SShuo Liu  * @vmid:	User VM ID
204*424f1ac2SShuo Liu  * @addr:	Service VM GPA of the &struct acrn_vdev
205*424f1ac2SShuo Liu  *
206*424f1ac2SShuo Liu  * Return: 0 on success, <0 on failure
207*424f1ac2SShuo Liu  */
hcall_create_vdev(u64 vmid,u64 addr)208*424f1ac2SShuo Liu static inline long hcall_create_vdev(u64 vmid, u64 addr)
209*424f1ac2SShuo Liu {
210*424f1ac2SShuo Liu 	return acrn_hypercall2(HC_CREATE_VDEV, vmid, addr);
211*424f1ac2SShuo Liu }
212*424f1ac2SShuo Liu 
213*424f1ac2SShuo Liu /**
214*424f1ac2SShuo Liu  * hcall_destroy_vdev() - Destroy a virtual device of a User VM
215*424f1ac2SShuo Liu  * @vmid:	User VM ID
216*424f1ac2SShuo Liu  * @addr:	Service VM GPA of the &struct acrn_vdev
217*424f1ac2SShuo Liu  *
218*424f1ac2SShuo Liu  * Return: 0 on success, <0 on failure
219*424f1ac2SShuo Liu  */
hcall_destroy_vdev(u64 vmid,u64 addr)220*424f1ac2SShuo Liu static inline long hcall_destroy_vdev(u64 vmid, u64 addr)
221*424f1ac2SShuo Liu {
222*424f1ac2SShuo Liu 	return acrn_hypercall2(HC_DESTROY_VDEV, vmid, addr);
223*424f1ac2SShuo Liu }
224*424f1ac2SShuo Liu 
225*424f1ac2SShuo Liu /**
22629a9f275SShuo Liu  * hcall_assign_mmiodev() - Assign a MMIO device to a User VM
22729a9f275SShuo Liu  * @vmid:	User VM ID
22829a9f275SShuo Liu  * @addr:	Service VM GPA of the &struct acrn_mmiodev
22929a9f275SShuo Liu  *
23029a9f275SShuo Liu  * Return: 0 on success, <0 on failure
23129a9f275SShuo Liu  */
hcall_assign_mmiodev(u64 vmid,u64 addr)23229a9f275SShuo Liu static inline long hcall_assign_mmiodev(u64 vmid, u64 addr)
23329a9f275SShuo Liu {
23429a9f275SShuo Liu 	return acrn_hypercall2(HC_ASSIGN_MMIODEV, vmid, addr);
23529a9f275SShuo Liu }
23629a9f275SShuo Liu 
23729a9f275SShuo Liu /**
23829a9f275SShuo Liu  * hcall_deassign_mmiodev() - De-assign a PCI device from a User VM
23929a9f275SShuo Liu  * @vmid:	User VM ID
24029a9f275SShuo Liu  * @addr:	Service VM GPA of the &struct acrn_mmiodev
24129a9f275SShuo Liu  *
24229a9f275SShuo Liu  * Return: 0 on success, <0 on failure
24329a9f275SShuo Liu  */
hcall_deassign_mmiodev(u64 vmid,u64 addr)24429a9f275SShuo Liu static inline long hcall_deassign_mmiodev(u64 vmid, u64 addr)
24529a9f275SShuo Liu {
24629a9f275SShuo Liu 	return acrn_hypercall2(HC_DEASSIGN_MMIODEV, vmid, addr);
24729a9f275SShuo Liu }
24829a9f275SShuo Liu 
24929a9f275SShuo Liu /**
250ce011e13SShuo Liu  * hcall_assign_pcidev() - Assign a PCI device to a User VM
251ce011e13SShuo Liu  * @vmid:	User VM ID
252ce011e13SShuo Liu  * @addr:	Service VM GPA of the &struct acrn_pcidev
253ce011e13SShuo Liu  *
254ce011e13SShuo Liu  * Return: 0 on success, <0 on failure
255ce011e13SShuo Liu  */
hcall_assign_pcidev(u64 vmid,u64 addr)256ce011e13SShuo Liu static inline long hcall_assign_pcidev(u64 vmid, u64 addr)
257ce011e13SShuo Liu {
258ce011e13SShuo Liu 	return acrn_hypercall2(HC_ASSIGN_PCIDEV, vmid, addr);
259ce011e13SShuo Liu }
260ce011e13SShuo Liu 
261ce011e13SShuo Liu /**
262ce011e13SShuo Liu  * hcall_deassign_pcidev() - De-assign a PCI device from a User VM
263ce011e13SShuo Liu  * @vmid:	User VM ID
264ce011e13SShuo Liu  * @addr:	Service VM GPA of the &struct acrn_pcidev
265ce011e13SShuo Liu  *
266ce011e13SShuo Liu  * Return: 0 on success, <0 on failure
267ce011e13SShuo Liu  */
hcall_deassign_pcidev(u64 vmid,u64 addr)268ce011e13SShuo Liu static inline long hcall_deassign_pcidev(u64 vmid, u64 addr)
269ce011e13SShuo Liu {
270ce011e13SShuo Liu 	return acrn_hypercall2(HC_DEASSIGN_PCIDEV, vmid, addr);
271ce011e13SShuo Liu }
272ce011e13SShuo Liu 
273ce011e13SShuo Liu /**
274ce011e13SShuo Liu  * hcall_set_ptdev_intr() - Configure an interrupt for an assigned PCI device.
275ce011e13SShuo Liu  * @vmid:	User VM ID
276ce011e13SShuo Liu  * @irq:	Service VM GPA of the &struct acrn_ptdev_irq
277ce011e13SShuo Liu  *
278ce011e13SShuo Liu  * Return: 0 on success, <0 on failure
279ce011e13SShuo Liu  */
hcall_set_ptdev_intr(u64 vmid,u64 irq)280ce011e13SShuo Liu static inline long hcall_set_ptdev_intr(u64 vmid, u64 irq)
281ce011e13SShuo Liu {
282ce011e13SShuo Liu 	return acrn_hypercall2(HC_SET_PTDEV_INTR, vmid, irq);
283ce011e13SShuo Liu }
284ce011e13SShuo Liu 
285ce011e13SShuo Liu /**
286ce011e13SShuo Liu  * hcall_reset_ptdev_intr() - Reset an interrupt for an assigned PCI device.
287ce011e13SShuo Liu  * @vmid:	User VM ID
288ce011e13SShuo Liu  * @irq:	Service VM GPA of the &struct acrn_ptdev_irq
289ce011e13SShuo Liu  *
290ce011e13SShuo Liu  * Return: 0 on success, <0 on failure
291ce011e13SShuo Liu  */
hcall_reset_ptdev_intr(u64 vmid,u64 irq)292ce011e13SShuo Liu static inline long hcall_reset_ptdev_intr(u64 vmid, u64 irq)
293ce011e13SShuo Liu {
294ce011e13SShuo Liu 	return acrn_hypercall2(HC_RESET_PTDEV_INTR, vmid, irq);
295ce011e13SShuo Liu }
296ce011e13SShuo Liu 
2973d679d5aSShuo Liu /*
2983d679d5aSShuo Liu  * hcall_get_cpu_state() - Get P-states and C-states info from the hypervisor
2993d679d5aSShuo Liu  * @state:	Service VM GPA of buffer of P-states and C-states
3003d679d5aSShuo Liu  */
hcall_get_cpu_state(u64 cmd,u64 state)3013d679d5aSShuo Liu static inline long hcall_get_cpu_state(u64 cmd, u64 state)
3023d679d5aSShuo Liu {
3033d679d5aSShuo Liu 	return acrn_hypercall2(HC_PM_GET_CPU_STATE, cmd, state);
3043d679d5aSShuo Liu }
3053d679d5aSShuo Liu 
3069c5137aeSShuo Liu #endif /* __ACRN_HSM_HYPERCALL_H */
307