physdev.h revision 256281
123599Smarkm/* 223599Smarkm * Permission is hereby granted, free of charge, to any person obtaining a copy 323599Smarkm * of this software and associated documentation files (the "Software"), to 423599Smarkm * deal in the Software without restriction, including without limitation the 523599Smarkm * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 623599Smarkm * sell copies of the Software, and to permit persons to whom the Software is 723599Smarkm * furnished to do so, subject to the following conditions: 823599Smarkm * 923599Smarkm * The above copyright notice and this permission notice shall be included in 1023599Smarkm * all copies or substantial portions of the Software. 1123599Smarkm * 1223599Smarkm * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1323599Smarkm * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1423599Smarkm * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1523599Smarkm * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1623599Smarkm * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 1723599Smarkm * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 1823599Smarkm * DEALINGS IN THE SOFTWARE. 1923599Smarkm */ 2023599Smarkm 2123599Smarkm#ifndef __XEN_PUBLIC_PHYSDEV_H__ 2223599Smarkm#define __XEN_PUBLIC_PHYSDEV_H__ 2323599Smarkm 2423599Smarkm#include "xen.h" 2523599Smarkm 2623599Smarkm/* 2723599Smarkm * Prototype for this hypercall is: 2823599Smarkm * int physdev_op(int cmd, void *args) 2923599Smarkm * @cmd == PHYSDEVOP_??? (physdev operation). 3023599Smarkm * @args == Operation-specific extra arguments (NULL if none). 3123599Smarkm */ 3223599Smarkm 3323599Smarkm/* 3423599Smarkm * Notify end-of-interrupt (EOI) for the specified IRQ. 3523599Smarkm * @arg == pointer to physdev_eoi structure. 3623599Smarkm */ 3723599Smarkm#define PHYSDEVOP_eoi 12 3823599Smarkmstruct physdev_eoi { 3935050Sahasty /* IN */ 4037611Sahasty uint32_t irq; 4137611Sahasty}; 4223599Smarkmtypedef struct physdev_eoi physdev_eoi_t; 4324246SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_eoi_t); 4424246Sfsmp 4524246Sfsmp/* 4624246Sfsmp * Register a shared page for the hypervisor to indicate whether the guest 4724246Sfsmp * must issue PHYSDEVOP_eoi. The semantics of PHYSDEVOP_eoi change slightly 4824246Sfsmp * once the guest used this function in that the associated event channel 4924246Sfsmp * will automatically get unmasked. The page registered is used as a bit 5024246Sfsmp * array indexed by Xen's PIRQ value. 5124246Sfsmp */ 5223599Smarkm#define PHYSDEVOP_pirq_eoi_gmfn_v1 17 5324246Sfsmp/* 5424246Sfsmp * Register a shared page for the hypervisor to indicate whether the 5524528Sfsmp * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to 5624528Sfsmp * PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't change the semantics of 5724528Sfsmp * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by 5824528Sfsmp * Xen's PIRQ value. 5924528Sfsmp */ 6024528Sfsmp#define PHYSDEVOP_pirq_eoi_gmfn_v2 28 6124528Sfsmpstruct physdev_pirq_eoi_gmfn { 6224246Sfsmp /* IN */ 6324528Sfsmp xen_pfn_t gmfn; 6424528Sfsmp}; 6524528Sfsmptypedef struct physdev_pirq_eoi_gmfn physdev_pirq_eoi_gmfn_t; 6624528SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_pirq_eoi_gmfn_t); 6737611Sahasty 6824528Sfsmp/* 6924528Sfsmp * Query the status of an IRQ line. 7024528Sfsmp * @arg == pointer to physdev_irq_status_query structure. 7124528Sfsmp */ 7224528Sfsmp#define PHYSDEVOP_irq_status_query 5 7324528Sfsmpstruct physdev_irq_status_query { 7424246Sfsmp /* IN */ 7524246Sfsmp uint32_t irq; 7624246Sfsmp /* OUT */ 7724246Sfsmp uint32_t flags; /* XENIRQSTAT_* */ 7824246Sfsmp}; 7924246Sfsmptypedef struct physdev_irq_status_query physdev_irq_status_query_t; 8024246SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_irq_status_query_t); 8124246Sfsmp 8224246Sfsmp/* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */ 8324246Sfsmp#define _XENIRQSTAT_needs_eoi (0) 8424528Sfsmp#define XENIRQSTAT_needs_eoi (1U<<_XENIRQSTAT_needs_eoi) 8524528Sfsmp 8624528Sfsmp/* IRQ shared by multiple guests? */ 8724528Sfsmp#define _XENIRQSTAT_shared (1) 8824528Sfsmp#define XENIRQSTAT_shared (1U<<_XENIRQSTAT_shared) 8924528Sfsmp 9024528Sfsmp/* 9124528Sfsmp * Set the current VCPU's I/O privilege level. 9224246Sfsmp * @arg == pointer to physdev_set_iopl structure. 9324246Sfsmp */ 9424246Sfsmp#define PHYSDEVOP_set_iopl 6 9524246Sfsmpstruct physdev_set_iopl { 9624246Sfsmp /* IN */ 9724528Sfsmp uint32_t iopl; 9824528Sfsmp}; 9924528Sfsmptypedef struct physdev_set_iopl physdev_set_iopl_t; 10024528SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_set_iopl_t); 10124528Sfsmp 10224528Sfsmp/* 10324528Sfsmp * Set the current VCPU's I/O-port permissions bitmap. 10424528Sfsmp * @arg == pointer to physdev_set_iobitmap structure. 10524528Sfsmp */ 10624246Sfsmp#define PHYSDEVOP_set_iobitmap 7 10724246Sfsmpstruct physdev_set_iobitmap { 10824246Sfsmp /* IN */ 10924246Sfsmp#if __XEN_INTERFACE_VERSION__ >= 0x00030205 11024246Sfsmp XEN_GUEST_HANDLE(uint8) bitmap; 11124246Sfsmp#else 11224246Sfsmp uint8_t *bitmap; 11324246Sfsmp#endif 11424246Sfsmp uint32_t nr_ports; 11524246Sfsmp}; 11624528Sfsmptypedef struct physdev_set_iobitmap physdev_set_iobitmap_t; 11724528SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_set_iobitmap_t); 11824528Sfsmp 11924528Sfsmp/* 12024528Sfsmp * Read or write an IO-APIC register. 12124528Sfsmp * @arg == pointer to physdev_apic structure. 12224528Sfsmp */ 12324246Sfsmp#define PHYSDEVOP_apic_read 8 12424246Sfsmp#define PHYSDEVOP_apic_write 9 12524246Sfsmpstruct physdev_apic { 12624246Sfsmp /* IN */ 12724246Sfsmp unsigned long apic_physbase; 12824246Sfsmp uint32_t reg; 12924246Sfsmp /* IN or OUT */ 13024246Sfsmp uint32_t value; 13124246Sfsmp}; 13224246Sfsmptypedef struct physdev_apic physdev_apic_t; 13324246SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_apic_t); 13424246Sfsmp 13524246Sfsmp/* 13624246Sfsmp * Allocate or free a physical upcall vector for the specified IRQ line. 13724246Sfsmp * @arg == pointer to physdev_irq structure. 13824528Sfsmp */ 13924528Sfsmp#define PHYSDEVOP_alloc_irq_vector 10 14024528Sfsmp#define PHYSDEVOP_free_irq_vector 11 14124528Sfsmpstruct physdev_irq { 14224528Sfsmp /* IN */ 14324528Sfsmp uint32_t irq; 14424528Sfsmp /* IN or OUT */ 14524528Sfsmp uint32_t vector; 14624246Sfsmp}; 14724246Sfsmptypedef struct physdev_irq physdev_irq_t; 14824528SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_irq_t); 14924528Sfsmp 15024528Sfsmp#define MAP_PIRQ_TYPE_MSI 0x0 15124528Sfsmp#define MAP_PIRQ_TYPE_GSI 0x1 15224528Sfsmp#define MAP_PIRQ_TYPE_UNKNOWN 0x2 15324528Sfsmp#define MAP_PIRQ_TYPE_MSI_SEG 0x3 15424528Sfsmp 15524528Sfsmp#define PHYSDEVOP_map_pirq 13 15624528Sfsmpstruct physdev_map_pirq { 15724246Sfsmp domid_t domid; 15824246Sfsmp /* IN */ 15924246Sfsmp int type; 16024246Sfsmp /* IN */ 16124246Sfsmp int index; 16225329Sfsmp /* IN or OUT */ 16324528Sfsmp int pirq; 16424528Sfsmp /* IN - high 16 bits hold segment for MAP_PIRQ_TYPE_MSI_SEG */ 16524528Sfsmp int bus; 16624528Sfsmp /* IN */ 16725329Sfsmp int devfn; 16825329Sfsmp /* IN */ 16925329Sfsmp int entry_nr; 17025329Sfsmp /* IN */ 17125329Sfsmp uint64_t table_base; 17224246Sfsmp}; 17324528Sfsmptypedef struct physdev_map_pirq physdev_map_pirq_t; 17424528SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_map_pirq_t); 17524528Sfsmp 17624528Sfsmp#define PHYSDEVOP_unmap_pirq 14 17724528Sfsmpstruct physdev_unmap_pirq { 17824246Sfsmp domid_t domid; 17924246Sfsmp /* IN */ 18024246Sfsmp int pirq; 18124246Sfsmp}; 18224246Sfsmp 18324246Sfsmptypedef struct physdev_unmap_pirq physdev_unmap_pirq_t; 18424246SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_unmap_pirq_t); 18524528Sfsmp 18624528Sfsmp#define PHYSDEVOP_manage_pci_add 15 18724528Sfsmp#define PHYSDEVOP_manage_pci_remove 16 18824528Sfsmpstruct physdev_manage_pci { 18924528Sfsmp /* IN */ 19024528Sfsmp uint8_t bus; 19124528Sfsmp uint8_t devfn; 19224528Sfsmp}; 19324528Sfsmp 19424528Sfsmptypedef struct physdev_manage_pci physdev_manage_pci_t; 19524528SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_t); 19624528Sfsmp 19724528Sfsmp#define PHYSDEVOP_restore_msi 19 19824528Sfsmpstruct physdev_restore_msi { 19924528Sfsmp /* IN */ 20024528Sfsmp uint8_t bus; 20124528Sfsmp uint8_t devfn; 20224528Sfsmp}; 20324528Sfsmptypedef struct physdev_restore_msi physdev_restore_msi_t; 20424528SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_restore_msi_t); 20524528Sfsmp 20624528Sfsmp#define PHYSDEVOP_manage_pci_add_ext 20 20724528Sfsmpstruct physdev_manage_pci_ext { 20824528Sfsmp /* IN */ 20924246Sfsmp uint8_t bus; 21024246Sfsmp uint8_t devfn; 21129233Smarkm unsigned is_extfn; 21229233Smarkm unsigned is_virtfn; 21329233Smarkm struct { 21429233Smarkm uint8_t bus; 21529233Smarkm uint8_t devfn; 21629233Smarkm } physfn; 21729233Smarkm}; 21829233Smarkm 21929233Smarkmtypedef struct physdev_manage_pci_ext physdev_manage_pci_ext_t; 22029233SmarkmDEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_ext_t); 22129233Smarkm 22229233Smarkm/* 22324528Sfsmp * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op() 22424528Sfsmp * hypercall since 0x00030202. 22524246Sfsmp */ 22624528Sfsmpstruct physdev_op { 22724528Sfsmp uint32_t cmd; 22824528Sfsmp union { 22924528Sfsmp struct physdev_irq_status_query irq_status_query; 23024528Sfsmp struct physdev_set_iopl set_iopl; 23124246Sfsmp struct physdev_set_iobitmap set_iobitmap; 23224246Sfsmp struct physdev_apic apic_op; 23324246Sfsmp struct physdev_irq irq_op; 23424246Sfsmp } u; 23524246Sfsmp}; 23624246Sfsmptypedef struct physdev_op physdev_op_t; 23724246SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_op_t); 23823599Smarkm 23924528Sfsmp#define PHYSDEVOP_setup_gsi 21 24024246Sfsmpstruct physdev_setup_gsi { 24124246Sfsmp int gsi; 24224528Sfsmp /* IN */ 24324528Sfsmp uint8_t triggering; 24424528Sfsmp /* IN */ 24524087Sfsmp uint8_t polarity; 24624087Sfsmp /* IN */ 24724087Sfsmp}; 24824087Sfsmp 24924087Sfsmptypedef struct physdev_setup_gsi physdev_setup_gsi_t; 25024087SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_setup_gsi_t); 25124087Sfsmp 25224087Sfsmp/* leave PHYSDEVOP 22 free */ 25324087Sfsmp 25424087Sfsmp/* type is MAP_PIRQ_TYPE_GSI or MAP_PIRQ_TYPE_MSI 25524087Sfsmp * the hypercall returns a free pirq */ 25624087Sfsmp#define PHYSDEVOP_get_free_pirq 23 25724087Sfsmpstruct physdev_get_free_pirq { 25824087Sfsmp /* IN */ 25924087Sfsmp int type; 26024087Sfsmp /* OUT */ 26124087Sfsmp uint32_t pirq; 26224087Sfsmp}; 26324087Sfsmp 26424087Sfsmptypedef struct physdev_get_free_pirq physdev_get_free_pirq_t; 26524087SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_get_free_pirq_t); 26624087Sfsmp 26724087Sfsmp#define XEN_PCI_MMCFG_RESERVED 0x1 26824087Sfsmp 26924087Sfsmp#define PHYSDEVOP_pci_mmcfg_reserved 24 27024087Sfsmpstruct physdev_pci_mmcfg_reserved { 27124087Sfsmp uint64_t address; 27224087Sfsmp uint16_t segment; 27324087Sfsmp uint8_t start_bus; 27424087Sfsmp uint8_t end_bus; 27524087Sfsmp uint32_t flags; 27624087Sfsmp}; 27724087Sfsmptypedef struct physdev_pci_mmcfg_reserved physdev_pci_mmcfg_reserved_t; 27824087SfsmpDEFINE_XEN_GUEST_HANDLE(physdev_pci_mmcfg_reserved_t); 27924087Sfsmp 28024087Sfsmp#define XEN_PCI_DEV_EXTFN 0x1 28124087Sfsmp#define XEN_PCI_DEV_VIRTFN 0x2 28224087Sfsmp#define XEN_PCI_DEV_PXM 0x4 28324087Sfsmp 28424087Sfsmp#define PHYSDEVOP_pci_device_add 25 28524087Sfsmpstruct physdev_pci_device_add { 28624087Sfsmp /* IN */ 28724087Sfsmp uint16_t seg; 28824087Sfsmp uint8_t bus; 28924087Sfsmp uint8_t devfn; 29024087Sfsmp uint32_t flags; 29124087Sfsmp struct { 29224087Sfsmp uint8_t bus; 29324087Sfsmp uint8_t devfn; 29424087Sfsmp } physfn; 29524087Sfsmp#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L 29624087Sfsmp uint32_t optarr[]; 29723599Smarkm#elif defined(__GNUC__) 29824528Sfsmp uint32_t optarr[0]; 29923599Smarkm#endif 30023599Smarkm}; 30123599Smarkmtypedef struct physdev_pci_device_add physdev_pci_device_add_t; 30223599SmarkmDEFINE_XEN_GUEST_HANDLE(physdev_pci_device_add_t); 30324528Sfsmp 30424528Sfsmp#define PHYSDEVOP_pci_device_remove 26 30524246Sfsmp#define PHYSDEVOP_restore_msi_ext 27 30624528Sfsmpstruct physdev_pci_device { 30724528Sfsmp /* IN */ 30824528Sfsmp uint16_t seg; 30924528Sfsmp uint8_t bus; 31024528Sfsmp uint8_t devfn; 31133850Sahasty}; 31223599Smarkmtypedef struct physdev_pci_device physdev_pci_device_t; 31323599SmarkmDEFINE_XEN_GUEST_HANDLE(physdev_pci_device_t); 31424528Sfsmp 31524528Sfsmp/* 31624528Sfsmp * Notify that some PIRQ-bound event channels have been unmasked. 31724528Sfsmp * ** This command is obsolete since interface version 0x00030202 and is ** 31824528Sfsmp * ** unsupported by newer versions of Xen. ** 31933025Sahasty */ 32024528Sfsmp#define PHYSDEVOP_IRQ_UNMASK_NOTIFY 4 32133025Sahasty 32233025Sahasty/* 32333025Sahasty * These all-capitals physdev operation names are superceded by the new names 32433025Sahasty * (defined above) since interface version 0x00030202. 32533025Sahasty */ 32624528Sfsmp#define PHYSDEVOP_IRQ_STATUS_QUERY PHYSDEVOP_irq_status_query 32724528Sfsmp#define PHYSDEVOP_SET_IOPL PHYSDEVOP_set_iopl 32824528Sfsmp#define PHYSDEVOP_SET_IOBITMAP PHYSDEVOP_set_iobitmap 32924246Sfsmp#define PHYSDEVOP_APIC_READ PHYSDEVOP_apic_read 33024246Sfsmp#define PHYSDEVOP_APIC_WRITE PHYSDEVOP_apic_write 33124528Sfsmp#define PHYSDEVOP_ASSIGN_VECTOR PHYSDEVOP_alloc_irq_vector 33224528Sfsmp#define PHYSDEVOP_FREE_VECTOR PHYSDEVOP_free_irq_vector 33330856Seivind#define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi 33430856Seivind#define PHYSDEVOP_IRQ_SHARED XENIRQSTAT_shared 33524528Sfsmp 33624528Sfsmp#if __XEN_INTERFACE_VERSION__ < 0x00040200 33724528Sfsmp#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v1 33824528Sfsmp#else 33924246Sfsmp#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v2 34023599Smarkm#endif 34124528Sfsmp 34224528Sfsmp#endif /* __XEN_PUBLIC_PHYSDEV_H__ */ 34324528Sfsmp 34424528Sfsmp/* 34524528Sfsmp * Local variables: 34629233Smarkm * mode: C 34729233Smarkm * c-set-style: "BSD" 34829233Smarkm * c-basic-offset: 4 34929233Smarkm * tab-width: 4 35030856Seivind * indent-tabs-mode: nil 35130856Seivind * End: 35230856Seivind */ 35330856Seivind