logo

oasis-root

Compiled tree of Oasis Linux based on own branch at <https://hacktivis.me/git/oasis/> git clone https://anongit.hacktivis.me/git/oasis-root.git

virtio_iommu.h (3931B)


  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 <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. __le64 start;
  20. __le64 end;
  21. };
  22. struct virtio_iommu_range_32 {
  23. __le32 start;
  24. __le32 end;
  25. };
  26. struct virtio_iommu_config {
  27. /* Supported page sizes */
  28. __le64 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. __le32 probe_size;
  35. __u8 bypass;
  36. __u8 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. __u8 type;
  56. __u8 reserved[3];
  57. };
  58. struct virtio_iommu_req_tail {
  59. __u8 status;
  60. __u8 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. __le32 domain;
  66. __le32 endpoint;
  67. __le32 flags;
  68. __u8 reserved[4];
  69. struct virtio_iommu_req_tail tail;
  70. };
  71. struct virtio_iommu_req_detach {
  72. struct virtio_iommu_req_head head;
  73. __le32 domain;
  74. __le32 endpoint;
  75. __u8 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. __le32 domain;
  87. __le64 virt_start;
  88. __le64 virt_end;
  89. __le64 phys_start;
  90. __le32 flags;
  91. struct virtio_iommu_req_tail tail;
  92. };
  93. struct virtio_iommu_req_unmap {
  94. struct virtio_iommu_req_head head;
  95. __le32 domain;
  96. __le64 virt_start;
  97. __le64 virt_end;
  98. __u8 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. __le16 type;
  106. __le16 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. __u8 subtype;
  113. __u8 reserved[3];
  114. __le64 start;
  115. __le64 end;
  116. };
  117. struct virtio_iommu_req_probe {
  118. struct virtio_iommu_req_head head;
  119. __le32 endpoint;
  120. __u8 reserved[64];
  121. __u8 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. __u8 reason;
  137. __u8 reserved[3];
  138. __le32 flags;
  139. __le32 endpoint;
  140. __u8 reserved2[4];
  141. __le64 address;
  142. };
  143. #endif