port.c 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604
  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 void __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. }
  1184. /**
  1185. * devlink_port_attrs_set - Set port attributes
  1186. *
  1187. * @devlink_port: devlink port
  1188. * @attrs: devlink port attrs
  1189. */
  1190. void devlink_port_attrs_set(struct devlink_port *devlink_port,
  1191. const struct devlink_port_attrs *attrs)
  1192. {
  1193. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1194. WARN_ON(attrs->splittable && attrs->split);
  1195. devlink_port->attrs = *attrs;
  1196. __devlink_port_attrs_set(devlink_port, attrs->flavour);
  1197. }
  1198. EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
  1199. /**
  1200. * devlink_port_attrs_pci_pf_set - Set PCI PF port attributes
  1201. *
  1202. * @devlink_port: devlink port
  1203. * @controller: associated controller number for the devlink port instance
  1204. * @pf: associated PCI function number for the devlink port instance
  1205. * @external: indicates if the port is for an external controller
  1206. */
  1207. void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 controller,
  1208. u16 pf, bool external)
  1209. {
  1210. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  1211. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1212. __devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PCI_PF);
  1213. attrs->pci_pf.controller = controller;
  1214. attrs->pci_pf.pf = pf;
  1215. attrs->pci_pf.external = external;
  1216. }
  1217. EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set);
  1218. /**
  1219. * devlink_port_attrs_pci_vf_set - Set PCI VF port attributes
  1220. *
  1221. * @devlink_port: devlink port
  1222. * @controller: associated controller number for the devlink port instance
  1223. * @pf: associated PCI function number for the devlink port instance
  1224. * @vf: associated PCI VF number of a PF for the devlink port instance;
  1225. * VF number starts from 0 for the first PCI virtual function
  1226. * @external: indicates if the port is for an external controller
  1227. */
  1228. void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller,
  1229. u16 pf, u16 vf, bool external)
  1230. {
  1231. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  1232. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1233. __devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PCI_VF);
  1234. attrs->pci_vf.controller = controller;
  1235. attrs->pci_vf.pf = pf;
  1236. attrs->pci_vf.vf = vf;
  1237. attrs->pci_vf.external = external;
  1238. }
  1239. EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set);
  1240. /**
  1241. * devlink_port_attrs_pci_sf_set - Set PCI SF port attributes
  1242. *
  1243. * @devlink_port: devlink port
  1244. * @controller: associated controller number for the devlink port instance
  1245. * @pf: associated PCI function number for the devlink port instance
  1246. * @sf: associated SF number of a PF for the devlink port instance
  1247. * @external: indicates if the port is for an external controller
  1248. */
  1249. void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port, u32 controller,
  1250. u16 pf, u32 sf, bool external)
  1251. {
  1252. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  1253. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1254. __devlink_port_attrs_set(devlink_port, DEVLINK_PORT_FLAVOUR_PCI_SF);
  1255. attrs->pci_sf.controller = controller;
  1256. attrs->pci_sf.pf = pf;
  1257. attrs->pci_sf.sf = sf;
  1258. attrs->pci_sf.external = external;
  1259. }
  1260. EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_sf_set);
  1261. static void devlink_port_rel_notify_cb(struct devlink *devlink, u32 port_index)
  1262. {
  1263. struct devlink_port *devlink_port;
  1264. devlink_port = devlink_port_get_by_index(devlink, port_index);
  1265. if (!devlink_port)
  1266. return;
  1267. devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
  1268. }
  1269. static void devlink_port_rel_cleanup_cb(struct devlink *devlink, u32 port_index,
  1270. u32 rel_index)
  1271. {
  1272. struct devlink_port *devlink_port;
  1273. devlink_port = devlink_port_get_by_index(devlink, port_index);
  1274. if (devlink_port && devlink_port->rel_index == rel_index)
  1275. devlink_port->rel_index = 0;
  1276. }
  1277. /**
  1278. * devl_port_fn_devlink_set - Attach peer devlink
  1279. * instance to port function.
  1280. * @devlink_port: devlink port
  1281. * @fn_devlink: devlink instance to attach
  1282. */
  1283. int devl_port_fn_devlink_set(struct devlink_port *devlink_port,
  1284. struct devlink *fn_devlink)
  1285. {
  1286. ASSERT_DEVLINK_PORT_REGISTERED(devlink_port);
  1287. if (WARN_ON(devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_SF ||
  1288. devlink_port->attrs.pci_sf.external))
  1289. return -EINVAL;
  1290. return devlink_rel_nested_in_add(&devlink_port->rel_index,
  1291. devlink_port->devlink->index,
  1292. devlink_port->index,
  1293. devlink_port_rel_notify_cb,
  1294. devlink_port_rel_cleanup_cb,
  1295. fn_devlink);
  1296. }
  1297. EXPORT_SYMBOL_GPL(devl_port_fn_devlink_set);
  1298. /**
  1299. * devlink_port_linecard_set - Link port with a linecard
  1300. *
  1301. * @devlink_port: devlink port
  1302. * @linecard: devlink linecard
  1303. */
  1304. void devlink_port_linecard_set(struct devlink_port *devlink_port,
  1305. struct devlink_linecard *linecard)
  1306. {
  1307. ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
  1308. devlink_port->linecard = linecard;
  1309. }
  1310. EXPORT_SYMBOL_GPL(devlink_port_linecard_set);
  1311. static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
  1312. char *name, size_t len)
  1313. {
  1314. struct devlink_port_attrs *attrs = &devlink_port->attrs;
  1315. int n = 0;
  1316. if (!devlink_port->attrs_set || devlink_port->attrs.no_phys_port_name)
  1317. return -EOPNOTSUPP;
  1318. switch (attrs->flavour) {
  1319. case DEVLINK_PORT_FLAVOUR_PHYSICAL:
  1320. if (devlink_port->linecard)
  1321. n = snprintf(name, len, "l%u",
  1322. devlink_linecard_index(devlink_port->linecard));
  1323. if (n < len)
  1324. n += snprintf(name + n, len - n, "p%u",
  1325. attrs->phys.port_number);
  1326. if (n < len && attrs->split)
  1327. n += snprintf(name + n, len - n, "s%u",
  1328. attrs->phys.split_subport_number);
  1329. break;
  1330. case DEVLINK_PORT_FLAVOUR_CPU:
  1331. case DEVLINK_PORT_FLAVOUR_DSA:
  1332. case DEVLINK_PORT_FLAVOUR_UNUSED:
  1333. /* As CPU and DSA ports do not have a netdevice associated
  1334. * case should not ever happen.
  1335. */
  1336. WARN_ON(1);
  1337. return -EINVAL;
  1338. case DEVLINK_PORT_FLAVOUR_PCI_PF:
  1339. if (attrs->pci_pf.external) {
  1340. n = snprintf(name, len, "c%u", attrs->pci_pf.controller);
  1341. if (n >= len)
  1342. return -EINVAL;
  1343. len -= n;
  1344. name += n;
  1345. }
  1346. n = snprintf(name, len, "pf%u", attrs->pci_pf.pf);
  1347. break;
  1348. case DEVLINK_PORT_FLAVOUR_PCI_VF:
  1349. if (attrs->pci_vf.external) {
  1350. n = snprintf(name, len, "c%u", attrs->pci_vf.controller);
  1351. if (n >= len)
  1352. return -EINVAL;
  1353. len -= n;
  1354. name += n;
  1355. }
  1356. n = snprintf(name, len, "pf%uvf%u",
  1357. attrs->pci_vf.pf, attrs->pci_vf.vf);
  1358. break;
  1359. case DEVLINK_PORT_FLAVOUR_PCI_SF:
  1360. if (attrs->pci_sf.external) {
  1361. n = snprintf(name, len, "c%u", attrs->pci_sf.controller);
  1362. if (n >= len)
  1363. return -EINVAL;
  1364. len -= n;
  1365. name += n;
  1366. }
  1367. n = snprintf(name, len, "pf%usf%u", attrs->pci_sf.pf,
  1368. attrs->pci_sf.sf);
  1369. break;
  1370. case DEVLINK_PORT_FLAVOUR_VIRTUAL:
  1371. return -EOPNOTSUPP;
  1372. }
  1373. if (n >= len)
  1374. return -EINVAL;
  1375. return 0;
  1376. }
  1377. int devlink_compat_phys_port_name_get(struct net_device *dev,
  1378. char *name, size_t len)
  1379. {
  1380. struct devlink_port *devlink_port;
  1381. /* RTNL mutex is held here which ensures that devlink_port
  1382. * instance cannot disappear in the middle. No need to take
  1383. * any devlink lock as only permanent values are accessed.
  1384. */
  1385. ASSERT_RTNL();
  1386. devlink_port = dev->devlink_port;
  1387. if (!devlink_port)
  1388. return -EOPNOTSUPP;
  1389. return __devlink_port_phys_port_name_get(devlink_port, name, len);
  1390. }
  1391. int devlink_compat_switch_id_get(struct net_device *dev,
  1392. struct netdev_phys_item_id *ppid)
  1393. {
  1394. struct devlink_port *devlink_port;
  1395. /* Caller must hold RTNL mutex or reference to dev, which ensures that
  1396. * devlink_port instance cannot disappear in the middle. No need to take
  1397. * any devlink lock as only permanent values are accessed.
  1398. */
  1399. devlink_port = dev->devlink_port;
  1400. if (!devlink_port || !devlink_port->switch_port)
  1401. return -EOPNOTSUPP;
  1402. memcpy(ppid, &devlink_port->attrs.switch_id, sizeof(*ppid));
  1403. return 0;
  1404. }