Home | History | Annotate | Line # | Download | only in hvm
      1 /*
      2  * ioreq.h: I/O request definitions for device models
      3  * Copyright (c) 2004, Intel Corporation.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a copy
      6  * of this software and associated documentation files (the "Software"), to
      7  * deal in the Software without restriction, including without limitation the
      8  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
      9  * sell copies of the Software, and to permit persons to whom the Software is
     10  * furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be included in
     13  * all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 #ifndef _IOREQ_H_
     25 #define _IOREQ_H_
     26 
     27 #define IOREQ_READ      1
     28 #define IOREQ_WRITE     0
     29 
     30 #define STATE_IOREQ_NONE        0
     31 #define STATE_IOREQ_READY       1
     32 #define STATE_IOREQ_INPROCESS   2
     33 #define STATE_IORESP_READY      3
     34 
     35 #define IOREQ_TYPE_PIO          0 /* pio */
     36 #define IOREQ_TYPE_COPY         1 /* mmio ops */
     37 #define IOREQ_TYPE_PCI_CONFIG   2
     38 #define IOREQ_TYPE_TIMEOFFSET   7
     39 #define IOREQ_TYPE_INVALIDATE   8 /* mapcache */
     40 
     41 /*
     42  * VMExit dispatcher should cooperate with instruction decoder to
     43  * prepare this structure and notify service OS and DM by sending
     44  * virq.
     45  *
     46  * For I/O type IOREQ_TYPE_PCI_CONFIG, the physical address is formatted
     47  * as follows:
     48  *
     49  * 63....48|47..40|39..35|34..32|31........0
     50  * SEGMENT |BUS   |DEV   |FN    |OFFSET
     51  */
     52 struct ioreq {
     53     uint64_t addr;          /* physical address */
     54     uint64_t data;          /* data (or paddr of data) */
     55     uint32_t count;         /* for rep prefixes */
     56     uint32_t size;          /* size in bytes */
     57     uint32_t vp_eport;      /* evtchn for notifications to/from device model */
     58     uint16_t _pad0;
     59     uint8_t state:4;
     60     uint8_t data_is_ptr:1;  /* if 1, data above is the guest paddr
     61                              * of the real data to use. */
     62     uint8_t dir:1;          /* 1=read, 0=write */
     63     uint8_t df:1;
     64     uint8_t _pad1:1;
     65     uint8_t type;           /* I/O type */
     66 };
     67 typedef struct ioreq ioreq_t;
     68 
     69 struct shared_iopage {
     70     struct ioreq vcpu_ioreq[1];
     71 };
     72 typedef struct shared_iopage shared_iopage_t;
     73 
     74 struct buf_ioreq {
     75     uint8_t  type;   /* I/O type                    */
     76     uint8_t  pad:1;
     77     uint8_t  dir:1;  /* 1=read, 0=write             */
     78     uint8_t  size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */
     79     uint32_t addr:20;/* physical address            */
     80     uint32_t data;   /* data                        */
     81 };
     82 typedef struct buf_ioreq buf_ioreq_t;
     83 
     84 #define IOREQ_BUFFER_SLOT_NUM     511 /* 8 bytes each, plus 2 4-byte indexes */
     85 struct buffered_iopage {
     86 #ifdef __XEN__
     87     union bufioreq_pointers {
     88         struct {
     89 #endif
     90             uint32_t read_pointer;
     91             uint32_t write_pointer;
     92 #ifdef __XEN__
     93         };
     94         uint64_t full;
     95     } ptrs;
     96 #endif
     97     buf_ioreq_t buf_ioreq[IOREQ_BUFFER_SLOT_NUM];
     98 }; /* NB. Size of this structure must be no greater than one page. */
     99 typedef struct buffered_iopage buffered_iopage_t;
    100 
    101 /*
    102  * ACPI Control/Event register locations. Location is controlled by a
    103  * version number in HVM_PARAM_ACPI_IOPORTS_LOCATION.
    104  */
    105 
    106 /*
    107  * Version 0 (default): Traditional (obsolete) Xen locations.
    108  *
    109  * These are now only used for compatibility with VMs migrated
    110  * from older Xen versions.
    111  */
    112 #define ACPI_PM1A_EVT_BLK_ADDRESS_V0 0x1f40
    113 #define ACPI_PM1A_CNT_BLK_ADDRESS_V0 (ACPI_PM1A_EVT_BLK_ADDRESS_V0 + 0x04)
    114 #define ACPI_PM_TMR_BLK_ADDRESS_V0   (ACPI_PM1A_EVT_BLK_ADDRESS_V0 + 0x08)
    115 #define ACPI_GPE0_BLK_ADDRESS_V0     (ACPI_PM_TMR_BLK_ADDRESS_V0 + 0x20)
    116 #define ACPI_GPE0_BLK_LEN_V0         0x08
    117 
    118 /* Version 1: Locations preferred by modern Qemu (including Qemu-trad). */
    119 #define ACPI_PM1A_EVT_BLK_ADDRESS_V1 0xb000
    120 #define ACPI_PM1A_CNT_BLK_ADDRESS_V1 (ACPI_PM1A_EVT_BLK_ADDRESS_V1 + 0x04)
    121 #define ACPI_PM_TMR_BLK_ADDRESS_V1   (ACPI_PM1A_EVT_BLK_ADDRESS_V1 + 0x08)
    122 #define ACPI_GPE0_BLK_ADDRESS_V1     0xafe0
    123 #define ACPI_GPE0_BLK_LEN_V1         0x04
    124 
    125 /* Compatibility definitions for the default location (version 0). */
    126 #define ACPI_PM1A_EVT_BLK_ADDRESS    ACPI_PM1A_EVT_BLK_ADDRESS_V0
    127 #define ACPI_PM1A_CNT_BLK_ADDRESS    ACPI_PM1A_CNT_BLK_ADDRESS_V0
    128 #define ACPI_PM_TMR_BLK_ADDRESS      ACPI_PM_TMR_BLK_ADDRESS_V0
    129 #define ACPI_GPE0_BLK_ADDRESS        ACPI_GPE0_BLK_ADDRESS_V0
    130 #define ACPI_GPE0_BLK_LEN            ACPI_GPE0_BLK_LEN_V0
    131 
    132 
    133 #endif /* _IOREQ_H_ */
    134 
    135 /*
    136  * Local variables:
    137  * mode: C
    138  * c-file-style: "BSD"
    139  * c-basic-offset: 4
    140  * tab-width: 4
    141  * indent-tabs-mode: nil
    142  * End:
    143  */
    144