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