linux/include/xen/interface/physdev.h
<<
>>
Prefs
   1/*
   2 * Permission is hereby granted, free of charge, to any person obtaining a copy
   3 * of this software and associated documentation files (the "Software"), to
   4 * deal in the Software without restriction, including without limitation the
   5 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
   6 * sell copies of the Software, and to permit persons to whom the Software is
   7 * furnished to do so, subject to the following conditions:
   8 *
   9 * The above copyright notice and this permission notice shall be included in
  10 * all copies or substantial portions of the Software.
  11 *
  12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  13 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  14 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  15 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  16 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  17 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  18 * DEALINGS IN THE SOFTWARE.
  19 */
  20
  21#ifndef __XEN_PUBLIC_PHYSDEV_H__
  22#define __XEN_PUBLIC_PHYSDEV_H__
  23
  24/*
  25 * Prototype for this hypercall is:
  26 *  int physdev_op(int cmd, void *args)
  27 * @cmd  == PHYSDEVOP_??? (physdev operation).
  28 * @args == Operation-specific extra arguments (NULL if none).
  29 */
  30
  31/*
  32 * Notify end-of-interrupt (EOI) for the specified IRQ.
  33 * @arg == pointer to physdev_eoi structure.
  34 */
  35#define PHYSDEVOP_eoi                   12
  36struct physdev_eoi {
  37        /* IN */
  38        uint32_t irq;
  39};
  40
  41/*
  42 * Query the status of an IRQ line.
  43 * @arg == pointer to physdev_irq_status_query structure.
  44 */
  45#define PHYSDEVOP_irq_status_query       5
  46struct physdev_irq_status_query {
  47        /* IN */
  48        uint32_t irq;
  49        /* OUT */
  50        uint32_t flags; /* XENIRQSTAT_* */
  51};
  52
  53/* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */
  54#define _XENIRQSTAT_needs_eoi   (0)
  55#define  XENIRQSTAT_needs_eoi   (1U<<_XENIRQSTAT_needs_eoi)
  56
  57/* IRQ shared by multiple guests? */
  58#define _XENIRQSTAT_shared      (1)
  59#define  XENIRQSTAT_shared      (1U<<_XENIRQSTAT_shared)
  60
  61/*
  62 * Set the current VCPU's I/O privilege level.
  63 * @arg == pointer to physdev_set_iopl structure.
  64 */
  65#define PHYSDEVOP_set_iopl               6
  66struct physdev_set_iopl {
  67        /* IN */
  68        uint32_t iopl;
  69};
  70
  71/*
  72 * Set the current VCPU's I/O-port permissions bitmap.
  73 * @arg == pointer to physdev_set_iobitmap structure.
  74 */
  75#define PHYSDEVOP_set_iobitmap           7
  76struct physdev_set_iobitmap {
  77        /* IN */
  78        uint8_t * bitmap;
  79        uint32_t nr_ports;
  80};
  81
  82/*
  83 * Read or write an IO-APIC register.
  84 * @arg == pointer to physdev_apic structure.
  85 */
  86#define PHYSDEVOP_apic_read              8
  87#define PHYSDEVOP_apic_write             9
  88struct physdev_apic {
  89        /* IN */
  90        unsigned long apic_physbase;
  91        uint32_t reg;
  92        /* IN or OUT */
  93        uint32_t value;
  94};
  95
  96/*
  97 * Allocate or free a physical upcall vector for the specified IRQ line.
  98 * @arg == pointer to physdev_irq structure.
  99 */
 100#define PHYSDEVOP_alloc_irq_vector      10
 101#define PHYSDEVOP_free_irq_vector       11
 102struct physdev_irq {
 103        /* IN */
 104        uint32_t irq;
 105        /* IN or OUT */
 106        uint32_t vector;
 107};
 108
 109#define MAP_PIRQ_TYPE_MSI               0x0
 110#define MAP_PIRQ_TYPE_GSI               0x1
 111#define MAP_PIRQ_TYPE_UNKNOWN           0x2
 112#define MAP_PIRQ_TYPE_MSI_SEG           0x3
 113
 114#define PHYSDEVOP_map_pirq              13
 115struct physdev_map_pirq {
 116    domid_t domid;
 117    /* IN */
 118    int type;
 119    /* IN */
 120    int index;
 121    /* IN or OUT */
 122    int pirq;
 123    /* IN - high 16 bits hold segment for MAP_PIRQ_TYPE_MSI_SEG */
 124    int bus;
 125    /* IN */
 126    int devfn;
 127    /* IN */
 128    int entry_nr;
 129    /* IN */
 130    uint64_t table_base;
 131};
 132
 133#define PHYSDEVOP_unmap_pirq            14
 134struct physdev_unmap_pirq {
 135    domid_t domid;
 136    /* IN */
 137    int pirq;
 138};
 139
 140#define PHYSDEVOP_manage_pci_add        15
 141#define PHYSDEVOP_manage_pci_remove     16
 142struct physdev_manage_pci {
 143        /* IN */
 144        uint8_t bus;
 145        uint8_t devfn;
 146};
 147
 148#define PHYSDEVOP_manage_pci_add_ext    20
 149struct physdev_manage_pci_ext {
 150        /* IN */
 151        uint8_t bus;
 152        uint8_t devfn;
 153        unsigned is_extfn;
 154        unsigned is_virtfn;
 155        struct {
 156                uint8_t bus;
 157                uint8_t devfn;
 158        } physfn;
 159};
 160
 161/*
 162 * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op()
 163 * hypercall since 0x00030202.
 164 */
 165struct physdev_op {
 166        uint32_t cmd;
 167        union {
 168                struct physdev_irq_status_query      irq_status_query;
 169                struct physdev_set_iopl              set_iopl;
 170                struct physdev_set_iobitmap          set_iobitmap;
 171                struct physdev_apic                  apic_op;
 172                struct physdev_irq                   irq_op;
 173        } u;
 174};
 175
 176#define PHYSDEVOP_setup_gsi    21
 177struct physdev_setup_gsi {
 178    int gsi;
 179    /* IN */
 180    uint8_t triggering;
 181    /* IN */
 182    uint8_t polarity;
 183    /* IN */
 184};
 185
 186#define PHYSDEVOP_get_nr_pirqs    22
 187struct physdev_nr_pirqs {
 188    /* OUT */
 189    uint32_t nr_pirqs;
 190};
 191
 192/* type is MAP_PIRQ_TYPE_GSI or MAP_PIRQ_TYPE_MSI
 193 * the hypercall returns a free pirq */
 194#define PHYSDEVOP_get_free_pirq    23
 195struct physdev_get_free_pirq {
 196    /* IN */ 
 197    int type;
 198    /* OUT */
 199    uint32_t pirq;
 200};
 201
 202#define XEN_PCI_DEV_EXTFN              0x1
 203#define XEN_PCI_DEV_VIRTFN             0x2
 204#define XEN_PCI_DEV_PXM                0x4
 205
 206#define PHYSDEVOP_pci_device_add        25
 207struct physdev_pci_device_add {
 208    /* IN */
 209    uint16_t seg;
 210    uint8_t bus;
 211    uint8_t devfn;
 212    uint32_t flags;
 213    struct {
 214        uint8_t bus;
 215        uint8_t devfn;
 216    } physfn;
 217#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
 218    uint32_t optarr[];
 219#elif defined(__GNUC__)
 220    uint32_t optarr[0];
 221#endif
 222};
 223
 224#define PHYSDEVOP_pci_device_remove     26
 225#define PHYSDEVOP_restore_msi_ext       27
 226struct physdev_pci_device {
 227    /* IN */
 228    uint16_t seg;
 229    uint8_t bus;
 230    uint8_t devfn;
 231};
 232
 233/*
 234 * Notify that some PIRQ-bound event channels have been unmasked.
 235 * ** This command is obsolete since interface version 0x00030202 and is **
 236 * ** unsupported by newer versions of Xen.                              **
 237 */
 238#define PHYSDEVOP_IRQ_UNMASK_NOTIFY      4
 239
 240/*
 241 * These all-capitals physdev operation names are superceded by the new names
 242 * (defined above) since interface version 0x00030202.
 243 */
 244#define PHYSDEVOP_IRQ_STATUS_QUERY       PHYSDEVOP_irq_status_query
 245#define PHYSDEVOP_SET_IOPL               PHYSDEVOP_set_iopl
 246#define PHYSDEVOP_SET_IOBITMAP           PHYSDEVOP_set_iobitmap
 247#define PHYSDEVOP_APIC_READ              PHYSDEVOP_apic_read
 248#define PHYSDEVOP_APIC_WRITE             PHYSDEVOP_apic_write
 249#define PHYSDEVOP_ASSIGN_VECTOR          PHYSDEVOP_alloc_irq_vector
 250#define PHYSDEVOP_FREE_VECTOR            PHYSDEVOP_free_irq_vector
 251#define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi
 252#define PHYSDEVOP_IRQ_SHARED             XENIRQSTAT_shared
 253
 254#endif /* __XEN_PUBLIC_PHYSDEV_H__ */
 255