1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 /* 3 * Intel MIC Platform Software Stack (MPSS) 4 * 5 * Copyright(c) 2013 Intel Corporation. 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License, version 2, as 9 * published by the Free Software Foundation. 10 * 11 * This program is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * The full GNU General Public License is included in this distribution in 17 * the file called "COPYING". 18 * 19 * Intel MIC driver. 20 * 21 */ 22 #ifndef __MIC_COMMON_H_ 23 #define __MIC_COMMON_H_ 24 25 #include <linux/virtio_ring.h> 26 27 #define __mic_align(a, x) (((a) + (x) - 1) & ~((x) - 1)) 28 29 /** 30 * struct mic_device_desc: Virtio device information shared between the 31 * virtio driver and userspace backend 32 * 33 * @type: Device type: console/network/disk etc. Type 0/-1 terminates. 34 * @num_vq: Number of virtqueues. 35 * @feature_len: Number of bytes of feature bits. Multiply by 2: one for 36 host features and one for guest acknowledgements. 37 * @config_len: Number of bytes of the config array after virtqueues. 38 * @status: A status byte, written by the Guest. 39 * @config: Start of the following variable length config. 40 */ 41 struct mic_device_desc { 42 __s8 type; 43 __u8 num_vq; 44 __u8 feature_len; 45 __u8 config_len; 46 __u8 status; 47 __le64 config[0]; 48 } __attribute__ ((aligned(8))); 49 50 /** 51 * struct mic_device_ctrl: Per virtio device information in the device page 52 * used internally by the host and card side drivers. 53 * 54 * @vdev: Used for storing MIC vdev information by the guest. 55 * @config_change: Set to 1 by host when a config change is requested. 56 * @vdev_reset: Set to 1 by guest to indicate virtio device has been reset. 57 * @guest_ack: Set to 1 by guest to ack a command. 58 * @host_ack: Set to 1 by host to ack a command. 59 * @used_address_updated: Set to 1 by guest when the used address should be 60 * updated. 61 * @c2h_vdev_db: The doorbell number to be used by guest. Set by host. 62 * @h2c_vdev_db: The doorbell number to be used by host. Set by guest. 63 */ 64 struct mic_device_ctrl { 65 __le64 vdev; 66 __u8 config_change; 67 __u8 vdev_reset; 68 __u8 guest_ack; 69 __u8 host_ack; 70 __u8 used_address_updated; 71 __s8 c2h_vdev_db; 72 __s8 h2c_vdev_db; 73 } __attribute__ ((aligned(8))); 74 75 /** 76 * struct mic_bootparam: Virtio device independent information in device page 77 * 78 * @magic: A magic value used by the card to ensure it can see the host 79 * @h2c_config_db: Host to Card Virtio config doorbell set by card 80 * @node_id: Unique id of the node 81 * @h2c_scif_db - Host to card SCIF doorbell set by card 82 * @c2h_scif_db - Card to host SCIF doorbell set by host 83 * @scif_host_dma_addr - SCIF host queue pair DMA address 84 * @scif_card_dma_addr - SCIF card queue pair DMA address 85 */ 86 struct mic_bootparam { 87 __le32 magic; 88 __s8 h2c_config_db; 89 __u8 node_id; 90 __u8 h2c_scif_db; 91 __u8 c2h_scif_db; 92 __u64 scif_host_dma_addr; 93 __u64 scif_card_dma_addr; 94 } __attribute__ ((aligned(8))); 95 96 /** 97 * struct mic_device_page: High level representation of the device page 98 * 99 * @bootparam: The bootparam structure is used for sharing information and 100 * status updates between MIC host and card drivers. 101 * @desc: Array of MIC virtio device descriptors. 102 */ 103 struct mic_device_page { 104 struct mic_bootparam bootparam; 105 struct mic_device_desc desc[0]; 106 }; 107 /** 108 * struct mic_vqconfig: This is how we expect the device configuration field 109 * for a virtqueue to be laid out in config space. 110 * 111 * @address: Guest/MIC physical address of the virtio ring 112 * (avail and desc rings) 113 * @used_address: Guest/MIC physical address of the used ring 114 * @num: The number of entries in the virtio_ring 115 */ 116 struct mic_vqconfig { 117 __le64 address; 118 __le64 used_address; 119 __le16 num; 120 } __attribute__ ((aligned(8))); 121 122 /* 123 * The alignment to use between consumer and producer parts of vring. 124 * This is pagesize for historical reasons. 125 */ 126 #define MIC_VIRTIO_RING_ALIGN 4096 127 128 #define MIC_MAX_VRINGS 4 129 #define MIC_VRING_ENTRIES 128 130 131 /* 132 * Max vring entries (power of 2) to ensure desc and avail rings 133 * fit in a single page 134 */ 135 #define MIC_MAX_VRING_ENTRIES 128 136 137 /** 138 * Max size of the desc block in bytes: includes: 139 * - struct mic_device_desc 140 * - struct mic_vqconfig (num_vq of these) 141 * - host and guest features 142 * - virtio device config space 143 */ 144 #define MIC_MAX_DESC_BLK_SIZE 256 145 146 /** 147 * struct _mic_vring_info - Host vring info exposed to userspace backend 148 * for the avail index and magic for the card. 149 * 150 * @avail_idx: host avail idx 151 * @magic: A magic debug cookie. 152 */ 153 struct _mic_vring_info { 154 __u16 avail_idx; 155 __le32 magic; 156 }; 157 158 /** 159 * struct mic_vring - Vring information. 160 * 161 * @vr: The virtio ring. 162 * @info: Host vring information exposed to the userspace backend for the 163 * avail index and magic for the card. 164 * @va: The va for the buffer allocated for vr and info. 165 * @len: The length of the buffer required for allocating vr and info. 166 */ 167 struct mic_vring { 168 struct vring vr; 169 struct _mic_vring_info *info; 170 void *va; 171 int len; 172 }; 173 174 #define mic_aligned_desc_size(d) __mic_align(mic_desc_size(d), 8) 175 176 #ifndef INTEL_MIC_CARD 177 static inline unsigned mic_desc_size(const struct mic_device_desc *desc) 178 { 179 return sizeof(*desc) + desc->num_vq * sizeof(struct mic_vqconfig) 180 + desc->feature_len * 2 + desc->config_len; 181 } 182 183 static inline struct mic_vqconfig * 184 mic_vq_config(const struct mic_device_desc *desc) 185 { 186 return (struct mic_vqconfig *)(desc + 1); 187 } 188 189 static inline __u8 *mic_vq_features(const struct mic_device_desc *desc) 190 { 191 return (__u8 *)(mic_vq_config(desc) + desc->num_vq); 192 } 193 194 static inline __u8 *mic_vq_configspace(const struct mic_device_desc *desc) 195 { 196 return mic_vq_features(desc) + desc->feature_len * 2; 197 } 198 static inline unsigned mic_total_desc_size(struct mic_device_desc *desc) 199 { 200 return mic_aligned_desc_size(desc) + sizeof(struct mic_device_ctrl); 201 } 202 #endif 203 204 /* Device page size */ 205 #define MIC_DP_SIZE 4096 206 207 #define MIC_MAGIC 0xc0ffee00 208 209 /** 210 * enum mic_states - MIC states. 211 */ 212 enum mic_states { 213 MIC_READY = 0, 214 MIC_BOOTING, 215 MIC_ONLINE, 216 MIC_SHUTTING_DOWN, 217 MIC_RESETTING, 218 MIC_RESET_FAILED, 219 MIC_LAST 220 }; 221 222 /** 223 * enum mic_status - MIC status reported by card after 224 * a host or card initiated shutdown or a card crash. 225 */ 226 enum mic_status { 227 MIC_NOP = 0, 228 MIC_CRASHED, 229 MIC_HALTED, 230 MIC_POWER_OFF, 231 MIC_RESTART, 232 MIC_STATUS_LAST 233 }; 234 235 #endif