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