root/include/uapi/linux/virtio_iommu.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: BSD-3-Clause */
   2 /*
   3  * Virtio-iommu definition v0.12
   4  *
   5  * Copyright (C) 2019 Arm Ltd.
   6  */
   7 #ifndef _UAPI_LINUX_VIRTIO_IOMMU_H
   8 #define _UAPI_LINUX_VIRTIO_IOMMU_H
   9 
  10 #include <linux/types.h>
  11 
  12 /* Feature bits */
  13 #define VIRTIO_IOMMU_F_INPUT_RANGE              0
  14 #define VIRTIO_IOMMU_F_DOMAIN_RANGE             1
  15 #define VIRTIO_IOMMU_F_MAP_UNMAP                2
  16 #define VIRTIO_IOMMU_F_BYPASS                   3
  17 #define VIRTIO_IOMMU_F_PROBE                    4
  18 #define VIRTIO_IOMMU_F_MMIO                     5
  19 
  20 struct virtio_iommu_range_64 {
  21         __le64                                  start;
  22         __le64                                  end;
  23 };
  24 
  25 struct virtio_iommu_range_32 {
  26         __le32                                  start;
  27         __le32                                  end;
  28 };
  29 
  30 struct virtio_iommu_config {
  31         /* Supported page sizes */
  32         __le64                                  page_size_mask;
  33         /* Supported IOVA range */
  34         struct virtio_iommu_range_64            input_range;
  35         /* Max domain ID size */
  36         struct virtio_iommu_range_32            domain_range;
  37         /* Probe buffer size */
  38         __le32                                  probe_size;
  39 };
  40 
  41 /* Request types */
  42 #define VIRTIO_IOMMU_T_ATTACH                   0x01
  43 #define VIRTIO_IOMMU_T_DETACH                   0x02
  44 #define VIRTIO_IOMMU_T_MAP                      0x03
  45 #define VIRTIO_IOMMU_T_UNMAP                    0x04
  46 #define VIRTIO_IOMMU_T_PROBE                    0x05
  47 
  48 /* Status types */
  49 #define VIRTIO_IOMMU_S_OK                       0x00
  50 #define VIRTIO_IOMMU_S_IOERR                    0x01
  51 #define VIRTIO_IOMMU_S_UNSUPP                   0x02
  52 #define VIRTIO_IOMMU_S_DEVERR                   0x03
  53 #define VIRTIO_IOMMU_S_INVAL                    0x04
  54 #define VIRTIO_IOMMU_S_RANGE                    0x05
  55 #define VIRTIO_IOMMU_S_NOENT                    0x06
  56 #define VIRTIO_IOMMU_S_FAULT                    0x07
  57 #define VIRTIO_IOMMU_S_NOMEM                    0x08
  58 
  59 struct virtio_iommu_req_head {
  60         __u8                                    type;
  61         __u8                                    reserved[3];
  62 };
  63 
  64 struct virtio_iommu_req_tail {
  65         __u8                                    status;
  66         __u8                                    reserved[3];
  67 };
  68 
  69 struct virtio_iommu_req_attach {
  70         struct virtio_iommu_req_head            head;
  71         __le32                                  domain;
  72         __le32                                  endpoint;
  73         __u8                                    reserved[8];
  74         struct virtio_iommu_req_tail            tail;
  75 };
  76 
  77 struct virtio_iommu_req_detach {
  78         struct virtio_iommu_req_head            head;
  79         __le32                                  domain;
  80         __le32                                  endpoint;
  81         __u8                                    reserved[8];
  82         struct virtio_iommu_req_tail            tail;
  83 };
  84 
  85 #define VIRTIO_IOMMU_MAP_F_READ                 (1 << 0)
  86 #define VIRTIO_IOMMU_MAP_F_WRITE                (1 << 1)
  87 #define VIRTIO_IOMMU_MAP_F_MMIO                 (1 << 2)
  88 
  89 #define VIRTIO_IOMMU_MAP_F_MASK                 (VIRTIO_IOMMU_MAP_F_READ |      \
  90                                                  VIRTIO_IOMMU_MAP_F_WRITE |     \
  91                                                  VIRTIO_IOMMU_MAP_F_MMIO)
  92 
  93 struct virtio_iommu_req_map {
  94         struct virtio_iommu_req_head            head;
  95         __le32                                  domain;
  96         __le64                                  virt_start;
  97         __le64                                  virt_end;
  98         __le64                                  phys_start;
  99         __le32                                  flags;
 100         struct virtio_iommu_req_tail            tail;
 101 };
 102 
 103 struct virtio_iommu_req_unmap {
 104         struct virtio_iommu_req_head            head;
 105         __le32                                  domain;
 106         __le64                                  virt_start;
 107         __le64                                  virt_end;
 108         __u8                                    reserved[4];
 109         struct virtio_iommu_req_tail            tail;
 110 };
 111 
 112 #define VIRTIO_IOMMU_PROBE_T_NONE               0
 113 #define VIRTIO_IOMMU_PROBE_T_RESV_MEM           1
 114 
 115 #define VIRTIO_IOMMU_PROBE_T_MASK               0xfff
 116 
 117 struct virtio_iommu_probe_property {
 118         __le16                                  type;
 119         __le16                                  length;
 120 };
 121 
 122 #define VIRTIO_IOMMU_RESV_MEM_T_RESERVED        0
 123 #define VIRTIO_IOMMU_RESV_MEM_T_MSI             1
 124 
 125 struct virtio_iommu_probe_resv_mem {
 126         struct virtio_iommu_probe_property      head;
 127         __u8                                    subtype;
 128         __u8                                    reserved[3];
 129         __le64                                  start;
 130         __le64                                  end;
 131 };
 132 
 133 struct virtio_iommu_req_probe {
 134         struct virtio_iommu_req_head            head;
 135         __le32                                  endpoint;
 136         __u8                                    reserved[64];
 137 
 138         __u8                                    properties[];
 139 
 140         /*
 141          * Tail follows the variable-length properties array. No padding,
 142          * property lengths are all aligned on 8 bytes.
 143          */
 144 };
 145 
 146 /* Fault types */
 147 #define VIRTIO_IOMMU_FAULT_R_UNKNOWN            0
 148 #define VIRTIO_IOMMU_FAULT_R_DOMAIN             1
 149 #define VIRTIO_IOMMU_FAULT_R_MAPPING            2
 150 
 151 #define VIRTIO_IOMMU_FAULT_F_READ               (1 << 0)
 152 #define VIRTIO_IOMMU_FAULT_F_WRITE              (1 << 1)
 153 #define VIRTIO_IOMMU_FAULT_F_EXEC               (1 << 2)
 154 #define VIRTIO_IOMMU_FAULT_F_ADDRESS            (1 << 8)
 155 
 156 struct virtio_iommu_fault {
 157         __u8                                    reason;
 158         __u8                                    reserved[3];
 159         __le32                                  flags;
 160         __le32                                  endpoint;
 161         __u8                                    reserved2[4];
 162         __le64                                  address;
 163 };
 164 
 165 #endif

/* [<][>][^][v][top][bottom][index][help] */