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