xref: /linux/include/uapi/linux/acrn.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
19c5137aeSShuo Liu /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
29c5137aeSShuo Liu /*
39c5137aeSShuo Liu  * Userspace interface for /dev/acrn_hsm - ACRN Hypervisor Service Module
49c5137aeSShuo Liu  *
59c5137aeSShuo Liu  * This file can be used by applications that need to communicate with the HSM
69c5137aeSShuo Liu  * via the ioctl interface.
79c5137aeSShuo Liu  *
89c5137aeSShuo Liu  * Copyright (C) 2021 Intel Corporation. All rights reserved.
99c5137aeSShuo Liu  */
109c5137aeSShuo Liu 
119c5137aeSShuo Liu #ifndef _UAPI_ACRN_H
129c5137aeSShuo Liu #define _UAPI_ACRN_H
139c5137aeSShuo Liu 
149c5137aeSShuo Liu #include <linux/types.h>
159c5137aeSShuo Liu 
1672f293deSShuo Liu #define ACRN_IO_REQUEST_MAX		16
1772f293deSShuo Liu 
1872f293deSShuo Liu #define ACRN_IOREQ_STATE_PENDING	0
1972f293deSShuo Liu #define ACRN_IOREQ_STATE_COMPLETE	1
2072f293deSShuo Liu #define ACRN_IOREQ_STATE_PROCESSING	2
2172f293deSShuo Liu #define ACRN_IOREQ_STATE_FREE		3
2272f293deSShuo Liu 
2372f293deSShuo Liu #define ACRN_IOREQ_TYPE_PORTIO		0
2472f293deSShuo Liu #define ACRN_IOREQ_TYPE_MMIO		1
253c4c3316SShuo Liu #define ACRN_IOREQ_TYPE_PCICFG		2
2672f293deSShuo Liu 
2772f293deSShuo Liu #define ACRN_IOREQ_DIR_READ		0
2872f293deSShuo Liu #define ACRN_IOREQ_DIR_WRITE		1
2972f293deSShuo Liu 
3072f293deSShuo Liu /**
3172f293deSShuo Liu  * struct acrn_mmio_request - Info of a MMIO I/O request
3272f293deSShuo Liu  * @direction:	Access direction of this request (ACRN_IOREQ_DIR_*)
3372f293deSShuo Liu  * @reserved:	Reserved for alignment and should be 0
3472f293deSShuo Liu  * @address:	Access address of this MMIO I/O request
3572f293deSShuo Liu  * @size:	Access size of this MMIO I/O request
3672f293deSShuo Liu  * @value:	Read/write value of this MMIO I/O request
3772f293deSShuo Liu  */
3872f293deSShuo Liu struct acrn_mmio_request {
3972f293deSShuo Liu 	__u32	direction;
4072f293deSShuo Liu 	__u32	reserved;
4172f293deSShuo Liu 	__u64	address;
4272f293deSShuo Liu 	__u64	size;
4372f293deSShuo Liu 	__u64	value;
4472f293deSShuo Liu };
4572f293deSShuo Liu 
4672f293deSShuo Liu /**
4772f293deSShuo Liu  * struct acrn_pio_request - Info of a PIO I/O request
4872f293deSShuo Liu  * @direction:	Access direction of this request (ACRN_IOREQ_DIR_*)
4972f293deSShuo Liu  * @reserved:	Reserved for alignment and should be 0
5072f293deSShuo Liu  * @address:	Access address of this PIO I/O request
5172f293deSShuo Liu  * @size:	Access size of this PIO I/O request
5272f293deSShuo Liu  * @value:	Read/write value of this PIO I/O request
5372f293deSShuo Liu  */
5472f293deSShuo Liu struct acrn_pio_request {
5572f293deSShuo Liu 	__u32	direction;
5672f293deSShuo Liu 	__u32	reserved;
5772f293deSShuo Liu 	__u64	address;
5872f293deSShuo Liu 	__u64	size;
5972f293deSShuo Liu 	__u32	value;
6072f293deSShuo Liu };
6172f293deSShuo Liu 
6272f293deSShuo Liu /**
633c4c3316SShuo Liu  * struct acrn_pci_request - Info of a PCI I/O request
643c4c3316SShuo Liu  * @direction:	Access direction of this request (ACRN_IOREQ_DIR_*)
653c4c3316SShuo Liu  * @reserved:	Reserved for alignment and should be 0
663c4c3316SShuo Liu  * @size:	Access size of this PCI I/O request
673c4c3316SShuo Liu  * @value:	Read/write value of this PIO I/O request
683c4c3316SShuo Liu  * @bus:	PCI bus value of this PCI I/O request
693c4c3316SShuo Liu  * @dev:	PCI device value of this PCI I/O request
703c4c3316SShuo Liu  * @func:	PCI function value of this PCI I/O request
713c4c3316SShuo Liu  * @reg:	PCI config space offset of this PCI I/O request
723c4c3316SShuo Liu  *
733c4c3316SShuo Liu  * Need keep same header layout with &struct acrn_pio_request.
743c4c3316SShuo Liu  */
753c4c3316SShuo Liu struct acrn_pci_request {
763c4c3316SShuo Liu 	__u32	direction;
773c4c3316SShuo Liu 	__u32	reserved[3];
783c4c3316SShuo Liu 	__u64	size;
793c4c3316SShuo Liu 	__u32	value;
803c4c3316SShuo Liu 	__u32	bus;
813c4c3316SShuo Liu 	__u32	dev;
823c4c3316SShuo Liu 	__u32	func;
833c4c3316SShuo Liu 	__u32	reg;
843c4c3316SShuo Liu };
853c4c3316SShuo Liu 
863c4c3316SShuo Liu /**
8772f293deSShuo Liu  * struct acrn_io_request - 256-byte ACRN I/O request
8872f293deSShuo Liu  * @type:		Type of this request (ACRN_IOREQ_TYPE_*).
8972f293deSShuo Liu  * @completion_polling:	Polling flag. Hypervisor will poll completion of the
9072f293deSShuo Liu  *			I/O request if this flag set.
9172f293deSShuo Liu  * @reserved0:		Reserved fields.
9272f293deSShuo Liu  * @reqs:		Union of different types of request. Byte offset: 64.
9372f293deSShuo Liu  * @reqs.pio_request:	PIO request data of the I/O request.
943c4c3316SShuo Liu  * @reqs.pci_request:	PCI configuration space request data of the I/O request.
9572f293deSShuo Liu  * @reqs.mmio_request:	MMIO request data of the I/O request.
9672f293deSShuo Liu  * @reqs.data:		Raw data of the I/O request.
9772f293deSShuo Liu  * @reserved1:		Reserved fields.
9872f293deSShuo Liu  * @kernel_handled:	Flag indicates this request need be handled in kernel.
9972f293deSShuo Liu  * @processed:		The status of this request (ACRN_IOREQ_STATE_*).
10072f293deSShuo Liu  *
10172f293deSShuo Liu  * The state transitions of ACRN I/O request:
10272f293deSShuo Liu  *
10372f293deSShuo Liu  *    FREE -> PENDING -> PROCESSING -> COMPLETE -> FREE -> ...
10472f293deSShuo Liu  *
10572f293deSShuo Liu  * An I/O request in COMPLETE or FREE state is owned by the hypervisor. HSM and
10672f293deSShuo Liu  * ACRN userspace are in charge of processing the others.
10772f293deSShuo Liu  *
10872f293deSShuo Liu  * On basis of the states illustrated above, a typical lifecycle of ACRN IO
10972f293deSShuo Liu  * request would look like:
11072f293deSShuo Liu  *
11172f293deSShuo Liu  * Flow                 (assume the initial state is FREE)
11272f293deSShuo Liu  * |
11372f293deSShuo Liu  * |   Service VM vCPU 0     Service VM vCPU x      User vCPU y
11472f293deSShuo Liu  * |
11572f293deSShuo Liu  * |                                             hypervisor:
11672f293deSShuo Liu  * |                                               fills in type, addr, etc.
11772f293deSShuo Liu  * |                                               pauses the User VM vCPU y
11872f293deSShuo Liu  * |                                               sets the state to PENDING (a)
11972f293deSShuo Liu  * |                                               fires an upcall to Service VM
12072f293deSShuo Liu  * |
12172f293deSShuo Liu  * | HSM:
12272f293deSShuo Liu  * |  scans for PENDING requests
12372f293deSShuo Liu  * |  sets the states to PROCESSING (b)
12472f293deSShuo Liu  * |  assigns the requests to clients (c)
12572f293deSShuo Liu  * V
12672f293deSShuo Liu  * |                     client:
12772f293deSShuo Liu  * |                       scans for the assigned requests
12872f293deSShuo Liu  * |                       handles the requests (d)
12972f293deSShuo Liu  * |                     HSM:
13072f293deSShuo Liu  * |                       sets states to COMPLETE
13172f293deSShuo Liu  * |                       notifies the hypervisor
13272f293deSShuo Liu  * |
13372f293deSShuo Liu  * |                     hypervisor:
13472f293deSShuo Liu  * |                       resumes User VM vCPU y (e)
13572f293deSShuo Liu  * |
13672f293deSShuo Liu  * |                                             hypervisor:
13772f293deSShuo Liu  * |                                               post handling (f)
13872f293deSShuo Liu  * V                                               sets states to FREE
13972f293deSShuo Liu  *
14072f293deSShuo Liu  * Note that the procedures (a) to (f) in the illustration above require to be
14172f293deSShuo Liu  * strictly processed in the order.  One vCPU cannot trigger another request of
14272f293deSShuo Liu  * I/O emulation before completing the previous one.
14372f293deSShuo Liu  *
14472f293deSShuo Liu  * Atomic and barriers are required when HSM and hypervisor accessing the state
14572f293deSShuo Liu  * of &struct acrn_io_request.
14672f293deSShuo Liu  *
14772f293deSShuo Liu  */
14872f293deSShuo Liu struct acrn_io_request {
14972f293deSShuo Liu 	__u32	type;
15072f293deSShuo Liu 	__u32	completion_polling;
15172f293deSShuo Liu 	__u32	reserved0[14];
15272f293deSShuo Liu 	union {
15372f293deSShuo Liu 		struct acrn_pio_request		pio_request;
1543c4c3316SShuo Liu 		struct acrn_pci_request		pci_request;
15572f293deSShuo Liu 		struct acrn_mmio_request	mmio_request;
15672f293deSShuo Liu 		__u64				data[8];
15772f293deSShuo Liu 	} reqs;
15872f293deSShuo Liu 	__u32	reserved1;
15972f293deSShuo Liu 	__u32	kernel_handled;
16072f293deSShuo Liu 	__u32	processed;
16172f293deSShuo Liu } __attribute__((aligned(256)));
16272f293deSShuo Liu 
16372f293deSShuo Liu struct acrn_io_request_buffer {
16472f293deSShuo Liu 	union {
16572f293deSShuo Liu 		struct acrn_io_request	req_slot[ACRN_IO_REQUEST_MAX];
16672f293deSShuo Liu 		__u8			reserved[4096];
16772f293deSShuo Liu 	};
16872f293deSShuo Liu };
16972f293deSShuo Liu 
17072f293deSShuo Liu /**
17172f293deSShuo Liu  * struct acrn_ioreq_notify - The structure of ioreq completion notification
17272f293deSShuo Liu  * @vmid:	User VM ID
17372f293deSShuo Liu  * @reserved:	Reserved and should be 0
17472f293deSShuo Liu  * @vcpu:	vCPU ID
17572f293deSShuo Liu  */
17672f293deSShuo Liu struct acrn_ioreq_notify {
17772f293deSShuo Liu 	__u16	vmid;
17872f293deSShuo Liu 	__u16	reserved;
17972f293deSShuo Liu 	__u32	vcpu;
18072f293deSShuo Liu };
18172f293deSShuo Liu 
1829c5137aeSShuo Liu /**
1839c5137aeSShuo Liu  * struct acrn_vm_creation - Info to create a User VM
1849c5137aeSShuo Liu  * @vmid:		User VM ID returned from the hypervisor
1859c5137aeSShuo Liu  * @reserved0:		Reserved and must be 0
1869c5137aeSShuo Liu  * @vcpu_num:		Number of vCPU in the VM. Return from hypervisor.
1879c5137aeSShuo Liu  * @reserved1:		Reserved and must be 0
188*1dbb4f02SAndy Shevchenko  * @uuid:		Empty space never to be used again (used to be UUID of the VM)
1899c5137aeSShuo Liu  * @vm_flag:		Flag of the VM creating. Pass to hypervisor directly.
1909c5137aeSShuo Liu  * @ioreq_buf:		Service VM GPA of I/O request buffer. Pass to
1919c5137aeSShuo Liu  *			hypervisor directly.
1929c5137aeSShuo Liu  * @cpu_affinity:	CPU affinity of the VM. Pass to hypervisor directly.
1939c5137aeSShuo Liu  * 			It's a bitmap which indicates CPUs used by the VM.
1949c5137aeSShuo Liu  */
1959c5137aeSShuo Liu struct acrn_vm_creation {
1969c5137aeSShuo Liu 	__u16	vmid;
1979c5137aeSShuo Liu 	__u16	reserved0;
1989c5137aeSShuo Liu 	__u16	vcpu_num;
1999c5137aeSShuo Liu 	__u16	reserved1;
200*1dbb4f02SAndy Shevchenko 	__u8	uuid[16];
2019c5137aeSShuo Liu 	__u64	vm_flag;
2029c5137aeSShuo Liu 	__u64	ioreq_buf;
2039c5137aeSShuo Liu 	__u64	cpu_affinity;
2049c5137aeSShuo Liu };
2059c5137aeSShuo Liu 
2062ad2aaeeSShuo Liu /**
2072ad2aaeeSShuo Liu  * struct acrn_gp_regs - General registers of a User VM
2082ad2aaeeSShuo Liu  * @rax:	Value of register RAX
2092ad2aaeeSShuo Liu  * @rcx:	Value of register RCX
2102ad2aaeeSShuo Liu  * @rdx:	Value of register RDX
2112ad2aaeeSShuo Liu  * @rbx:	Value of register RBX
2122ad2aaeeSShuo Liu  * @rsp:	Value of register RSP
2132ad2aaeeSShuo Liu  * @rbp:	Value of register RBP
2142ad2aaeeSShuo Liu  * @rsi:	Value of register RSI
2152ad2aaeeSShuo Liu  * @rdi:	Value of register RDI
2162ad2aaeeSShuo Liu  * @r8:		Value of register R8
2172ad2aaeeSShuo Liu  * @r9:		Value of register R9
2182ad2aaeeSShuo Liu  * @r10:	Value of register R10
2192ad2aaeeSShuo Liu  * @r11:	Value of register R11
2202ad2aaeeSShuo Liu  * @r12:	Value of register R12
2212ad2aaeeSShuo Liu  * @r13:	Value of register R13
2222ad2aaeeSShuo Liu  * @r14:	Value of register R14
2232ad2aaeeSShuo Liu  * @r15:	Value of register R15
2242ad2aaeeSShuo Liu  */
2252ad2aaeeSShuo Liu struct acrn_gp_regs {
2262ad2aaeeSShuo Liu 	__le64	rax;
2272ad2aaeeSShuo Liu 	__le64	rcx;
2282ad2aaeeSShuo Liu 	__le64	rdx;
2292ad2aaeeSShuo Liu 	__le64	rbx;
2302ad2aaeeSShuo Liu 	__le64	rsp;
2312ad2aaeeSShuo Liu 	__le64	rbp;
2322ad2aaeeSShuo Liu 	__le64	rsi;
2332ad2aaeeSShuo Liu 	__le64	rdi;
2342ad2aaeeSShuo Liu 	__le64	r8;
2352ad2aaeeSShuo Liu 	__le64	r9;
2362ad2aaeeSShuo Liu 	__le64	r10;
2372ad2aaeeSShuo Liu 	__le64	r11;
2382ad2aaeeSShuo Liu 	__le64	r12;
2392ad2aaeeSShuo Liu 	__le64	r13;
2402ad2aaeeSShuo Liu 	__le64	r14;
2412ad2aaeeSShuo Liu 	__le64	r15;
2422ad2aaeeSShuo Liu };
2432ad2aaeeSShuo Liu 
2442ad2aaeeSShuo Liu /**
2452ad2aaeeSShuo Liu  * struct acrn_descriptor_ptr - Segment descriptor table of a User VM.
2462ad2aaeeSShuo Liu  * @limit:	Limit field.
2472ad2aaeeSShuo Liu  * @base:	Base field.
2482ad2aaeeSShuo Liu  * @reserved:	Reserved and must be 0.
2492ad2aaeeSShuo Liu  */
2502ad2aaeeSShuo Liu struct acrn_descriptor_ptr {
2512ad2aaeeSShuo Liu 	__le16	limit;
2522ad2aaeeSShuo Liu 	__le64	base;
2532ad2aaeeSShuo Liu 	__le16	reserved[3];
2542ad2aaeeSShuo Liu } __attribute__ ((__packed__));
2552ad2aaeeSShuo Liu 
2562ad2aaeeSShuo Liu /**
2572ad2aaeeSShuo Liu  * struct acrn_regs - Registers structure of a User VM
2582ad2aaeeSShuo Liu  * @gprs:		General registers
2592ad2aaeeSShuo Liu  * @gdt:		Global Descriptor Table
2602ad2aaeeSShuo Liu  * @idt:		Interrupt Descriptor Table
2612ad2aaeeSShuo Liu  * @rip:		Value of register RIP
2622ad2aaeeSShuo Liu  * @cs_base:		Base of code segment selector
2632ad2aaeeSShuo Liu  * @cr0:		Value of register CR0
2642ad2aaeeSShuo Liu  * @cr4:		Value of register CR4
2652ad2aaeeSShuo Liu  * @cr3:		Value of register CR3
2662ad2aaeeSShuo Liu  * @ia32_efer:		Value of IA32_EFER MSR
2672ad2aaeeSShuo Liu  * @rflags:		Value of regsiter RFLAGS
2682ad2aaeeSShuo Liu  * @reserved_64:	Reserved and must be 0
2692ad2aaeeSShuo Liu  * @cs_ar:		Attribute field of code segment selector
2702ad2aaeeSShuo Liu  * @cs_limit:		Limit field of code segment selector
2712ad2aaeeSShuo Liu  * @reserved_32:	Reserved and must be 0
2722ad2aaeeSShuo Liu  * @cs_sel:		Value of code segment selector
2732ad2aaeeSShuo Liu  * @ss_sel:		Value of stack segment selector
2742ad2aaeeSShuo Liu  * @ds_sel:		Value of data segment selector
2752ad2aaeeSShuo Liu  * @es_sel:		Value of extra segment selector
2762ad2aaeeSShuo Liu  * @fs_sel:		Value of FS selector
2772ad2aaeeSShuo Liu  * @gs_sel:		Value of GS selector
2782ad2aaeeSShuo Liu  * @ldt_sel:		Value of LDT descriptor selector
2792ad2aaeeSShuo Liu  * @tr_sel:		Value of TSS descriptor selector
2802ad2aaeeSShuo Liu  */
2812ad2aaeeSShuo Liu struct acrn_regs {
2822ad2aaeeSShuo Liu 	struct acrn_gp_regs		gprs;
2832ad2aaeeSShuo Liu 	struct acrn_descriptor_ptr	gdt;
2842ad2aaeeSShuo Liu 	struct acrn_descriptor_ptr	idt;
2852ad2aaeeSShuo Liu 
2862ad2aaeeSShuo Liu 	__le64				rip;
2872ad2aaeeSShuo Liu 	__le64				cs_base;
2882ad2aaeeSShuo Liu 	__le64				cr0;
2892ad2aaeeSShuo Liu 	__le64				cr4;
2902ad2aaeeSShuo Liu 	__le64				cr3;
2912ad2aaeeSShuo Liu 	__le64				ia32_efer;
2922ad2aaeeSShuo Liu 	__le64				rflags;
2932ad2aaeeSShuo Liu 	__le64				reserved_64[4];
2942ad2aaeeSShuo Liu 
2952ad2aaeeSShuo Liu 	__le32				cs_ar;
2962ad2aaeeSShuo Liu 	__le32				cs_limit;
2972ad2aaeeSShuo Liu 	__le32				reserved_32[3];
2982ad2aaeeSShuo Liu 
2992ad2aaeeSShuo Liu 	__le16				cs_sel;
3002ad2aaeeSShuo Liu 	__le16				ss_sel;
3012ad2aaeeSShuo Liu 	__le16				ds_sel;
3022ad2aaeeSShuo Liu 	__le16				es_sel;
3032ad2aaeeSShuo Liu 	__le16				fs_sel;
3042ad2aaeeSShuo Liu 	__le16				gs_sel;
3052ad2aaeeSShuo Liu 	__le16				ldt_sel;
3062ad2aaeeSShuo Liu 	__le16				tr_sel;
3072ad2aaeeSShuo Liu };
3082ad2aaeeSShuo Liu 
3092ad2aaeeSShuo Liu /**
3102ad2aaeeSShuo Liu  * struct acrn_vcpu_regs - Info of vCPU registers state
3112ad2aaeeSShuo Liu  * @vcpu_id:	vCPU ID
3122ad2aaeeSShuo Liu  * @reserved:	Reserved and must be 0
3132ad2aaeeSShuo Liu  * @vcpu_regs:	vCPU registers state
3142ad2aaeeSShuo Liu  *
3152ad2aaeeSShuo Liu  * This structure will be passed to hypervisor directly.
3162ad2aaeeSShuo Liu  */
3172ad2aaeeSShuo Liu struct acrn_vcpu_regs {
3182ad2aaeeSShuo Liu 	__u16			vcpu_id;
3192ad2aaeeSShuo Liu 	__u16			reserved[3];
3202ad2aaeeSShuo Liu 	struct acrn_regs	vcpu_regs;
3212ad2aaeeSShuo Liu };
3222ad2aaeeSShuo Liu 
32388f537d5SShuo Liu #define	ACRN_MEM_ACCESS_RIGHT_MASK	0x00000007U
32488f537d5SShuo Liu #define	ACRN_MEM_ACCESS_READ		0x00000001U
32588f537d5SShuo Liu #define	ACRN_MEM_ACCESS_WRITE		0x00000002U
32688f537d5SShuo Liu #define	ACRN_MEM_ACCESS_EXEC		0x00000004U
32788f537d5SShuo Liu #define	ACRN_MEM_ACCESS_RWX		(ACRN_MEM_ACCESS_READ  | \
32888f537d5SShuo Liu 					 ACRN_MEM_ACCESS_WRITE | \
32988f537d5SShuo Liu 					 ACRN_MEM_ACCESS_EXEC)
33088f537d5SShuo Liu 
33188f537d5SShuo Liu #define	ACRN_MEM_TYPE_MASK		0x000007C0U
33288f537d5SShuo Liu #define	ACRN_MEM_TYPE_WB		0x00000040U
33388f537d5SShuo Liu #define	ACRN_MEM_TYPE_WT		0x00000080U
33488f537d5SShuo Liu #define	ACRN_MEM_TYPE_UC		0x00000100U
33588f537d5SShuo Liu #define	ACRN_MEM_TYPE_WC		0x00000200U
33688f537d5SShuo Liu #define	ACRN_MEM_TYPE_WP		0x00000400U
33788f537d5SShuo Liu 
33888f537d5SShuo Liu /* Memory mapping types */
33988f537d5SShuo Liu #define	ACRN_MEMMAP_RAM			0
34088f537d5SShuo Liu #define	ACRN_MEMMAP_MMIO		1
34188f537d5SShuo Liu 
34288f537d5SShuo Liu /**
34388f537d5SShuo Liu  * struct acrn_vm_memmap - A EPT memory mapping info for a User VM.
34488f537d5SShuo Liu  * @type:		Type of the memory mapping (ACRM_MEMMAP_*).
34588f537d5SShuo Liu  *			Pass to hypervisor directly.
34688f537d5SShuo Liu  * @attr:		Attribute of the memory mapping.
34788f537d5SShuo Liu  *			Pass to hypervisor directly.
34888f537d5SShuo Liu  * @user_vm_pa:		Physical address of User VM.
34988f537d5SShuo Liu  *			Pass to hypervisor directly.
35088f537d5SShuo Liu  * @service_vm_pa:	Physical address of Service VM.
35188f537d5SShuo Liu  *			Pass to hypervisor directly.
35288f537d5SShuo Liu  * @vma_base:		VMA address of Service VM. Pass to hypervisor directly.
35388f537d5SShuo Liu  * @len:		Length of the memory mapping.
35488f537d5SShuo Liu  *			Pass to hypervisor directly.
35588f537d5SShuo Liu  */
35688f537d5SShuo Liu struct acrn_vm_memmap {
35788f537d5SShuo Liu 	__u32	type;
35888f537d5SShuo Liu 	__u32	attr;
35988f537d5SShuo Liu 	__u64	user_vm_pa;
36088f537d5SShuo Liu 	union {
36188f537d5SShuo Liu 		__u64	service_vm_pa;
36288f537d5SShuo Liu 		__u64	vma_base;
36388f537d5SShuo Liu 	};
36488f537d5SShuo Liu 	__u64	len;
36588f537d5SShuo Liu };
36688f537d5SShuo Liu 
367ce011e13SShuo Liu /* Type of interrupt of a passthrough device */
368ce011e13SShuo Liu #define ACRN_PTDEV_IRQ_INTX	0
369ce011e13SShuo Liu #define ACRN_PTDEV_IRQ_MSI	1
370ce011e13SShuo Liu #define ACRN_PTDEV_IRQ_MSIX	2
371ce011e13SShuo Liu /**
372ce011e13SShuo Liu  * struct acrn_ptdev_irq - Interrupt data of a passthrough device.
373ce011e13SShuo Liu  * @type:		Type (ACRN_PTDEV_IRQ_*)
374ce011e13SShuo Liu  * @virt_bdf:		Virtual Bus/Device/Function
375ce011e13SShuo Liu  * @phys_bdf:		Physical Bus/Device/Function
376ce011e13SShuo Liu  * @intx:		Info of interrupt
377ce011e13SShuo Liu  * @intx.virt_pin:	Virtual IOAPIC pin
378ce011e13SShuo Liu  * @intx.phys_pin:	Physical IOAPIC pin
379ce011e13SShuo Liu  * @intx.is_pic_pin:	Is PIC pin or not
380ce011e13SShuo Liu  *
381ce011e13SShuo Liu  * This structure will be passed to hypervisor directly.
382ce011e13SShuo Liu  */
383ce011e13SShuo Liu struct acrn_ptdev_irq {
384ce011e13SShuo Liu 	__u32	type;
385ce011e13SShuo Liu 	__u16	virt_bdf;
386ce011e13SShuo Liu 	__u16	phys_bdf;
387ce011e13SShuo Liu 
388ce011e13SShuo Liu 	struct {
389ce011e13SShuo Liu 		__u32	virt_pin;
390ce011e13SShuo Liu 		__u32	phys_pin;
391ce011e13SShuo Liu 		__u32	is_pic_pin;
392ce011e13SShuo Liu 	} intx;
393ce011e13SShuo Liu };
394ce011e13SShuo Liu 
395ce011e13SShuo Liu /* Type of PCI device assignment */
396ce011e13SShuo Liu #define ACRN_PTDEV_QUIRK_ASSIGN	(1U << 0)
397ce011e13SShuo Liu 
39829a9f275SShuo Liu #define ACRN_MMIODEV_RES_NUM	3
399ce011e13SShuo Liu #define ACRN_PCI_NUM_BARS	6
400ce011e13SShuo Liu /**
401ce011e13SShuo Liu  * struct acrn_pcidev - Info for assigning or de-assigning a PCI device
402ce011e13SShuo Liu  * @type:	Type of the assignment
403ce011e13SShuo Liu  * @virt_bdf:	Virtual Bus/Device/Function
404ce011e13SShuo Liu  * @phys_bdf:	Physical Bus/Device/Function
405ce011e13SShuo Liu  * @intr_line:	PCI interrupt line
406ce011e13SShuo Liu  * @intr_pin:	PCI interrupt pin
407ce011e13SShuo Liu  * @bar:	PCI BARs.
408ce011e13SShuo Liu  *
409ce011e13SShuo Liu  * This structure will be passed to hypervisor directly.
410ce011e13SShuo Liu  */
411ce011e13SShuo Liu struct acrn_pcidev {
412ce011e13SShuo Liu 	__u32	type;
413ce011e13SShuo Liu 	__u16	virt_bdf;
414ce011e13SShuo Liu 	__u16	phys_bdf;
415ce011e13SShuo Liu 	__u8	intr_line;
416ce011e13SShuo Liu 	__u8	intr_pin;
417ce011e13SShuo Liu 	__u32	bar[ACRN_PCI_NUM_BARS];
418ce011e13SShuo Liu };
419ce011e13SShuo Liu 
420c7cf8d27SShuo Liu /**
42129a9f275SShuo Liu  * struct acrn_mmiodev - Info for assigning or de-assigning a MMIO device
42229a9f275SShuo Liu  * @name:			Name of the MMIO device.
42329a9f275SShuo Liu  * @res[].user_vm_pa:		Physical address of User VM of the MMIO region
42429a9f275SShuo Liu  *				for the MMIO device.
42529a9f275SShuo Liu  * @res[].service_vm_pa:	Physical address of Service VM of the MMIO
42629a9f275SShuo Liu  *				region for the MMIO device.
42729a9f275SShuo Liu  * @res[].size:			Size of the MMIO region for the MMIO device.
42829a9f275SShuo Liu  * @res[].mem_type:		Memory type of the MMIO region for the MMIO
42929a9f275SShuo Liu  *				device.
43029a9f275SShuo Liu  *
43129a9f275SShuo Liu  * This structure will be passed to hypervisor directly.
43229a9f275SShuo Liu  */
43329a9f275SShuo Liu struct acrn_mmiodev {
43429a9f275SShuo Liu 	__u8	name[8];
43529a9f275SShuo Liu 	struct {
43629a9f275SShuo Liu 		__u64	user_vm_pa;
43729a9f275SShuo Liu 		__u64	service_vm_pa;
43829a9f275SShuo Liu 		__u64	size;
43929a9f275SShuo Liu 		__u64	mem_type;
44029a9f275SShuo Liu 	} res[ACRN_MMIODEV_RES_NUM];
44129a9f275SShuo Liu };
44229a9f275SShuo Liu 
44329a9f275SShuo Liu /**
444424f1ac2SShuo Liu  * struct acrn_vdev - Info for creating or destroying a virtual device
445424f1ac2SShuo Liu  * @id:				Union of identifier of the virtual device
446424f1ac2SShuo Liu  * @id.value:			Raw data of the identifier
447424f1ac2SShuo Liu  * @id.fields.vendor:		Vendor id of the virtual PCI device
448424f1ac2SShuo Liu  * @id.fields.device:		Device id of the virtual PCI device
449424f1ac2SShuo Liu  * @id.fields.legacy_id:	ID of the virtual device if not a PCI device
450424f1ac2SShuo Liu  * @slot:			Virtual Bus/Device/Function of the virtual
451424f1ac2SShuo Liu  *				device
452424f1ac2SShuo Liu  * @io_base:			IO resource base address of the virtual device
453424f1ac2SShuo Liu  * @io_size:			IO resource size of the virtual device
454424f1ac2SShuo Liu  * @args:			Arguments for the virtual device creation
455424f1ac2SShuo Liu  *
456424f1ac2SShuo Liu  * The created virtual device can be a PCI device or a legacy device (e.g.
457424f1ac2SShuo Liu  * a virtual UART controller) and it is emulated by the hypervisor. This
458424f1ac2SShuo Liu  * structure will be passed to hypervisor directly.
459424f1ac2SShuo Liu  */
460424f1ac2SShuo Liu struct acrn_vdev {
461424f1ac2SShuo Liu 	/*
462424f1ac2SShuo Liu 	 * the identifier of the device, the low 32 bits represent the vendor
463424f1ac2SShuo Liu 	 * id and device id of PCI device and the high 32 bits represent the
464424f1ac2SShuo Liu 	 * device number of the legacy device
465424f1ac2SShuo Liu 	 */
466424f1ac2SShuo Liu 	union {
467424f1ac2SShuo Liu 		__u64 value;
468424f1ac2SShuo Liu 		struct {
469424f1ac2SShuo Liu 			__le16 vendor;
470424f1ac2SShuo Liu 			__le16 device;
471424f1ac2SShuo Liu 			__le32 legacy_id;
472424f1ac2SShuo Liu 		} fields;
473424f1ac2SShuo Liu 	} id;
474424f1ac2SShuo Liu 
475424f1ac2SShuo Liu 	__u64	slot;
476424f1ac2SShuo Liu 	__u32	io_addr[ACRN_PCI_NUM_BARS];
477424f1ac2SShuo Liu 	__u32	io_size[ACRN_PCI_NUM_BARS];
478424f1ac2SShuo Liu 	__u8	args[128];
479424f1ac2SShuo Liu };
480424f1ac2SShuo Liu 
481424f1ac2SShuo Liu /**
482c7cf8d27SShuo Liu  * struct acrn_msi_entry - Info for injecting a MSI interrupt to a VM
483c7cf8d27SShuo Liu  * @msi_addr:	MSI addr[19:12] with dest vCPU ID
484c7cf8d27SShuo Liu  * @msi_data:	MSI data[7:0] with vector
485c7cf8d27SShuo Liu  */
486c7cf8d27SShuo Liu struct acrn_msi_entry {
487c7cf8d27SShuo Liu 	__u64	msi_addr;
488c7cf8d27SShuo Liu 	__u64	msi_data;
489c7cf8d27SShuo Liu };
490c7cf8d27SShuo Liu 
4913d679d5aSShuo Liu struct acrn_acpi_generic_address {
4923d679d5aSShuo Liu 	__u8	space_id;
4933d679d5aSShuo Liu 	__u8	bit_width;
4943d679d5aSShuo Liu 	__u8	bit_offset;
4953d679d5aSShuo Liu 	__u8	access_size;
4963d679d5aSShuo Liu 	__u64	address;
4973d679d5aSShuo Liu } __attribute__ ((__packed__));
4983d679d5aSShuo Liu 
4993d679d5aSShuo Liu /**
5003d679d5aSShuo Liu  * struct acrn_cstate_data - A C state package defined in ACPI
5013d679d5aSShuo Liu  * @cx_reg:	Register of the C state object
5023d679d5aSShuo Liu  * @type:	Type of the C state object
5033d679d5aSShuo Liu  * @latency:	The worst-case latency to enter and exit this C state
5043d679d5aSShuo Liu  * @power:	The average power consumption when in this C state
5053d679d5aSShuo Liu  */
5063d679d5aSShuo Liu struct acrn_cstate_data {
5073d679d5aSShuo Liu 	struct acrn_acpi_generic_address	cx_reg;
5083d679d5aSShuo Liu 	__u8					type;
5093d679d5aSShuo Liu 	__u32					latency;
5103d679d5aSShuo Liu 	__u64					power;
5113d679d5aSShuo Liu };
5123d679d5aSShuo Liu 
5133d679d5aSShuo Liu /**
5143d679d5aSShuo Liu  * struct acrn_pstate_data - A P state package defined in ACPI
5153d679d5aSShuo Liu  * @core_frequency:	CPU frequency (in MHz).
5163d679d5aSShuo Liu  * @power:		Power dissipation (in milliwatts).
5173d679d5aSShuo Liu  * @transition_latency:	The worst-case latency in microseconds that CPU is
5183d679d5aSShuo Liu  * 			unavailable during a transition from any P state to
5193d679d5aSShuo Liu  * 			this P state.
5203d679d5aSShuo Liu  * @bus_master_latency:	The worst-case latency in microseconds that Bus Masters
5213d679d5aSShuo Liu  * 			are prevented from accessing memory during a transition
5223d679d5aSShuo Liu  * 			from any P state to this P state.
5233d679d5aSShuo Liu  * @control:		The value to be written to Performance Control Register
5243d679d5aSShuo Liu  * @status:		Transition status.
5253d679d5aSShuo Liu  */
5263d679d5aSShuo Liu struct acrn_pstate_data {
5273d679d5aSShuo Liu 	__u64	core_frequency;
5283d679d5aSShuo Liu 	__u64	power;
5293d679d5aSShuo Liu 	__u64	transition_latency;
5303d679d5aSShuo Liu 	__u64	bus_master_latency;
5313d679d5aSShuo Liu 	__u64	control;
5323d679d5aSShuo Liu 	__u64	status;
5333d679d5aSShuo Liu };
5343d679d5aSShuo Liu 
5353d679d5aSShuo Liu #define PMCMD_TYPE_MASK		0x000000ff
5363d679d5aSShuo Liu enum acrn_pm_cmd_type {
5373d679d5aSShuo Liu 	ACRN_PMCMD_GET_PX_CNT,
5383d679d5aSShuo Liu 	ACRN_PMCMD_GET_PX_DATA,
5393d679d5aSShuo Liu 	ACRN_PMCMD_GET_CX_CNT,
5403d679d5aSShuo Liu 	ACRN_PMCMD_GET_CX_DATA,
5413d679d5aSShuo Liu };
5423d679d5aSShuo Liu 
543d8ad5151SShuo Liu #define ACRN_IOEVENTFD_FLAG_PIO		0x01
544d8ad5151SShuo Liu #define ACRN_IOEVENTFD_FLAG_DATAMATCH	0x02
545d8ad5151SShuo Liu #define ACRN_IOEVENTFD_FLAG_DEASSIGN	0x04
546d8ad5151SShuo Liu /**
547d8ad5151SShuo Liu  * struct acrn_ioeventfd - Data to operate a &struct hsm_ioeventfd
548d8ad5151SShuo Liu  * @fd:		The fd of eventfd associated with a hsm_ioeventfd
549d8ad5151SShuo Liu  * @flags:	Logical-OR of ACRN_IOEVENTFD_FLAG_*
550d8ad5151SShuo Liu  * @addr:	The start address of IO range of ioeventfd
551d8ad5151SShuo Liu  * @len:	The length of IO range of ioeventfd
552d8ad5151SShuo Liu  * @reserved:	Reserved and should be 0
553d8ad5151SShuo Liu  * @data:	Data for data matching
554d8ad5151SShuo Liu  *
555d8ad5151SShuo Liu  * Without flag ACRN_IOEVENTFD_FLAG_DEASSIGN, ioctl ACRN_IOCTL_IOEVENTFD
556d8ad5151SShuo Liu  * creates a &struct hsm_ioeventfd with properties originated from &struct
557d8ad5151SShuo Liu  * acrn_ioeventfd. With flag ACRN_IOEVENTFD_FLAG_DEASSIGN, ioctl
558d8ad5151SShuo Liu  * ACRN_IOCTL_IOEVENTFD destroys the &struct hsm_ioeventfd matching the fd.
559d8ad5151SShuo Liu  */
560d8ad5151SShuo Liu struct acrn_ioeventfd {
561d8ad5151SShuo Liu 	__u32	fd;
562d8ad5151SShuo Liu 	__u32	flags;
563d8ad5151SShuo Liu 	__u64	addr;
564d8ad5151SShuo Liu 	__u32	len;
565d8ad5151SShuo Liu 	__u32	reserved;
566d8ad5151SShuo Liu 	__u64	data;
567d8ad5151SShuo Liu };
568d8ad5151SShuo Liu 
569aa3b483fSShuo Liu #define ACRN_IRQFD_FLAG_DEASSIGN	0x01
570aa3b483fSShuo Liu /**
571aa3b483fSShuo Liu  * struct acrn_irqfd - Data to operate a &struct hsm_irqfd
572aa3b483fSShuo Liu  * @fd:		The fd of eventfd associated with a hsm_irqfd
573aa3b483fSShuo Liu  * @flags:	Logical-OR of ACRN_IRQFD_FLAG_*
574aa3b483fSShuo Liu  * @msi:	Info of MSI associated with the irqfd
575aa3b483fSShuo Liu  */
576aa3b483fSShuo Liu struct acrn_irqfd {
577aa3b483fSShuo Liu 	__s32			fd;
578aa3b483fSShuo Liu 	__u32			flags;
579aa3b483fSShuo Liu 	struct acrn_msi_entry	msi;
580aa3b483fSShuo Liu };
581aa3b483fSShuo Liu 
5829c5137aeSShuo Liu /* The ioctl type, documented in ioctl-number.rst */
5839c5137aeSShuo Liu #define ACRN_IOCTL_TYPE			0xA2
5849c5137aeSShuo Liu 
5859c5137aeSShuo Liu /*
5869c5137aeSShuo Liu  * Common IOCTL IDs definition for ACRN userspace
5879c5137aeSShuo Liu  */
5889c5137aeSShuo Liu #define ACRN_IOCTL_CREATE_VM		\
5899c5137aeSShuo Liu 	_IOWR(ACRN_IOCTL_TYPE, 0x10, struct acrn_vm_creation)
5909c5137aeSShuo Liu #define ACRN_IOCTL_DESTROY_VM		\
5919c5137aeSShuo Liu 	_IO(ACRN_IOCTL_TYPE, 0x11)
5929c5137aeSShuo Liu #define ACRN_IOCTL_START_VM		\
5939c5137aeSShuo Liu 	_IO(ACRN_IOCTL_TYPE, 0x12)
5949c5137aeSShuo Liu #define ACRN_IOCTL_PAUSE_VM		\
5959c5137aeSShuo Liu 	_IO(ACRN_IOCTL_TYPE, 0x13)
5969c5137aeSShuo Liu #define ACRN_IOCTL_RESET_VM		\
5979c5137aeSShuo Liu 	_IO(ACRN_IOCTL_TYPE, 0x15)
5982ad2aaeeSShuo Liu #define ACRN_IOCTL_SET_VCPU_REGS	\
5992ad2aaeeSShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x16, struct acrn_vcpu_regs)
6009c5137aeSShuo Liu 
601c7cf8d27SShuo Liu #define ACRN_IOCTL_INJECT_MSI		\
602c7cf8d27SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x23, struct acrn_msi_entry)
603c7cf8d27SShuo Liu #define ACRN_IOCTL_VM_INTR_MONITOR	\
604c7cf8d27SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x24, unsigned long)
605c7cf8d27SShuo Liu #define ACRN_IOCTL_SET_IRQLINE		\
606c7cf8d27SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x25, __u64)
607c7cf8d27SShuo Liu 
60872f293deSShuo Liu #define ACRN_IOCTL_NOTIFY_REQUEST_FINISH \
60972f293deSShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x31, struct acrn_ioreq_notify)
61072f293deSShuo Liu #define ACRN_IOCTL_CREATE_IOREQ_CLIENT	\
61172f293deSShuo Liu 	_IO(ACRN_IOCTL_TYPE, 0x32)
61272f293deSShuo Liu #define ACRN_IOCTL_ATTACH_IOREQ_CLIENT	\
61372f293deSShuo Liu 	_IO(ACRN_IOCTL_TYPE, 0x33)
61472f293deSShuo Liu #define ACRN_IOCTL_DESTROY_IOREQ_CLIENT	\
61572f293deSShuo Liu 	_IO(ACRN_IOCTL_TYPE, 0x34)
61672f293deSShuo Liu #define ACRN_IOCTL_CLEAR_VM_IOREQ	\
61772f293deSShuo Liu 	_IO(ACRN_IOCTL_TYPE, 0x35)
61872f293deSShuo Liu 
61988f537d5SShuo Liu #define ACRN_IOCTL_SET_MEMSEG		\
62088f537d5SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x41, struct acrn_vm_memmap)
62188f537d5SShuo Liu #define ACRN_IOCTL_UNSET_MEMSEG		\
62288f537d5SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x42, struct acrn_vm_memmap)
62388f537d5SShuo Liu 
624ce011e13SShuo Liu #define ACRN_IOCTL_SET_PTDEV_INTR	\
625ce011e13SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x53, struct acrn_ptdev_irq)
626ce011e13SShuo Liu #define ACRN_IOCTL_RESET_PTDEV_INTR	\
627ce011e13SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x54, struct acrn_ptdev_irq)
628ce011e13SShuo Liu #define ACRN_IOCTL_ASSIGN_PCIDEV	\
629ce011e13SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x55, struct acrn_pcidev)
630ce011e13SShuo Liu #define ACRN_IOCTL_DEASSIGN_PCIDEV	\
631ce011e13SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x56, struct acrn_pcidev)
63229a9f275SShuo Liu #define ACRN_IOCTL_ASSIGN_MMIODEV	\
63329a9f275SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x57, struct acrn_mmiodev)
63429a9f275SShuo Liu #define ACRN_IOCTL_DEASSIGN_MMIODEV	\
63529a9f275SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x58, struct acrn_mmiodev)
636424f1ac2SShuo Liu #define ACRN_IOCTL_CREATE_VDEV	\
637424f1ac2SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x59, struct acrn_vdev)
638424f1ac2SShuo Liu #define ACRN_IOCTL_DESTROY_VDEV	\
639424f1ac2SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x5A, struct acrn_vdev)
640ce011e13SShuo Liu 
6413d679d5aSShuo Liu #define ACRN_IOCTL_PM_GET_CPU_STATE	\
6423d679d5aSShuo Liu 	_IOWR(ACRN_IOCTL_TYPE, 0x60, __u64)
6433d679d5aSShuo Liu 
644d8ad5151SShuo Liu #define ACRN_IOCTL_IOEVENTFD		\
645d8ad5151SShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x70, struct acrn_ioeventfd)
646aa3b483fSShuo Liu #define ACRN_IOCTL_IRQFD		\
647aa3b483fSShuo Liu 	_IOW(ACRN_IOCTL_TYPE, 0x71, struct acrn_irqfd)
648d8ad5151SShuo Liu 
6499c5137aeSShuo Liu #endif /* _UAPI_ACRN_H */
650