xref: /linux-6.15/include/xen/interface/physdev.h (revision 88801d04)
19e2b3e83SJuergen Gross /* SPDX-License-Identifier: MIT */
2a42089ddSJeremy Fitzhardinge 
3a42089ddSJeremy Fitzhardinge #ifndef __XEN_PUBLIC_PHYSDEV_H__
4a42089ddSJeremy Fitzhardinge #define __XEN_PUBLIC_PHYSDEV_H__
5a42089ddSJeremy Fitzhardinge 
6a42089ddSJeremy Fitzhardinge /*
7a42089ddSJeremy Fitzhardinge  * Prototype for this hypercall is:
8a42089ddSJeremy Fitzhardinge  *  int physdev_op(int cmd, void *args)
9a42089ddSJeremy Fitzhardinge  * @cmd	 == PHYSDEVOP_??? (physdev operation).
10a42089ddSJeremy Fitzhardinge  * @args == Operation-specific extra arguments (NULL if none).
11a42089ddSJeremy Fitzhardinge  */
12a42089ddSJeremy Fitzhardinge 
13a42089ddSJeremy Fitzhardinge /*
14a42089ddSJeremy Fitzhardinge  * Notify end-of-interrupt (EOI) for the specified IRQ.
15a42089ddSJeremy Fitzhardinge  * @arg == pointer to physdev_eoi structure.
16a42089ddSJeremy Fitzhardinge  */
17a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_eoi			12
18a42089ddSJeremy Fitzhardinge struct physdev_eoi {
19a42089ddSJeremy Fitzhardinge 	/* IN */
20a42089ddSJeremy Fitzhardinge 	uint32_t irq;
21a42089ddSJeremy Fitzhardinge };
22a42089ddSJeremy Fitzhardinge 
23a42089ddSJeremy Fitzhardinge /*
249846ff10SStefano Stabellini  * Register a shared page for the hypervisor to indicate whether the guest
259846ff10SStefano Stabellini  * must issue PHYSDEVOP_eoi. The semantics of PHYSDEVOP_eoi change slightly
269846ff10SStefano Stabellini  * once the guest used this function in that the associated event channel
279846ff10SStefano Stabellini  * will automatically get unmasked. The page registered is used as a bit
289846ff10SStefano Stabellini  * array indexed by Xen's PIRQ value.
299846ff10SStefano Stabellini  */
309846ff10SStefano Stabellini #define PHYSDEVOP_pirq_eoi_gmfn_v1       17
319846ff10SStefano Stabellini /*
329846ff10SStefano Stabellini  * Register a shared page for the hypervisor to indicate whether the
339846ff10SStefano Stabellini  * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to
349846ff10SStefano Stabellini  * PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't change the semantics of
359846ff10SStefano Stabellini  * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by
369846ff10SStefano Stabellini  * Xen's PIRQ value.
379846ff10SStefano Stabellini  */
389846ff10SStefano Stabellini #define PHYSDEVOP_pirq_eoi_gmfn_v2       28
399846ff10SStefano Stabellini struct physdev_pirq_eoi_gmfn {
409846ff10SStefano Stabellini     /* IN */
41256f631fSStefano Stabellini     xen_ulong_t gmfn;
429846ff10SStefano Stabellini };
439846ff10SStefano Stabellini 
449846ff10SStefano Stabellini /*
45a42089ddSJeremy Fitzhardinge  * Query the status of an IRQ line.
46a42089ddSJeremy Fitzhardinge  * @arg == pointer to physdev_irq_status_query structure.
47a42089ddSJeremy Fitzhardinge  */
48a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_irq_status_query	 5
49a42089ddSJeremy Fitzhardinge struct physdev_irq_status_query {
50a42089ddSJeremy Fitzhardinge 	/* IN */
51a42089ddSJeremy Fitzhardinge 	uint32_t irq;
52a42089ddSJeremy Fitzhardinge 	/* OUT */
53a42089ddSJeremy Fitzhardinge 	uint32_t flags; /* XENIRQSTAT_* */
54a42089ddSJeremy Fitzhardinge };
55a42089ddSJeremy Fitzhardinge 
56a42089ddSJeremy Fitzhardinge /* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */
57a42089ddSJeremy Fitzhardinge #define _XENIRQSTAT_needs_eoi	(0)
58a42089ddSJeremy Fitzhardinge #define	 XENIRQSTAT_needs_eoi	(1U<<_XENIRQSTAT_needs_eoi)
59a42089ddSJeremy Fitzhardinge 
60a42089ddSJeremy Fitzhardinge /* IRQ shared by multiple guests? */
61a42089ddSJeremy Fitzhardinge #define _XENIRQSTAT_shared	(1)
62a42089ddSJeremy Fitzhardinge #define	 XENIRQSTAT_shared	(1U<<_XENIRQSTAT_shared)
63a42089ddSJeremy Fitzhardinge 
64a42089ddSJeremy Fitzhardinge /*
65a42089ddSJeremy Fitzhardinge  * Set the current VCPU's I/O privilege level.
66a42089ddSJeremy Fitzhardinge  * @arg == pointer to physdev_set_iopl structure.
67a42089ddSJeremy Fitzhardinge  */
68a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_set_iopl		 6
69a42089ddSJeremy Fitzhardinge struct physdev_set_iopl {
70a42089ddSJeremy Fitzhardinge 	/* IN */
71a42089ddSJeremy Fitzhardinge 	uint32_t iopl;
72a42089ddSJeremy Fitzhardinge };
73a42089ddSJeremy Fitzhardinge 
74a42089ddSJeremy Fitzhardinge /*
75a42089ddSJeremy Fitzhardinge  * Set the current VCPU's I/O-port permissions bitmap.
76a42089ddSJeremy Fitzhardinge  * @arg == pointer to physdev_set_iobitmap structure.
77a42089ddSJeremy Fitzhardinge  */
78a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_set_iobitmap		 7
79a42089ddSJeremy Fitzhardinge struct physdev_set_iobitmap {
80a42089ddSJeremy Fitzhardinge 	/* IN */
81a42089ddSJeremy Fitzhardinge 	uint8_t * bitmap;
82a42089ddSJeremy Fitzhardinge 	uint32_t nr_ports;
83a42089ddSJeremy Fitzhardinge };
84a42089ddSJeremy Fitzhardinge 
85a42089ddSJeremy Fitzhardinge /*
86a42089ddSJeremy Fitzhardinge  * Read or write an IO-APIC register.
87a42089ddSJeremy Fitzhardinge  * @arg == pointer to physdev_apic structure.
88a42089ddSJeremy Fitzhardinge  */
89a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_apic_read		 8
90a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_apic_write		 9
91a42089ddSJeremy Fitzhardinge struct physdev_apic {
92a42089ddSJeremy Fitzhardinge 	/* IN */
93a42089ddSJeremy Fitzhardinge 	unsigned long apic_physbase;
94a42089ddSJeremy Fitzhardinge 	uint32_t reg;
95a42089ddSJeremy Fitzhardinge 	/* IN or OUT */
96a42089ddSJeremy Fitzhardinge 	uint32_t value;
97a42089ddSJeremy Fitzhardinge };
98a42089ddSJeremy Fitzhardinge 
99a42089ddSJeremy Fitzhardinge /*
100a42089ddSJeremy Fitzhardinge  * Allocate or free a physical upcall vector for the specified IRQ line.
101a42089ddSJeremy Fitzhardinge  * @arg == pointer to physdev_irq structure.
102a42089ddSJeremy Fitzhardinge  */
103a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_alloc_irq_vector	10
104a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_free_irq_vector	11
105a42089ddSJeremy Fitzhardinge struct physdev_irq {
106a42089ddSJeremy Fitzhardinge 	/* IN */
107a42089ddSJeremy Fitzhardinge 	uint32_t irq;
108a42089ddSJeremy Fitzhardinge 	/* IN or OUT */
109a42089ddSJeremy Fitzhardinge 	uint32_t vector;
110a42089ddSJeremy Fitzhardinge };
111a42089ddSJeremy Fitzhardinge 
11242a1de56SStefano Stabellini #define MAP_PIRQ_TYPE_MSI		0x0
11342a1de56SStefano Stabellini #define MAP_PIRQ_TYPE_GSI		0x1
11442a1de56SStefano Stabellini #define MAP_PIRQ_TYPE_UNKNOWN		0x2
11555e901fcSJan Beulich #define MAP_PIRQ_TYPE_MSI_SEG		0x3
1164892c9b4SRoger Pau Monne #define MAP_PIRQ_TYPE_MULTI_MSI		0x4
11742a1de56SStefano Stabellini 
11842a1de56SStefano Stabellini #define PHYSDEVOP_map_pirq		13
11942a1de56SStefano Stabellini struct physdev_map_pirq {
12042a1de56SStefano Stabellini     domid_t domid;
12142a1de56SStefano Stabellini     /* IN */
12242a1de56SStefano Stabellini     int type;
12342a1de56SStefano Stabellini     /* IN */
12442a1de56SStefano Stabellini     int index;
12542a1de56SStefano Stabellini     /* IN or OUT */
12642a1de56SStefano Stabellini     int pirq;
1274892c9b4SRoger Pau Monne     /* IN - high 16 bits hold segment for ..._MSI_SEG and ..._MULTI_MSI */
12842a1de56SStefano Stabellini     int bus;
12942a1de56SStefano Stabellini     /* IN */
13042a1de56SStefano Stabellini     int devfn;
1314892c9b4SRoger Pau Monne     /* IN
1324892c9b4SRoger Pau Monne      * - For MSI-X contains entry number.
1334892c9b4SRoger Pau Monne      * - For MSI with ..._MULTI_MSI contains number of vectors.
1344892c9b4SRoger Pau Monne      * OUT (..._MULTI_MSI only)
1354892c9b4SRoger Pau Monne      * - Number of vectors allocated.
1364892c9b4SRoger Pau Monne      */
13742a1de56SStefano Stabellini     int entry_nr;
13842a1de56SStefano Stabellini     /* IN */
13942a1de56SStefano Stabellini     uint64_t table_base;
14042a1de56SStefano Stabellini };
14142a1de56SStefano Stabellini 
14242a1de56SStefano Stabellini #define PHYSDEVOP_unmap_pirq		14
14342a1de56SStefano Stabellini struct physdev_unmap_pirq {
14442a1de56SStefano Stabellini     domid_t domid;
14542a1de56SStefano Stabellini     /* IN */
14642a1de56SStefano Stabellini     int pirq;
14742a1de56SStefano Stabellini };
14842a1de56SStefano Stabellini 
149e28c31a9SWeidong Han #define PHYSDEVOP_manage_pci_add	15
150e28c31a9SWeidong Han #define PHYSDEVOP_manage_pci_remove	16
151e28c31a9SWeidong Han struct physdev_manage_pci {
152e28c31a9SWeidong Han 	/* IN */
153e28c31a9SWeidong Han 	uint8_t bus;
154e28c31a9SWeidong Han 	uint8_t devfn;
155e28c31a9SWeidong Han };
156e28c31a9SWeidong Han 
1578605c684STang Liang #define PHYSDEVOP_restore_msi            19
1588605c684STang Liang struct physdev_restore_msi {
1598605c684STang Liang 	/* IN */
1608605c684STang Liang 	uint8_t bus;
1618605c684STang Liang 	uint8_t devfn;
1628605c684STang Liang };
1638605c684STang Liang 
164e28c31a9SWeidong Han #define PHYSDEVOP_manage_pci_add_ext	20
165e28c31a9SWeidong Han struct physdev_manage_pci_ext {
166e28c31a9SWeidong Han 	/* IN */
167e28c31a9SWeidong Han 	uint8_t bus;
168e28c31a9SWeidong Han 	uint8_t devfn;
169e28c31a9SWeidong Han 	unsigned is_extfn;
170e28c31a9SWeidong Han 	unsigned is_virtfn;
171e28c31a9SWeidong Han 	struct {
172e28c31a9SWeidong Han 		uint8_t bus;
173e28c31a9SWeidong Han 		uint8_t devfn;
174e28c31a9SWeidong Han 	} physfn;
175e28c31a9SWeidong Han };
176e28c31a9SWeidong Han 
177a42089ddSJeremy Fitzhardinge /*
178a42089ddSJeremy Fitzhardinge  * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op()
179a42089ddSJeremy Fitzhardinge  * hypercall since 0x00030202.
180a42089ddSJeremy Fitzhardinge  */
181a42089ddSJeremy Fitzhardinge struct physdev_op {
182a42089ddSJeremy Fitzhardinge 	uint32_t cmd;
183a42089ddSJeremy Fitzhardinge 	union {
184a42089ddSJeremy Fitzhardinge 		struct physdev_irq_status_query	     irq_status_query;
185a42089ddSJeremy Fitzhardinge 		struct physdev_set_iopl		     set_iopl;
186a42089ddSJeremy Fitzhardinge 		struct physdev_set_iobitmap	     set_iobitmap;
187a42089ddSJeremy Fitzhardinge 		struct physdev_apic		     apic_op;
188a42089ddSJeremy Fitzhardinge 		struct physdev_irq		     irq_op;
189a42089ddSJeremy Fitzhardinge 	} u;
190a42089ddSJeremy Fitzhardinge };
191a42089ddSJeremy Fitzhardinge 
19238aa66fcSJeremy Fitzhardinge #define PHYSDEVOP_setup_gsi    21
19338aa66fcSJeremy Fitzhardinge struct physdev_setup_gsi {
19438aa66fcSJeremy Fitzhardinge     int gsi;
19538aa66fcSJeremy Fitzhardinge     /* IN */
19638aa66fcSJeremy Fitzhardinge     uint8_t triggering;
19738aa66fcSJeremy Fitzhardinge     /* IN */
19838aa66fcSJeremy Fitzhardinge     uint8_t polarity;
19938aa66fcSJeremy Fitzhardinge     /* IN */
20038aa66fcSJeremy Fitzhardinge };
20138aa66fcSJeremy Fitzhardinge 
20201557bafSStefano Stabellini #define PHYSDEVOP_get_nr_pirqs    22
20301557bafSStefano Stabellini struct physdev_nr_pirqs {
20401557bafSStefano Stabellini     /* OUT */
20501557bafSStefano Stabellini     uint32_t nr_pirqs;
20601557bafSStefano Stabellini };
20701557bafSStefano Stabellini 
208e5fc7345SStefano Stabellini /* type is MAP_PIRQ_TYPE_GSI or MAP_PIRQ_TYPE_MSI
209e5fc7345SStefano Stabellini  * the hypercall returns a free pirq */
210e5fc7345SStefano Stabellini #define PHYSDEVOP_get_free_pirq    23
211e5fc7345SStefano Stabellini struct physdev_get_free_pirq {
212e5fc7345SStefano Stabellini     /* IN */
213e5fc7345SStefano Stabellini     int type;
214e5fc7345SStefano Stabellini     /* OUT */
215e5fc7345SStefano Stabellini     uint32_t pirq;
216e5fc7345SStefano Stabellini };
217e5fc7345SStefano Stabellini 
21855e901fcSJan Beulich #define XEN_PCI_DEV_EXTFN              0x1
21955e901fcSJan Beulich #define XEN_PCI_DEV_VIRTFN             0x2
22055e901fcSJan Beulich #define XEN_PCI_DEV_PXM                0x4
22155e901fcSJan Beulich 
2228deb3eb1SKonrad Rzeszutek Wilk #define XEN_PCI_MMCFG_RESERVED         0x1
2238deb3eb1SKonrad Rzeszutek Wilk 
2248deb3eb1SKonrad Rzeszutek Wilk #define PHYSDEVOP_pci_mmcfg_reserved    24
2258deb3eb1SKonrad Rzeszutek Wilk struct physdev_pci_mmcfg_reserved {
2268deb3eb1SKonrad Rzeszutek Wilk     uint64_t address;
2278deb3eb1SKonrad Rzeszutek Wilk     uint16_t segment;
2288deb3eb1SKonrad Rzeszutek Wilk     uint8_t start_bus;
2298deb3eb1SKonrad Rzeszutek Wilk     uint8_t end_bus;
2308deb3eb1SKonrad Rzeszutek Wilk     uint32_t flags;
2318deb3eb1SKonrad Rzeszutek Wilk };
2328deb3eb1SKonrad Rzeszutek Wilk 
23355e901fcSJan Beulich #define PHYSDEVOP_pci_device_add        25
23455e901fcSJan Beulich struct physdev_pci_device_add {
23555e901fcSJan Beulich     /* IN */
23655e901fcSJan Beulich     uint16_t seg;
23755e901fcSJan Beulich     uint8_t bus;
23855e901fcSJan Beulich     uint8_t devfn;
23955e901fcSJan Beulich     uint32_t flags;
24055e901fcSJan Beulich     struct {
24155e901fcSJan Beulich         uint8_t bus;
24255e901fcSJan Beulich         uint8_t devfn;
24355e901fcSJan Beulich     } physfn;
24455e901fcSJan Beulich #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
24555e901fcSJan Beulich     uint32_t optarr[];
24655e901fcSJan Beulich #elif defined(__GNUC__)
24755e901fcSJan Beulich     uint32_t optarr[0];
24855e901fcSJan Beulich #endif
24955e901fcSJan Beulich };
25055e901fcSJan Beulich 
25155e901fcSJan Beulich #define PHYSDEVOP_pci_device_remove     26
25255e901fcSJan Beulich #define PHYSDEVOP_restore_msi_ext       27
253909b3fdbSJan Beulich /*
254909b3fdbSJan Beulich  * Dom0 should use these two to announce MMIO resources assigned to
255909b3fdbSJan Beulich  * MSI-X capable devices won't (prepare) or may (release) change.
256909b3fdbSJan Beulich  */
257909b3fdbSJan Beulich #define PHYSDEVOP_prepare_msix          30
258909b3fdbSJan Beulich #define PHYSDEVOP_release_msix          31
259*88801d04SJiqian Chen /*
260*88801d04SJiqian Chen  * Notify the hypervisor that a PCI device has been reset, so that any
261*88801d04SJiqian Chen  * internally cached state is regenerated.  Should be called after any
262*88801d04SJiqian Chen  * device reset performed by the hardware domain.
263*88801d04SJiqian Chen  */
264*88801d04SJiqian Chen #define PHYSDEVOP_pci_device_reset      32
265*88801d04SJiqian Chen 
26655e901fcSJan Beulich struct physdev_pci_device {
26755e901fcSJan Beulich     /* IN */
26855e901fcSJan Beulich     uint16_t seg;
26955e901fcSJan Beulich     uint8_t bus;
27055e901fcSJan Beulich     uint8_t devfn;
27155e901fcSJan Beulich };
27255e901fcSJan Beulich 
273*88801d04SJiqian Chen struct pci_device_reset {
274*88801d04SJiqian Chen     struct physdev_pci_device dev;
275*88801d04SJiqian Chen #define PCI_DEVICE_RESET_COLD 0x0
276*88801d04SJiqian Chen #define PCI_DEVICE_RESET_WARM 0x1
277*88801d04SJiqian Chen #define PCI_DEVICE_RESET_HOT  0x2
278*88801d04SJiqian Chen #define PCI_DEVICE_RESET_FLR  0x3
279*88801d04SJiqian Chen #define PCI_DEVICE_RESET_MASK 0x3
280*88801d04SJiqian Chen     uint32_t flags;
281*88801d04SJiqian Chen };
282*88801d04SJiqian Chen 
2839fa5780bSJan Beulich #define PHYSDEVOP_DBGP_RESET_PREPARE    1
2849fa5780bSJan Beulich #define PHYSDEVOP_DBGP_RESET_DONE       2
2859fa5780bSJan Beulich 
2869fa5780bSJan Beulich #define PHYSDEVOP_DBGP_BUS_UNKNOWN      0
2879fa5780bSJan Beulich #define PHYSDEVOP_DBGP_BUS_PCI          1
2889fa5780bSJan Beulich 
2899fa5780bSJan Beulich #define PHYSDEVOP_dbgp_op               29
2909fa5780bSJan Beulich struct physdev_dbgp_op {
2919fa5780bSJan Beulich     /* IN */
2929fa5780bSJan Beulich     uint8_t op;
2939fa5780bSJan Beulich     uint8_t bus;
2949fa5780bSJan Beulich     union {
2959fa5780bSJan Beulich         struct physdev_pci_device pci;
2969fa5780bSJan Beulich     } u;
2979fa5780bSJan Beulich };
2989fa5780bSJan Beulich 
299a42089ddSJeremy Fitzhardinge /*
300a42089ddSJeremy Fitzhardinge  * Notify that some PIRQ-bound event channels have been unmasked.
301a42089ddSJeremy Fitzhardinge  * ** This command is obsolete since interface version 0x00030202 and is **
302a42089ddSJeremy Fitzhardinge  * ** unsupported by newer versions of Xen.				 **
303a42089ddSJeremy Fitzhardinge  */
304a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_IRQ_UNMASK_NOTIFY	 4
305a42089ddSJeremy Fitzhardinge 
306a42089ddSJeremy Fitzhardinge /*
307a42089ddSJeremy Fitzhardinge  * These all-capitals physdev operation names are superceded by the new names
308a42089ddSJeremy Fitzhardinge  * (defined above) since interface version 0x00030202.
309a42089ddSJeremy Fitzhardinge  */
310a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_IRQ_STATUS_QUERY	 PHYSDEVOP_irq_status_query
311a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_SET_IOPL		 PHYSDEVOP_set_iopl
312a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_SET_IOBITMAP		 PHYSDEVOP_set_iobitmap
313a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_APIC_READ		 PHYSDEVOP_apic_read
314a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_APIC_WRITE		 PHYSDEVOP_apic_write
315a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_ASSIGN_VECTOR		 PHYSDEVOP_alloc_irq_vector
316a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_FREE_VECTOR		 PHYSDEVOP_free_irq_vector
317a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi
318a42089ddSJeremy Fitzhardinge #define PHYSDEVOP_IRQ_SHARED		 XENIRQSTAT_shared
319a42089ddSJeremy Fitzhardinge 
320a42089ddSJeremy Fitzhardinge #endif /* __XEN_PUBLIC_PHYSDEV_H__ */
321