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