vnic_devcmd.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. /*
  2. * Copyright 2008-2010 Cisco Systems, Inc. All rights reserved.
  3. * Copyright 2007 Nuova Systems, Inc. All rights reserved.
  4. *
  5. * This program is free software; you may redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; version 2 of the License.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  10. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  11. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  12. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  13. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  14. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  15. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  16. * SOFTWARE.
  17. *
  18. */
  19. #ifndef _VNIC_DEVCMD_H_
  20. #define _VNIC_DEVCMD_H_
  21. #define _CMD_NBITS 14
  22. #define _CMD_VTYPEBITS 10
  23. #define _CMD_FLAGSBITS 6
  24. #define _CMD_DIRBITS 2
  25. #define _CMD_NMASK ((1 << _CMD_NBITS)-1)
  26. #define _CMD_VTYPEMASK ((1 << _CMD_VTYPEBITS)-1)
  27. #define _CMD_FLAGSMASK ((1 << _CMD_FLAGSBITS)-1)
  28. #define _CMD_DIRMASK ((1 << _CMD_DIRBITS)-1)
  29. #define _CMD_NSHIFT 0
  30. #define _CMD_VTYPESHIFT (_CMD_NSHIFT+_CMD_NBITS)
  31. #define _CMD_FLAGSSHIFT (_CMD_VTYPESHIFT+_CMD_VTYPEBITS)
  32. #define _CMD_DIRSHIFT (_CMD_FLAGSSHIFT+_CMD_FLAGSBITS)
  33. /*
  34. * Direction bits (from host perspective).
  35. */
  36. #define _CMD_DIR_NONE 0U
  37. #define _CMD_DIR_WRITE 1U
  38. #define _CMD_DIR_READ 2U
  39. #define _CMD_DIR_RW (_CMD_DIR_WRITE | _CMD_DIR_READ)
  40. /*
  41. * Flag bits.
  42. */
  43. #define _CMD_FLAGS_NONE 0U
  44. #define _CMD_FLAGS_NOWAIT 1U
  45. /*
  46. * vNIC type bits.
  47. */
  48. #define _CMD_VTYPE_NONE 0U
  49. #define _CMD_VTYPE_ENET 1U
  50. #define _CMD_VTYPE_FC 2U
  51. #define _CMD_VTYPE_SCSI 4U
  52. #define _CMD_VTYPE_ALL (_CMD_VTYPE_ENET | _CMD_VTYPE_FC | _CMD_VTYPE_SCSI)
  53. /*
  54. * Used to create cmds..
  55. */
  56. #define _CMDCF(dir, flags, vtype, nr) \
  57. (((dir) << _CMD_DIRSHIFT) | \
  58. ((flags) << _CMD_FLAGSSHIFT) | \
  59. ((vtype) << _CMD_VTYPESHIFT) | \
  60. ((nr) << _CMD_NSHIFT))
  61. #define _CMDC(dir, vtype, nr) _CMDCF(dir, 0, vtype, nr)
  62. #define _CMDCNW(dir, vtype, nr) _CMDCF(dir, _CMD_FLAGS_NOWAIT, vtype, nr)
  63. /*
  64. * Used to decode cmds..
  65. */
  66. #define _CMD_DIR(cmd) (((cmd) >> _CMD_DIRSHIFT) & _CMD_DIRMASK)
  67. #define _CMD_FLAGS(cmd) (((cmd) >> _CMD_FLAGSSHIFT) & _CMD_FLAGSMASK)
  68. #define _CMD_VTYPE(cmd) (((cmd) >> _CMD_VTYPESHIFT) & _CMD_VTYPEMASK)
  69. #define _CMD_N(cmd) (((cmd) >> _CMD_NSHIFT) & _CMD_NMASK)
  70. enum vnic_devcmd_cmd {
  71. CMD_NONE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_NONE, 0),
  72. /*
  73. * mcpu fw info in mem:
  74. * in:
  75. * (u64)a0=paddr to struct vnic_devcmd_fw_info
  76. * action:
  77. * Fills in struct vnic_devcmd_fw_info (128 bytes)
  78. * note:
  79. * An old definition of CMD_MCPU_FW_INFO
  80. */
  81. CMD_MCPU_FW_INFO_OLD = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 1),
  82. /*
  83. * mcpu fw info in mem:
  84. * in:
  85. * (u64)a0=paddr to struct vnic_devcmd_fw_info
  86. * (u16)a1=size of the structure
  87. * out:
  88. * (u16)a1=0 for in:a1 = 0,
  89. * data size actually written for other values.
  90. * action:
  91. * Fills in first 128 bytes of vnic_devcmd_fw_info for in:a1 = 0,
  92. * first in:a1 bytes for 0 < in:a1 <= 132,
  93. * 132 bytes for other values of in:a1.
  94. * note:
  95. * CMD_MCPU_FW_INFO and CMD_MCPU_FW_INFO_OLD have the same enum 1
  96. * for source compatibility.
  97. */
  98. CMD_MCPU_FW_INFO = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 1),
  99. /* dev-specific block member:
  100. * in: (u16)a0=offset,(u8)a1=size
  101. * out: a0=value */
  102. CMD_DEV_SPEC = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 2),
  103. /* stats clear */
  104. CMD_STATS_CLEAR = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 3),
  105. /* stats dump in mem: (u64)a0=paddr to stats area,
  106. * (u16)a1=sizeof stats area */
  107. CMD_STATS_DUMP = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 4),
  108. /* set Rx packet filter: (u32)a0=filters (see CMD_PFILTER_*) */
  109. CMD_PACKET_FILTER = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 7),
  110. /* set Rx packet filter for all: (u32)a0=filters (see CMD_PFILTER_*) */
  111. CMD_PACKET_FILTER_ALL = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 7),
  112. /* hang detection notification */
  113. CMD_HANG_NOTIFY = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 8),
  114. /* MAC address in (u48)a0 */
  115. CMD_GET_MAC_ADDR = _CMDC(_CMD_DIR_READ,
  116. _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 9),
  117. /* add addr from (u48)a0 */
  118. CMD_ADDR_ADD = _CMDCNW(_CMD_DIR_WRITE,
  119. _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 12),
  120. /* del addr from (u48)a0 */
  121. CMD_ADDR_DEL = _CMDCNW(_CMD_DIR_WRITE,
  122. _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 13),
  123. /* add VLAN id in (u16)a0 */
  124. CMD_VLAN_ADD = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 14),
  125. /* del VLAN id in (u16)a0 */
  126. CMD_VLAN_DEL = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 15),
  127. /* nic_cfg (no wait, always succeeds)
  128. * in: (u32)a0
  129. *
  130. * Capability query:
  131. * out: (u64) a0 = 1 if a1 is valid
  132. * (u64) a1 = (NIC_CFG bits supported) | (flags << 32)
  133. *
  134. * flags are CMD_NIC_CFG_CAPF_xxx
  135. */
  136. CMD_NIC_CFG = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16),
  137. /* nic_cfg_chk (will return error if flags are invalid)
  138. * in: (u32)a0
  139. *
  140. * Capability query:
  141. * out: (u64) a0 = 1 if a1 is valid
  142. * (u64) a1 = (NIC_CFG bits supported) | (flags << 32)
  143. *
  144. * flags are CMD_NIC_CFG_CAPF_xxx
  145. */
  146. CMD_NIC_CFG_CHK = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16),
  147. /* union vnic_rss_key in mem: (u64)a0=paddr, (u16)a1=len */
  148. CMD_RSS_KEY = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 17),
  149. /* union vnic_rss_cpu in mem: (u64)a0=paddr, (u16)a1=len */
  150. CMD_RSS_CPU = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 18),
  151. /* initiate softreset */
  152. CMD_SOFT_RESET = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 19),
  153. /* softreset status:
  154. * out: a0=0 reset complete, a0=1 reset in progress */
  155. CMD_SOFT_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 20),
  156. /* set struct vnic_devcmd_notify buffer in mem:
  157. * in:
  158. * (u64)a0=paddr to notify (set paddr=0 to unset)
  159. * (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify)
  160. * (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr)
  161. * out:
  162. * (u32)a1 = effective size
  163. */
  164. CMD_NOTIFY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 21),
  165. /* UNDI API: (u64)a0=paddr to s_PXENV_UNDI_ struct,
  166. * (u8)a1=PXENV_UNDI_xxx */
  167. CMD_UNDI = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 22),
  168. /* initiate open sequence (u32)a0=flags (see CMD_OPENF_*) */
  169. CMD_OPEN = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 23),
  170. /* open status:
  171. * out: a0=0 open complete, a0=1 open in progress */
  172. CMD_OPEN_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 24),
  173. /* close vnic */
  174. CMD_CLOSE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 25),
  175. /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
  176. /***** Replaced by CMD_INIT *****/
  177. CMD_INIT_v1 = _CMDCNW(_CMD_DIR_READ, _CMD_VTYPE_ALL, 26),
  178. /* variant of CMD_INIT, with provisioning info
  179. * (u64)a0=paddr of vnic_devcmd_provinfo
  180. * (u32)a1=sizeof provision info */
  181. CMD_INIT_PROV_INFO = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 27),
  182. /* enable virtual link */
  183. CMD_ENABLE = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
  184. /* enable virtual link, waiting variant. */
  185. CMD_ENABLE_WAIT = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28),
  186. /* disable virtual link */
  187. CMD_DISABLE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 29),
  188. /* stats dump sum of all vnic stats on same uplink in mem:
  189. * (u64)a0=paddr
  190. * (u16)a1=sizeof stats area */
  191. CMD_STATS_DUMP_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 30),
  192. /* init status:
  193. * out: a0=0 init complete, a0=1 init in progress
  194. * if a0=0, a1=errno */
  195. CMD_INIT_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31),
  196. /* INT13 API: (u64)a0=paddr to vnic_int13_params struct
  197. * (u32)a1=INT13_CMD_xxx */
  198. CMD_INT13 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_FC, 32),
  199. /* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */
  200. CMD_LOGICAL_UPLINK = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 33),
  201. /* undo initialize of virtual link */
  202. CMD_DEINIT = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 34),
  203. /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
  204. CMD_INIT = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 35),
  205. /* check fw capability of a cmd:
  206. * in: (u32)a0=cmd
  207. * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */
  208. CMD_CAPABILITY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36),
  209. /* persistent binding info
  210. * in: (u64)a0=paddr of arg
  211. * (u32)a1=CMD_PERBI_XXX */
  212. CMD_PERBI = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 37),
  213. /* Interrupt Assert Register functionality
  214. * in: (u16)a0=interrupt number to assert
  215. */
  216. CMD_IAR = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 38),
  217. /* initiate hangreset, like softreset after hang detected */
  218. CMD_HANG_RESET = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 39),
  219. /* hangreset status:
  220. * out: a0=0 reset complete, a0=1 reset in progress */
  221. CMD_HANG_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 40),
  222. /*
  223. * Set hw ingress packet vlan rewrite mode:
  224. * in: (u32)a0=new vlan rewrite mode
  225. * out: (u32)a0=old vlan rewrite mode */
  226. CMD_IG_VLAN_REWRITE_MODE = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 41),
  227. /*
  228. * in: (u16)a0=bdf of target vnic
  229. * (u32)a1=cmd to proxy
  230. * a2-a15=args to cmd in a1
  231. * out: (u32)a0=status of proxied cmd
  232. * a1-a15=out args of proxied cmd */
  233. CMD_PROXY_BY_BDF = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 42),
  234. /*
  235. * As for BY_BDF except a0 is index of hvnlink subordinate vnic
  236. * or SR-IOV virtual vnic
  237. */
  238. CMD_PROXY_BY_INDEX = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 43),
  239. /*
  240. * For HPP toggle:
  241. * adapter-info-get
  242. * in: (u64)a0=phsical address of buffer passed in from caller.
  243. * (u16)a1=size of buffer specified in a0.
  244. * out: (u64)a0=phsical address of buffer passed in from caller.
  245. * (u16)a1=actual bytes from VIF-CONFIG-INFO TLV, or
  246. * 0 if no VIF-CONFIG-INFO TLV was ever received. */
  247. CMD_CONFIG_INFO_GET = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 44),
  248. /* INT13 API: (u64)a0=paddr to vnic_int13_params struct
  249. * (u32)a1=INT13_CMD_xxx
  250. */
  251. CMD_INT13_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 45),
  252. /* Set default vlan:
  253. * in: (u16)a0=new default vlan
  254. * (u16)a1=zero for overriding vlan with param a0,
  255. * non-zero for resetting vlan to the default
  256. * out: (u16)a0=old default vlan
  257. */
  258. CMD_SET_DEFAULT_VLAN = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 46),
  259. /* init_prov_info2:
  260. * Variant of CMD_INIT_PROV_INFO, where it will not try to enable
  261. * the vnic until CMD_ENABLE2 is issued.
  262. * (u64)a0=paddr of vnic_devcmd_provinfo
  263. * (u32)a1=sizeof provision info
  264. */
  265. CMD_INIT_PROV_INFO2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 47),
  266. /* enable2:
  267. * (u32)a0=0 ==> standby
  268. * =CMD_ENABLE2_ACTIVE ==> active
  269. */
  270. CMD_ENABLE2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 48),
  271. /*
  272. * cmd_status:
  273. * Returns the status of the specified command
  274. * Input:
  275. * a0 = command for which status is being queried.
  276. * Possible values are:
  277. * CMD_SOFT_RESET
  278. * CMD_HANG_RESET
  279. * CMD_OPEN
  280. * CMD_INIT
  281. * CMD_INIT_PROV_INFO
  282. * CMD_DEINIT
  283. * CMD_INIT_PROV_INFO2
  284. * CMD_ENABLE2
  285. * Output:
  286. * if status == STAT_ERROR
  287. * a0 = ERR_ENOTSUPPORTED - status for command in a0 is
  288. * not supported
  289. * if status == STAT_NONE
  290. * a0 = status of the devcmd specified in a0 as follows.
  291. * ERR_SUCCESS - command in a0 completed successfully
  292. * ERR_EINPROGRESS - command in a0 is still in progress
  293. */
  294. CMD_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 49),
  295. /*
  296. * Returns interrupt coalescing timer conversion factors.
  297. * After calling this devcmd, ENIC driver can convert
  298. * interrupt coalescing timer in usec into CPU cycles as follows:
  299. *
  300. * intr_timer_cycles = intr_timer_usec * multiplier / divisor
  301. *
  302. * Interrupt coalescing timer in usecs can be obtained from
  303. * CPU cycles as follows:
  304. *
  305. * intr_timer_usec = intr_timer_cycles * divisor / multiplier
  306. *
  307. * in: none
  308. * out: (u32)a0 = multiplier
  309. * (u32)a1 = divisor
  310. * (u32)a2 = maximum timer value in usec
  311. */
  312. CMD_INTR_COAL_CONVERT = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 50),
  313. /*
  314. * Set the predefined mac address as default
  315. * in:
  316. * (u48)a0 = mac addr
  317. */
  318. CMD_SET_MAC_ADDR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 55),
  319. /* Update the provisioning info of the given VIF
  320. * (u64)a0=paddr of vnic_devcmd_provinfo
  321. * (u32)a1=sizeof provision info
  322. */
  323. CMD_PROV_INFO_UPDATE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 56),
  324. /* Initialization for the devcmd2 interface.
  325. * in: (u64) a0 = host result buffer physical address
  326. * in: (u16) a1 = number of entries in result buffer
  327. */
  328. CMD_INITIALIZE_DEVCMD2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 57),
  329. /* Add a filter.
  330. * in: (u64) a0= filter address
  331. * (u32) a1= size of filter
  332. * out: (u32) a0=filter identifier
  333. */
  334. CMD_ADD_FILTER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 58),
  335. /* Delete a filter.
  336. * in: (u32) a0=filter identifier
  337. */
  338. CMD_DEL_FILTER = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 59),
  339. /* Enable a Queue Pair in User space NIC
  340. * in: (u32) a0=Queue Pair number
  341. * (u32) a1= command
  342. */
  343. CMD_QP_ENABLE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 60),
  344. /* Disable a Queue Pair in User space NIC
  345. * in: (u32) a0=Queue Pair number
  346. * (u32) a1= command
  347. */
  348. CMD_QP_DISABLE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 61),
  349. /* Stats dump Queue Pair in User space NIC
  350. * in: (u32) a0=Queue Pair number
  351. * (u64) a1=host buffer addr for status dump
  352. * (u32) a2=length of the buffer
  353. */
  354. CMD_QP_STATS_DUMP = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 62),
  355. /* Clear stats for Queue Pair in User space NIC
  356. * in: (u32) a0=Queue Pair number
  357. */
  358. CMD_QP_STATS_CLEAR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 63),
  359. /* Use this devcmd for agreeing on the highest common version supported
  360. * by both driver and fw for features who need such a facility.
  361. * in: (u64) a0 = feature (driver requests for the supported versions
  362. * on this feature)
  363. * out: (u64) a0 = bitmap of all supported versions for that feature
  364. */
  365. CMD_GET_SUPP_FEATURE_VER = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 69),
  366. /* Control (Enable/Disable) overlay offloads on the given vnic
  367. * in: (u8) a0 = OVERLAY_FEATURE_NVGRE : NVGRE
  368. * a0 = OVERLAY_FEATURE_VXLAN : VxLAN
  369. * in: (u8) a1 = OVERLAY_OFFLOAD_ENABLE : Enable or
  370. * a1 = OVERLAY_OFFLOAD_DISABLE : Disable or
  371. * a1 = OVERLAY_OFFLOAD_ENABLE_V2 : Enable with version 2
  372. */
  373. CMD_OVERLAY_OFFLOAD_CTRL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 72),
  374. /* Configuration of overlay offloads feature on a given vNIC
  375. * in: (u8) a0 = DEVCMD_OVERLAY_NVGRE : NVGRE
  376. * a0 = DEVCMD_OVERLAY_VXLAN : VxLAN
  377. * in: (u8) a1 = VXLAN_PORT_UPDATE : VxLAN
  378. * in: (u16) a2 = unsigned short int port information
  379. */
  380. CMD_OVERLAY_OFFLOAD_CFG = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 73),
  381. };
  382. /* CMD_ENABLE2 flags */
  383. #define CMD_ENABLE2_STANDBY 0x0
  384. #define CMD_ENABLE2_ACTIVE 0x1
  385. /* flags for CMD_OPEN */
  386. #define CMD_OPENF_OPROM 0x1 /* open coming from option rom */
  387. #define CMD_OPENF_IG_DESCCACHE 0x2 /* Do not flush IG DESC cache */
  388. /* flags for CMD_INIT */
  389. #define CMD_INITF_DEFAULT_MAC 0x1 /* init with default mac addr */
  390. /* flags for CMD_PACKET_FILTER */
  391. #define CMD_PFILTER_DIRECTED 0x01
  392. #define CMD_PFILTER_MULTICAST 0x02
  393. #define CMD_PFILTER_BROADCAST 0x04
  394. #define CMD_PFILTER_PROMISCUOUS 0x08
  395. #define CMD_PFILTER_ALL_MULTICAST 0x10
  396. /* Commands for CMD_QP_ENABLE/CM_QP_DISABLE */
  397. #define CMD_QP_RQWQ 0x0
  398. /* rewrite modes for CMD_IG_VLAN_REWRITE_MODE */
  399. #define IG_VLAN_REWRITE_MODE_DEFAULT_TRUNK 0
  400. #define IG_VLAN_REWRITE_MODE_UNTAG_DEFAULT_VLAN 1
  401. #define IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN 2
  402. #define IG_VLAN_REWRITE_MODE_PASS_THRU 3
  403. enum vnic_devcmd_status {
  404. STAT_NONE = 0,
  405. STAT_BUSY = 1 << 0, /* cmd in progress */
  406. STAT_ERROR = 1 << 1, /* last cmd caused error (code in a0) */
  407. };
  408. enum vnic_devcmd_error {
  409. ERR_SUCCESS = 0,
  410. ERR_EINVAL = 1,
  411. ERR_EFAULT = 2,
  412. ERR_EPERM = 3,
  413. ERR_EBUSY = 4,
  414. ERR_ECMDUNKNOWN = 5,
  415. ERR_EBADSTATE = 6,
  416. ERR_ENOMEM = 7,
  417. ERR_ETIMEDOUT = 8,
  418. ERR_ELINKDOWN = 9,
  419. ERR_EMAXRES = 10,
  420. ERR_ENOTSUPPORTED = 11,
  421. ERR_EINPROGRESS = 12,
  422. ERR_MAX
  423. };
  424. /*
  425. * note: hw_version and asic_rev refer to the same thing,
  426. * but have different formats. hw_version is
  427. * a 32-byte string (e.g. "A2") and asic_rev is
  428. * a 16-bit integer (e.g. 0xA2).
  429. */
  430. struct vnic_devcmd_fw_info {
  431. char fw_version[32];
  432. char fw_build[32];
  433. char hw_version[32];
  434. char hw_serial_number[32];
  435. u16 asic_type;
  436. u16 asic_rev;
  437. };
  438. struct vnic_devcmd_notify {
  439. u32 csum; /* checksum over following words */
  440. u32 link_state; /* link up == 1 */
  441. u32 port_speed; /* effective port speed (rate limit) */
  442. u32 mtu; /* MTU */
  443. u32 msglvl; /* requested driver msg lvl */
  444. u32 uif; /* uplink interface */
  445. u32 status; /* status bits (see VNIC_STF_*) */
  446. u32 error; /* error code (see ERR_*) for first ERR */
  447. u32 link_down_cnt; /* running count of link down transitions */
  448. u32 perbi_rebuild_cnt; /* running count of perbi rebuilds */
  449. };
  450. #define VNIC_STF_FATAL_ERR 0x0001 /* fatal fw error */
  451. #define VNIC_STF_STD_PAUSE 0x0002 /* standard link-level pause on */
  452. #define VNIC_STF_PFC_PAUSE 0x0004 /* priority flow control pause on */
  453. /* all supported status flags */
  454. #define VNIC_STF_ALL (VNIC_STF_FATAL_ERR |\
  455. VNIC_STF_STD_PAUSE |\
  456. VNIC_STF_PFC_PAUSE |\
  457. 0)
  458. struct vnic_devcmd_provinfo {
  459. u8 oui[3];
  460. u8 type;
  461. u8 data[0];
  462. };
  463. /* These are used in flags field of different filters to denote
  464. * valid fields used.
  465. */
  466. #define FILTER_FIELD_VALID(fld) (1 << (fld - 1))
  467. #define FILTER_FIELDS_USNIC ( \
  468. FILTER_FIELD_VALID(1) | \
  469. FILTER_FIELD_VALID(2) | \
  470. FILTER_FIELD_VALID(3) | \
  471. FILTER_FIELD_VALID(4))
  472. #define FILTER_FIELDS_IPV4_5TUPLE ( \
  473. FILTER_FIELD_VALID(1) | \
  474. FILTER_FIELD_VALID(2) | \
  475. FILTER_FIELD_VALID(3) | \
  476. FILTER_FIELD_VALID(4) | \
  477. FILTER_FIELD_VALID(5))
  478. #define FILTER_FIELDS_MAC_VLAN ( \
  479. FILTER_FIELD_VALID(1) | \
  480. FILTER_FIELD_VALID(2))
  481. #define FILTER_FIELD_USNIC_VLAN FILTER_FIELD_VALID(1)
  482. #define FILTER_FIELD_USNIC_ETHTYPE FILTER_FIELD_VALID(2)
  483. #define FILTER_FIELD_USNIC_PROTO FILTER_FIELD_VALID(3)
  484. #define FILTER_FIELD_USNIC_ID FILTER_FIELD_VALID(4)
  485. struct filter_usnic_id {
  486. u32 flags;
  487. u16 vlan;
  488. u16 ethtype;
  489. u8 proto_version;
  490. u32 usnic_id;
  491. } __packed;
  492. #define FILTER_FIELD_5TUP_PROTO FILTER_FIELD_VALID(1)
  493. #define FILTER_FIELD_5TUP_SRC_AD FILTER_FIELD_VALID(2)
  494. #define FILTER_FIELD_5TUP_DST_AD FILTER_FIELD_VALID(3)
  495. #define FILTER_FIELD_5TUP_SRC_PT FILTER_FIELD_VALID(4)
  496. #define FILTER_FIELD_5TUP_DST_PT FILTER_FIELD_VALID(5)
  497. /* Enums for the protocol field. */
  498. enum protocol_e {
  499. PROTO_UDP = 0,
  500. PROTO_TCP = 1,
  501. };
  502. struct filter_ipv4_5tuple {
  503. u32 flags;
  504. u32 protocol;
  505. u32 src_addr;
  506. u32 dst_addr;
  507. u16 src_port;
  508. u16 dst_port;
  509. } __packed;
  510. #define FILTER_FIELD_VMQ_VLAN FILTER_FIELD_VALID(1)
  511. #define FILTER_FIELD_VMQ_MAC FILTER_FIELD_VALID(2)
  512. struct filter_mac_vlan {
  513. u32 flags;
  514. u16 vlan;
  515. u8 mac_addr[6];
  516. } __packed;
  517. /* Specifies the filter_action type. */
  518. enum {
  519. FILTER_ACTION_RQ_STEERING = 0,
  520. FILTER_ACTION_MAX
  521. };
  522. struct filter_action {
  523. u32 type;
  524. union {
  525. u32 rq_idx;
  526. } u;
  527. } __packed;
  528. /* Specifies the filter type. */
  529. enum filter_type {
  530. FILTER_USNIC_ID = 0,
  531. FILTER_IPV4_5TUPLE = 1,
  532. FILTER_MAC_VLAN = 2,
  533. FILTER_MAX
  534. };
  535. struct filter {
  536. u32 type;
  537. union {
  538. struct filter_usnic_id usnic;
  539. struct filter_ipv4_5tuple ipv4;
  540. struct filter_mac_vlan mac_vlan;
  541. } u;
  542. } __packed;
  543. enum {
  544. CLSF_TLV_FILTER = 0,
  545. CLSF_TLV_ACTION = 1,
  546. };
  547. /* Maximum size of buffer to CMD_ADD_FILTER */
  548. #define FILTER_MAX_BUF_SIZE 100
  549. struct filter_tlv {
  550. u_int32_t type;
  551. u_int32_t length;
  552. u_int32_t val[0];
  553. };
  554. enum {
  555. CLSF_ADD = 0,
  556. CLSF_DEL = 1,
  557. };
  558. /*
  559. * Writing cmd register causes STAT_BUSY to get set in status register.
  560. * When cmd completes, STAT_BUSY will be cleared.
  561. *
  562. * If cmd completed successfully STAT_ERROR will be clear
  563. * and args registers contain cmd-specific results.
  564. *
  565. * If cmd error, STAT_ERROR will be set and args[0] contains error code.
  566. *
  567. * status register is read-only. While STAT_BUSY is set,
  568. * all other register contents are read-only.
  569. */
  570. /* Make sizeof(vnic_devcmd) a power-of-2 for I/O BAR. */
  571. #define VNIC_DEVCMD_NARGS 15
  572. struct vnic_devcmd {
  573. u32 status; /* RO */
  574. u32 cmd; /* RW */
  575. u64 args[VNIC_DEVCMD_NARGS]; /* RW cmd args (little-endian) */
  576. };
  577. #define DEVCMD2_FNORESULT 0x1 /* Don't copy result to host */
  578. #define VNIC_DEVCMD2_NARGS VNIC_DEVCMD_NARGS
  579. struct vnic_devcmd2 {
  580. u16 pad;
  581. u16 flags;
  582. u32 cmd;
  583. u64 args[VNIC_DEVCMD2_NARGS];
  584. };
  585. #define VNIC_DEVCMD2_NRESULTS VNIC_DEVCMD_NARGS
  586. struct devcmd2_result {
  587. u64 results[VNIC_DEVCMD2_NRESULTS];
  588. u32 pad;
  589. u16 completed_index;
  590. u8 error;
  591. u8 color;
  592. };
  593. #define DEVCMD2_RING_SIZE 32
  594. #define DEVCMD2_DESC_SIZE 128
  595. enum overlay_feature_t {
  596. OVERLAY_FEATURE_NVGRE = 1,
  597. OVERLAY_FEATURE_VXLAN,
  598. OVERLAY_FEATURE_MAX,
  599. };
  600. enum overlay_ofld_cmd {
  601. OVERLAY_OFFLOAD_ENABLE,
  602. OVERLAY_OFFLOAD_DISABLE,
  603. OVERLAY_OFFLOAD_ENABLE_P2,
  604. OVERLAY_OFFLOAD_MAX,
  605. };
  606. #define OVERLAY_CFG_VXLAN_PORT_UPDATE 0
  607. #define ENIC_VXLAN_INNER_IPV6 BIT(0)
  608. #define ENIC_VXLAN_OUTER_IPV6 BIT(1)
  609. #define ENIC_VXLAN_MULTI_WQ BIT(2)
  610. /* Use this enum to get the supported versions for each of these features
  611. * If you need to use the devcmd_get_supported_feature_version(), add
  612. * the new feature into this enum and install function handler in devcmd.c
  613. */
  614. enum vic_feature_t {
  615. VIC_FEATURE_VXLAN,
  616. VIC_FEATURE_RDMA,
  617. VIC_FEATURE_VXLAN_PATCH,
  618. VIC_FEATURE_MAX,
  619. };
  620. #endif /* _VNIC_DEVCMD_H_ */