xref: /freebsd/sys/sys/iov.h (revision c57c26179033f64c2011a2d2a904ee3fa62e826a)
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 #define	VF_VLAN_TRUNK		4096
50 
51 /*
52  * Because each PF device is expected to expose a unique set of possible
53  * configurations, the SR-IOV infrastructure dynamically queries the PF
54  * driver for its capabilities.  These capabilities are exposed to userland
55  * with a configuration schema.  The schema is exported from the kernel as a
56  * packed nvlist.  See nv(3) for the details of the nvlist API.  The expected
57  * format of the nvlist is:
58  *
59  * BASIC RULES
60  *   1) All keys are case-insensitive.
61  *   2) No keys that are not specified below may exist at any level of the
62  *      schema.
63  *   3) All keys are mandatory unless explicitly documented as optional.  If a
64  *      key is mandatory then the associated value is also mandatory.
65  *   4) Order of keys is irrelevant.
66  *
67  * TOP LEVEL
68  *   1) There must be a top-level key with the name PF_CONFIG_NAME.  The value
69  *      associated with this key is a nvlist that follows the device schema
70  *      node format.  The parameters in this node specify the configuration
71  *      parameters that may be applied to a PF.
72  *   2) There must be a top-level key with the name VF_SCHEMA_NAME.  The value
73  *      associated with this key is a nvlist that follows the device schema
74  *      node format.  The parameters in this node specify the configuration
75  *      parameters that may be applied to a VF.
76  *
77  * DEVICE SCHEMA NODE
78  *   1) There must be a key with the name DRIVER_CONFIG_NAME.  The value
79  *      associated with this key is a nvlist that follows the device/subsystem
80  *      schema node format.  The parameters in this node specify the
81  *      configuration parameters that are specific to a particular device
82  *      driver.
83  *   2) There must be a key with the name IOV_CONFIG_NAME.  The value associated
84  *      with this key is an nvlist that follows the device/subsystem schema node
85  *      format.  The parameters in this node specify the configuration
86  *      parameters that are applied by the SR-IOV infrastructure.
87  *
88  * DEVICE/SUBSYSTEM SCHEMA NODE
89  *   1) All keys in the device/subsystem schema node are optional.
90  *   2) Each key specifies the name of a valid configuration parameter that may
91  *      be applied to the device/subsystem combination specified by this node.
92  *      The value associated with the key specifies the format of valid
93  *      configuration values, and must be a nvlist in parameter schema node
94  *      format.
95  *
96  * PARAMETER SCHEMA NODE
97  *   1) The parameter schema node must contain a key with the name
98  *      TYPE_SCHEMA_NAME.  The value associated with this key must be a string.
99  *      This string specifies the type of value that the parameter specified by
100  *      this node must take.  The string must have one of the following values:
101  *         - "bool"     - The configuration value must be a boolean.
102  *         - "mac-addr" - The configuration value must be a binary value.  In
103  *                         addition, the value must be exactly 6 bytes long and
104  *                         the value must not be a multicast or broadcast mac.
105  *         - "uint8_t"  - The configuration value must be a integer value in
106  *                         the range [0, UINT8_MAX].
107  *         - "uint16_t" - The configuration value must be a integer value in
108  *                         the range [0, UINT16_MAX].
109  *         - "uint32_t" - The configuration value must be a integer value in
110  *                         the range [0, UINT32_MAX].
111  *         - "uint64_t" - The configuration value must be a integer value in
112  *                         the range [0, UINT64_MAX].
113  *  2) The parameter schema may contain a key with the name
114  *     REQUIRED_SCHEMA_NAME.  This key is optional.  If this key is present, the
115  *     value associated with it must have a boolean type.  If the value is true,
116  *     then the parameter specified by this schema is a required parameter.  All
117  *     valid configurations must include all required parameters.
118  *  3) The parameter schema may contain a key with the name DEFAULT_SCHEMA_NAME.
119  *     This key is optional.  This key must not be present if the parameter
120  *     specified by this schema is required.  If this key is present, the value
121  *     associated with the parent key must follow all restrictions specified by
122  *     the type specified by this schema.  If a configuration does not supply a
123  *     value for the parameter specified by this schema, then the kernel will
124  *     apply the value associated with this key in its place.
125  *
126  * The following is an example of a valid schema, as printed by nvlist_dump.
127  * Keys are printed followed by the type of the value in parantheses.  The
128  * value is displayed following a colon.  The indentation level reflects the
129  * level of nesting of nvlists.  String values are displayed between []
130  * brackets.  Binary values are shown with the length of the binary value (in
131  * bytes) followed by the actual binary values.
132  *
133  *  PF (NVLIST):
134  *      IOV (NVLIST):
135  *          num_vfs (NVLIST):
136  *              type (STRING): [uint16_t]
137  *              required (BOOL): TRUE
138  *          device (NVLIST):
139  *              type (STRING): [string]
140  *              required (BOOL): TRUE
141  *      DRIVER (NVLIST):
142  *  VF (NVLIST):
143  *      IOV (NVLIST):
144  *          passthrough (NVLIST):
145  *              type (STRING): [bool]
146  *              default (BOOL): FALSE
147  *      DRIVER (NVLIST):
148  *          mac-addr (NVLIST):
149  *              type (STRING): [mac-addr]
150  *              default (BINARY): 6 000000000000
151  *          vlan (NVLIST):
152  *               type (STRING): [uint16_t]
153  *          spoof-check (NVLIST):
154  *              type (STRING): [bool]
155  *              default (BOOL): TRUE
156  *          allow-set-mac (NVLIST):
157  *              type (STRING): [bool]
158  *              default (BOOL): FALSE
159  */
160 struct pci_iov_schema
161 {
162 	void *schema;
163 	size_t len;
164 	int error;
165 };
166 
167 /*
168  * SR-IOV configuration is passed to the kernel as a packed nvlist.  See nv(3)
169  * for the details of the nvlist API.  The expected format of the nvlist is:
170  *
171  * BASIC RULES
172  *   1) All keys are case-insensitive.
173  *   2) No keys that are not specified below may exist at any level of the
174  *      config nvlist.
175  *   3) Unless otherwise specified, all keys are optional.  It should go without
176  *      saying a key being mandatory is transitive: that is, if a key is
177  *      specified to contain a sub-nodes that contains a mandatory key, then
178  *      the outer key is implicitly mandatory.  If a key is mandatory then the
179  *      associated value is also mandatory.
180  *   4) Order of keys is irrelevant.
181  *
182  * TOP LEVEL OF CONFIG NVLIST
183  * 1) All keys specified in this section are mandatory.
184  * 2) There must be a top-level key with the name PF_CONFIG_NAME.  The value
185  *    associated is an nvlist that follows the "device node" format.  The
186  *    parameters in this node specify parameters that apply to the PF.
187  * 3) For every VF being configured (this is set via the "num_vfs" parameter
188  *    in the PF section), there must be a top-level key whose name is VF_PREFIX
189  *    immediately followed by the index of the VF as a decimal integer.  For
190  *    example, this would be VF-0 for the first VF.  VFs are numbered starting
191  *    from 0.  The value associated with this key follows the "device node"
192  *    format.  The parameters in this node specify configuration that applies
193  *    to the VF specified in the key.  Leading zeros are not permitted in VF
194  *    index.  Configuration for the second VF must be specified in a node with
195  *    the key VF-1.  VF-01 is not a valid key.
196  *
197  * DEVICE NODES
198  * 1) All keys specified in this section are mandatory.
199  * 2) The device node must contain a key with the name DRIVER_CONFIG_NAME.  The
200  *    value associated with this key is an nvlist following the subsystem node
201  *    format.  The parameters in this key specify configuration that is specific
202  *    to a particular device driver.
203  * 3) The device node must contain a key with the name IOV_CONFIG_NAME.  The
204  *    value associated with this key is an nvlist following the subsystem node
205  *    format.  The parameters in this key specify configuration that is consumed
206  *    by the SR-IOV infrastructure.
207  *
208  * SUBSYSTEM NODES
209  * 1) A subsystem node specifies configuration parameters that apply to a
210  *    particular subsystem (driver or infrastructure) of a particular device
211  *    (PF or individual VF).
212  *         Note: We will refer to the section of the configuration schema that
213  *               specifies the parameters for this subsystem and device
214  *               configuration as the device/subsystem schema.
215  * 2) The subsystem node must contain only keys that correspond to parameters
216  *    that are specified in the device/subsystem schema.
217  * 3) Every parameter specified as required in the device/subsystem schema is
218  *    a mandatory key in the subsystem node.
219  *    Note:  All parameters that are not required in device/subsystem schema are
220  *           optional keys.  In particular, any parameter specified to have a
221  *           default value in the device/subsystem schema is optional.  The
222  *           kernel is responsible for applying default values.
223  * 4) The value of every parameter in the device node must conform to the
224  *    restrictions of the type specified for that parameter in the device/
225  *    subsystem schema.
226  *
227  * The following is an example of a valid configuration, when validated against
228  * the schema example given above.
229  *
230  * PF (NVLIST):
231  *     driver (NVLIST):
232  *     iov (NVLIST):
233  *         num_vfs (NUMBER): 3 (3) (0x3)
234  *         device (STRING): [ix0]
235  * VF-0 (NVLIST):
236  *     driver (NVLIST):
237  *         vlan (NUMBER): 1000 (1000) (0x3e8)
238  *     iov (NVLIST):
239  *         passthrough (BOOL): TRUE
240  * VF-1 (NVLIST):
241  *     driver (NVLIST):
242  *     iov (NVLIST):
243  * VF-2 (NVLIST):
244  *     driver (NVLIST):
245  *         mac-addr (BINARY): 6 020102030405
246  *     iov (NVLIST):
247  */
248 struct pci_iov_arg
249 {
250 	void *config;
251 	size_t len;
252 };
253 
254 #define	IOV_CONFIG	_IOW('p', 10, struct pci_iov_arg)
255 #define	IOV_DELETE	_IO('p', 11)
256 #define	IOV_GET_SCHEMA	_IOWR('p', 12, struct pci_iov_schema)
257 
258 #endif
259