15084Sjohnlev /* 25084Sjohnlev * Permission is hereby granted, free of charge, to any person obtaining a copy 35084Sjohnlev * of this software and associated documentation files (the "Software"), to 45084Sjohnlev * deal in the Software without restriction, including without limitation the 55084Sjohnlev * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 65084Sjohnlev * sell copies of the Software, and to permit persons to whom the Software is 75084Sjohnlev * furnished to do so, subject to the following conditions: 85084Sjohnlev * 95084Sjohnlev * The above copyright notice and this permission notice shall be included in 105084Sjohnlev * all copies or substantial portions of the Software. 115084Sjohnlev * 125084Sjohnlev * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 135084Sjohnlev * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 145084Sjohnlev * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 155084Sjohnlev * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 165084Sjohnlev * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 175084Sjohnlev * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 185084Sjohnlev * DEALINGS IN THE SOFTWARE. 195084Sjohnlev */ 205084Sjohnlev 215084Sjohnlev #ifndef __XEN_PUBLIC_PHYSDEV_H__ 225084Sjohnlev #define __XEN_PUBLIC_PHYSDEV_H__ 235084Sjohnlev 245084Sjohnlev /* 255084Sjohnlev * Prototype for this hypercall is: 265084Sjohnlev * int physdev_op(int cmd, void *args) 275084Sjohnlev * @cmd == PHYSDEVOP_??? (physdev operation). 285084Sjohnlev * @args == Operation-specific extra arguments (NULL if none). 295084Sjohnlev */ 305084Sjohnlev 315084Sjohnlev /* 325084Sjohnlev * Notify end-of-interrupt (EOI) for the specified IRQ. 335084Sjohnlev * @arg == pointer to physdev_eoi structure. 345084Sjohnlev */ 355084Sjohnlev #define PHYSDEVOP_eoi 12 365084Sjohnlev struct physdev_eoi { 375084Sjohnlev /* IN */ 385084Sjohnlev uint32_t irq; 395084Sjohnlev }; 405084Sjohnlev typedef struct physdev_eoi physdev_eoi_t; 415084Sjohnlev DEFINE_XEN_GUEST_HANDLE(physdev_eoi_t); 425084Sjohnlev 435084Sjohnlev /* 44*11120SMark.Johnson@Sun.COM * Register a shared page for the hypervisor to indicate whether the guest 45*11120SMark.Johnson@Sun.COM * must issue PHYSDEVOP_eoi. The semantics of PHYSDEVOP_eoi change slightly 46*11120SMark.Johnson@Sun.COM * once the guest used this function in that the associated event channel 47*11120SMark.Johnson@Sun.COM * will automatically get unmasked. The page registered is used as a bit 48*11120SMark.Johnson@Sun.COM * array indexed by Xen's PIRQ value. 49*11120SMark.Johnson@Sun.COM */ 50*11120SMark.Johnson@Sun.COM #define PHYSDEVOP_pirq_eoi_gmfn 17 51*11120SMark.Johnson@Sun.COM struct physdev_pirq_eoi_gmfn { 52*11120SMark.Johnson@Sun.COM /* IN */ 53*11120SMark.Johnson@Sun.COM xen_pfn_t gmfn; 54*11120SMark.Johnson@Sun.COM }; 55*11120SMark.Johnson@Sun.COM typedef struct physdev_pirq_eoi_gmfn physdev_pirq_eoi_gmfn_t; 56*11120SMark.Johnson@Sun.COM DEFINE_XEN_GUEST_HANDLE(physdev_pirq_eoi_gmfn_t); 57*11120SMark.Johnson@Sun.COM 58*11120SMark.Johnson@Sun.COM /* 595084Sjohnlev * Query the status of an IRQ line. 605084Sjohnlev * @arg == pointer to physdev_irq_status_query structure. 615084Sjohnlev */ 625084Sjohnlev #define PHYSDEVOP_irq_status_query 5 635084Sjohnlev struct physdev_irq_status_query { 645084Sjohnlev /* IN */ 655084Sjohnlev uint32_t irq; 665084Sjohnlev /* OUT */ 675084Sjohnlev uint32_t flags; /* XENIRQSTAT_* */ 685084Sjohnlev }; 695084Sjohnlev typedef struct physdev_irq_status_query physdev_irq_status_query_t; 705084Sjohnlev DEFINE_XEN_GUEST_HANDLE(physdev_irq_status_query_t); 715084Sjohnlev 725084Sjohnlev /* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */ 735084Sjohnlev #define _XENIRQSTAT_needs_eoi (0) 745084Sjohnlev #define XENIRQSTAT_needs_eoi (1U<<_XENIRQSTAT_needs_eoi) 755084Sjohnlev 765084Sjohnlev /* IRQ shared by multiple guests? */ 775084Sjohnlev #define _XENIRQSTAT_shared (1) 785084Sjohnlev #define XENIRQSTAT_shared (1U<<_XENIRQSTAT_shared) 795084Sjohnlev 805084Sjohnlev /* 815084Sjohnlev * Set the current VCPU's I/O privilege level. 825084Sjohnlev * @arg == pointer to physdev_set_iopl structure. 835084Sjohnlev */ 845084Sjohnlev #define PHYSDEVOP_set_iopl 6 855084Sjohnlev struct physdev_set_iopl { 865084Sjohnlev /* IN */ 875084Sjohnlev uint32_t iopl; 885084Sjohnlev }; 895084Sjohnlev typedef struct physdev_set_iopl physdev_set_iopl_t; 905084Sjohnlev DEFINE_XEN_GUEST_HANDLE(physdev_set_iopl_t); 915084Sjohnlev 925084Sjohnlev /* 935084Sjohnlev * Set the current VCPU's I/O-port permissions bitmap. 945084Sjohnlev * @arg == pointer to physdev_set_iobitmap structure. 955084Sjohnlev */ 965084Sjohnlev #define PHYSDEVOP_set_iobitmap 7 975084Sjohnlev struct physdev_set_iobitmap { 985084Sjohnlev /* IN */ 9910175SStuart.Maybee@Sun.COM #if __XEN_INTERFACE_VERSION__ >= 0x00030205 10010175SStuart.Maybee@Sun.COM XEN_GUEST_HANDLE(uint8) bitmap; 10110175SStuart.Maybee@Sun.COM #else 10210175SStuart.Maybee@Sun.COM uint8_t *bitmap; 10310175SStuart.Maybee@Sun.COM #endif 1045084Sjohnlev uint32_t nr_ports; 1055084Sjohnlev }; 1065084Sjohnlev typedef struct physdev_set_iobitmap physdev_set_iobitmap_t; 1075084Sjohnlev DEFINE_XEN_GUEST_HANDLE(physdev_set_iobitmap_t); 1085084Sjohnlev 1095084Sjohnlev /* 1105084Sjohnlev * Read or write an IO-APIC register. 1115084Sjohnlev * @arg == pointer to physdev_apic structure. 1125084Sjohnlev */ 1135084Sjohnlev #define PHYSDEVOP_apic_read 8 1145084Sjohnlev #define PHYSDEVOP_apic_write 9 1155084Sjohnlev struct physdev_apic { 1165084Sjohnlev /* IN */ 1175084Sjohnlev unsigned long apic_physbase; 1185084Sjohnlev uint32_t reg; 1195084Sjohnlev /* IN or OUT */ 1205084Sjohnlev uint32_t value; 1215084Sjohnlev }; 1225084Sjohnlev typedef struct physdev_apic physdev_apic_t; 1235084Sjohnlev DEFINE_XEN_GUEST_HANDLE(physdev_apic_t); 1245084Sjohnlev 1255084Sjohnlev /* 1265084Sjohnlev * Allocate or free a physical upcall vector for the specified IRQ line. 1275084Sjohnlev * @arg == pointer to physdev_irq structure. 1285084Sjohnlev */ 1295084Sjohnlev #define PHYSDEVOP_alloc_irq_vector 10 1305084Sjohnlev #define PHYSDEVOP_free_irq_vector 11 1315084Sjohnlev struct physdev_irq { 1325084Sjohnlev /* IN */ 1335084Sjohnlev uint32_t irq; 1345084Sjohnlev /* IN or OUT */ 1355084Sjohnlev uint32_t vector; 1365084Sjohnlev }; 1375084Sjohnlev typedef struct physdev_irq physdev_irq_t; 1385084Sjohnlev DEFINE_XEN_GUEST_HANDLE(physdev_irq_t); 13910175SStuart.Maybee@Sun.COM 14010175SStuart.Maybee@Sun.COM #define MAP_PIRQ_TYPE_MSI 0x0 14110175SStuart.Maybee@Sun.COM #define MAP_PIRQ_TYPE_GSI 0x1 14210175SStuart.Maybee@Sun.COM #define MAP_PIRQ_TYPE_UNKNOWN 0x2 14310175SStuart.Maybee@Sun.COM 14410175SStuart.Maybee@Sun.COM #define PHYSDEVOP_map_pirq 13 14510175SStuart.Maybee@Sun.COM struct physdev_map_pirq { 14610175SStuart.Maybee@Sun.COM domid_t domid; 14710175SStuart.Maybee@Sun.COM /* IN */ 14810175SStuart.Maybee@Sun.COM int type; 14910175SStuart.Maybee@Sun.COM /* IN */ 15010175SStuart.Maybee@Sun.COM int index; 15110175SStuart.Maybee@Sun.COM /* IN or OUT */ 15210175SStuart.Maybee@Sun.COM int pirq; 15310175SStuart.Maybee@Sun.COM /* IN */ 15410175SStuart.Maybee@Sun.COM int bus; 15510175SStuart.Maybee@Sun.COM /* IN */ 15610175SStuart.Maybee@Sun.COM int devfn; 15710175SStuart.Maybee@Sun.COM /* IN */ 15810175SStuart.Maybee@Sun.COM int entry_nr; 15910175SStuart.Maybee@Sun.COM /* IN */ 16010175SStuart.Maybee@Sun.COM uint64_t table_base; 16110175SStuart.Maybee@Sun.COM }; 16210175SStuart.Maybee@Sun.COM typedef struct physdev_map_pirq physdev_map_pirq_t; 16310175SStuart.Maybee@Sun.COM DEFINE_XEN_GUEST_HANDLE(physdev_map_pirq_t); 16410175SStuart.Maybee@Sun.COM 16510175SStuart.Maybee@Sun.COM #define PHYSDEVOP_unmap_pirq 14 16610175SStuart.Maybee@Sun.COM struct physdev_unmap_pirq { 16710175SStuart.Maybee@Sun.COM domid_t domid; 16810175SStuart.Maybee@Sun.COM /* IN */ 16910175SStuart.Maybee@Sun.COM int pirq; 17010175SStuart.Maybee@Sun.COM }; 17110175SStuart.Maybee@Sun.COM 17210175SStuart.Maybee@Sun.COM typedef struct physdev_unmap_pirq physdev_unmap_pirq_t; 17310175SStuart.Maybee@Sun.COM DEFINE_XEN_GUEST_HANDLE(physdev_unmap_pirq_t); 17410175SStuart.Maybee@Sun.COM 17510175SStuart.Maybee@Sun.COM #define PHYSDEVOP_manage_pci_add 15 17610175SStuart.Maybee@Sun.COM #define PHYSDEVOP_manage_pci_remove 16 17710175SStuart.Maybee@Sun.COM struct physdev_manage_pci { 17810175SStuart.Maybee@Sun.COM /* IN */ 17910175SStuart.Maybee@Sun.COM uint8_t bus; 18010175SStuart.Maybee@Sun.COM uint8_t devfn; 18110175SStuart.Maybee@Sun.COM }; 18210175SStuart.Maybee@Sun.COM 18310175SStuart.Maybee@Sun.COM typedef struct physdev_manage_pci physdev_manage_pci_t; 18410175SStuart.Maybee@Sun.COM DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_t); 1855084Sjohnlev 186*11120SMark.Johnson@Sun.COM #define PHYSDEVOP_restore_msi 19 187*11120SMark.Johnson@Sun.COM struct physdev_restore_msi { 188*11120SMark.Johnson@Sun.COM /* IN */ 189*11120SMark.Johnson@Sun.COM uint8_t bus; 190*11120SMark.Johnson@Sun.COM uint8_t devfn; 191*11120SMark.Johnson@Sun.COM }; 192*11120SMark.Johnson@Sun.COM typedef struct physdev_restore_msi physdev_restore_msi_t; 193*11120SMark.Johnson@Sun.COM DEFINE_XEN_GUEST_HANDLE(physdev_restore_msi_t); 194*11120SMark.Johnson@Sun.COM 195*11120SMark.Johnson@Sun.COM #define PHYSDEVOP_manage_pci_add_ext 20 196*11120SMark.Johnson@Sun.COM struct physdev_manage_pci_ext { 197*11120SMark.Johnson@Sun.COM /* IN */ 198*11120SMark.Johnson@Sun.COM uint8_t bus; 199*11120SMark.Johnson@Sun.COM uint8_t devfn; 200*11120SMark.Johnson@Sun.COM unsigned is_extfn; 201*11120SMark.Johnson@Sun.COM unsigned is_virtfn; 202*11120SMark.Johnson@Sun.COM struct { 203*11120SMark.Johnson@Sun.COM uint8_t bus; 204*11120SMark.Johnson@Sun.COM uint8_t devfn; 205*11120SMark.Johnson@Sun.COM } physfn; 206*11120SMark.Johnson@Sun.COM }; 207*11120SMark.Johnson@Sun.COM 208*11120SMark.Johnson@Sun.COM typedef struct physdev_manage_pci_ext physdev_manage_pci_ext_t; 209*11120SMark.Johnson@Sun.COM DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_ext_t); 210*11120SMark.Johnson@Sun.COM 2115084Sjohnlev /* 2125084Sjohnlev * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op() 2135084Sjohnlev * hypercall since 0x00030202. 2145084Sjohnlev */ 2155084Sjohnlev struct physdev_op { 2165084Sjohnlev uint32_t cmd; 2175084Sjohnlev union { 2185084Sjohnlev struct physdev_irq_status_query irq_status_query; 2195084Sjohnlev struct physdev_set_iopl set_iopl; 2205084Sjohnlev struct physdev_set_iobitmap set_iobitmap; 2215084Sjohnlev struct physdev_apic apic_op; 2225084Sjohnlev struct physdev_irq irq_op; 2235084Sjohnlev } u; 2245084Sjohnlev }; 2255084Sjohnlev typedef struct physdev_op physdev_op_t; 2265084Sjohnlev DEFINE_XEN_GUEST_HANDLE(physdev_op_t); 2275084Sjohnlev 2285084Sjohnlev /* 2295084Sjohnlev * Notify that some PIRQ-bound event channels have been unmasked. 2305084Sjohnlev * ** This command is obsolete since interface version 0x00030202 and is ** 2315084Sjohnlev * ** unsupported by newer versions of Xen. ** 2325084Sjohnlev */ 2335084Sjohnlev #define PHYSDEVOP_IRQ_UNMASK_NOTIFY 4 2345084Sjohnlev 2355084Sjohnlev /* 2365084Sjohnlev * These all-capitals physdev operation names are superceded by the new names 2375084Sjohnlev * (defined above) since interface version 0x00030202. 2385084Sjohnlev */ 2395084Sjohnlev #define PHYSDEVOP_IRQ_STATUS_QUERY PHYSDEVOP_irq_status_query 2405084Sjohnlev #define PHYSDEVOP_SET_IOPL PHYSDEVOP_set_iopl 2415084Sjohnlev #define PHYSDEVOP_SET_IOBITMAP PHYSDEVOP_set_iobitmap 2425084Sjohnlev #define PHYSDEVOP_APIC_READ PHYSDEVOP_apic_read 2435084Sjohnlev #define PHYSDEVOP_APIC_WRITE PHYSDEVOP_apic_write 2445084Sjohnlev #define PHYSDEVOP_ASSIGN_VECTOR PHYSDEVOP_alloc_irq_vector 2455084Sjohnlev #define PHYSDEVOP_FREE_VECTOR PHYSDEVOP_free_irq_vector 2465084Sjohnlev #define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi 2475084Sjohnlev #define PHYSDEVOP_IRQ_SHARED XENIRQSTAT_shared 2485084Sjohnlev 2495084Sjohnlev #endif /* __XEN_PUBLIC_PHYSDEV_H__ */ 2505084Sjohnlev 2515084Sjohnlev /* 2525084Sjohnlev * Local variables: 2535084Sjohnlev * mode: C 2545084Sjohnlev * c-set-style: "BSD" 2555084Sjohnlev * c-basic-offset: 4 2565084Sjohnlev * tab-width: 4 2575084Sjohnlev * indent-tabs-mode: nil 2585084Sjohnlev * End: 2595084Sjohnlev */ 260