2
0

virtio_iommu.h 4.0 KB

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