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 */ 41struct 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 */ 64struct 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 */ 86struct 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 */ 103struct 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 */ 116struct 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 */ 153struct _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 */ 167struct 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 177static 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 183static inline struct mic_vqconfig * 184mic_vq_config(const struct mic_device_desc *desc) 185{ 186 return (struct mic_vqconfig *)(desc + 1); 187} 188 189static inline __u8 *mic_vq_features(const struct mic_device_desc *desc) 190{ 191 return (__u8 *)(mic_vq_config(desc) + desc->num_vq); 192} 193 194static inline __u8 *mic_vq_configspace(const struct mic_device_desc *desc) 195{ 196 return mic_vq_features(desc) + desc->feature_len * 2; 197} 198static 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 */ 212enum 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 */ 226enum 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 236