Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: BSD-3-Clause */
0002 /*
0003  * Virtio-iommu definition v0.12
0004  *
0005  * Copyright (C) 2019 Arm Ltd.
0006  */
0007 #ifndef _UAPI_LINUX_VIRTIO_IOMMU_H
0008 #define _UAPI_LINUX_VIRTIO_IOMMU_H
0009 
0010 #include <linux/types.h>
0011 
0012 /* Feature bits */
0013 #define VIRTIO_IOMMU_F_INPUT_RANGE      0
0014 #define VIRTIO_IOMMU_F_DOMAIN_RANGE     1
0015 #define VIRTIO_IOMMU_F_MAP_UNMAP        2
0016 #define VIRTIO_IOMMU_F_BYPASS           3
0017 #define VIRTIO_IOMMU_F_PROBE            4
0018 #define VIRTIO_IOMMU_F_MMIO         5
0019 #define VIRTIO_IOMMU_F_BYPASS_CONFIG        6
0020 
0021 struct virtio_iommu_range_64 {
0022     __le64                  start;
0023     __le64                  end;
0024 };
0025 
0026 struct virtio_iommu_range_32 {
0027     __le32                  start;
0028     __le32                  end;
0029 };
0030 
0031 struct virtio_iommu_config {
0032     /* Supported page sizes */
0033     __le64                  page_size_mask;
0034     /* Supported IOVA range */
0035     struct virtio_iommu_range_64        input_range;
0036     /* Max domain ID size */
0037     struct virtio_iommu_range_32        domain_range;
0038     /* Probe buffer size */
0039     __le32                  probe_size;
0040     __u8                    bypass;
0041     __u8                    reserved[3];
0042 };
0043 
0044 /* Request types */
0045 #define VIRTIO_IOMMU_T_ATTACH           0x01
0046 #define VIRTIO_IOMMU_T_DETACH           0x02
0047 #define VIRTIO_IOMMU_T_MAP          0x03
0048 #define VIRTIO_IOMMU_T_UNMAP            0x04
0049 #define VIRTIO_IOMMU_T_PROBE            0x05
0050 
0051 /* Status types */
0052 #define VIRTIO_IOMMU_S_OK           0x00
0053 #define VIRTIO_IOMMU_S_IOERR            0x01
0054 #define VIRTIO_IOMMU_S_UNSUPP           0x02
0055 #define VIRTIO_IOMMU_S_DEVERR           0x03
0056 #define VIRTIO_IOMMU_S_INVAL            0x04
0057 #define VIRTIO_IOMMU_S_RANGE            0x05
0058 #define VIRTIO_IOMMU_S_NOENT            0x06
0059 #define VIRTIO_IOMMU_S_FAULT            0x07
0060 #define VIRTIO_IOMMU_S_NOMEM            0x08
0061 
0062 struct virtio_iommu_req_head {
0063     __u8                    type;
0064     __u8                    reserved[3];
0065 };
0066 
0067 struct virtio_iommu_req_tail {
0068     __u8                    status;
0069     __u8                    reserved[3];
0070 };
0071 
0072 #define VIRTIO_IOMMU_ATTACH_F_BYPASS        (1 << 0)
0073 
0074 struct virtio_iommu_req_attach {
0075     struct virtio_iommu_req_head        head;
0076     __le32                  domain;
0077     __le32                  endpoint;
0078     __le32                  flags;
0079     __u8                    reserved[4];
0080     struct virtio_iommu_req_tail        tail;
0081 };
0082 
0083 struct virtio_iommu_req_detach {
0084     struct virtio_iommu_req_head        head;
0085     __le32                  domain;
0086     __le32                  endpoint;
0087     __u8                    reserved[8];
0088     struct virtio_iommu_req_tail        tail;
0089 };
0090 
0091 #define VIRTIO_IOMMU_MAP_F_READ         (1 << 0)
0092 #define VIRTIO_IOMMU_MAP_F_WRITE        (1 << 1)
0093 #define VIRTIO_IOMMU_MAP_F_MMIO         (1 << 2)
0094 
0095 #define VIRTIO_IOMMU_MAP_F_MASK         (VIRTIO_IOMMU_MAP_F_READ |  \
0096                          VIRTIO_IOMMU_MAP_F_WRITE | \
0097                          VIRTIO_IOMMU_MAP_F_MMIO)
0098 
0099 struct virtio_iommu_req_map {
0100     struct virtio_iommu_req_head        head;
0101     __le32                  domain;
0102     __le64                  virt_start;
0103     __le64                  virt_end;
0104     __le64                  phys_start;
0105     __le32                  flags;
0106     struct virtio_iommu_req_tail        tail;
0107 };
0108 
0109 struct virtio_iommu_req_unmap {
0110     struct virtio_iommu_req_head        head;
0111     __le32                  domain;
0112     __le64                  virt_start;
0113     __le64                  virt_end;
0114     __u8                    reserved[4];
0115     struct virtio_iommu_req_tail        tail;
0116 };
0117 
0118 #define VIRTIO_IOMMU_PROBE_T_NONE       0
0119 #define VIRTIO_IOMMU_PROBE_T_RESV_MEM       1
0120 
0121 #define VIRTIO_IOMMU_PROBE_T_MASK       0xfff
0122 
0123 struct virtio_iommu_probe_property {
0124     __le16                  type;
0125     __le16                  length;
0126 };
0127 
0128 #define VIRTIO_IOMMU_RESV_MEM_T_RESERVED    0
0129 #define VIRTIO_IOMMU_RESV_MEM_T_MSI     1
0130 
0131 struct virtio_iommu_probe_resv_mem {
0132     struct virtio_iommu_probe_property  head;
0133     __u8                    subtype;
0134     __u8                    reserved[3];
0135     __le64                  start;
0136     __le64                  end;
0137 };
0138 
0139 struct virtio_iommu_req_probe {
0140     struct virtio_iommu_req_head        head;
0141     __le32                  endpoint;
0142     __u8                    reserved[64];
0143 
0144     __u8                    properties[];
0145 
0146     /*
0147      * Tail follows the variable-length properties array. No padding,
0148      * property lengths are all aligned on 8 bytes.
0149      */
0150 };
0151 
0152 /* Fault types */
0153 #define VIRTIO_IOMMU_FAULT_R_UNKNOWN        0
0154 #define VIRTIO_IOMMU_FAULT_R_DOMAIN     1
0155 #define VIRTIO_IOMMU_FAULT_R_MAPPING        2
0156 
0157 #define VIRTIO_IOMMU_FAULT_F_READ       (1 << 0)
0158 #define VIRTIO_IOMMU_FAULT_F_WRITE      (1 << 1)
0159 #define VIRTIO_IOMMU_FAULT_F_EXEC       (1 << 2)
0160 #define VIRTIO_IOMMU_FAULT_F_ADDRESS        (1 << 8)
0161 
0162 struct virtio_iommu_fault {
0163     __u8                    reason;
0164     __u8                    reserved[3];
0165     __le32                  flags;
0166     __le32                  endpoint;
0167     __u8                    reserved2[4];
0168     __le64                  address;
0169 };
0170 
0171 #endif