1edcd69abSJean-Philippe Brucker /* SPDX-License-Identifier: BSD-3-Clause */ 2edcd69abSJean-Philippe Brucker /* 3ae24fb49SJean-Philippe Brucker * Virtio-iommu definition v0.12 4edcd69abSJean-Philippe Brucker * 5ae24fb49SJean-Philippe Brucker * Copyright (C) 2019 Arm Ltd. 6edcd69abSJean-Philippe Brucker */ 7edcd69abSJean-Philippe Brucker #ifndef _UAPI_LINUX_VIRTIO_IOMMU_H 8edcd69abSJean-Philippe Brucker #define _UAPI_LINUX_VIRTIO_IOMMU_H 9edcd69abSJean-Philippe Brucker 10edcd69abSJean-Philippe Brucker #include <linux/types.h> 11edcd69abSJean-Philippe Brucker 12edcd69abSJean-Philippe Brucker /* Feature bits */ 13edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_F_INPUT_RANGE 0 14ae24fb49SJean-Philippe Brucker #define VIRTIO_IOMMU_F_DOMAIN_RANGE 1 15edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_F_MAP_UNMAP 2 16edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_F_BYPASS 3 172a5a3148SJean-Philippe Brucker #define VIRTIO_IOMMU_F_PROBE 4 18ae24fb49SJean-Philippe Brucker #define VIRTIO_IOMMU_F_MMIO 5 19*063ebb19SJean-Philippe Brucker #define VIRTIO_IOMMU_F_BYPASS_CONFIG 6 20edcd69abSJean-Philippe Brucker 21ae24fb49SJean-Philippe Brucker struct virtio_iommu_range_64 { 220ebcffccSMichael S. Tsirkin __le64 start; 230ebcffccSMichael S. Tsirkin __le64 end; 24ae24fb49SJean-Philippe Brucker }; 25ae24fb49SJean-Philippe Brucker 26ae24fb49SJean-Philippe Brucker struct virtio_iommu_range_32 { 270ebcffccSMichael S. Tsirkin __le32 start; 280ebcffccSMichael S. Tsirkin __le32 end; 29edcd69abSJean-Philippe Brucker }; 30edcd69abSJean-Philippe Brucker 31edcd69abSJean-Philippe Brucker struct virtio_iommu_config { 32edcd69abSJean-Philippe Brucker /* Supported page sizes */ 330ebcffccSMichael S. Tsirkin __le64 page_size_mask; 34edcd69abSJean-Philippe Brucker /* Supported IOVA range */ 35ae24fb49SJean-Philippe Brucker struct virtio_iommu_range_64 input_range; 36edcd69abSJean-Philippe Brucker /* Max domain ID size */ 37ae24fb49SJean-Philippe Brucker struct virtio_iommu_range_32 domain_range; 38edcd69abSJean-Philippe Brucker /* Probe buffer size */ 390ebcffccSMichael S. Tsirkin __le32 probe_size; 40*063ebb19SJean-Philippe Brucker __u8 bypass; 41*063ebb19SJean-Philippe Brucker __u8 reserved[3]; 42edcd69abSJean-Philippe Brucker }; 43edcd69abSJean-Philippe Brucker 44edcd69abSJean-Philippe Brucker /* Request types */ 45edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_T_ATTACH 0x01 46edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_T_DETACH 0x02 47edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_T_MAP 0x03 48edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_T_UNMAP 0x04 492a5a3148SJean-Philippe Brucker #define VIRTIO_IOMMU_T_PROBE 0x05 50edcd69abSJean-Philippe Brucker 51edcd69abSJean-Philippe Brucker /* Status types */ 52edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_S_OK 0x00 53edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_S_IOERR 0x01 54edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_S_UNSUPP 0x02 55edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_S_DEVERR 0x03 56edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_S_INVAL 0x04 57edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_S_RANGE 0x05 58edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_S_NOENT 0x06 59edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_S_FAULT 0x07 60ae24fb49SJean-Philippe Brucker #define VIRTIO_IOMMU_S_NOMEM 0x08 61edcd69abSJean-Philippe Brucker 62edcd69abSJean-Philippe Brucker struct virtio_iommu_req_head { 63edcd69abSJean-Philippe Brucker __u8 type; 64edcd69abSJean-Philippe Brucker __u8 reserved[3]; 65edcd69abSJean-Philippe Brucker }; 66edcd69abSJean-Philippe Brucker 67edcd69abSJean-Philippe Brucker struct virtio_iommu_req_tail { 68edcd69abSJean-Philippe Brucker __u8 status; 69edcd69abSJean-Philippe Brucker __u8 reserved[3]; 70edcd69abSJean-Philippe Brucker }; 71edcd69abSJean-Philippe Brucker 72*063ebb19SJean-Philippe Brucker #define VIRTIO_IOMMU_ATTACH_F_BYPASS (1 << 0) 73*063ebb19SJean-Philippe Brucker 74edcd69abSJean-Philippe Brucker struct virtio_iommu_req_attach { 75edcd69abSJean-Philippe Brucker struct virtio_iommu_req_head head; 76edcd69abSJean-Philippe Brucker __le32 domain; 77edcd69abSJean-Philippe Brucker __le32 endpoint; 78*063ebb19SJean-Philippe Brucker __le32 flags; 79*063ebb19SJean-Philippe Brucker __u8 reserved[4]; 80edcd69abSJean-Philippe Brucker struct virtio_iommu_req_tail tail; 81edcd69abSJean-Philippe Brucker }; 82edcd69abSJean-Philippe Brucker 83edcd69abSJean-Philippe Brucker struct virtio_iommu_req_detach { 84edcd69abSJean-Philippe Brucker struct virtio_iommu_req_head head; 85edcd69abSJean-Philippe Brucker __le32 domain; 86edcd69abSJean-Philippe Brucker __le32 endpoint; 87edcd69abSJean-Philippe Brucker __u8 reserved[8]; 88edcd69abSJean-Philippe Brucker struct virtio_iommu_req_tail tail; 89edcd69abSJean-Philippe Brucker }; 90edcd69abSJean-Philippe Brucker 91edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_MAP_F_READ (1 << 0) 92edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_MAP_F_WRITE (1 << 1) 93ae24fb49SJean-Philippe Brucker #define VIRTIO_IOMMU_MAP_F_MMIO (1 << 2) 94edcd69abSJean-Philippe Brucker 95edcd69abSJean-Philippe Brucker #define VIRTIO_IOMMU_MAP_F_MASK (VIRTIO_IOMMU_MAP_F_READ | \ 96edcd69abSJean-Philippe Brucker VIRTIO_IOMMU_MAP_F_WRITE | \ 97edcd69abSJean-Philippe Brucker VIRTIO_IOMMU_MAP_F_MMIO) 98edcd69abSJean-Philippe Brucker 99edcd69abSJean-Philippe Brucker struct virtio_iommu_req_map { 100edcd69abSJean-Philippe Brucker struct virtio_iommu_req_head head; 101edcd69abSJean-Philippe Brucker __le32 domain; 102edcd69abSJean-Philippe Brucker __le64 virt_start; 103edcd69abSJean-Philippe Brucker __le64 virt_end; 104edcd69abSJean-Philippe Brucker __le64 phys_start; 105edcd69abSJean-Philippe Brucker __le32 flags; 106edcd69abSJean-Philippe Brucker struct virtio_iommu_req_tail tail; 107edcd69abSJean-Philippe Brucker }; 108edcd69abSJean-Philippe Brucker 109edcd69abSJean-Philippe Brucker struct virtio_iommu_req_unmap { 110edcd69abSJean-Philippe Brucker struct virtio_iommu_req_head head; 111edcd69abSJean-Philippe Brucker __le32 domain; 112edcd69abSJean-Philippe Brucker __le64 virt_start; 113edcd69abSJean-Philippe Brucker __le64 virt_end; 114edcd69abSJean-Philippe Brucker __u8 reserved[4]; 115edcd69abSJean-Philippe Brucker struct virtio_iommu_req_tail tail; 116edcd69abSJean-Philippe Brucker }; 117edcd69abSJean-Philippe Brucker 1182a5a3148SJean-Philippe Brucker #define VIRTIO_IOMMU_PROBE_T_NONE 0 1192a5a3148SJean-Philippe Brucker #define VIRTIO_IOMMU_PROBE_T_RESV_MEM 1 1202a5a3148SJean-Philippe Brucker 1212a5a3148SJean-Philippe Brucker #define VIRTIO_IOMMU_PROBE_T_MASK 0xfff 1222a5a3148SJean-Philippe Brucker 1232a5a3148SJean-Philippe Brucker struct virtio_iommu_probe_property { 1242a5a3148SJean-Philippe Brucker __le16 type; 1252a5a3148SJean-Philippe Brucker __le16 length; 1262a5a3148SJean-Philippe Brucker }; 1272a5a3148SJean-Philippe Brucker 1282a5a3148SJean-Philippe Brucker #define VIRTIO_IOMMU_RESV_MEM_T_RESERVED 0 1292a5a3148SJean-Philippe Brucker #define VIRTIO_IOMMU_RESV_MEM_T_MSI 1 1302a5a3148SJean-Philippe Brucker 1312a5a3148SJean-Philippe Brucker struct virtio_iommu_probe_resv_mem { 1322a5a3148SJean-Philippe Brucker struct virtio_iommu_probe_property head; 1332a5a3148SJean-Philippe Brucker __u8 subtype; 1342a5a3148SJean-Philippe Brucker __u8 reserved[3]; 1352a5a3148SJean-Philippe Brucker __le64 start; 1362a5a3148SJean-Philippe Brucker __le64 end; 1372a5a3148SJean-Philippe Brucker }; 1382a5a3148SJean-Philippe Brucker 1392a5a3148SJean-Philippe Brucker struct virtio_iommu_req_probe { 1402a5a3148SJean-Philippe Brucker struct virtio_iommu_req_head head; 1412a5a3148SJean-Philippe Brucker __le32 endpoint; 1422a5a3148SJean-Philippe Brucker __u8 reserved[64]; 1432a5a3148SJean-Philippe Brucker 1442a5a3148SJean-Philippe Brucker __u8 properties[]; 1452a5a3148SJean-Philippe Brucker 1462a5a3148SJean-Philippe Brucker /* 1472a5a3148SJean-Philippe Brucker * Tail follows the variable-length properties array. No padding, 1482a5a3148SJean-Philippe Brucker * property lengths are all aligned on 8 bytes. 1492a5a3148SJean-Philippe Brucker */ 1502a5a3148SJean-Philippe Brucker }; 1512a5a3148SJean-Philippe Brucker 152169a126cSJean-Philippe Brucker /* Fault types */ 153169a126cSJean-Philippe Brucker #define VIRTIO_IOMMU_FAULT_R_UNKNOWN 0 154169a126cSJean-Philippe Brucker #define VIRTIO_IOMMU_FAULT_R_DOMAIN 1 155169a126cSJean-Philippe Brucker #define VIRTIO_IOMMU_FAULT_R_MAPPING 2 156169a126cSJean-Philippe Brucker 157169a126cSJean-Philippe Brucker #define VIRTIO_IOMMU_FAULT_F_READ (1 << 0) 158169a126cSJean-Philippe Brucker #define VIRTIO_IOMMU_FAULT_F_WRITE (1 << 1) 159169a126cSJean-Philippe Brucker #define VIRTIO_IOMMU_FAULT_F_EXEC (1 << 2) 160169a126cSJean-Philippe Brucker #define VIRTIO_IOMMU_FAULT_F_ADDRESS (1 << 8) 161169a126cSJean-Philippe Brucker 162169a126cSJean-Philippe Brucker struct virtio_iommu_fault { 163169a126cSJean-Philippe Brucker __u8 reason; 164169a126cSJean-Philippe Brucker __u8 reserved[3]; 165169a126cSJean-Philippe Brucker __le32 flags; 166169a126cSJean-Philippe Brucker __le32 endpoint; 167169a126cSJean-Philippe Brucker __u8 reserved2[4]; 168169a126cSJean-Philippe Brucker __le64 address; 169169a126cSJean-Philippe Brucker }; 170169a126cSJean-Philippe Brucker 171edcd69abSJean-Philippe Brucker #endif 172