port.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
  4. * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
  5. */
  6. #include "devl_internal.h"
  7. #define DEVLINK_PORT_FN_CAPS_VALID_MASK \
  8. (_BITUL(__DEVLINK_PORT_FN_ATTR_CAPS_MAX) - 1)
  9. static const struct nla_policy devlink_function_nl_policy[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1] = {
  10. [DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] = { .type = NLA_BINARY },
  11. [DEVLINK_PORT_FN_ATTR_STATE] =
  12. NLA_POLICY_RANGE(NLA_U8, DEVLINK_PORT_FN_STATE_INACTIVE,
  13. DEVLINK_PORT_FN_STATE_ACTIVE),
  14. [DEVLINK_PORT_FN_ATTR_CAPS] =
  15. NLA_POLICY_BITFIELD32(DEVLINK_PORT_FN_CAPS_VALID_MASK),
  16. [DEVLINK_PORT_FN_ATTR_MAX_IO_EQS] = { .type = NLA_U32 },
  17. };
  18. #define ASSERT_DEVLINK_PORT_REGISTERED(devlink_port) \
  19. WARN_ON_ONCE(!(devlink_port)->registered)
  20. #define ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port) \
  21. WARN_ON_ONCE((devlink_port)->registered)
  22. struct devlink_port *devlink_port_get_by_index(struct devlink *devlink,
  23. unsigned int port_index)
  24. {
  25. return xa_load(&devlink->ports, port_index);
  26. }
  27. struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink,
  28. struct nlattr **attrs)
  29. {
  30. if (attrs[DEVLINK_ATTR_PORT_INDEX]) {
  31. u32 port_index = nla_get_u32(attrs[DEVLINK_ATTR_PORT_INDEX]);
  32. struct devlink_port *devlink_port;
  33. devlink_port = devlink_port_get_by_index(devlink, port_index);
  34. if (!devlink_port)
  35. return ERR_PTR(-ENODEV);
  36. return devlink_port;
  37. }
  38. return ERR_PTR(-EINVAL);
  39. }
  40. struct devlink_port *devlink_port_get_from_info(struct devlink *devlink,
  41. struct genl_info *info)
  42. {
  43. return devlink_port_get_from_attrs(devlink, info->attrs);
  44. }
  45. static void devlink_port_fn_cap_fill(struct nla_bitfield32 *caps,
  46. u32 cap, bool is_enable)
  47. {
  48. caps->selector |= cap;
  49. if (is_enable)
  50. caps->value |= cap;
  51. }
  52. static int devlink_port_fn_roce_fill(struct devlink_port *devlink_port,
  53. struct nla_bitfield32 *caps,
  54. struct netlink_ext_ack *extack)
  55. {
  56. bool is_enable;
  57. int err;
  58. if (!devlink_port->ops->port_fn_roce_get)
  59. return 0;
  60. err = devlink_port->ops->port_fn_roce_get(devlink_port, &is_enable,
  61. extack);
  62. if (err) {
  63. if (err == -EOPNOTSUPP)
  64. return 0;
  65. return err;
  66. }
  67. devlink_port_fn_cap_fill(caps, DEVLINK_PORT_FN_CAP_ROCE, is_enable);
  68. return 0;
  69. }
  70. static int devlink_port_fn_migratable_fill(struct devlink_port *devlink_port,
  71. struct nla_bitfield32 *caps,
  72. struct netlink_ext_ack *extack)
  73. {
  74. bool is_enable;
  75. int err;
  76. if (!devlink_port->ops->port_fn_migratable_get ||
  77. devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF)
  78. return 0;
  79. err = devlink_port->ops->port_fn_migratable_get(devlink_port,
  80. &is_enable, extack);
  81. if (err) {
  82. if (err == -EOPNOTSUPP)
  83. return 0;
  84. return err;
  85. }
  86. devlink_port_fn_cap_fill(caps, DEVLINK_PORT_FN_CAP_MIGRATABLE, is_enable);
  87. return 0;
  88. }
  89. static int devlink_port_fn_ipsec_crypto_fill(struct devlink_port *devlink_port,
  90. struct nla_bitfield32 *caps,
  91. struct netlink_ext_ack *extack)
  92. {
  93. bool is_enable;
  94. int err;
  95. if (!devlink_port->ops->port_fn_ipsec_crypto_get ||
  96. devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF)
  97. return 0;
  98. err = devlink_port->ops->port_fn_ipsec_crypto_get(devlink_port, &is_enable, extack);
  99. if (err) {
  100. if (err == -EOPNOTSUPP)
  101. return 0;
  102. return err;
  103. }
  104. devlink_port_fn_cap_fill(caps, DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO, is_enable);
  105. return 0;
  106. }
  107. static int devlink_port_fn_ipsec_packet_fill(struct devlink_port *devlink_port,
  108. struct nla_bitfield32 *caps,
  109. struct netlink_ext_ack *extack)
  110. {
  111. bool is_enable;
  112. int err;
  113. if (!devlink_port->ops->port_fn_ipsec_packet_get ||
  114. devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF)
  115. return 0;
  116. err = devlink_port->ops->port_fn_ipsec_packet_get(devlink_port, &is_enable, extack);
  117. if (err) {
  118. if (err == -EOPNOTSUPP)
  119. return 0;
  120. return err;
  121. }
  122. devlink_port_fn_cap_fill(caps, DEVLINK_PORT_FN_CAP_IPSEC_PACKET, is_enable);
  123. return 0;
  124. }
  125. static int devlink_port_fn_caps_fill(struct devlink_port *devlink_port,
  126. struct sk_buff *msg,
  127. struct netlink_ext_ack *extack,
  128. bool *msg_updated)
  129. {
  130. struct nla_bitfield32 caps = {};
  131. int err;
  132. err = devlink_port_fn_roce_fill(devlink_port, &caps, extack);
  133. if (err)
  134. return err;
  135. err = devlink_port_fn_migratable_fill(devlink_port, &caps, extack);
  136. if (err)
  137. return err;
  138. err = devlink_port_fn_ipsec_crypto_fill(devlink_port, &caps, extack);
  139. if (err)
  140. return err;
  141. err = devlink_port_fn_ipsec_packet_fill(devlink_port, &caps, extack);
  142. if (err)
  143. return err;
  144. if (!caps.selector)
  145. return 0;
  146. err = nla_put_bitfield32(msg, DEVLINK_PORT_FN_ATTR_CAPS, caps.value,
  147. caps.selector);
  148. if (err)
  149. return err;
  150. *msg_updated = true;
  151. return 0;
  152. }
  153. static int devlink_port_fn_max_io_eqs_fill(struct devlink_port *port,
  154. struct sk_buff *msg,
  155. struct netlink_ext_ack *extack,
  156. bool *msg_updated)
  157. {
  158. u32 max_io_eqs;
  159. int err;
  160. if (!port->ops->port_fn_max_io_eqs_get)
  161. return 0;
  162. err = port->ops->port_fn_max_io_eqs_get(port, &max_io_eqs, extack);
  163. if (err) {
  164. if (err == -EOPNOTSUPP)
  165. return 0;
  166. return err;
  167. }
  168. err = nla_put_u32(msg, DEVLINK_PORT_FN_ATTR_MAX_IO_EQS, max_io_eqs);
  169. if (err)
  170. return err;
  171. *msg_updated = true;
  172. return 0;
  173. }
  174. int devlink_nl_port_handle_fill(struct sk_buff *msg, struct devlink_port *devlink_port)
  175. {
  176. if (devlink_nl_put_handle(msg, devlink_port->devlink))
  177. return -EMSGSIZE;
  178. if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index))
  179. return -EMSGSIZE;
  180. return 0;
  181. }
  182. size_t devlink_nl_port_handle_size(struct devlink_port *devlink_port)
  183. {
  184. struct devlink *devlink = devlink_port->devlink;
  185. return nla_total_size(strlen(devlink->dev->bus->name) + 1) /* DEVLINK_ATTR_BUS_NAME */
  186. + nla_total_size(strlen(dev_name(devlink->dev)) + 1) /* DEVLINK_ATTR_DEV_NAME */
  187. + nla_total_size(4); /* DEVLINK_ATTR_PORT_INDEX */
  188. }
  189. static int devlink_nl_port_attrs_put(struct sk_buff *msg,
  190. struct devlink_port *devlink_port)
  191. {
  192. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  193. if (!devlink_port->attrs_set)
  194. return 0;
  195. if (attrs->lanes) {
  196. if (nla_put_u32(msg, DEVLINK_ATTR_PORT_LANES, attrs->lanes))
  197. return -EMSGSIZE;
  198. }
  199. if (nla_put_u8(msg, DEVLINK_ATTR_PORT_SPLITTABLE, attrs->splittable))
  200. return -EMSGSIZE;
  201. if (nla_put_u16(msg, DEVLINK_ATTR_PORT_FLAVOUR, attrs->flavour))
  202. return -EMSGSIZE;
  203. switch (devlink_port->attrs.flavour) {
  204. case DEVLINK_PORT_FLAVOUR_PCI_PF:
  205. if (nla_put_u32(msg, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,
  206. attrs->pci_pf.controller) ||
  207. nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, attrs->pci_pf.pf))
  208. return -EMSGSIZE;
  209. if (nla_put_u8(msg, DEVLINK_ATTR_PORT_EXTERNAL, attrs->pci_pf.external))
  210. return -EMSGSIZE;
  211. break;
  212. case DEVLINK_PORT_FLAVOUR_PCI_VF:
  213. if (nla_put_u32(msg, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,
  214. attrs->pci_vf.controller) ||
  215. nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, attrs->pci_vf.pf) ||
  216. nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_VF_NUMBER, attrs->pci_vf.vf))
  217. return -EMSGSIZE;
  218. if (nla_put_u8(msg, DEVLINK_ATTR_PORT_EXTERNAL, attrs->pci_vf.external))
  219. return -EMSGSIZE;
  220. break;
  221. case DEVLINK_PORT_FLAVOUR_PCI_SF:
  222. if (nla_put_u32(msg, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,
  223. attrs->pci_sf.controller) ||
  224. nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER,
  225. attrs->pci_sf.pf) ||
  226. nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_SF_NUMBER,
  227. attrs->pci_sf.sf))
  228. return -EMSGSIZE;
  229. break;
  230. case DEVLINK_PORT_FLAVOUR_PHYSICAL:
  231. case DEVLINK_PORT_FLAVOUR_CPU:
  232. case DEVLINK_PORT_FLAVOUR_DSA:
  233. if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER,
  234. attrs->phys.port_number))
  235. return -EMSGSIZE;
  236. if (!attrs->split)
  237. return 0;
  238. if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP,
  239. attrs->phys.port_number))
  240. return -EMSGSIZE;
  241. if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER,
  242. attrs->phys.split_subport_number))
  243. return -EMSGSIZE;
  244. break;
  245. default:
  246. break;
  247. }
  248. return 0;
  249. }
  250. static int devlink_port_fn_hw_addr_fill(struct devlink_port *port,
  251. struct sk_buff *msg,
  252. struct netlink_ext_ack *extack,
  253. bool *msg_updated)
  254. {
  255. u8 hw_addr[MAX_ADDR_LEN];
  256. int hw_addr_len;
  257. int err;
  258. if (!port->ops->port_fn_hw_addr_get)
  259. return 0;
  260. err = port->ops->port_fn_hw_addr_get(port, hw_addr, &hw_addr_len,
  261. extack);
  262. if (err) {
  263. if (err == -EOPNOTSUPP)
  264. return 0;
  265. return err;
  266. }
  267. err = nla_put(msg, DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR, hw_addr_len, hw_addr);
  268. if (err)
  269. return err;
  270. *msg_updated = true;
  271. return 0;
  272. }
  273. static bool
  274. devlink_port_fn_state_valid(enum devlink_port_fn_state state)
  275. {
  276. return state == DEVLINK_PORT_FN_STATE_INACTIVE ||
  277. state == DEVLINK_PORT_FN_STATE_ACTIVE;
  278. }
  279. static bool
  280. devlink_port_fn_opstate_valid(enum devlink_port_fn_opstate opstate)
  281. {
  282. return opstate == DEVLINK_PORT_FN_OPSTATE_DETACHED ||
  283. opstate == DEVLINK_PORT_FN_OPSTATE_ATTACHED;
  284. }
  285. static int devlink_port_fn_state_fill(struct devlink_port *port,
  286. struct sk_buff *msg,
  287. struct netlink_ext_ack *extack,
  288. bool *msg_updated)
  289. {
  290. enum devlink_port_fn_opstate opstate;
  291. enum devlink_port_fn_state state;
  292. int err;
  293. if (!port->ops->port_fn_state_get)
  294. return 0;
  295. err = port->ops->port_fn_state_get(port, &state, &opstate, extack);
  296. if (err) {
  297. if (err == -EOPNOTSUPP)
  298. return 0;
  299. return err;
  300. }
  301. if (!devlink_port_fn_state_valid(state)) {
  302. WARN_ON_ONCE(1);
  303. NL_SET_ERR_MSG(extack, "Invalid state read from driver");
  304. return -EINVAL;
  305. }
  306. if (!devlink_port_fn_opstate_valid(opstate)) {
  307. WARN_ON_ONCE(1);
  308. NL_SET_ERR_MSG(extack, "Invalid operational state read from driver");
  309. return -EINVAL;
  310. }
  311. if (nla_put_u8(msg, DEVLINK_PORT_FN_ATTR_STATE, state) ||
  312. nla_put_u8(msg, DEVLINK_PORT_FN_ATTR_OPSTATE, opstate))
  313. return -EMSGSIZE;
  314. *msg_updated = true;
  315. return 0;
  316. }
  317. static int
  318. devlink_port_fn_mig_set(struct devlink_port *devlink_port, bool enable,
  319. struct netlink_ext_ack *extack)
  320. {
  321. return devlink_port->ops->port_fn_migratable_set(devlink_port, enable,
  322. extack);
  323. }
  324. static int
  325. devlink_port_fn_roce_set(struct devlink_port *devlink_port, bool enable,
  326. struct netlink_ext_ack *extack)
  327. {
  328. return devlink_port->ops->port_fn_roce_set(devlink_port, enable,
  329. extack);
  330. }
  331. static int
  332. devlink_port_fn_ipsec_crypto_set(struct devlink_port *devlink_port, bool enable,
  333. struct netlink_ext_ack *extack)
  334. {
  335. return devlink_port->ops->port_fn_ipsec_crypto_set(devlink_port, enable, extack);
  336. }
  337. static int
  338. devlink_port_fn_ipsec_packet_set(struct devlink_port *devlink_port, bool enable,
  339. struct netlink_ext_ack *extack)
  340. {
  341. return devlink_port->ops->port_fn_ipsec_packet_set(devlink_port, enable, extack);
  342. }
  343. static int devlink_port_fn_caps_set(struct devlink_port *devlink_port,
  344. const struct nlattr *attr,
  345. struct netlink_ext_ack *extack)
  346. {
  347. struct nla_bitfield32 caps;
  348. u32 caps_value;
  349. int err;
  350. caps = nla_get_bitfield32(attr);
  351. caps_value = caps.value & caps.selector;
  352. if (caps.selector & DEVLINK_PORT_FN_CAP_ROCE) {
  353. err = devlink_port_fn_roce_set(devlink_port,
  354. caps_value & DEVLINK_PORT_FN_CAP_ROCE,
  355. extack);
  356. if (err)
  357. return err;
  358. }
  359. if (caps.selector & DEVLINK_PORT_FN_CAP_MIGRATABLE) {
  360. err = devlink_port_fn_mig_set(devlink_port, caps_value &
  361. DEVLINK_PORT_FN_CAP_MIGRATABLE,
  362. extack);
  363. if (err)
  364. return err;
  365. }
  366. if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO) {
  367. err = devlink_port_fn_ipsec_crypto_set(devlink_port, caps_value &
  368. DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO,
  369. extack);
  370. if (err)
  371. return err;
  372. }
  373. if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_PACKET) {
  374. err = devlink_port_fn_ipsec_packet_set(devlink_port, caps_value &
  375. DEVLINK_PORT_FN_CAP_IPSEC_PACKET,
  376. extack);
  377. if (err)
  378. return err;
  379. }
  380. return 0;
  381. }
  382. static int
  383. devlink_port_fn_max_io_eqs_set(struct devlink_port *devlink_port,
  384. const struct nlattr *attr,
  385. struct netlink_ext_ack *extack)
  386. {
  387. u32 max_io_eqs;
  388. max_io_eqs = nla_get_u32(attr);
  389. return devlink_port->ops->port_fn_max_io_eqs_set(devlink_port,
  390. max_io_eqs, extack);
  391. }
  392. static int
  393. devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *port,
  394. struct netlink_ext_ack *extack)
  395. {
  396. struct nlattr *function_attr;
  397. bool msg_updated = false;
  398. int err;
  399. function_attr = nla_nest_start_noflag(msg, DEVLINK_ATTR_PORT_FUNCTION);
  400. if (!function_attr)
  401. return -EMSGSIZE;
  402. err = devlink_port_fn_hw_addr_fill(port, msg, extack, &msg_updated);
  403. if (err)
  404. goto out;
  405. err = devlink_port_fn_caps_fill(port, msg, extack, &msg_updated);
  406. if (err)
  407. goto out;
  408. err = devlink_port_fn_state_fill(port, msg, extack, &msg_updated);
  409. if (err)
  410. goto out;
  411. err = devlink_port_fn_max_io_eqs_fill(port, msg, extack, &msg_updated);
  412. if (err)
  413. goto out;
  414. err = devlink_rel_devlink_handle_put(msg, port->devlink,
  415. port->rel_index,
  416. DEVLINK_PORT_FN_ATTR_DEVLINK,
  417. &msg_updated);
  418. out:
  419. if (err || !msg_updated)
  420. nla_nest_cancel(msg, function_attr);
  421. else
  422. nla_nest_end(msg, function_attr);
  423. return err;
  424. }
  425. static int devlink_nl_port_fill(struct sk_buff *msg,
  426. struct devlink_port *devlink_port,
  427. enum devlink_command cmd, u32 portid, u32 seq,
  428. int flags, struct netlink_ext_ack *extack)
  429. {
  430. struct devlink *devlink = devlink_port->devlink;
  431. void *hdr;
  432. hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
  433. if (!hdr)
  434. return -EMSGSIZE;
  435. if (devlink_nl_put_handle(msg, devlink))
  436. goto nla_put_failure;
  437. if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index))
  438. goto nla_put_failure;
  439. spin_lock_bh(&devlink_port->type_lock);
  440. if (nla_put_u16(msg, DEVLINK_ATTR_PORT_TYPE, devlink_port->type))
  441. goto nla_put_failure_type_locked;
  442. if (devlink_port->desired_type != DEVLINK_PORT_TYPE_NOTSET &&
  443. nla_put_u16(msg, DEVLINK_ATTR_PORT_DESIRED_TYPE,
  444. devlink_port->desired_type))
  445. goto nla_put_failure_type_locked;
  446. if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) {
  447. if (devlink_port->type_eth.netdev &&
  448. (nla_put_u32(msg, DEVLINK_ATTR_PORT_NETDEV_IFINDEX,
  449. devlink_port->type_eth.ifindex) ||
  450. nla_put_string(msg, DEVLINK_ATTR_PORT_NETDEV_NAME,
  451. devlink_port->type_eth.ifname)))
  452. goto nla_put_failure_type_locked;
  453. }
  454. if (devlink_port->type == DEVLINK_PORT_TYPE_IB) {
  455. struct ib_device *ibdev = devlink_port->type_ib.ibdev;
  456. if (ibdev &&
  457. nla_put_string(msg, DEVLINK_ATTR_PORT_IBDEV_NAME,
  458. ibdev->name))
  459. goto nla_put_failure_type_locked;
  460. }
  461. spin_unlock_bh(&devlink_port->type_lock);
  462. if (devlink_nl_port_attrs_put(msg, devlink_port))
  463. goto nla_put_failure;
  464. if (devlink_nl_port_function_attrs_put(msg, devlink_port, extack))
  465. goto nla_put_failure;
  466. if (devlink_port->linecard &&
  467. nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX,
  468. devlink_linecard_index(devlink_port->linecard)))
  469. goto nla_put_failure;
  470. genlmsg_end(msg, hdr);
  471. return 0;
  472. nla_put_failure_type_locked:
  473. spin_unlock_bh(&devlink_port->type_lock);
  474. nla_put_failure:
  475. genlmsg_cancel(msg, hdr);
  476. return -EMSGSIZE;
  477. }
  478. static void devlink_port_notify(struct devlink_port *devlink_port,
  479. enum devlink_command cmd)
  480. {
  481. struct devlink *devlink = devlink_port->devlink;
  482. struct devlink_obj_desc desc;
  483. struct sk_buff *msg;
  484. int err;
  485. WARN_ON(cmd != DEVLINK_CMD_PORT_NEW && cmd != DEVLINK_CMD_PORT_DEL);
  486. if (!__devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
  487. return;
  488. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  489. if (!msg)
  490. return;
  491. err = devlink_nl_port_fill(msg, devlink_port, cmd, 0, 0, 0, NULL);
  492. if (err) {
  493. nlmsg_free(msg);
  494. return;
  495. }
  496. devlink_nl_obj_desc_init(&desc, devlink);
  497. devlink_nl_obj_desc_port_set(&desc, devlink_port);
  498. devlink_nl_notify_send_desc(devlink, msg, &desc);
  499. }
  500. static void devlink_ports_notify(struct devlink *devlink,
  501. enum devlink_command cmd)
  502. {
  503. struct devlink_port *devlink_port;
  504. unsigned long port_index;
  505. xa_for_each(&devlink->ports, port_index, devlink_port)
  506. devlink_port_notify(devlink_port, cmd);
  507. }
  508. void devlink_ports_notify_register(struct devlink *devlink)
  509. {
  510. devlink_ports_notify(devlink, DEVLINK_CMD_PORT_NEW);
  511. }
  512. void devlink_ports_notify_unregister(struct devlink *devlink)
  513. {
  514. devlink_ports_notify(devlink, DEVLINK_CMD_PORT_DEL);
  515. }
  516. int devlink_nl_port_get_doit(struct sk_buff *skb, struct genl_info *info)
  517. {
  518. struct devlink_port *devlink_port = info->user_ptr[1];
  519. struct sk_buff *msg;
  520. int err;
  521. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  522. if (!msg)
  523. return -ENOMEM;
  524. err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_PORT_NEW,
  525. info->snd_portid, info->snd_seq, 0,
  526. info->extack);
  527. if (err) {
  528. nlmsg_free(msg);
  529. return err;
  530. }
  531. return genlmsg_reply(msg, info);
  532. }
  533. static int
  534. devlink_nl_port_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
  535. struct netlink_callback *cb, int flags)
  536. {
  537. struct devlink_nl_dump_state *state = devlink_dump_state(cb);
  538. struct devlink_port *devlink_port;
  539. unsigned long port_index;
  540. int err = 0;
  541. xa_for_each_start(&devlink->ports, port_index, devlink_port, state->idx) {
  542. err = devlink_nl_port_fill(msg, devlink_port,
  543. DEVLINK_CMD_PORT_NEW,
  544. NETLINK_CB(cb->skb).portid,
  545. cb->nlh->nlmsg_seq, flags,
  546. cb->extack);
  547. if (err) {
  548. state->idx = port_index;
  549. break;
  550. }
  551. }
  552. return err;
  553. }
  554. int devlink_nl_port_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
  555. {
  556. return devlink_nl_dumpit(skb, cb, devlink_nl_port_get_dump_one);
  557. }
  558. static int devlink_port_type_set(struct devlink_port *devlink_port,
  559. enum devlink_port_type port_type)
  560. {
  561. int err;
  562. if (!devlink_port->ops->port_type_set)
  563. return -EOPNOTSUPP;
  564. if (port_type == devlink_port->type)
  565. return 0;
  566. err = devlink_port->ops->port_type_set(devlink_port, port_type);
  567. if (err)
  568. return err;
  569. devlink_port->desired_type = port_type;
  570. devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
  571. return 0;
  572. }
  573. static int devlink_port_function_hw_addr_set(struct devlink_port *port,
  574. const struct nlattr *attr,
  575. struct netlink_ext_ack *extack)
  576. {
  577. const u8 *hw_addr;
  578. int hw_addr_len;
  579. hw_addr = nla_data(attr);
  580. hw_addr_len = nla_len(attr);
  581. if (hw_addr_len > MAX_ADDR_LEN) {
  582. NL_SET_ERR_MSG(extack, "Port function hardware address too long");
  583. return -EINVAL;
  584. }
  585. if (port->type == DEVLINK_PORT_TYPE_ETH) {
  586. if (hw_addr_len != ETH_ALEN) {
  587. NL_SET_ERR_MSG(extack, "Address must be 6 bytes for Ethernet device");
  588. return -EINVAL;
  589. }
  590. if (!is_unicast_ether_addr(hw_addr)) {
  591. NL_SET_ERR_MSG(extack, "Non-unicast hardware address unsupported");
  592. return -EINVAL;
  593. }
  594. }
  595. return port->ops->port_fn_hw_addr_set(port, hw_addr, hw_addr_len,
  596. extack);
  597. }
  598. static int devlink_port_fn_state_set(struct devlink_port *port,
  599. const struct nlattr *attr,
  600. struct netlink_ext_ack *extack)
  601. {
  602. enum devlink_port_fn_state state;
  603. state = nla_get_u8(attr);
  604. return port->ops->port_fn_state_set(port, state, extack);
  605. }
  606. static int devlink_port_function_validate(struct devlink_port *devlink_port,
  607. struct nlattr **tb,
  608. struct netlink_ext_ack *extack)
  609. {
  610. const struct devlink_port_ops *ops = devlink_port->ops;
  611. struct nlattr *attr;
  612. if (tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] &&
  613. !ops->port_fn_hw_addr_set) {
  614. NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR],
  615. "Port doesn't support function attributes");
  616. return -EOPNOTSUPP;
  617. }
  618. if (tb[DEVLINK_PORT_FN_ATTR_STATE] && !ops->port_fn_state_set) {
  619. NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FN_ATTR_STATE],
  620. "Function does not support state setting");
  621. return -EOPNOTSUPP;
  622. }
  623. attr = tb[DEVLINK_PORT_FN_ATTR_CAPS];
  624. if (attr) {
  625. struct nla_bitfield32 caps;
  626. caps = nla_get_bitfield32(attr);
  627. if (caps.selector & DEVLINK_PORT_FN_CAP_ROCE &&
  628. !ops->port_fn_roce_set) {
  629. NL_SET_ERR_MSG_ATTR(extack, attr,
  630. "Port doesn't support RoCE function attribute");
  631. return -EOPNOTSUPP;
  632. }
  633. if (caps.selector & DEVLINK_PORT_FN_CAP_MIGRATABLE) {
  634. if (!ops->port_fn_migratable_set) {
  635. NL_SET_ERR_MSG_ATTR(extack, attr,
  636. "Port doesn't support migratable function attribute");
  637. return -EOPNOTSUPP;
  638. }
  639. if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
  640. NL_SET_ERR_MSG_ATTR(extack, attr,
  641. "migratable function attribute supported for VFs only");
  642. return -EOPNOTSUPP;
  643. }
  644. }
  645. if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO) {
  646. if (!ops->port_fn_ipsec_crypto_set) {
  647. NL_SET_ERR_MSG_ATTR(extack, attr,
  648. "Port doesn't support ipsec_crypto function attribute");
  649. return -EOPNOTSUPP;
  650. }
  651. if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
  652. NL_SET_ERR_MSG_ATTR(extack, attr,
  653. "ipsec_crypto function attribute supported for VFs only");
  654. return -EOPNOTSUPP;
  655. }
  656. }
  657. if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_PACKET) {
  658. if (!ops->port_fn_ipsec_packet_set) {
  659. NL_SET_ERR_MSG_ATTR(extack, attr,
  660. "Port doesn't support ipsec_packet function attribute");
  661. return -EOPNOTSUPP;
  662. }
  663. if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
  664. NL_SET_ERR_MSG_ATTR(extack, attr,
  665. "ipsec_packet function attribute supported for VFs only");
  666. return -EOPNOTSUPP;
  667. }
  668. }
  669. }
  670. if (tb[DEVLINK_PORT_FN_ATTR_MAX_IO_EQS] &&
  671. !ops->port_fn_max_io_eqs_set) {
  672. NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FN_ATTR_MAX_IO_EQS],
  673. "Function does not support max_io_eqs setting");
  674. return -EOPNOTSUPP;
  675. }
  676. return 0;
  677. }
  678. static int devlink_port_function_set(struct devlink_port *port,
  679. const struct nlattr *attr,
  680. struct netlink_ext_ack *extack)
  681. {
  682. struct nlattr *tb[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1];
  683. int err;
  684. err = nla_parse_nested(tb, DEVLINK_PORT_FUNCTION_ATTR_MAX, attr,
  685. devlink_function_nl_policy, extack);
  686. if (err < 0) {
  687. NL_SET_ERR_MSG(extack, "Fail to parse port function attributes");
  688. return err;
  689. }
  690. err = devlink_port_function_validate(port, tb, extack);
  691. if (err)
  692. return err;
  693. attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR];
  694. if (attr) {
  695. err = devlink_port_function_hw_addr_set(port, attr, extack);
  696. if (err)
  697. return err;
  698. }
  699. attr = tb[DEVLINK_PORT_FN_ATTR_CAPS];
  700. if (attr) {
  701. err = devlink_port_fn_caps_set(port, attr, extack);
  702. if (err)
  703. return err;
  704. }
  705. attr = tb[DEVLINK_PORT_FN_ATTR_MAX_IO_EQS];
  706. if (attr) {
  707. err = devlink_port_fn_max_io_eqs_set(port, attr, extack);
  708. if (err)
  709. return err;
  710. }
  711. /* Keep this as the last function attribute set, so that when
  712. * multiple port function attributes are set along with state,
  713. * Those can be applied first before activating the state.
  714. */
  715. attr = tb[DEVLINK_PORT_FN_ATTR_STATE];
  716. if (attr)
  717. err = devlink_port_fn_state_set(port, attr, extack);
  718. if (!err)
  719. devlink_port_notify(port, DEVLINK_CMD_PORT_NEW);
  720. return err;
  721. }
  722. int devlink_nl_port_set_doit(struct sk_buff *skb, struct genl_info *info)
  723. {
  724. struct devlink_port *devlink_port = info->user_ptr[1];
  725. int err;
  726. if (info->attrs[DEVLINK_ATTR_PORT_TYPE]) {
  727. enum devlink_port_type port_type;
  728. port_type = nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_TYPE]);
  729. err = devlink_port_type_set(devlink_port, port_type);
  730. if (err)
  731. return err;
  732. }
  733. if (info->attrs[DEVLINK_ATTR_PORT_FUNCTION]) {
  734. struct nlattr *attr = info->attrs[DEVLINK_ATTR_PORT_FUNCTION];
  735. struct netlink_ext_ack *extack = info->extack;
  736. err = devlink_port_function_set(devlink_port, attr, extack);
  737. if (err)
  738. return err;
  739. }
  740. return 0;
  741. }
  742. int devlink_nl_port_split_doit(struct sk_buff *skb, struct genl_info *info)
  743. {
  744. struct devlink_port *devlink_port = info->user_ptr[1];
  745. struct devlink *devlink = info->user_ptr[0];
  746. u32 count;
  747. if (GENL_REQ_ATTR_CHECK(info, DEVLINK_ATTR_PORT_SPLIT_COUNT))
  748. return -EINVAL;
  749. if (!devlink_port->ops->port_split)
  750. return -EOPNOTSUPP;
  751. count = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_SPLIT_COUNT]);
  752. if (!devlink_port->attrs.splittable) {
  753. /* Split ports cannot be split. */
  754. if (devlink_port->attrs.split)
  755. NL_SET_ERR_MSG(info->extack, "Port cannot be split further");
  756. else
  757. NL_SET_ERR_MSG(info->extack, "Port cannot be split");
  758. return -EINVAL;
  759. }
  760. if (count < 2 || !is_power_of_2(count) || count > devlink_port->attrs.lanes) {
  761. NL_SET_ERR_MSG(info->extack, "Invalid split count");
  762. return -EINVAL;
  763. }
  764. return devlink_port->ops->port_split(devlink, devlink_port, count,
  765. info->extack);
  766. }
  767. int devlink_nl_port_unsplit_doit(struct sk_buff *skb, struct genl_info *info)
  768. {
  769. struct devlink_port *devlink_port = info->user_ptr[1];
  770. struct devlink *devlink = info->user_ptr[0];
  771. if (!devlink_port->ops->port_unsplit)
  772. return -EOPNOTSUPP;
  773. return devlink_port->ops->port_unsplit(devlink, devlink_port, info->extack);
  774. }
  775. int devlink_nl_port_new_doit(struct sk_buff *skb, struct genl_info *info)
  776. {
  777. struct netlink_ext_ack *extack = info->extack;
  778. struct devlink_port_new_attrs new_attrs = {};
  779. struct devlink *devlink = info->user_ptr[0];
  780. struct devlink_port *devlink_port;
  781. struct sk_buff *msg;
  782. int err;
  783. if (!devlink->ops->port_new)
  784. return -EOPNOTSUPP;
  785. if (!info->attrs[DEVLINK_ATTR_PORT_FLAVOUR] ||
  786. !info->attrs[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]) {
  787. NL_SET_ERR_MSG(extack, "Port flavour or PCI PF are not specified");
  788. return -EINVAL;
  789. }
  790. new_attrs.flavour = nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_FLAVOUR]);
  791. new_attrs.pfnum =
  792. nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]);
  793. if (info->attrs[DEVLINK_ATTR_PORT_INDEX]) {
  794. /* Port index of the new port being created by driver. */
  795. new_attrs.port_index =
  796. nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_INDEX]);
  797. new_attrs.port_index_valid = true;
  798. }
  799. if (info->attrs[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER]) {
  800. new_attrs.controller =
  801. nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER]);
  802. new_attrs.controller_valid = true;
  803. }
  804. if (new_attrs.flavour == DEVLINK_PORT_FLAVOUR_PCI_SF &&
  805. info->attrs[DEVLINK_ATTR_PORT_PCI_SF_NUMBER]) {
  806. new_attrs.sfnum = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_PCI_SF_NUMBER]);
  807. new_attrs.sfnum_valid = true;
  808. }
  809. err = devlink->ops->port_new(devlink, &new_attrs,
  810. extack, &devlink_port);
  811. if (err)
  812. return err;
  813. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  814. if (!msg) {
  815. err = -ENOMEM;
  816. goto err_out_port_del;
  817. }
  818. err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_PORT_NEW,
  819. info->snd_portid, info->snd_seq, 0, NULL);
  820. if (WARN_ON_ONCE(err))
  821. goto err_out_msg_free;
  822. err = genlmsg_reply(msg, info);
  823. if (err)
  824. goto err_out_port_del;
  825. return 0;
  826. err_out_msg_free:
  827. nlmsg_free(msg);
  828. err_out_port_del:
  829. devlink_port->ops->port_del(devlink, devlink_port, NULL);
  830. return err;
  831. }
  832. int devlink_nl_port_del_doit(struct sk_buff *skb, struct genl_info *info)
  833. {
  834. struct devlink_port *devlink_port = info->user_ptr[1];
  835. struct netlink_ext_ack *extack = info->extack;
  836. struct devlink *devlink = info->user_ptr[0];
  837. if (!devlink_port->ops->port_del)
  838. return -EOPNOTSUPP;
  839. return devlink_port->ops->port_del(devlink, devlink_port, extack);
  840. }
  841. static void devlink_port_type_warn(struct work_struct *work)
  842. {
  843. struct devlink_port *port = container_of(to_delayed_work(work),
  844. struct devlink_port,
  845. type_warn_dw);
  846. dev_warn(port->devlink->dev, "Type was not set for devlink port.");
  847. }
  848. static bool devlink_port_type_should_warn(struct devlink_port *devlink_port)
  849. {
  850. /* Ignore CPU and DSA flavours. */
  851. return devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_CPU &&
  852. devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_DSA &&
  853. devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_UNUSED;
  854. }
  855. #define DEVLINK_PORT_TYPE_WARN_TIMEOUT (HZ * 3600)
  856. static void devlink_port_type_warn_schedule(struct devlink_port *devlink_port)
  857. {
  858. if (!devlink_port_type_should_warn(devlink_port))
  859. return;
  860. /* Schedule a work to WARN in case driver does not set port
  861. * type within timeout.
  862. */
  863. schedule_delayed_work(&devlink_port->type_warn_dw,
  864. DEVLINK_PORT_TYPE_WARN_TIMEOUT);
  865. }
  866. static void devlink_port_type_warn_cancel(struct devlink_port *devlink_port)
  867. {
  868. if (!devlink_port_type_should_warn(devlink_port))
  869. return;
  870. cancel_delayed_work_sync(&devlink_port->type_warn_dw);
  871. }
  872. /**
  873. * devlink_port_init() - Init devlink port
  874. *
  875. * @devlink: devlink
  876. * @devlink_port: devlink port
  877. *
  878. * Initialize essential stuff that is needed for functions
  879. * that may be called before devlink port registration.
  880. * Call to this function is optional and not needed
  881. * in case the driver does not use such functions.
  882. */
  883. void devlink_port_init(struct devlink *devlink,
  884. struct devlink_port *devlink_port)
  885. {
  886. if (devlink_port->initialized)
  887. return;
  888. devlink_port->devlink = devlink;
  889. INIT_LIST_HEAD(&devlink_port->region_list);
  890. devlink_port->initialized = true;
  891. }
  892. EXPORT_SYMBOL_GPL(devlink_port_init);
  893. /**
  894. * devlink_port_fini() - Deinitialize devlink port
  895. *
  896. * @devlink_port: devlink port
  897. *
  898. * Deinitialize essential stuff that is in use for functions
  899. * that may be called after devlink port unregistration.
  900. * Call to this function is optional and not needed
  901. * in case the driver does not use such functions.
  902. */
  903. void devlink_port_fini(struct devlink_port *devlink_port)
  904. {
  905. WARN_ON(!list_empty(&devlink_port->region_list));
  906. }
  907. EXPORT_SYMBOL_GPL(devlink_port_fini);
  908. static const struct devlink_port_ops devlink_port_dummy_ops = {};
  909. /**
  910. * devl_port_register_with_ops() - Register devlink port
  911. *
  912. * @devlink: devlink
  913. * @devlink_port: devlink port
  914. * @port_index: driver-specific numerical identifier of the port
  915. * @ops: port ops
  916. *
  917. * Register devlink port with provided port index. User can use
  918. * any indexing, even hw-related one. devlink_port structure
  919. * is convenient to be embedded inside user driver private structure.
  920. * Note that the caller should take care of zeroing the devlink_port
  921. * structure.
  922. */
  923. int devl_port_register_with_ops(struct devlink *devlink,
  924. struct devlink_port *devlink_port,
  925. unsigned int port_index,
  926. const struct devlink_port_ops *ops)
  927. {
  928. int err;
  929. devl_assert_locked(devlink);
  930. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  931. devlink_port_init(devlink, devlink_port);
  932. devlink_port->registered = true;
  933. devlink_port->index = port_index;
  934. devlink_port->ops = ops ? ops : &devlink_port_dummy_ops;
  935. spin_lock_init(&devlink_port->type_lock);
  936. INIT_LIST_HEAD(&devlink_port->reporter_list);
  937. err = xa_insert(&devlink->ports, port_index, devlink_port, GFP_KERNEL);
  938. if (err) {
  939. devlink_port->registered = false;
  940. return err;
  941. }
  942. INIT_DELAYED_WORK(&devlink_port->type_warn_dw, &devlink_port_type_warn);
  943. devlink_port_type_warn_schedule(devlink_port);
  944. devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
  945. return 0;
  946. }
  947. EXPORT_SYMBOL_GPL(devl_port_register_with_ops);
  948. /**
  949. * devlink_port_register_with_ops - Register devlink port
  950. *
  951. * @devlink: devlink
  952. * @devlink_port: devlink port
  953. * @port_index: driver-specific numerical identifier of the port
  954. * @ops: port ops
  955. *
  956. * Register devlink port with provided port index. User can use
  957. * any indexing, even hw-related one. devlink_port structure
  958. * is convenient to be embedded inside user driver private structure.
  959. * Note that the caller should take care of zeroing the devlink_port
  960. * structure.
  961. *
  962. * Context: Takes and release devlink->lock <mutex>.
  963. */
  964. int devlink_port_register_with_ops(struct devlink *devlink,
  965. struct devlink_port *devlink_port,
  966. unsigned int port_index,
  967. const struct devlink_port_ops *ops)
  968. {
  969. int err;
  970. devl_lock(devlink);
  971. err = devl_port_register_with_ops(devlink, devlink_port,
  972. port_index, ops);
  973. devl_unlock(devlink);
  974. return err;
  975. }
  976. EXPORT_SYMBOL_GPL(devlink_port_register_with_ops);
  977. /**
  978. * devl_port_unregister() - Unregister devlink port
  979. *
  980. * @devlink_port: devlink port
  981. */
  982. void devl_port_unregister(struct devlink_port *devlink_port)
  983. {
  984. lockdep_assert_held(&devlink_port->devlink->lock);
  985. WARN_ON(devlink_port->type != DEVLINK_PORT_TYPE_NOTSET);
  986. devlink_port_type_warn_cancel(devlink_port);
  987. devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_DEL);
  988. xa_erase(&devlink_port->devlink->ports, devlink_port->index);
  989. WARN_ON(!list_empty(&devlink_port->reporter_list));
  990. devlink_port->registered = false;
  991. }
  992. EXPORT_SYMBOL_GPL(devl_port_unregister);
  993. /**
  994. * devlink_port_unregister - Unregister devlink port
  995. *
  996. * @devlink_port: devlink port
  997. *
  998. * Context: Takes and release devlink->lock <mutex>.
  999. */
  1000. void devlink_port_unregister(struct devlink_port *devlink_port)
  1001. {
  1002. struct devlink *devlink = devlink_port->devlink;
  1003. devl_lock(devlink);
  1004. devl_port_unregister(devlink_port);
  1005. devl_unlock(devlink);
  1006. }
  1007. EXPORT_SYMBOL_GPL(devlink_port_unregister);
  1008. static void devlink_port_type_netdev_checks(struct devlink_port *devlink_port,
  1009. struct net_device *netdev)
  1010. {
  1011. const struct net_device_ops *ops = netdev->netdev_ops;
  1012. /* If driver registers devlink port, it should set devlink port
  1013. * attributes accordingly so the compat functions are called
  1014. * and the original ops are not used.
  1015. */
  1016. if (ops->ndo_get_phys_port_name) {
  1017. /* Some drivers use the same set of ndos for netdevs
  1018. * that have devlink_port registered and also for
  1019. * those who don't. Make sure that ndo_get_phys_port_name
  1020. * returns -EOPNOTSUPP here in case it is defined.
  1021. * Warn if not.
  1022. */
  1023. char name[IFNAMSIZ];
  1024. int err;
  1025. err = ops->ndo_get_phys_port_name(netdev, name, sizeof(name));
  1026. WARN_ON(err != -EOPNOTSUPP);
  1027. }
  1028. if (ops->ndo_get_port_parent_id) {
  1029. /* Some drivers use the same set of ndos for netdevs
  1030. * that have devlink_port registered and also for
  1031. * those who don't. Make sure that ndo_get_port_parent_id
  1032. * returns -EOPNOTSUPP here in case it is defined.
  1033. * Warn if not.
  1034. */
  1035. struct netdev_phys_item_id ppid;
  1036. int err;
  1037. err = ops->ndo_get_port_parent_id(netdev, &ppid);
  1038. WARN_ON(err != -EOPNOTSUPP);
  1039. }
  1040. }
  1041. static void __devlink_port_type_set(struct devlink_port *devlink_port,
  1042. enum devlink_port_type type,
  1043. void *type_dev)
  1044. {
  1045. struct net_device *netdev = type_dev;
  1046. ASSERT_DEVLINK_PORT_REGISTERED(devlink_port);
  1047. if (type == DEVLINK_PORT_TYPE_NOTSET) {
  1048. devlink_port_type_warn_schedule(devlink_port);
  1049. } else {
  1050. devlink_port_type_warn_cancel(devlink_port);
  1051. if (type == DEVLINK_PORT_TYPE_ETH && netdev)
  1052. devlink_port_type_netdev_checks(devlink_port, netdev);
  1053. }
  1054. spin_lock_bh(&devlink_port->type_lock);
  1055. devlink_port->type = type;
  1056. switch (type) {
  1057. case DEVLINK_PORT_TYPE_ETH:
  1058. devlink_port->type_eth.netdev = netdev;
  1059. if (netdev) {
  1060. ASSERT_RTNL();
  1061. devlink_port->type_eth.ifindex = netdev->ifindex;
  1062. BUILD_BUG_ON(sizeof(devlink_port->type_eth.ifname) !=
  1063. sizeof(netdev->name));
  1064. strcpy(devlink_port->type_eth.ifname, netdev->name);
  1065. }
  1066. break;
  1067. case DEVLINK_PORT_TYPE_IB:
  1068. devlink_port->type_ib.ibdev = type_dev;
  1069. break;
  1070. default:
  1071. break;
  1072. }
  1073. spin_unlock_bh(&devlink_port->type_lock);
  1074. devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
  1075. }
  1076. /**
  1077. * devlink_port_type_eth_set - Set port type to Ethernet
  1078. *
  1079. * @devlink_port: devlink port
  1080. *
  1081. * If driver is calling this, most likely it is doing something wrong.
  1082. */
  1083. void devlink_port_type_eth_set(struct devlink_port *devlink_port)
  1084. {
  1085. dev_warn(devlink_port->devlink->dev,
  1086. "devlink port type for port %d set to Ethernet without a software interface reference, device type not supported by the kernel?\n",
  1087. devlink_port->index);
  1088. __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, NULL);
  1089. }
  1090. EXPORT_SYMBOL_GPL(devlink_port_type_eth_set);
  1091. /**
  1092. * devlink_port_type_ib_set - Set port type to InfiniBand
  1093. *
  1094. * @devlink_port: devlink port
  1095. * @ibdev: related IB device
  1096. */
  1097. void devlink_port_type_ib_set(struct devlink_port *devlink_port,
  1098. struct ib_device *ibdev)
  1099. {
  1100. __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_IB, ibdev);
  1101. }
  1102. EXPORT_SYMBOL_GPL(devlink_port_type_ib_set);
  1103. /**
  1104. * devlink_port_type_clear - Clear port type
  1105. *
  1106. * @devlink_port: devlink port
  1107. *
  1108. * If driver is calling this for clearing Ethernet type, most likely
  1109. * it is doing something wrong.
  1110. */
  1111. void devlink_port_type_clear(struct devlink_port *devlink_port)
  1112. {
  1113. if (devlink_port->type == DEVLINK_PORT_TYPE_ETH)
  1114. dev_warn(devlink_port->devlink->dev,
  1115. "devlink port type for port %d cleared without a software interface reference, device type not supported by the kernel?\n",
  1116. devlink_port->index);
  1117. __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET, NULL);
  1118. }
  1119. EXPORT_SYMBOL_GPL(devlink_port_type_clear);
  1120. int devlink_port_netdevice_event(struct notifier_block *nb,
  1121. unsigned long event, void *ptr)
  1122. {
  1123. struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
  1124. struct devlink_port *devlink_port = netdev->devlink_port;
  1125. struct devlink *devlink;
  1126. if (!devlink_port)
  1127. return NOTIFY_OK;
  1128. devlink = devlink_port->devlink;
  1129. switch (event) {
  1130. case NETDEV_POST_INIT:
  1131. /* Set the type but not netdev pointer. It is going to be set
  1132. * later on by NETDEV_REGISTER event. Happens once during
  1133. * netdevice register
  1134. */
  1135. __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH,
  1136. NULL);
  1137. break;
  1138. case NETDEV_REGISTER:
  1139. case NETDEV_CHANGENAME:
  1140. if (devlink_net(devlink) != dev_net(netdev))
  1141. return NOTIFY_OK;
  1142. /* Set the netdev on top of previously set type. Note this
  1143. * event happens also during net namespace change so here
  1144. * we take into account netdev pointer appearing in this
  1145. * namespace.
  1146. */
  1147. __devlink_port_type_set(devlink_port, devlink_port->type,
  1148. netdev);
  1149. break;
  1150. case NETDEV_UNREGISTER:
  1151. if (devlink_net(devlink) != dev_net(netdev))
  1152. return NOTIFY_OK;
  1153. /* Clear netdev pointer, but not the type. This event happens
  1154. * also during net namespace change so we need to clear
  1155. * pointer to netdev that is going to another net namespace.
  1156. */
  1157. __devlink_port_type_set(devlink_port, devlink_port->type,
  1158. NULL);
  1159. break;
  1160. case NETDEV_PRE_UNINIT:
  1161. /* Clear the type and the netdev pointer. Happens one during
  1162. * netdevice unregister.
  1163. */
  1164. __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET,
  1165. NULL);
  1166. break;
  1167. }
  1168. return NOTIFY_OK;
  1169. }
  1170. static int __devlink_port_attrs_set(struct devlink_port *devlink_port,
  1171. enum devlink_port_flavour flavour)
  1172. {
  1173. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  1174. devlink_port->attrs_set = true;
  1175. attrs->flavour = flavour;
  1176. if (attrs->switch_id.id_len) {
  1177. devlink_port->switch_port = true;
  1178. if (WARN_ON(attrs->switch_id.id_len > MAX_PHYS_ITEM_ID_LEN))
  1179. attrs->switch_id.id_len = MAX_PHYS_ITEM_ID_LEN;
  1180. } else {
  1181. devlink_port->switch_port = false;
  1182. }
  1183. return 0;
  1184. }
  1185. /**
  1186. * devlink_port_attrs_set - Set port attributes
  1187. *
  1188. * @devlink_port: devlink port
  1189. * @attrs: devlink port attrs
  1190. */
  1191. void devlink_port_attrs_set(struct devlink_port *devlink_port,
  1192. struct devlink_port_attrs *attrs)
  1193. {
  1194. int ret;
  1195. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1196. devlink_port->attrs = *attrs;
  1197. ret = __devlink_port_attrs_set(devlink_port, attrs->flavour);
  1198. if (ret)
  1199. return;
  1200. WARN_ON(attrs->splittable && attrs->split);
  1201. }
  1202. EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
  1203. /**
  1204. * devlink_port_attrs_pci_pf_set - Set PCI PF port attributes
  1205. *
  1206. * @devlink_port: devlink port
  1207. * @controller: associated controller number for the devlink port instance
  1208. * @pf: associated PF for the devlink port instance
  1209. * @external: indicates if the port is for an external controller
  1210. */
  1211. void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 controller,
  1212. u16 pf, bool external)
  1213. {
  1214. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  1215. int ret;
  1216. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1217. ret = __devlink_port_attrs_set(devlink_port,
  1218. DEVLINK_PORT_FLAVOUR_PCI_PF);
  1219. if (ret)
  1220. return;
  1221. attrs->pci_pf.controller = controller;
  1222. attrs->pci_pf.pf = pf;
  1223. attrs->pci_pf.external = external;
  1224. }
  1225. EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set);
  1226. /**
  1227. * devlink_port_attrs_pci_vf_set - Set PCI VF port attributes
  1228. *
  1229. * @devlink_port: devlink port
  1230. * @controller: associated controller number for the devlink port instance
  1231. * @pf: associated PF for the devlink port instance
  1232. * @vf: associated VF of a PF for the devlink port instance
  1233. * @external: indicates if the port is for an external controller
  1234. */
  1235. void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller,
  1236. u16 pf, u16 vf, bool external)
  1237. {
  1238. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  1239. int ret;
  1240. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1241. ret = __devlink_port_attrs_set(devlink_port,
  1242. DEVLINK_PORT_FLAVOUR_PCI_VF);
  1243. if (ret)
  1244. return;
  1245. attrs->pci_vf.controller = controller;
  1246. attrs->pci_vf.pf = pf;
  1247. attrs->pci_vf.vf = vf;
  1248. attrs->pci_vf.external = external;
  1249. }
  1250. EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set);
  1251. /**
  1252. * devlink_port_attrs_pci_sf_set - Set PCI SF port attributes
  1253. *
  1254. * @devlink_port: devlink port
  1255. * @controller: associated controller number for the devlink port instance
  1256. * @pf: associated PF for the devlink port instance
  1257. * @sf: associated SF of a PF for the devlink port instance
  1258. * @external: indicates if the port is for an external controller
  1259. */
  1260. void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port, u32 controller,
  1261. u16 pf, u32 sf, bool external)
  1262. {
  1263. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  1264. int ret;
  1265. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1266. ret = __devlink_port_attrs_set(devlink_port,
  1267. DEVLINK_PORT_FLAVOUR_PCI_SF);
  1268. if (ret)
  1269. return;
  1270. attrs->pci_sf.controller = controller;
  1271. attrs->pci_sf.pf = pf;
  1272. attrs->pci_sf.sf = sf;
  1273. attrs->pci_sf.external = external;
  1274. }
  1275. EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_sf_set);
  1276. static void devlink_port_rel_notify_cb(struct devlink *devlink, u32 port_index)
  1277. {
  1278. struct devlink_port *devlink_port;
  1279. devlink_port = devlink_port_get_by_index(devlink, port_index);
  1280. if (!devlink_port)
  1281. return;
  1282. devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
  1283. }
  1284. static void devlink_port_rel_cleanup_cb(struct devlink *devlink, u32 port_index,
  1285. u32 rel_index)
  1286. {
  1287. struct devlink_port *devlink_port;
  1288. devlink_port = devlink_port_get_by_index(devlink, port_index);
  1289. if (devlink_port && devlink_port->rel_index == rel_index)
  1290. devlink_port->rel_index = 0;
  1291. }
  1292. /**
  1293. * devl_port_fn_devlink_set - Attach peer devlink
  1294. * instance to port function.
  1295. * @devlink_port: devlink port
  1296. * @fn_devlink: devlink instance to attach
  1297. */
  1298. int devl_port_fn_devlink_set(struct devlink_port *devlink_port,
  1299. struct devlink *fn_devlink)
  1300. {
  1301. ASSERT_DEVLINK_PORT_REGISTERED(devlink_port);
  1302. if (WARN_ON(devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_SF ||
  1303. devlink_port->attrs.pci_sf.external))
  1304. return -EINVAL;
  1305. return devlink_rel_nested_in_add(&devlink_port->rel_index,
  1306. devlink_port->devlink->index,
  1307. devlink_port->index,
  1308. devlink_port_rel_notify_cb,
  1309. devlink_port_rel_cleanup_cb,
  1310. fn_devlink);
  1311. }
  1312. EXPORT_SYMBOL_GPL(devl_port_fn_devlink_set);
  1313. /**
  1314. * devlink_port_linecard_set - Link port with a linecard
  1315. *
  1316. * @devlink_port: devlink port
  1317. * @linecard: devlink linecard
  1318. */
  1319. void devlink_port_linecard_set(struct devlink_port *devlink_port,
  1320. struct devlink_linecard *linecard)
  1321. {
  1322. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1323. devlink_port->linecard = linecard;
  1324. }
  1325. EXPORT_SYMBOL_GPL(devlink_port_linecard_set);
  1326. static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
  1327. char *name, size_t len)
  1328. {
  1329. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  1330. int n = 0;
  1331. if (!devlink_port->attrs_set)
  1332. return -EOPNOTSUPP;
  1333. switch (attrs->flavour) {
  1334. case DEVLINK_PORT_FLAVOUR_PHYSICAL:
  1335. if (devlink_port->linecard)
  1336. n = snprintf(name, len, "l%u",
  1337. devlink_linecard_index(devlink_port->linecard));
  1338. if (n < len)
  1339. n += snprintf(name + n, len - n, "p%u",
  1340. attrs->phys.port_number);
  1341. if (n < len && attrs->split)
  1342. n += snprintf(name + n, len - n, "s%u",
  1343. attrs->phys.split_subport_number);
  1344. break;
  1345. case DEVLINK_PORT_FLAVOUR_CPU:
  1346. case DEVLINK_PORT_FLAVOUR_DSA:
  1347. case DEVLINK_PORT_FLAVOUR_UNUSED:
  1348. /* As CPU and DSA ports do not have a netdevice associated
  1349. * case should not ever happen.
  1350. */
  1351. WARN_ON(1);
  1352. return -EINVAL;
  1353. case DEVLINK_PORT_FLAVOUR_PCI_PF:
  1354. if (attrs->pci_pf.external) {
  1355. n = snprintf(name, len, "c%u", attrs->pci_pf.controller);
  1356. if (n >= len)
  1357. return -EINVAL;
  1358. len -= n;
  1359. name += n;
  1360. }
  1361. n = snprintf(name, len, "pf%u", attrs->pci_pf.pf);
  1362. break;
  1363. case DEVLINK_PORT_FLAVOUR_PCI_VF:
  1364. if (attrs->pci_vf.external) {
  1365. n = snprintf(name, len, "c%u", attrs->pci_vf.controller);
  1366. if (n >= len)
  1367. return -EINVAL;
  1368. len -= n;
  1369. name += n;
  1370. }
  1371. n = snprintf(name, len, "pf%uvf%u",
  1372. attrs->pci_vf.pf, attrs->pci_vf.vf);
  1373. break;
  1374. case DEVLINK_PORT_FLAVOUR_PCI_SF:
  1375. if (attrs->pci_sf.external) {
  1376. n = snprintf(name, len, "c%u", attrs->pci_sf.controller);
  1377. if (n >= len)
  1378. return -EINVAL;
  1379. len -= n;
  1380. name += n;
  1381. }
  1382. n = snprintf(name, len, "pf%usf%u", attrs->pci_sf.pf,
  1383. attrs->pci_sf.sf);
  1384. break;
  1385. case DEVLINK_PORT_FLAVOUR_VIRTUAL:
  1386. return -EOPNOTSUPP;
  1387. }
  1388. if (n >= len)
  1389. return -EINVAL;
  1390. return 0;
  1391. }
  1392. int devlink_compat_phys_port_name_get(struct net_device *dev,
  1393. char *name, size_t len)
  1394. {
  1395. struct devlink_port *devlink_port;
  1396. /* RTNL mutex is held here which ensures that devlink_port
  1397. * instance cannot disappear in the middle. No need to take
  1398. * any devlink lock as only permanent values are accessed.
  1399. */
  1400. ASSERT_RTNL();
  1401. devlink_port = dev->devlink_port;
  1402. if (!devlink_port)
  1403. return -EOPNOTSUPP;
  1404. return __devlink_port_phys_port_name_get(devlink_port, name, len);
  1405. }
  1406. int devlink_compat_switch_id_get(struct net_device *dev,
  1407. struct netdev_phys_item_id *ppid)
  1408. {
  1409. struct devlink_port *devlink_port;
  1410. /* Caller must hold RTNL mutex or reference to dev, which ensures that
  1411. * devlink_port instance cannot disappear in the middle. No need to take
  1412. * any devlink lock as only permanent values are accessed.
  1413. */
  1414. devlink_port = dev->devlink_port;
  1415. if (!devlink_port || !devlink_port->switch_port)
  1416. return -EOPNOTSUPP;
  1417. memcpy(ppid, &devlink_port->attrs.switch_id, sizeof(*ppid));
  1418. return 0;
  1419. }