xref: /onnv-gate/usr/src/uts/common/xen/public/physdev.h (revision 11120:fe619717975a)
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