xref: /openbmc/linux/Documentation/virt/kvm/devices/vcpu.rst (revision e777a5bd98c689f1ee15ebdbce739497e7d92f70)
1*e777a5bdSMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0
2*e777a5bdSMauro Carvalho Chehab
3*e777a5bdSMauro Carvalho Chehab======================
4*e777a5bdSMauro Carvalho ChehabGeneric vcpu interface
5*e777a5bdSMauro Carvalho Chehab======================
6*e777a5bdSMauro Carvalho Chehab
7*e777a5bdSMauro Carvalho ChehabThe virtual cpu "device" also accepts the ioctls KVM_SET_DEVICE_ATTR,
8*e777a5bdSMauro Carvalho ChehabKVM_GET_DEVICE_ATTR, and KVM_HAS_DEVICE_ATTR. The interface uses the same struct
9*e777a5bdSMauro Carvalho Chehabkvm_device_attr as other devices, but targets VCPU-wide settings and controls.
10*e777a5bdSMauro Carvalho Chehab
11*e777a5bdSMauro Carvalho ChehabThe groups and attributes per virtual cpu, if any, are architecture specific.
12*e777a5bdSMauro Carvalho Chehab
13*e777a5bdSMauro Carvalho Chehab1. GROUP: KVM_ARM_VCPU_PMU_V3_CTRL
14*e777a5bdSMauro Carvalho Chehab==================================
15*e777a5bdSMauro Carvalho Chehab
16*e777a5bdSMauro Carvalho Chehab:Architectures: ARM64
17*e777a5bdSMauro Carvalho Chehab
18*e777a5bdSMauro Carvalho Chehab1.1. ATTRIBUTE: KVM_ARM_VCPU_PMU_V3_IRQ
19*e777a5bdSMauro Carvalho Chehab---------------------------------------
20*e777a5bdSMauro Carvalho Chehab
21*e777a5bdSMauro Carvalho Chehab:Parameters: in kvm_device_attr.addr the address for PMU overflow interrupt is a
22*e777a5bdSMauro Carvalho Chehab	     pointer to an int
23*e777a5bdSMauro Carvalho Chehab
24*e777a5bdSMauro Carvalho ChehabReturns:
25*e777a5bdSMauro Carvalho Chehab
26*e777a5bdSMauro Carvalho Chehab	 =======  ========================================================
27*e777a5bdSMauro Carvalho Chehab	 -EBUSY   The PMU overflow interrupt is already set
28*e777a5bdSMauro Carvalho Chehab	 -ENXIO   The overflow interrupt not set when attempting to get it
29*e777a5bdSMauro Carvalho Chehab	 -ENODEV  PMUv3 not supported
30*e777a5bdSMauro Carvalho Chehab	 -EINVAL  Invalid PMU overflow interrupt number supplied or
31*e777a5bdSMauro Carvalho Chehab		  trying to set the IRQ number without using an in-kernel
32*e777a5bdSMauro Carvalho Chehab		  irqchip.
33*e777a5bdSMauro Carvalho Chehab	 =======  ========================================================
34*e777a5bdSMauro Carvalho Chehab
35*e777a5bdSMauro Carvalho ChehabA value describing the PMUv3 (Performance Monitor Unit v3) overflow interrupt
36*e777a5bdSMauro Carvalho Chehabnumber for this vcpu. This interrupt could be a PPI or SPI, but the interrupt
37*e777a5bdSMauro Carvalho Chehabtype must be same for each vcpu. As a PPI, the interrupt number is the same for
38*e777a5bdSMauro Carvalho Chehaball vcpus, while as an SPI it must be a separate number per vcpu.
39*e777a5bdSMauro Carvalho Chehab
40*e777a5bdSMauro Carvalho Chehab1.2 ATTRIBUTE: KVM_ARM_VCPU_PMU_V3_INIT
41*e777a5bdSMauro Carvalho Chehab---------------------------------------
42*e777a5bdSMauro Carvalho Chehab
43*e777a5bdSMauro Carvalho Chehab:Parameters: no additional parameter in kvm_device_attr.addr
44*e777a5bdSMauro Carvalho Chehab
45*e777a5bdSMauro Carvalho ChehabReturns:
46*e777a5bdSMauro Carvalho Chehab
47*e777a5bdSMauro Carvalho Chehab	 =======  ======================================================
48*e777a5bdSMauro Carvalho Chehab	 -ENODEV  PMUv3 not supported or GIC not initialized
49*e777a5bdSMauro Carvalho Chehab	 -ENXIO   PMUv3 not properly configured or in-kernel irqchip not
50*e777a5bdSMauro Carvalho Chehab		  configured as required prior to calling this attribute
51*e777a5bdSMauro Carvalho Chehab	 -EBUSY   PMUv3 already initialized
52*e777a5bdSMauro Carvalho Chehab	 =======  ======================================================
53*e777a5bdSMauro Carvalho Chehab
54*e777a5bdSMauro Carvalho ChehabRequest the initialization of the PMUv3.  If using the PMUv3 with an in-kernel
55*e777a5bdSMauro Carvalho Chehabvirtual GIC implementation, this must be done after initializing the in-kernel
56*e777a5bdSMauro Carvalho Chehabirqchip.
57*e777a5bdSMauro Carvalho Chehab
58*e777a5bdSMauro Carvalho Chehab
59*e777a5bdSMauro Carvalho Chehab2. GROUP: KVM_ARM_VCPU_TIMER_CTRL
60*e777a5bdSMauro Carvalho Chehab=================================
61*e777a5bdSMauro Carvalho Chehab
62*e777a5bdSMauro Carvalho Chehab:Architectures: ARM, ARM64
63*e777a5bdSMauro Carvalho Chehab
64*e777a5bdSMauro Carvalho Chehab2.1. ATTRIBUTES: KVM_ARM_VCPU_TIMER_IRQ_VTIMER, KVM_ARM_VCPU_TIMER_IRQ_PTIMER
65*e777a5bdSMauro Carvalho Chehab-----------------------------------------------------------------------------
66*e777a5bdSMauro Carvalho Chehab
67*e777a5bdSMauro Carvalho Chehab:Parameters: in kvm_device_attr.addr the address for the timer interrupt is a
68*e777a5bdSMauro Carvalho Chehab	     pointer to an int
69*e777a5bdSMauro Carvalho Chehab
70*e777a5bdSMauro Carvalho ChehabReturns:
71*e777a5bdSMauro Carvalho Chehab
72*e777a5bdSMauro Carvalho Chehab	 =======  =================================
73*e777a5bdSMauro Carvalho Chehab	 -EINVAL  Invalid timer interrupt number
74*e777a5bdSMauro Carvalho Chehab	 -EBUSY   One or more VCPUs has already run
75*e777a5bdSMauro Carvalho Chehab	 =======  =================================
76*e777a5bdSMauro Carvalho Chehab
77*e777a5bdSMauro Carvalho ChehabA value describing the architected timer interrupt number when connected to an
78*e777a5bdSMauro Carvalho Chehabin-kernel virtual GIC.  These must be a PPI (16 <= intid < 32).  Setting the
79*e777a5bdSMauro Carvalho Chehabattribute overrides the default values (see below).
80*e777a5bdSMauro Carvalho Chehab
81*e777a5bdSMauro Carvalho Chehab=============================  ==========================================
82*e777a5bdSMauro Carvalho ChehabKVM_ARM_VCPU_TIMER_IRQ_VTIMER  The EL1 virtual timer intid (default: 27)
83*e777a5bdSMauro Carvalho ChehabKVM_ARM_VCPU_TIMER_IRQ_PTIMER  The EL1 physical timer intid (default: 30)
84*e777a5bdSMauro Carvalho Chehab=============================  ==========================================
85*e777a5bdSMauro Carvalho Chehab
86*e777a5bdSMauro Carvalho ChehabSetting the same PPI for different timers will prevent the VCPUs from running.
87*e777a5bdSMauro Carvalho ChehabSetting the interrupt number on a VCPU configures all VCPUs created at that
88*e777a5bdSMauro Carvalho Chehabtime to use the number provided for a given timer, overwriting any previously
89*e777a5bdSMauro Carvalho Chehabconfigured values on other VCPUs.  Userspace should configure the interrupt
90*e777a5bdSMauro Carvalho Chehabnumbers on at least one VCPU after creating all VCPUs and before running any
91*e777a5bdSMauro Carvalho ChehabVCPUs.
92*e777a5bdSMauro Carvalho Chehab
93*e777a5bdSMauro Carvalho Chehab3. GROUP: KVM_ARM_VCPU_PVTIME_CTRL
94*e777a5bdSMauro Carvalho Chehab==================================
95*e777a5bdSMauro Carvalho Chehab
96*e777a5bdSMauro Carvalho Chehab:Architectures: ARM64
97*e777a5bdSMauro Carvalho Chehab
98*e777a5bdSMauro Carvalho Chehab3.1 ATTRIBUTE: KVM_ARM_VCPU_PVTIME_IPA
99*e777a5bdSMauro Carvalho Chehab--------------------------------------
100*e777a5bdSMauro Carvalho Chehab
101*e777a5bdSMauro Carvalho Chehab:Parameters: 64-bit base address
102*e777a5bdSMauro Carvalho Chehab
103*e777a5bdSMauro Carvalho ChehabReturns:
104*e777a5bdSMauro Carvalho Chehab
105*e777a5bdSMauro Carvalho Chehab	 =======  ======================================
106*e777a5bdSMauro Carvalho Chehab	 -ENXIO   Stolen time not implemented
107*e777a5bdSMauro Carvalho Chehab	 -EEXIST  Base address already set for this VCPU
108*e777a5bdSMauro Carvalho Chehab	 -EINVAL  Base address not 64 byte aligned
109*e777a5bdSMauro Carvalho Chehab	 =======  ======================================
110*e777a5bdSMauro Carvalho Chehab
111*e777a5bdSMauro Carvalho ChehabSpecifies the base address of the stolen time structure for this VCPU. The
112*e777a5bdSMauro Carvalho Chehabbase address must be 64 byte aligned and exist within a valid guest memory
113*e777a5bdSMauro Carvalho Chehabregion. See Documentation/virt/kvm/arm/pvtime.txt for more information
114*e777a5bdSMauro Carvalho Chehabincluding the layout of the stolen time structure.
115