linux-headers (unknown)

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