1/*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2013-2015 Sandvine Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29#ifndef _SYS_IOV_H_ 30#define _SYS_IOV_H_ 31 32#include <sys/ioccom.h> 33 34#define PF_CONFIG_NAME "PF" 35#define VF_SCHEMA_NAME "VF" 36 37#define VF_PREFIX "VF-" 38#define VF_PREFIX_LEN 3 39#define VF_NUM_LEN 5 /* The maximum VF num is 65535. */ 40#define VF_MAX_NAME (VF_PREFIX_LEN + VF_NUM_LEN + 1) 41 42#define DRIVER_CONFIG_NAME "DRIVER" 43#define IOV_CONFIG_NAME "IOV" 44 45#define TYPE_SCHEMA_NAME "TYPE" 46#define DEFAULT_SCHEMA_NAME "DEFAULT" 47#define REQUIRED_SCHEMA_NAME "REQUIRED" 48 49/* 50 * Because each PF device is expected to expose a unique set of possible 51 * configurations, the SR-IOV infrastructure dynamically queries the PF 52 * driver for its capabilities. These capabilities are exposed to userland 53 * with a configuration schema. The schema is exported from the kernel as a 54 * packed nvlist. See nv(3) for the details of the nvlist API. The expected 55 * format of the nvlist is: 56 * 57 * BASIC RULES 58 * 1) All keys are case-insensitive. 59 * 2) No keys that are not specified below may exist at any level of the 60 * schema. 61 * 3) All keys are mandatory unless explicitly documented as optional. If a 62 * key is mandatory then the associated value is also mandatory. 63 * 4) Order of keys is irrelevant. 64 * 65 * TOP LEVEL 66 * 1) There must be a top-level key with the name PF_CONFIG_NAME. The value 67 * associated with this key is a nvlist that follows the device schema 68 * node format. The parameters in this node specify the configuration 69 * parameters that may be applied to a PF. 70 * 2) There must be a top-level key with the name VF_SCHEMA_NAME. The value 71 * associated with this key is a nvlist that follows the device schema 72 * node format. The parameters in this node specify the configuration 73 * parameters that may be applied to a VF. 74 * 75 * DEVICE SCHEMA NODE 76 * 1) There must be a key with the name DRIVER_CONFIG_NAME. The value 77 * associated with this key is a nvlist that follows the device/subsystem 78 * schema node format. The parameters in this node specify the 79 * configuration parameters that are specific to a particular device 80 * driver. 81 * 2) There must be a key with the name IOV_CONFIG_NAME. The value associated 82 * with this key is an nvlist that follows the device/subsystem schema node 83 * format. The parameters in this node specify the configuration 84 * parameters that are applied by the SR-IOV infrastructure. 85 * 86 * DEVICE/SUBSYSTEM SCHEMA NODE 87 * 1) All keys in the device/subsystem schema node are optional. 88 * 2) Each key specifies the name of a valid configuration parameter that may 89 * be applied to the device/subsystem combination specified by this node. 90 * The value associated with the key specifies the format of valid 91 * configuration values, and must be a nvlist in parameter schema node 92 * format. 93 * 94 * PARAMETER SCHEMA NODE 95 * 1) The parameter schema node must contain a key with the name 96 * TYPE_SCHEMA_NAME. The value associated with this key must be a string. 97 * This string specifies the type of value that the parameter specified by 98 * this node must take. The string must have one of the following values: 99 * - "bool" - The configuration value must be a boolean. 100 * - "mac-addr" - The configuration value must be a binary value. In 101 * addition, the value must be exactly 6 bytes long and 102 * the value must not be a multicast or broadcast mac. 103 * - "uint8_t" - The configuration value must be a integer value in 104 * the range [0, UINT8_MAX]. 105 * - "uint16_t" - The configuration value must be a integer value in 106 * the range [0, UINT16_MAX]. 107 * - "uint32_t" - The configuration value must be a integer value in 108 * the range [0, UINT32_MAX]. 109 * - "uint64_t" - The configuration value must be a integer value in 110 * the range [0, UINT64_MAX]. 111 * 2) The parameter schema may contain a key with the name 112 * REQUIRED_SCHEMA_NAME. This key is optional. If this key is present, the 113 * value associated with it must have a boolean type. If the value is true, 114 * then the parameter specified by this schema is a required parameter. All 115 * valid configurations must include all required parameters. 116 * 3) The parameter schema may contain a key with the name DEFAULT_SCHEMA_NAME. 117 * This key is optional. This key must not be present if the parameter 118 * specified by this schema is required. If this key is present, the value 119 * associated with the parent key must follow all restrictions specified by 120 * the type specified by this schema. If a configuration does not supply a 121 * value for the parameter specified by this schema, then the kernel will 122 * apply the value associated with this key in its place. 123 * 124 * The following is an example of a valid schema, as printed by nvlist_dump. 125 * Keys are printed followed by the type of the value in parantheses. The 126 * value is displayed following a colon. The indentation level reflects the 127 * level of nesting of nvlists. String values are displayed between [] 128 * brackets. Binary values are shown with the length of the binary value (in 129 * bytes) followed by the actual binary values. 130 * 131 * PF (NVLIST): 132 * IOV (NVLIST): 133 * num_vfs (NVLIST): 134 * type (STRING): [uint16_t] 135 * required (BOOL): TRUE 136 * device (NVLIST): 137 * type (STRING): [string] 138 * required (BOOL): TRUE 139 * DRIVER (NVLIST): 140 * VF (NVLIST): 141 * IOV (NVLIST): 142 * passthrough (NVLIST): 143 * type (STRING): [bool] 144 * default (BOOL): FALSE 145 * DRIVER (NVLIST): 146 * mac-addr (NVLIST): 147 * type (STRING): [mac-addr] 148 * default (BINARY): 6 000000000000 149 * vlan (NVLIST): 150 * type (STRING): [uint16_t] 151 * spoof-check (NVLIST): 152 * type (STRING): [bool] 153 * default (BOOL): TRUE 154 * allow-set-mac (NVLIST): 155 * type (STRING): [bool] 156 * default (BOOL): FALSE 157 */ 158struct pci_iov_schema 159{ 160 void *schema; 161 size_t len; 162 int error; 163}; 164 165/* 166 * SR-IOV configuration is passed to the kernel as a packed nvlist. See nv(3) 167 * for the details of the nvlist API. The expected format of the nvlist is: 168 * 169 * BASIC RULES 170 * 1) All keys are case-insensitive. 171 * 2) No keys that are not specified below may exist at any level of the 172 * config nvlist. 173 * 3) Unless otherwise specified, all keys are optional. It should go without 174 * saying a key being mandatory is transitive: that is, if a key is 175 * specified to contain a sub-nodes that contains a mandatory key, then 176 * the outer key is implicitly mandatory. If a key is mandatory then the 177 * associated value is also mandatory. 178 * 4) Order of keys is irrelevant. 179 * 180 * TOP LEVEL OF CONFIG NVLIST 181 * 1) All keys specified in this section are mandatory. 182 * 2) There must be a top-level key with the name PF_CONFIG_NAME. The value 183 * associated is an nvlist that follows the "device node" format. The 184 * parameters in this node specify parameters that apply to the PF. 185 * 3) For every VF being configured (this is set via the "num_vfs" parameter 186 * in the PF section), there must be a top-level key whose name is VF_PREFIX 187 * immediately followed by the index of the VF as a decimal integer. For 188 * example, this would be VF-0 for the first VF. VFs are numbered starting 189 * from 0. The value associated with this key follows the "device node" 190 * format. The parameters in this node specify configuration that applies 191 * to the VF specified in the key. Leading zeros are not permitted in VF 192 * index. Configuration for the second VF must be specified in a node with 193 * the key VF-1. VF-01 is not a valid key. 194 * 195 * DEVICE NODES 196 * 1) All keys specified in this section are mandatory. 197 * 2) The device node must contain a key with the name DRIVER_CONFIG_NAME. The 198 * value associated with this key is an nvlist following the subsystem node 199 * format. The parameters in this key specify configuration that is specific 200 * to a particular device driver. 201 * 3) The device node must contain a key with the name IOV_CONFIG_NAME. The 202 * value associated with this key is an nvlist following the subsystem node 203 * format. The parameters in this key specify configuration that is consumed 204 * by the SR-IOV infrastructure. 205 * 206 * SUBSYSTEM NODES 207 * 1) A subsystem node specifies configuration parameters that apply to a 208 * particular subsystem (driver or infrastructure) of a particular device 209 * (PF or individual VF). 210 * Note: We will refer to the section of the configuration schema that 211 * specifies the parameters for this subsystem and device 212 * configuration as the device/subsystem schema. 213 * 2) The subsystem node must contain only keys that correspond to parameters 214 * that are specified in the device/subsystem schema. 215 * 3) Every parameter specified as required in the device/subsystem schema is 216 * a mandatory key in the subsystem node. 217 * Note: All parameters that are not required in device/subsystem schema are 218 * optional keys. In particular, any parameter specified to have a 219 * default value in the device/subsystem schema is optional. The 220 * kernel is responsible for applying default values. 221 * 4) The value of every parameter in the device node must conform to the 222 * restrictions of the type specified for that parameter in the device/ 223 * subsystem schema. 224 * 225 * The following is an example of a valid configuration, when validated against 226 * the schema example given above. 227 * 228 * PF (NVLIST): 229 * driver (NVLIST): 230 * iov (NVLIST): 231 * num_vfs (NUMBER): 3 (3) (0x3) 232 * device (STRING): [ix0] 233 * VF-0 (NVLIST): 234 * driver (NVLIST): 235 * vlan (NUMBER): 1000 (1000) (0x3e8) 236 * iov (NVLIST): 237 * passthrough (BOOL): TRUE 238 * VF-1 (NVLIST): 239 * driver (NVLIST): 240 * iov (NVLIST): 241 * VF-2 (NVLIST): 242 * driver (NVLIST): 243 * mac-addr (BINARY): 6 020102030405 244 * iov (NVLIST): 245 */ 246struct pci_iov_arg 247{ 248 void *config; 249 size_t len; 250}; 251 252#define IOV_CONFIG _IOW('p', 10, struct pci_iov_arg) 253#define IOV_DELETE _IO('p', 11) 254#define IOV_GET_SCHEMA _IOWR('p', 12, struct pci_iov_schema) 255 256#endif 257