pse_core.c 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. //
  3. // Framework for Ethernet Power Sourcing Equipment
  4. //
  5. // Copyright (c) 2022 Pengutronix, Oleksij Rempel <kernel@pengutronix.de>
  6. //
  7. #include <linux/device.h>
  8. #include <linux/ethtool.h>
  9. #include <linux/ethtool_netlink.h>
  10. #include <linux/of.h>
  11. #include <linux/phy.h>
  12. #include <linux/pse-pd/pse.h>
  13. #include <linux/regulator/driver.h>
  14. #include <linux/regulator/machine.h>
  15. #include <linux/rtnetlink.h>
  16. #include <net/net_trackers.h>
  17. #define PSE_PW_D_LIMIT INT_MAX
  18. static DEFINE_MUTEX(pse_list_mutex);
  19. static LIST_HEAD(pse_controller_list);
  20. static DEFINE_XARRAY_ALLOC(pse_pw_d_map);
  21. static DEFINE_MUTEX(pse_pw_d_mutex);
  22. /**
  23. * struct pse_control - a PSE control
  24. * @pcdev: a pointer to the PSE controller device
  25. * this PSE control belongs to
  26. * @ps: PSE PI supply of the PSE control
  27. * @list: list entry for the pcdev's PSE controller list
  28. * @id: ID of the PSE line in the PSE controller device
  29. * @refcnt: Number of gets of this pse_control
  30. * @attached_phydev: PHY device pointer attached by the PSE control
  31. */
  32. struct pse_control {
  33. struct pse_controller_dev *pcdev;
  34. struct regulator *ps;
  35. struct list_head list;
  36. unsigned int id;
  37. struct kref refcnt;
  38. struct phy_device *attached_phydev;
  39. };
  40. /**
  41. * struct pse_power_domain - a PSE power domain
  42. * @id: ID of the power domain
  43. * @supply: Power supply the Power Domain
  44. * @refcnt: Number of gets of this pse_power_domain
  45. * @budget_eval_strategy: Current power budget evaluation strategy of the
  46. * power domain
  47. */
  48. struct pse_power_domain {
  49. int id;
  50. struct regulator *supply;
  51. struct kref refcnt;
  52. u32 budget_eval_strategy;
  53. };
  54. static int of_load_single_pse_pi_pairset(struct device_node *node,
  55. struct pse_pi *pi,
  56. int pairset_num)
  57. {
  58. struct device_node *pairset_np;
  59. const char *name;
  60. int ret;
  61. ret = of_property_read_string_index(node, "pairset-names",
  62. pairset_num, &name);
  63. if (ret)
  64. return ret;
  65. if (!strcmp(name, "alternative-a")) {
  66. pi->pairset[pairset_num].pinout = ALTERNATIVE_A;
  67. } else if (!strcmp(name, "alternative-b")) {
  68. pi->pairset[pairset_num].pinout = ALTERNATIVE_B;
  69. } else {
  70. pr_err("pse: wrong pairset-names value %s (%pOF)\n",
  71. name, node);
  72. return -EINVAL;
  73. }
  74. pairset_np = of_parse_phandle(node, "pairsets", pairset_num);
  75. if (!pairset_np)
  76. return -ENODEV;
  77. pi->pairset[pairset_num].np = pairset_np;
  78. return 0;
  79. }
  80. /**
  81. * of_load_pse_pi_pairsets - load PSE PI pairsets pinout and polarity
  82. * @node: a pointer of the device node
  83. * @pi: a pointer of the PSE PI to fill
  84. * @npairsets: the number of pairsets (1 or 2) used by the PI
  85. *
  86. * Return: 0 on success and failure value on error
  87. */
  88. static int of_load_pse_pi_pairsets(struct device_node *node,
  89. struct pse_pi *pi,
  90. int npairsets)
  91. {
  92. int i, ret;
  93. ret = of_property_count_strings(node, "pairset-names");
  94. if (ret != npairsets) {
  95. pr_err("pse: amount of pairsets and pairset-names is not equal %d != %d (%pOF)\n",
  96. npairsets, ret, node);
  97. return -EINVAL;
  98. }
  99. for (i = 0; i < npairsets; i++) {
  100. ret = of_load_single_pse_pi_pairset(node, pi, i);
  101. if (ret)
  102. goto out;
  103. }
  104. if (npairsets == 2 &&
  105. pi->pairset[0].pinout == pi->pairset[1].pinout) {
  106. pr_err("pse: two PI pairsets can not have identical pinout (%pOF)",
  107. node);
  108. ret = -EINVAL;
  109. }
  110. out:
  111. /* If an error appears, release all the pairset device node kref */
  112. if (ret) {
  113. of_node_put(pi->pairset[0].np);
  114. pi->pairset[0].np = NULL;
  115. of_node_put(pi->pairset[1].np);
  116. pi->pairset[1].np = NULL;
  117. }
  118. return ret;
  119. }
  120. static void pse_release_pis(struct pse_controller_dev *pcdev)
  121. {
  122. int i;
  123. for (i = 0; i < pcdev->nr_lines; i++) {
  124. of_node_put(pcdev->pi[i].pairset[0].np);
  125. of_node_put(pcdev->pi[i].pairset[1].np);
  126. of_node_put(pcdev->pi[i].np);
  127. }
  128. kfree(pcdev->pi);
  129. }
  130. /**
  131. * of_load_pse_pis - load all the PSE PIs
  132. * @pcdev: a pointer to the PSE controller device
  133. *
  134. * Return: 0 on success and failure value on error
  135. */
  136. static int of_load_pse_pis(struct pse_controller_dev *pcdev)
  137. {
  138. struct device_node *np = pcdev->dev->of_node;
  139. struct device_node *node, *pis;
  140. int ret;
  141. if (!np)
  142. return -ENODEV;
  143. pcdev->pi = kzalloc_objs(*pcdev->pi, pcdev->nr_lines);
  144. if (!pcdev->pi)
  145. return -ENOMEM;
  146. pis = of_get_child_by_name(np, "pse-pis");
  147. if (!pis) {
  148. /* no description of PSE PIs */
  149. pcdev->no_of_pse_pi = true;
  150. return 0;
  151. }
  152. for_each_child_of_node(pis, node) {
  153. struct pse_pi pi = {0};
  154. u32 id;
  155. if (!of_node_name_eq(node, "pse-pi"))
  156. continue;
  157. ret = of_property_read_u32(node, "reg", &id);
  158. if (ret) {
  159. dev_err(pcdev->dev,
  160. "can't get reg property for node '%pOF'",
  161. node);
  162. goto out;
  163. }
  164. if (id >= pcdev->nr_lines) {
  165. dev_err(pcdev->dev,
  166. "reg value (%u) is out of range (%u) (%pOF)\n",
  167. id, pcdev->nr_lines, node);
  168. ret = -EINVAL;
  169. goto out;
  170. }
  171. if (pcdev->pi[id].np) {
  172. dev_err(pcdev->dev,
  173. "other node with same reg value was already registered. %pOF : %pOF\n",
  174. pcdev->pi[id].np, node);
  175. ret = -EINVAL;
  176. goto out;
  177. }
  178. ret = of_count_phandle_with_args(node, "pairsets", NULL);
  179. /* npairsets is limited to value one or two */
  180. if (ret == 1 || ret == 2) {
  181. ret = of_load_pse_pi_pairsets(node, &pi, ret);
  182. if (ret)
  183. goto out;
  184. } else if (ret != ENOENT) {
  185. dev_err(pcdev->dev,
  186. "error: wrong number of pairsets. Should be 1 or 2, got %d (%pOF)\n",
  187. ret, node);
  188. ret = -EINVAL;
  189. goto out;
  190. }
  191. of_node_get(node);
  192. pi.np = node;
  193. memcpy(&pcdev->pi[id], &pi, sizeof(pi));
  194. }
  195. of_node_put(pis);
  196. return 0;
  197. out:
  198. pse_release_pis(pcdev);
  199. of_node_put(node);
  200. of_node_put(pis);
  201. return ret;
  202. }
  203. /**
  204. * pse_control_find_net_by_id - Find net attached to the pse control id
  205. * @pcdev: a pointer to the PSE
  206. * @id: index of the PSE control
  207. *
  208. * Return: pse_control pointer or NULL. The device returned has had a
  209. * reference added and the pointer is safe until the user calls
  210. * pse_control_put() to indicate they have finished with it.
  211. */
  212. static struct pse_control *
  213. pse_control_find_by_id(struct pse_controller_dev *pcdev, int id)
  214. {
  215. struct pse_control *psec;
  216. mutex_lock(&pse_list_mutex);
  217. list_for_each_entry(psec, &pcdev->pse_control_head, list) {
  218. if (psec->id == id) {
  219. kref_get(&psec->refcnt);
  220. mutex_unlock(&pse_list_mutex);
  221. return psec;
  222. }
  223. }
  224. mutex_unlock(&pse_list_mutex);
  225. return NULL;
  226. }
  227. /**
  228. * pse_control_get_netdev - Return netdev associated to a PSE control
  229. * @psec: PSE control pointer
  230. *
  231. * Return: netdev pointer or NULL
  232. */
  233. static struct net_device *pse_control_get_netdev(struct pse_control *psec)
  234. {
  235. ASSERT_RTNL();
  236. if (!psec || !psec->attached_phydev)
  237. return NULL;
  238. return psec->attached_phydev->attached_dev;
  239. }
  240. /**
  241. * pse_pi_is_hw_enabled - Is PI enabled at the hardware level
  242. * @pcdev: a pointer to the PSE controller device
  243. * @id: Index of the PI
  244. *
  245. * Return: 1 if the PI is enabled at the hardware level, 0 if not, and
  246. * a failure value on error
  247. */
  248. static int pse_pi_is_hw_enabled(struct pse_controller_dev *pcdev, int id)
  249. {
  250. struct pse_admin_state admin_state = {0};
  251. int ret;
  252. ret = pcdev->ops->pi_get_admin_state(pcdev, id, &admin_state);
  253. if (ret < 0)
  254. return ret;
  255. /* PI is well enabled at the hardware level */
  256. if (admin_state.podl_admin_state == ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED ||
  257. admin_state.c33_admin_state == ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED)
  258. return 1;
  259. return 0;
  260. }
  261. /**
  262. * pse_pi_is_admin_enable_pending - Check if PI is in admin enable pending state
  263. * which mean the power is not yet being
  264. * delivered
  265. * @pcdev: a pointer to the PSE controller device
  266. * @id: Index of the PI
  267. *
  268. * Detects if a PI is enabled in software with a PD detected, but the hardware
  269. * admin state hasn't been applied yet.
  270. *
  271. * This function is used in the power delivery and retry mechanisms to determine
  272. * which PIs need to have power delivery attempted again.
  273. *
  274. * Return: true if the PI has admin enable flag set in software but not yet
  275. * reflected in the hardware admin state, false otherwise.
  276. */
  277. static bool
  278. pse_pi_is_admin_enable_pending(struct pse_controller_dev *pcdev, int id)
  279. {
  280. int ret;
  281. /* PI not enabled or nothing is plugged */
  282. if (!pcdev->pi[id].admin_state_enabled ||
  283. !pcdev->pi[id].isr_pd_detected)
  284. return false;
  285. ret = pse_pi_is_hw_enabled(pcdev, id);
  286. /* PSE PI is already enabled at hardware level */
  287. if (ret == 1)
  288. return false;
  289. return true;
  290. }
  291. static int _pse_pi_delivery_power_sw_pw_ctrl(struct pse_controller_dev *pcdev,
  292. int id,
  293. struct netlink_ext_ack *extack);
  294. /**
  295. * pse_pw_d_retry_power_delivery - Retry power delivery for pending ports in a
  296. * PSE power domain
  297. * @pcdev: a pointer to the PSE controller device
  298. * @pw_d: a pointer to the PSE power domain
  299. *
  300. * Scans all ports in the specified power domain and attempts to enable power
  301. * delivery to any ports that have admin enable state set but don't yet have
  302. * hardware power enabled. Used when there are changes in connection status,
  303. * admin state, or priority that might allow previously unpowered ports to
  304. * receive power, especially in over-budget conditions.
  305. */
  306. static void pse_pw_d_retry_power_delivery(struct pse_controller_dev *pcdev,
  307. struct pse_power_domain *pw_d)
  308. {
  309. int i, ret = 0;
  310. for (i = 0; i < pcdev->nr_lines; i++) {
  311. int prio_max = pcdev->nr_lines;
  312. struct netlink_ext_ack extack;
  313. if (pcdev->pi[i].pw_d != pw_d)
  314. continue;
  315. if (!pse_pi_is_admin_enable_pending(pcdev, i))
  316. continue;
  317. /* Do not try to enable PI with a lower prio (higher value)
  318. * than one which already can't be enabled.
  319. */
  320. if (pcdev->pi[i].prio > prio_max)
  321. continue;
  322. ret = _pse_pi_delivery_power_sw_pw_ctrl(pcdev, i, &extack);
  323. if (ret == -ERANGE)
  324. prio_max = pcdev->pi[i].prio;
  325. }
  326. }
  327. /**
  328. * pse_pw_d_is_sw_pw_control - Determine if power control is software managed
  329. * @pcdev: a pointer to the PSE controller device
  330. * @pw_d: a pointer to the PSE power domain
  331. *
  332. * This function determines whether the power control for a specific power
  333. * domain is managed by software in the interrupt handler rather than directly
  334. * by hardware.
  335. *
  336. * Software power control is active in the following cases:
  337. * - When the budget evaluation strategy is set to static
  338. * - When the budget evaluation strategy is disabled but the PSE controller
  339. * has an interrupt handler that can report if a Powered Device is connected
  340. *
  341. * Return: true if the power control of the power domain is managed by software,
  342. * false otherwise
  343. */
  344. static bool pse_pw_d_is_sw_pw_control(struct pse_controller_dev *pcdev,
  345. struct pse_power_domain *pw_d)
  346. {
  347. if (!pw_d)
  348. return false;
  349. if (pw_d->budget_eval_strategy == PSE_BUDGET_EVAL_STRAT_STATIC)
  350. return true;
  351. if (pw_d->budget_eval_strategy == PSE_BUDGET_EVAL_STRAT_DISABLED &&
  352. pcdev->ops->pi_enable && pcdev->irq)
  353. return true;
  354. return false;
  355. }
  356. static int pse_pi_is_enabled(struct regulator_dev *rdev)
  357. {
  358. struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
  359. const struct pse_controller_ops *ops;
  360. int id, ret;
  361. ops = pcdev->ops;
  362. if (!ops->pi_get_admin_state)
  363. return -EOPNOTSUPP;
  364. id = rdev_get_id(rdev);
  365. mutex_lock(&pcdev->lock);
  366. if (pse_pw_d_is_sw_pw_control(pcdev, pcdev->pi[id].pw_d)) {
  367. ret = pcdev->pi[id].admin_state_enabled;
  368. goto out;
  369. }
  370. ret = pse_pi_is_hw_enabled(pcdev, id);
  371. out:
  372. mutex_unlock(&pcdev->lock);
  373. return ret;
  374. }
  375. /**
  376. * pse_pi_deallocate_pw_budget - Deallocate power budget of the PI
  377. * @pi: a pointer to the PSE PI
  378. */
  379. static void pse_pi_deallocate_pw_budget(struct pse_pi *pi)
  380. {
  381. if (!pi->pw_d || !pi->pw_allocated_mW)
  382. return;
  383. regulator_free_power_budget(pi->pw_d->supply, pi->pw_allocated_mW);
  384. pi->pw_allocated_mW = 0;
  385. }
  386. /**
  387. * _pse_pi_disable - Call disable operation. Assumes the PSE lock has been
  388. * acquired.
  389. * @pcdev: a pointer to the PSE
  390. * @id: index of the PSE control
  391. *
  392. * Return: 0 on success and failure value on error
  393. */
  394. static int _pse_pi_disable(struct pse_controller_dev *pcdev, int id)
  395. {
  396. const struct pse_controller_ops *ops = pcdev->ops;
  397. int ret;
  398. if (!ops->pi_disable)
  399. return -EOPNOTSUPP;
  400. ret = ops->pi_disable(pcdev, id);
  401. if (ret)
  402. return ret;
  403. pse_pi_deallocate_pw_budget(&pcdev->pi[id]);
  404. if (pse_pw_d_is_sw_pw_control(pcdev, pcdev->pi[id].pw_d))
  405. pse_pw_d_retry_power_delivery(pcdev, pcdev->pi[id].pw_d);
  406. return 0;
  407. }
  408. /**
  409. * pse_disable_pi_pol - Disable a PI on a power budget policy
  410. * @pcdev: a pointer to the PSE
  411. * @id: index of the PSE PI
  412. *
  413. * Return: 0 on success and failure value on error
  414. */
  415. static int pse_disable_pi_pol(struct pse_controller_dev *pcdev, int id)
  416. {
  417. unsigned long notifs = ETHTOOL_PSE_EVENT_OVER_BUDGET;
  418. struct pse_ntf ntf = {};
  419. int ret;
  420. dev_dbg(pcdev->dev, "Disabling PI %d to free power budget\n", id);
  421. ret = _pse_pi_disable(pcdev, id);
  422. if (ret)
  423. notifs |= ETHTOOL_PSE_EVENT_SW_PW_CONTROL_ERROR;
  424. ntf.notifs = notifs;
  425. ntf.id = id;
  426. kfifo_in_spinlocked(&pcdev->ntf_fifo, &ntf, 1, &pcdev->ntf_fifo_lock);
  427. schedule_work(&pcdev->ntf_work);
  428. return ret;
  429. }
  430. /**
  431. * pse_disable_pi_prio - Disable all PIs of a given priority inside a PSE
  432. * power domain
  433. * @pcdev: a pointer to the PSE
  434. * @pw_d: a pointer to the PSE power domain
  435. * @prio: priority
  436. *
  437. * Return: 0 on success and failure value on error
  438. */
  439. static int pse_disable_pi_prio(struct pse_controller_dev *pcdev,
  440. struct pse_power_domain *pw_d,
  441. int prio)
  442. {
  443. int i;
  444. for (i = 0; i < pcdev->nr_lines; i++) {
  445. int ret;
  446. if (pcdev->pi[i].prio != prio ||
  447. pcdev->pi[i].pw_d != pw_d ||
  448. pse_pi_is_hw_enabled(pcdev, i) <= 0)
  449. continue;
  450. ret = pse_disable_pi_pol(pcdev, i);
  451. if (ret)
  452. return ret;
  453. }
  454. return 0;
  455. }
  456. /**
  457. * pse_pi_allocate_pw_budget_static_prio - Allocate power budget for the PI
  458. * when the budget eval strategy is
  459. * static
  460. * @pcdev: a pointer to the PSE
  461. * @id: index of the PSE control
  462. * @pw_req: power requested in mW
  463. * @extack: extack for error reporting
  464. *
  465. * Allocates power using static budget evaluation strategy, where allocation
  466. * is based on PD classification. When insufficient budget is available,
  467. * lower-priority ports (higher priority numbers) are turned off first.
  468. *
  469. * Return: 0 on success and failure value on error
  470. */
  471. static int
  472. pse_pi_allocate_pw_budget_static_prio(struct pse_controller_dev *pcdev, int id,
  473. int pw_req, struct netlink_ext_ack *extack)
  474. {
  475. struct pse_pi *pi = &pcdev->pi[id];
  476. int ret, _prio;
  477. _prio = pcdev->nr_lines;
  478. while (regulator_request_power_budget(pi->pw_d->supply, pw_req) == -ERANGE) {
  479. if (_prio <= pi->prio) {
  480. NL_SET_ERR_MSG_FMT(extack,
  481. "PI %d: not enough power budget available",
  482. id);
  483. return -ERANGE;
  484. }
  485. ret = pse_disable_pi_prio(pcdev, pi->pw_d, _prio);
  486. if (ret < 0)
  487. return ret;
  488. _prio--;
  489. }
  490. pi->pw_allocated_mW = pw_req;
  491. return 0;
  492. }
  493. /**
  494. * pse_pi_allocate_pw_budget - Allocate power budget for the PI
  495. * @pcdev: a pointer to the PSE
  496. * @id: index of the PSE control
  497. * @pw_req: power requested in mW
  498. * @extack: extack for error reporting
  499. *
  500. * Return: 0 on success and failure value on error
  501. */
  502. static int pse_pi_allocate_pw_budget(struct pse_controller_dev *pcdev, int id,
  503. int pw_req, struct netlink_ext_ack *extack)
  504. {
  505. struct pse_pi *pi = &pcdev->pi[id];
  506. if (!pi->pw_d)
  507. return 0;
  508. /* PSE_BUDGET_EVAL_STRAT_STATIC */
  509. if (pi->pw_d->budget_eval_strategy == PSE_BUDGET_EVAL_STRAT_STATIC)
  510. return pse_pi_allocate_pw_budget_static_prio(pcdev, id, pw_req,
  511. extack);
  512. return 0;
  513. }
  514. /**
  515. * _pse_pi_delivery_power_sw_pw_ctrl - Enable PSE PI in case of software power
  516. * control. Assumes the PSE lock has been
  517. * acquired.
  518. * @pcdev: a pointer to the PSE
  519. * @id: index of the PSE control
  520. * @extack: extack for error reporting
  521. *
  522. * Return: 0 on success and failure value on error
  523. */
  524. static int _pse_pi_delivery_power_sw_pw_ctrl(struct pse_controller_dev *pcdev,
  525. int id,
  526. struct netlink_ext_ack *extack)
  527. {
  528. const struct pse_controller_ops *ops = pcdev->ops;
  529. struct pse_pi *pi = &pcdev->pi[id];
  530. int ret, pw_req;
  531. if (!ops->pi_get_pw_req) {
  532. /* No power allocation management */
  533. ret = ops->pi_enable(pcdev, id);
  534. if (ret)
  535. NL_SET_ERR_MSG_FMT(extack,
  536. "PI %d: enable error %d",
  537. id, ret);
  538. return ret;
  539. }
  540. ret = ops->pi_get_pw_req(pcdev, id);
  541. if (ret < 0)
  542. return ret;
  543. pw_req = ret;
  544. /* Compare requested power with port power limit and use the lowest
  545. * one.
  546. */
  547. if (ops->pi_get_pw_limit) {
  548. ret = ops->pi_get_pw_limit(pcdev, id);
  549. if (ret < 0)
  550. return ret;
  551. if (ret < pw_req)
  552. pw_req = ret;
  553. }
  554. ret = pse_pi_allocate_pw_budget(pcdev, id, pw_req, extack);
  555. if (ret)
  556. return ret;
  557. ret = ops->pi_enable(pcdev, id);
  558. if (ret) {
  559. pse_pi_deallocate_pw_budget(pi);
  560. NL_SET_ERR_MSG_FMT(extack,
  561. "PI %d: enable error %d",
  562. id, ret);
  563. return ret;
  564. }
  565. return 0;
  566. }
  567. static int pse_pi_enable(struct regulator_dev *rdev)
  568. {
  569. struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
  570. const struct pse_controller_ops *ops;
  571. int id, ret = 0;
  572. ops = pcdev->ops;
  573. if (!ops->pi_enable)
  574. return -EOPNOTSUPP;
  575. id = rdev_get_id(rdev);
  576. mutex_lock(&pcdev->lock);
  577. if (pse_pw_d_is_sw_pw_control(pcdev, pcdev->pi[id].pw_d)) {
  578. /* Manage enabled status by software.
  579. * Real enable process will happen if a port is connected.
  580. */
  581. if (pcdev->pi[id].isr_pd_detected) {
  582. struct netlink_ext_ack extack;
  583. ret = _pse_pi_delivery_power_sw_pw_ctrl(pcdev, id, &extack);
  584. }
  585. if (!ret || ret == -ERANGE) {
  586. pcdev->pi[id].admin_state_enabled = 1;
  587. ret = 0;
  588. }
  589. mutex_unlock(&pcdev->lock);
  590. return ret;
  591. }
  592. ret = ops->pi_enable(pcdev, id);
  593. if (!ret)
  594. pcdev->pi[id].admin_state_enabled = 1;
  595. mutex_unlock(&pcdev->lock);
  596. return ret;
  597. }
  598. static int pse_pi_disable(struct regulator_dev *rdev)
  599. {
  600. struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
  601. struct pse_pi *pi;
  602. int id, ret;
  603. id = rdev_get_id(rdev);
  604. pi = &pcdev->pi[id];
  605. mutex_lock(&pcdev->lock);
  606. ret = _pse_pi_disable(pcdev, id);
  607. if (!ret)
  608. pi->admin_state_enabled = 0;
  609. mutex_unlock(&pcdev->lock);
  610. return 0;
  611. }
  612. static int _pse_pi_get_voltage(struct regulator_dev *rdev)
  613. {
  614. struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
  615. const struct pse_controller_ops *ops;
  616. int id;
  617. ops = pcdev->ops;
  618. if (!ops->pi_get_voltage)
  619. return -EOPNOTSUPP;
  620. id = rdev_get_id(rdev);
  621. return ops->pi_get_voltage(pcdev, id);
  622. }
  623. static int pse_pi_get_voltage(struct regulator_dev *rdev)
  624. {
  625. struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
  626. int ret;
  627. mutex_lock(&pcdev->lock);
  628. ret = _pse_pi_get_voltage(rdev);
  629. mutex_unlock(&pcdev->lock);
  630. return ret;
  631. }
  632. static int pse_pi_get_current_limit(struct regulator_dev *rdev)
  633. {
  634. struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
  635. const struct pse_controller_ops *ops;
  636. int id, uV, mW, ret;
  637. s64 tmp_64;
  638. ops = pcdev->ops;
  639. id = rdev_get_id(rdev);
  640. if (!ops->pi_get_pw_limit || !ops->pi_get_voltage)
  641. return -EOPNOTSUPP;
  642. mutex_lock(&pcdev->lock);
  643. ret = ops->pi_get_pw_limit(pcdev, id);
  644. if (ret < 0)
  645. goto out;
  646. mW = ret;
  647. ret = _pse_pi_get_voltage(rdev);
  648. if (!ret) {
  649. dev_err(pcdev->dev, "Voltage null\n");
  650. ret = -ERANGE;
  651. goto out;
  652. }
  653. if (ret < 0)
  654. goto out;
  655. uV = ret;
  656. tmp_64 = mW;
  657. tmp_64 *= 1000000000ull;
  658. /* uA = mW * 1000000000 / uV */
  659. ret = DIV_ROUND_CLOSEST_ULL(tmp_64, uV);
  660. out:
  661. mutex_unlock(&pcdev->lock);
  662. return ret;
  663. }
  664. static int pse_pi_set_current_limit(struct regulator_dev *rdev, int min_uA,
  665. int max_uA)
  666. {
  667. struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
  668. const struct pse_controller_ops *ops;
  669. int id, mW, ret;
  670. s64 tmp_64;
  671. ops = pcdev->ops;
  672. if (!ops->pi_set_pw_limit || !ops->pi_get_voltage)
  673. return -EOPNOTSUPP;
  674. if (max_uA > MAX_PI_CURRENT)
  675. return -ERANGE;
  676. id = rdev_get_id(rdev);
  677. mutex_lock(&pcdev->lock);
  678. ret = _pse_pi_get_voltage(rdev);
  679. if (!ret) {
  680. dev_err(pcdev->dev, "Voltage null\n");
  681. ret = -ERANGE;
  682. goto out;
  683. }
  684. if (ret < 0)
  685. goto out;
  686. tmp_64 = ret;
  687. tmp_64 *= max_uA;
  688. /* mW = uA * uV / 1000000000 */
  689. mW = DIV_ROUND_CLOSEST_ULL(tmp_64, 1000000000);
  690. ret = ops->pi_set_pw_limit(pcdev, id, mW);
  691. out:
  692. mutex_unlock(&pcdev->lock);
  693. return ret;
  694. }
  695. static const struct regulator_ops pse_pi_ops = {
  696. .is_enabled = pse_pi_is_enabled,
  697. .enable = pse_pi_enable,
  698. .disable = pse_pi_disable,
  699. .get_voltage = pse_pi_get_voltage,
  700. .get_current_limit = pse_pi_get_current_limit,
  701. .set_current_limit = pse_pi_set_current_limit,
  702. };
  703. static int
  704. devm_pse_pi_regulator_register(struct pse_controller_dev *pcdev,
  705. char *name, int id)
  706. {
  707. struct regulator_init_data *rinit_data;
  708. struct regulator_config rconfig = {0};
  709. struct regulator_desc *rdesc;
  710. struct regulator_dev *rdev;
  711. rinit_data = devm_kzalloc(pcdev->dev, sizeof(*rinit_data),
  712. GFP_KERNEL);
  713. if (!rinit_data)
  714. return -ENOMEM;
  715. rdesc = devm_kzalloc(pcdev->dev, sizeof(*rdesc), GFP_KERNEL);
  716. if (!rdesc)
  717. return -ENOMEM;
  718. /* Regulator descriptor id have to be the same as its associated
  719. * PSE PI id for the well functioning of the PSE controls.
  720. */
  721. rdesc->id = id;
  722. rdesc->name = name;
  723. rdesc->type = REGULATOR_VOLTAGE;
  724. rdesc->ops = &pse_pi_ops;
  725. rdesc->owner = pcdev->owner;
  726. rinit_data->constraints.valid_ops_mask = REGULATOR_CHANGE_STATUS;
  727. if (pcdev->ops->pi_set_pw_limit)
  728. rinit_data->constraints.valid_ops_mask |=
  729. REGULATOR_CHANGE_CURRENT;
  730. rinit_data->supply_regulator = "vpwr";
  731. rconfig.dev = pcdev->dev;
  732. rconfig.driver_data = pcdev;
  733. rconfig.init_data = rinit_data;
  734. rconfig.of_node = pcdev->pi[id].np;
  735. rdev = devm_regulator_register(pcdev->dev, rdesc, &rconfig);
  736. if (IS_ERR(rdev)) {
  737. dev_err_probe(pcdev->dev, PTR_ERR(rdev),
  738. "Failed to register regulator\n");
  739. return PTR_ERR(rdev);
  740. }
  741. pcdev->pi[id].rdev = rdev;
  742. return 0;
  743. }
  744. static void __pse_pw_d_release(struct kref *kref)
  745. {
  746. struct pse_power_domain *pw_d = container_of(kref,
  747. struct pse_power_domain,
  748. refcnt);
  749. regulator_put(pw_d->supply);
  750. xa_erase(&pse_pw_d_map, pw_d->id);
  751. mutex_unlock(&pse_pw_d_mutex);
  752. }
  753. /**
  754. * pse_flush_pw_ds - flush all PSE power domains of a PSE
  755. * @pcdev: a pointer to the initialized PSE controller device
  756. */
  757. static void pse_flush_pw_ds(struct pse_controller_dev *pcdev)
  758. {
  759. struct pse_power_domain *pw_d;
  760. int i;
  761. for (i = 0; i < pcdev->nr_lines; i++) {
  762. if (!pcdev->pi[i].pw_d)
  763. continue;
  764. pw_d = xa_load(&pse_pw_d_map, pcdev->pi[i].pw_d->id);
  765. if (!pw_d)
  766. continue;
  767. kref_put_mutex(&pw_d->refcnt, __pse_pw_d_release,
  768. &pse_pw_d_mutex);
  769. }
  770. }
  771. /**
  772. * devm_pse_alloc_pw_d - allocate a new PSE power domain for a device
  773. * @dev: device that is registering this PSE power domain
  774. *
  775. * Return: Pointer to the newly allocated PSE power domain or error pointers
  776. */
  777. static struct pse_power_domain *devm_pse_alloc_pw_d(struct device *dev)
  778. {
  779. struct pse_power_domain *pw_d;
  780. int index, ret;
  781. pw_d = devm_kzalloc(dev, sizeof(*pw_d), GFP_KERNEL);
  782. if (!pw_d)
  783. return ERR_PTR(-ENOMEM);
  784. ret = xa_alloc(&pse_pw_d_map, &index, pw_d, XA_LIMIT(1, PSE_PW_D_LIMIT),
  785. GFP_KERNEL);
  786. if (ret)
  787. return ERR_PTR(ret);
  788. kref_init(&pw_d->refcnt);
  789. pw_d->id = index;
  790. return pw_d;
  791. }
  792. /**
  793. * pse_register_pw_ds - register the PSE power domains for a PSE
  794. * @pcdev: a pointer to the PSE controller device
  795. *
  796. * Return: 0 on success and failure value on error
  797. */
  798. static int pse_register_pw_ds(struct pse_controller_dev *pcdev)
  799. {
  800. int i, ret = 0;
  801. mutex_lock(&pse_pw_d_mutex);
  802. for (i = 0; i < pcdev->nr_lines; i++) {
  803. struct regulator_dev *rdev = pcdev->pi[i].rdev;
  804. struct pse_power_domain *pw_d;
  805. struct regulator *supply;
  806. bool present = false;
  807. unsigned long index;
  808. /* No regulator or regulator parent supply registered.
  809. * We need a regulator parent to register a PSE power domain
  810. */
  811. if (!rdev || !rdev->supply)
  812. continue;
  813. xa_for_each(&pse_pw_d_map, index, pw_d) {
  814. /* Power supply already registered as a PSE power
  815. * domain.
  816. */
  817. if (regulator_is_equal(pw_d->supply, rdev->supply)) {
  818. present = true;
  819. pcdev->pi[i].pw_d = pw_d;
  820. break;
  821. }
  822. }
  823. if (present) {
  824. kref_get(&pw_d->refcnt);
  825. continue;
  826. }
  827. pw_d = devm_pse_alloc_pw_d(pcdev->dev);
  828. if (IS_ERR(pw_d)) {
  829. ret = PTR_ERR(pw_d);
  830. goto out;
  831. }
  832. supply = regulator_get(&rdev->dev, rdev->supply_name);
  833. if (IS_ERR(supply)) {
  834. xa_erase(&pse_pw_d_map, pw_d->id);
  835. ret = PTR_ERR(supply);
  836. goto out;
  837. }
  838. pw_d->supply = supply;
  839. if (pcdev->supp_budget_eval_strategies)
  840. pw_d->budget_eval_strategy = pcdev->supp_budget_eval_strategies;
  841. else
  842. pw_d->budget_eval_strategy = PSE_BUDGET_EVAL_STRAT_DISABLED;
  843. kref_init(&pw_d->refcnt);
  844. pcdev->pi[i].pw_d = pw_d;
  845. }
  846. out:
  847. mutex_unlock(&pse_pw_d_mutex);
  848. return ret;
  849. }
  850. /**
  851. * pse_send_ntf_worker - Worker to send PSE notifications
  852. * @work: work object
  853. *
  854. * Manage and send PSE netlink notifications using a workqueue to avoid
  855. * deadlock between pcdev_lock and pse_list_mutex.
  856. */
  857. static void pse_send_ntf_worker(struct work_struct *work)
  858. {
  859. struct pse_controller_dev *pcdev;
  860. struct pse_ntf ntf;
  861. pcdev = container_of(work, struct pse_controller_dev, ntf_work);
  862. while (kfifo_out(&pcdev->ntf_fifo, &ntf, 1)) {
  863. struct net_device *netdev;
  864. struct pse_control *psec;
  865. psec = pse_control_find_by_id(pcdev, ntf.id);
  866. rtnl_lock();
  867. netdev = pse_control_get_netdev(psec);
  868. if (netdev)
  869. ethnl_pse_send_ntf(netdev, ntf.notifs);
  870. rtnl_unlock();
  871. pse_control_put(psec);
  872. }
  873. }
  874. /**
  875. * pse_controller_register - register a PSE controller device
  876. * @pcdev: a pointer to the initialized PSE controller device
  877. *
  878. * Return: 0 on success and failure value on error
  879. */
  880. int pse_controller_register(struct pse_controller_dev *pcdev)
  881. {
  882. size_t reg_name_len;
  883. int ret, i;
  884. mutex_init(&pcdev->lock);
  885. INIT_LIST_HEAD(&pcdev->pse_control_head);
  886. spin_lock_init(&pcdev->ntf_fifo_lock);
  887. ret = kfifo_alloc(&pcdev->ntf_fifo, pcdev->nr_lines, GFP_KERNEL);
  888. if (ret) {
  889. dev_err(pcdev->dev, "failed to allocate kfifo notifications\n");
  890. return ret;
  891. }
  892. INIT_WORK(&pcdev->ntf_work, pse_send_ntf_worker);
  893. if (!pcdev->nr_lines)
  894. pcdev->nr_lines = 1;
  895. if (!pcdev->ops->pi_get_admin_state ||
  896. !pcdev->ops->pi_get_pw_status) {
  897. dev_err(pcdev->dev,
  898. "Mandatory status report callbacks are missing");
  899. return -EINVAL;
  900. }
  901. ret = of_load_pse_pis(pcdev);
  902. if (ret)
  903. return ret;
  904. if (pcdev->ops->setup_pi_matrix) {
  905. ret = pcdev->ops->setup_pi_matrix(pcdev);
  906. if (ret)
  907. return ret;
  908. }
  909. /* Each regulator name len is pcdev dev name + 7 char +
  910. * int max digit number (10) + 1
  911. */
  912. reg_name_len = strlen(dev_name(pcdev->dev)) + 18;
  913. /* Register PI regulators */
  914. for (i = 0; i < pcdev->nr_lines; i++) {
  915. char *reg_name;
  916. /* Do not register regulator for PIs not described */
  917. if (!pcdev->no_of_pse_pi && !pcdev->pi[i].np)
  918. continue;
  919. reg_name = devm_kzalloc(pcdev->dev, reg_name_len, GFP_KERNEL);
  920. if (!reg_name)
  921. return -ENOMEM;
  922. snprintf(reg_name, reg_name_len, "pse-%s_pi%d",
  923. dev_name(pcdev->dev), i);
  924. ret = devm_pse_pi_regulator_register(pcdev, reg_name, i);
  925. if (ret)
  926. return ret;
  927. }
  928. ret = pse_register_pw_ds(pcdev);
  929. if (ret)
  930. return ret;
  931. mutex_lock(&pse_list_mutex);
  932. list_add(&pcdev->list, &pse_controller_list);
  933. mutex_unlock(&pse_list_mutex);
  934. return 0;
  935. }
  936. EXPORT_SYMBOL_GPL(pse_controller_register);
  937. /**
  938. * pse_controller_unregister - unregister a PSE controller device
  939. * @pcdev: a pointer to the PSE controller device
  940. */
  941. void pse_controller_unregister(struct pse_controller_dev *pcdev)
  942. {
  943. pse_flush_pw_ds(pcdev);
  944. pse_release_pis(pcdev);
  945. if (pcdev->irq)
  946. disable_irq(pcdev->irq);
  947. cancel_work_sync(&pcdev->ntf_work);
  948. kfifo_free(&pcdev->ntf_fifo);
  949. mutex_lock(&pse_list_mutex);
  950. list_del(&pcdev->list);
  951. mutex_unlock(&pse_list_mutex);
  952. }
  953. EXPORT_SYMBOL_GPL(pse_controller_unregister);
  954. static void devm_pse_controller_release(struct device *dev, void *res)
  955. {
  956. pse_controller_unregister(*(struct pse_controller_dev **)res);
  957. }
  958. /**
  959. * devm_pse_controller_register - resource managed pse_controller_register()
  960. * @dev: device that is registering this PSE controller
  961. * @pcdev: a pointer to the initialized PSE controller device
  962. *
  963. * Managed pse_controller_register(). For PSE controllers registered by
  964. * this function, pse_controller_unregister() is automatically called on
  965. * driver detach. See pse_controller_register() for more information.
  966. *
  967. * Return: 0 on success and failure value on error
  968. */
  969. int devm_pse_controller_register(struct device *dev,
  970. struct pse_controller_dev *pcdev)
  971. {
  972. struct pse_controller_dev **pcdevp;
  973. int ret;
  974. pcdevp = devres_alloc(devm_pse_controller_release, sizeof(*pcdevp),
  975. GFP_KERNEL);
  976. if (!pcdevp)
  977. return -ENOMEM;
  978. ret = pse_controller_register(pcdev);
  979. if (ret) {
  980. devres_free(pcdevp);
  981. return ret;
  982. }
  983. *pcdevp = pcdev;
  984. devres_add(dev, pcdevp);
  985. return 0;
  986. }
  987. EXPORT_SYMBOL_GPL(devm_pse_controller_register);
  988. struct pse_irq {
  989. struct pse_controller_dev *pcdev;
  990. struct pse_irq_desc desc;
  991. unsigned long *notifs;
  992. };
  993. /**
  994. * pse_to_regulator_notifs - Convert PSE notifications to Regulator
  995. * notifications
  996. * @notifs: PSE notifications
  997. *
  998. * Return: Regulator notifications
  999. */
  1000. static unsigned long pse_to_regulator_notifs(unsigned long notifs)
  1001. {
  1002. unsigned long rnotifs = 0;
  1003. if (notifs & ETHTOOL_PSE_EVENT_OVER_CURRENT)
  1004. rnotifs |= REGULATOR_EVENT_OVER_CURRENT;
  1005. if (notifs & ETHTOOL_PSE_EVENT_OVER_TEMP)
  1006. rnotifs |= REGULATOR_EVENT_OVER_TEMP;
  1007. return rnotifs;
  1008. }
  1009. /**
  1010. * pse_set_config_isr - Set PSE control config according to the PSE
  1011. * notifications
  1012. * @pcdev: a pointer to the PSE
  1013. * @id: index of the PSE control
  1014. * @notifs: PSE event notifications
  1015. *
  1016. * Return: 0 on success and failure value on error
  1017. */
  1018. static int pse_set_config_isr(struct pse_controller_dev *pcdev, int id,
  1019. unsigned long notifs)
  1020. {
  1021. int ret = 0;
  1022. if (notifs & PSE_BUDGET_EVAL_STRAT_DYNAMIC)
  1023. return 0;
  1024. if ((notifs & ETHTOOL_C33_PSE_EVENT_DISCONNECTION) &&
  1025. ((notifs & ETHTOOL_C33_PSE_EVENT_DETECTION) ||
  1026. (notifs & ETHTOOL_C33_PSE_EVENT_CLASSIFICATION))) {
  1027. dev_dbg(pcdev->dev,
  1028. "PI %d: error, connection and disconnection reported simultaneously",
  1029. id);
  1030. return -EINVAL;
  1031. }
  1032. if (notifs & ETHTOOL_C33_PSE_EVENT_CLASSIFICATION) {
  1033. struct netlink_ext_ack extack;
  1034. pcdev->pi[id].isr_pd_detected = true;
  1035. if (pcdev->pi[id].admin_state_enabled) {
  1036. ret = _pse_pi_delivery_power_sw_pw_ctrl(pcdev, id,
  1037. &extack);
  1038. if (ret == -ERANGE)
  1039. ret = 0;
  1040. }
  1041. } else if (notifs & ETHTOOL_C33_PSE_EVENT_DISCONNECTION) {
  1042. if (pcdev->pi[id].admin_state_enabled &&
  1043. pcdev->pi[id].isr_pd_detected)
  1044. ret = _pse_pi_disable(pcdev, id);
  1045. pcdev->pi[id].isr_pd_detected = false;
  1046. }
  1047. return ret;
  1048. }
  1049. /**
  1050. * pse_isr - IRQ handler for PSE
  1051. * @irq: irq number
  1052. * @data: pointer to user interrupt structure
  1053. *
  1054. * Return: irqreturn_t - status of IRQ
  1055. */
  1056. static irqreturn_t pse_isr(int irq, void *data)
  1057. {
  1058. struct pse_controller_dev *pcdev;
  1059. unsigned long notifs_mask = 0;
  1060. struct pse_irq_desc *desc;
  1061. struct pse_irq *h = data;
  1062. int ret, i;
  1063. desc = &h->desc;
  1064. pcdev = h->pcdev;
  1065. /* Clear notifs mask */
  1066. memset(h->notifs, 0, pcdev->nr_lines * sizeof(*h->notifs));
  1067. mutex_lock(&pcdev->lock);
  1068. ret = desc->map_event(irq, pcdev, h->notifs, &notifs_mask);
  1069. if (ret || !notifs_mask) {
  1070. mutex_unlock(&pcdev->lock);
  1071. return IRQ_NONE;
  1072. }
  1073. for_each_set_bit(i, &notifs_mask, pcdev->nr_lines) {
  1074. unsigned long notifs, rnotifs;
  1075. struct pse_ntf ntf = {};
  1076. /* Do nothing PI not described */
  1077. if (!pcdev->pi[i].rdev)
  1078. continue;
  1079. notifs = h->notifs[i];
  1080. if (pse_pw_d_is_sw_pw_control(pcdev, pcdev->pi[i].pw_d)) {
  1081. ret = pse_set_config_isr(pcdev, i, notifs);
  1082. if (ret)
  1083. notifs |= ETHTOOL_PSE_EVENT_SW_PW_CONTROL_ERROR;
  1084. }
  1085. dev_dbg(h->pcdev->dev,
  1086. "Sending PSE notification EVT 0x%lx\n", notifs);
  1087. ntf.notifs = notifs;
  1088. ntf.id = i;
  1089. kfifo_in_spinlocked(&pcdev->ntf_fifo, &ntf, 1,
  1090. &pcdev->ntf_fifo_lock);
  1091. schedule_work(&pcdev->ntf_work);
  1092. rnotifs = pse_to_regulator_notifs(notifs);
  1093. regulator_notifier_call_chain(pcdev->pi[i].rdev, rnotifs,
  1094. NULL);
  1095. }
  1096. mutex_unlock(&pcdev->lock);
  1097. return IRQ_HANDLED;
  1098. }
  1099. /**
  1100. * devm_pse_irq_helper - Register IRQ based PSE event notifier
  1101. * @pcdev: a pointer to the PSE
  1102. * @irq: the irq value to be passed to request_irq
  1103. * @irq_flags: the flags to be passed to request_irq
  1104. * @d: PSE interrupt description
  1105. *
  1106. * Return: 0 on success and errno on failure
  1107. */
  1108. int devm_pse_irq_helper(struct pse_controller_dev *pcdev, int irq,
  1109. int irq_flags, const struct pse_irq_desc *d)
  1110. {
  1111. struct device *dev = pcdev->dev;
  1112. size_t irq_name_len;
  1113. struct pse_irq *h;
  1114. char *irq_name;
  1115. int ret;
  1116. if (!d || !d->map_event || !d->name)
  1117. return -EINVAL;
  1118. h = devm_kzalloc(dev, sizeof(*h), GFP_KERNEL);
  1119. if (!h)
  1120. return -ENOMEM;
  1121. h->pcdev = pcdev;
  1122. h->desc = *d;
  1123. /* IRQ name len is pcdev dev name + 5 char + irq desc name + 1 */
  1124. irq_name_len = strlen(dev_name(pcdev->dev)) + 5 + strlen(d->name) + 1;
  1125. irq_name = devm_kzalloc(dev, irq_name_len, GFP_KERNEL);
  1126. if (!irq_name)
  1127. return -ENOMEM;
  1128. snprintf(irq_name, irq_name_len, "pse-%s:%s", dev_name(pcdev->dev),
  1129. d->name);
  1130. h->notifs = devm_kcalloc(dev, pcdev->nr_lines,
  1131. sizeof(*h->notifs), GFP_KERNEL);
  1132. if (!h->notifs)
  1133. return -ENOMEM;
  1134. ret = devm_request_threaded_irq(dev, irq, NULL, pse_isr,
  1135. IRQF_ONESHOT | irq_flags,
  1136. irq_name, h);
  1137. if (ret)
  1138. dev_err(pcdev->dev, "Failed to request IRQ %d\n", irq);
  1139. pcdev->irq = irq;
  1140. return ret;
  1141. }
  1142. EXPORT_SYMBOL_GPL(devm_pse_irq_helper);
  1143. /* PSE control section */
  1144. static void __pse_control_release(struct kref *kref)
  1145. {
  1146. struct pse_control *psec = container_of(kref, struct pse_control,
  1147. refcnt);
  1148. lockdep_assert_held(&pse_list_mutex);
  1149. if (psec->pcdev->pi[psec->id].admin_state_enabled)
  1150. regulator_disable(psec->ps);
  1151. devm_regulator_put(psec->ps);
  1152. module_put(psec->pcdev->owner);
  1153. list_del(&psec->list);
  1154. kfree(psec);
  1155. }
  1156. static void __pse_control_put_internal(struct pse_control *psec)
  1157. {
  1158. lockdep_assert_held(&pse_list_mutex);
  1159. kref_put(&psec->refcnt, __pse_control_release);
  1160. }
  1161. /**
  1162. * pse_control_put - free the PSE control
  1163. * @psec: PSE control pointer
  1164. */
  1165. void pse_control_put(struct pse_control *psec)
  1166. {
  1167. if (IS_ERR_OR_NULL(psec))
  1168. return;
  1169. mutex_lock(&pse_list_mutex);
  1170. __pse_control_put_internal(psec);
  1171. mutex_unlock(&pse_list_mutex);
  1172. }
  1173. EXPORT_SYMBOL_GPL(pse_control_put);
  1174. static struct pse_control *
  1175. pse_control_get_internal(struct pse_controller_dev *pcdev, unsigned int index,
  1176. struct phy_device *phydev)
  1177. {
  1178. struct pse_control *psec;
  1179. int ret;
  1180. lockdep_assert_held(&pse_list_mutex);
  1181. list_for_each_entry(psec, &pcdev->pse_control_head, list) {
  1182. if (psec->id == index) {
  1183. kref_get(&psec->refcnt);
  1184. return psec;
  1185. }
  1186. }
  1187. psec = kzalloc_obj(*psec);
  1188. if (!psec)
  1189. return ERR_PTR(-ENOMEM);
  1190. if (!try_module_get(pcdev->owner)) {
  1191. ret = -ENODEV;
  1192. goto free_psec;
  1193. }
  1194. if (!pcdev->ops->pi_get_admin_state) {
  1195. ret = -EOPNOTSUPP;
  1196. goto free_psec;
  1197. }
  1198. /* Initialize admin_state_enabled before the regulator_get. This
  1199. * aims to have the right value reported in the first is_enabled
  1200. * call in case of control managed by software.
  1201. */
  1202. ret = pse_pi_is_hw_enabled(pcdev, index);
  1203. if (ret < 0)
  1204. goto free_psec;
  1205. pcdev->pi[index].admin_state_enabled = ret;
  1206. psec->ps = devm_regulator_get_exclusive(pcdev->dev,
  1207. rdev_get_name(pcdev->pi[index].rdev));
  1208. if (IS_ERR(psec->ps)) {
  1209. ret = PTR_ERR(psec->ps);
  1210. goto put_module;
  1211. }
  1212. psec->pcdev = pcdev;
  1213. list_add(&psec->list, &pcdev->pse_control_head);
  1214. psec->id = index;
  1215. psec->attached_phydev = phydev;
  1216. kref_init(&psec->refcnt);
  1217. return psec;
  1218. put_module:
  1219. module_put(pcdev->owner);
  1220. free_psec:
  1221. kfree(psec);
  1222. return ERR_PTR(ret);
  1223. }
  1224. /**
  1225. * of_pse_match_pi - Find the PSE PI id matching the device node phandle
  1226. * @pcdev: a pointer to the PSE controller device
  1227. * @np: a pointer to the device node
  1228. *
  1229. * Return: id of the PSE PI, -EINVAL if not found
  1230. */
  1231. static int of_pse_match_pi(struct pse_controller_dev *pcdev,
  1232. struct device_node *np)
  1233. {
  1234. int i;
  1235. for (i = 0; i < pcdev->nr_lines; i++) {
  1236. if (pcdev->pi[i].np == np)
  1237. return i;
  1238. }
  1239. return -EINVAL;
  1240. }
  1241. /**
  1242. * psec_id_xlate - translate pse_spec to the PSE line number according
  1243. * to the number of pse-cells in case of no pse_pi node
  1244. * @pcdev: a pointer to the PSE controller device
  1245. * @pse_spec: PSE line specifier as found in the device tree
  1246. *
  1247. * Return: 0 if #pse-cells = <0>. Return PSE line number otherwise.
  1248. */
  1249. static int psec_id_xlate(struct pse_controller_dev *pcdev,
  1250. const struct of_phandle_args *pse_spec)
  1251. {
  1252. if (!pcdev->of_pse_n_cells)
  1253. return 0;
  1254. if (pcdev->of_pse_n_cells > 1 ||
  1255. pse_spec->args[0] >= pcdev->nr_lines)
  1256. return -EINVAL;
  1257. return pse_spec->args[0];
  1258. }
  1259. struct pse_control *of_pse_control_get(struct device_node *node,
  1260. struct phy_device *phydev)
  1261. {
  1262. struct pse_controller_dev *r, *pcdev;
  1263. struct of_phandle_args args;
  1264. struct pse_control *psec;
  1265. int psec_id;
  1266. int ret;
  1267. if (!node)
  1268. return ERR_PTR(-EINVAL);
  1269. ret = of_parse_phandle_with_args(node, "pses", "#pse-cells", 0, &args);
  1270. if (ret)
  1271. return ERR_PTR(ret);
  1272. mutex_lock(&pse_list_mutex);
  1273. pcdev = NULL;
  1274. list_for_each_entry(r, &pse_controller_list, list) {
  1275. if (!r->no_of_pse_pi) {
  1276. ret = of_pse_match_pi(r, args.np);
  1277. if (ret >= 0) {
  1278. pcdev = r;
  1279. psec_id = ret;
  1280. break;
  1281. }
  1282. } else if (args.np == r->dev->of_node) {
  1283. pcdev = r;
  1284. break;
  1285. }
  1286. }
  1287. if (!pcdev) {
  1288. psec = ERR_PTR(-EPROBE_DEFER);
  1289. goto out;
  1290. }
  1291. if (WARN_ON(args.args_count != pcdev->of_pse_n_cells)) {
  1292. psec = ERR_PTR(-EINVAL);
  1293. goto out;
  1294. }
  1295. if (pcdev->no_of_pse_pi) {
  1296. psec_id = psec_id_xlate(pcdev, &args);
  1297. if (psec_id < 0) {
  1298. psec = ERR_PTR(psec_id);
  1299. goto out;
  1300. }
  1301. }
  1302. /* pse_list_mutex also protects the pcdev's pse_control list */
  1303. psec = pse_control_get_internal(pcdev, psec_id, phydev);
  1304. out:
  1305. mutex_unlock(&pse_list_mutex);
  1306. of_node_put(args.np);
  1307. return psec;
  1308. }
  1309. EXPORT_SYMBOL_GPL(of_pse_control_get);
  1310. /**
  1311. * pse_get_sw_admin_state - Convert the software admin state to c33 or podl
  1312. * admin state value used in the standard
  1313. * @psec: PSE control pointer
  1314. * @admin_state: a pointer to the admin_state structure
  1315. */
  1316. static void pse_get_sw_admin_state(struct pse_control *psec,
  1317. struct pse_admin_state *admin_state)
  1318. {
  1319. struct pse_pi *pi = &psec->pcdev->pi[psec->id];
  1320. if (pse_has_podl(psec)) {
  1321. if (pi->admin_state_enabled)
  1322. admin_state->podl_admin_state =
  1323. ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED;
  1324. else
  1325. admin_state->podl_admin_state =
  1326. ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED;
  1327. }
  1328. if (pse_has_c33(psec)) {
  1329. if (pi->admin_state_enabled)
  1330. admin_state->c33_admin_state =
  1331. ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED;
  1332. else
  1333. admin_state->c33_admin_state =
  1334. ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED;
  1335. }
  1336. }
  1337. /**
  1338. * pse_ethtool_get_status - get status of PSE control
  1339. * @psec: PSE control pointer
  1340. * @extack: extack for reporting useful error messages
  1341. * @status: struct to store PSE status
  1342. *
  1343. * Return: 0 on success and failure value on error
  1344. */
  1345. int pse_ethtool_get_status(struct pse_control *psec,
  1346. struct netlink_ext_ack *extack,
  1347. struct ethtool_pse_control_status *status)
  1348. {
  1349. struct pse_admin_state admin_state = {0};
  1350. struct pse_pw_status pw_status = {0};
  1351. const struct pse_controller_ops *ops;
  1352. struct pse_controller_dev *pcdev;
  1353. struct pse_pi *pi;
  1354. int ret;
  1355. pcdev = psec->pcdev;
  1356. ops = pcdev->ops;
  1357. pi = &pcdev->pi[psec->id];
  1358. mutex_lock(&pcdev->lock);
  1359. if (pi->pw_d) {
  1360. status->pw_d_id = pi->pw_d->id;
  1361. if (pse_pw_d_is_sw_pw_control(pcdev, pi->pw_d)) {
  1362. pse_get_sw_admin_state(psec, &admin_state);
  1363. } else {
  1364. ret = ops->pi_get_admin_state(pcdev, psec->id,
  1365. &admin_state);
  1366. if (ret)
  1367. goto out;
  1368. }
  1369. status->podl_admin_state = admin_state.podl_admin_state;
  1370. status->c33_admin_state = admin_state.c33_admin_state;
  1371. switch (pi->pw_d->budget_eval_strategy) {
  1372. case PSE_BUDGET_EVAL_STRAT_STATIC:
  1373. status->prio_max = pcdev->nr_lines - 1;
  1374. status->prio = pi->prio;
  1375. break;
  1376. case PSE_BUDGET_EVAL_STRAT_DYNAMIC:
  1377. status->prio_max = pcdev->pis_prio_max;
  1378. if (ops->pi_get_prio) {
  1379. ret = ops->pi_get_prio(pcdev, psec->id);
  1380. if (ret < 0)
  1381. goto out;
  1382. status->prio = ret;
  1383. }
  1384. break;
  1385. default:
  1386. break;
  1387. }
  1388. }
  1389. ret = ops->pi_get_pw_status(pcdev, psec->id, &pw_status);
  1390. if (ret)
  1391. goto out;
  1392. status->podl_pw_status = pw_status.podl_pw_status;
  1393. status->c33_pw_status = pw_status.c33_pw_status;
  1394. if (ops->pi_get_ext_state) {
  1395. struct pse_ext_state_info ext_state_info = {0};
  1396. ret = ops->pi_get_ext_state(pcdev, psec->id,
  1397. &ext_state_info);
  1398. if (ret)
  1399. goto out;
  1400. memcpy(&status->c33_ext_state_info,
  1401. &ext_state_info.c33_ext_state_info,
  1402. sizeof(status->c33_ext_state_info));
  1403. }
  1404. if (ops->pi_get_pw_class) {
  1405. ret = ops->pi_get_pw_class(pcdev, psec->id);
  1406. if (ret < 0)
  1407. goto out;
  1408. status->c33_pw_class = ret;
  1409. }
  1410. if (ops->pi_get_actual_pw) {
  1411. ret = ops->pi_get_actual_pw(pcdev, psec->id);
  1412. if (ret < 0)
  1413. goto out;
  1414. status->c33_actual_pw = ret;
  1415. }
  1416. if (ops->pi_get_pw_limit) {
  1417. ret = ops->pi_get_pw_limit(pcdev, psec->id);
  1418. if (ret < 0)
  1419. goto out;
  1420. status->c33_avail_pw_limit = ret;
  1421. }
  1422. if (ops->pi_get_pw_limit_ranges) {
  1423. struct pse_pw_limit_ranges pw_limit_ranges = {0};
  1424. ret = ops->pi_get_pw_limit_ranges(pcdev, psec->id,
  1425. &pw_limit_ranges);
  1426. if (ret < 0)
  1427. goto out;
  1428. status->c33_pw_limit_ranges =
  1429. pw_limit_ranges.c33_pw_limit_ranges;
  1430. status->c33_pw_limit_nb_ranges = ret;
  1431. }
  1432. out:
  1433. mutex_unlock(&psec->pcdev->lock);
  1434. return ret;
  1435. }
  1436. EXPORT_SYMBOL_GPL(pse_ethtool_get_status);
  1437. static int pse_ethtool_c33_set_config(struct pse_control *psec,
  1438. const struct pse_control_config *config)
  1439. {
  1440. int err = 0;
  1441. /* Look at admin_state_enabled status to not call regulator_enable
  1442. * or regulator_disable twice creating a regulator counter mismatch
  1443. */
  1444. switch (config->c33_admin_control) {
  1445. case ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED:
  1446. /* We could have mismatch between admin_state_enabled and
  1447. * state reported by regulator_is_enabled. This can occur when
  1448. * the PI is forcibly turn off by the controller. Call
  1449. * regulator_disable on that case to fix the counters state.
  1450. */
  1451. if (psec->pcdev->pi[psec->id].admin_state_enabled &&
  1452. !regulator_is_enabled(psec->ps)) {
  1453. err = regulator_disable(psec->ps);
  1454. if (err)
  1455. break;
  1456. }
  1457. if (!psec->pcdev->pi[psec->id].admin_state_enabled)
  1458. err = regulator_enable(psec->ps);
  1459. break;
  1460. case ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED:
  1461. if (psec->pcdev->pi[psec->id].admin_state_enabled)
  1462. err = regulator_disable(psec->ps);
  1463. break;
  1464. default:
  1465. err = -EOPNOTSUPP;
  1466. }
  1467. return err;
  1468. }
  1469. static int pse_ethtool_podl_set_config(struct pse_control *psec,
  1470. const struct pse_control_config *config)
  1471. {
  1472. int err = 0;
  1473. /* Look at admin_state_enabled status to not call regulator_enable
  1474. * or regulator_disable twice creating a regulator counter mismatch
  1475. */
  1476. switch (config->podl_admin_control) {
  1477. case ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED:
  1478. if (!psec->pcdev->pi[psec->id].admin_state_enabled)
  1479. err = regulator_enable(psec->ps);
  1480. break;
  1481. case ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED:
  1482. if (psec->pcdev->pi[psec->id].admin_state_enabled)
  1483. err = regulator_disable(psec->ps);
  1484. break;
  1485. default:
  1486. err = -EOPNOTSUPP;
  1487. }
  1488. return err;
  1489. }
  1490. /**
  1491. * pse_ethtool_set_config - set PSE control configuration
  1492. * @psec: PSE control pointer
  1493. * @extack: extack for reporting useful error messages
  1494. * @config: Configuration of the test to run
  1495. *
  1496. * Return: 0 on success and failure value on error
  1497. */
  1498. int pse_ethtool_set_config(struct pse_control *psec,
  1499. struct netlink_ext_ack *extack,
  1500. const struct pse_control_config *config)
  1501. {
  1502. int err = 0;
  1503. if (pse_has_c33(psec) && config->c33_admin_control) {
  1504. err = pse_ethtool_c33_set_config(psec, config);
  1505. if (err)
  1506. return err;
  1507. }
  1508. if (pse_has_podl(psec) && config->podl_admin_control)
  1509. err = pse_ethtool_podl_set_config(psec, config);
  1510. return err;
  1511. }
  1512. EXPORT_SYMBOL_GPL(pse_ethtool_set_config);
  1513. /**
  1514. * pse_pi_update_pw_budget - Update PSE power budget allocated with new
  1515. * power in mW
  1516. * @pcdev: a pointer to the PSE controller device
  1517. * @id: index of the PSE PI
  1518. * @pw_req: power requested
  1519. * @extack: extack for reporting useful error messages
  1520. *
  1521. * Return: Previous power allocated on success and failure value on error
  1522. */
  1523. static int pse_pi_update_pw_budget(struct pse_controller_dev *pcdev, int id,
  1524. const unsigned int pw_req,
  1525. struct netlink_ext_ack *extack)
  1526. {
  1527. struct pse_pi *pi = &pcdev->pi[id];
  1528. int previous_pw_allocated;
  1529. int pw_diff, ret = 0;
  1530. /* We don't want pw_allocated_mW value change in the middle of an
  1531. * power budget update
  1532. */
  1533. mutex_lock(&pcdev->lock);
  1534. previous_pw_allocated = pi->pw_allocated_mW;
  1535. pw_diff = pw_req - previous_pw_allocated;
  1536. if (!pw_diff) {
  1537. goto out;
  1538. } else if (pw_diff > 0) {
  1539. ret = regulator_request_power_budget(pi->pw_d->supply, pw_diff);
  1540. if (ret) {
  1541. NL_SET_ERR_MSG_FMT(extack,
  1542. "PI %d: not enough power budget available",
  1543. id);
  1544. goto out;
  1545. }
  1546. } else {
  1547. regulator_free_power_budget(pi->pw_d->supply, -pw_diff);
  1548. }
  1549. pi->pw_allocated_mW = pw_req;
  1550. ret = previous_pw_allocated;
  1551. out:
  1552. mutex_unlock(&pcdev->lock);
  1553. return ret;
  1554. }
  1555. /**
  1556. * pse_ethtool_set_pw_limit - set PSE control power limit
  1557. * @psec: PSE control pointer
  1558. * @extack: extack for reporting useful error messages
  1559. * @pw_limit: power limit value in mW
  1560. *
  1561. * Return: 0 on success and failure value on error
  1562. */
  1563. int pse_ethtool_set_pw_limit(struct pse_control *psec,
  1564. struct netlink_ext_ack *extack,
  1565. const unsigned int pw_limit)
  1566. {
  1567. int uV, uA, ret, previous_pw_allocated = 0;
  1568. s64 tmp_64;
  1569. if (pw_limit > MAX_PI_PW)
  1570. return -ERANGE;
  1571. ret = regulator_get_voltage(psec->ps);
  1572. if (!ret) {
  1573. NL_SET_ERR_MSG(extack,
  1574. "Can't calculate the current, PSE voltage read is 0");
  1575. return -ERANGE;
  1576. }
  1577. if (ret < 0) {
  1578. NL_SET_ERR_MSG(extack,
  1579. "Error reading PSE voltage");
  1580. return ret;
  1581. }
  1582. uV = ret;
  1583. tmp_64 = pw_limit;
  1584. tmp_64 *= 1000000000ull;
  1585. /* uA = mW * 1000000000 / uV */
  1586. uA = DIV_ROUND_CLOSEST_ULL(tmp_64, uV);
  1587. /* Update power budget only in software power control case and
  1588. * if a Power Device is powered.
  1589. */
  1590. if (pse_pw_d_is_sw_pw_control(psec->pcdev,
  1591. psec->pcdev->pi[psec->id].pw_d) &&
  1592. psec->pcdev->pi[psec->id].admin_state_enabled &&
  1593. psec->pcdev->pi[psec->id].isr_pd_detected) {
  1594. ret = pse_pi_update_pw_budget(psec->pcdev, psec->id,
  1595. pw_limit, extack);
  1596. if (ret < 0)
  1597. return ret;
  1598. previous_pw_allocated = ret;
  1599. }
  1600. ret = regulator_set_current_limit(psec->ps, 0, uA);
  1601. if (ret < 0 && previous_pw_allocated) {
  1602. pse_pi_update_pw_budget(psec->pcdev, psec->id,
  1603. previous_pw_allocated, extack);
  1604. }
  1605. return ret;
  1606. }
  1607. EXPORT_SYMBOL_GPL(pse_ethtool_set_pw_limit);
  1608. /**
  1609. * pse_ethtool_set_prio - Set PSE PI priority according to the budget
  1610. * evaluation strategy
  1611. * @psec: PSE control pointer
  1612. * @extack: extack for reporting useful error messages
  1613. * @prio: priovity value
  1614. *
  1615. * Return: 0 on success and failure value on error
  1616. */
  1617. int pse_ethtool_set_prio(struct pse_control *psec,
  1618. struct netlink_ext_ack *extack,
  1619. unsigned int prio)
  1620. {
  1621. struct pse_controller_dev *pcdev = psec->pcdev;
  1622. const struct pse_controller_ops *ops;
  1623. int ret = 0;
  1624. if (!pcdev->pi[psec->id].pw_d) {
  1625. NL_SET_ERR_MSG(extack, "no power domain attached");
  1626. return -EOPNOTSUPP;
  1627. }
  1628. /* We don't want priority change in the middle of an
  1629. * enable/disable call or a priority mode change
  1630. */
  1631. mutex_lock(&pcdev->lock);
  1632. switch (pcdev->pi[psec->id].pw_d->budget_eval_strategy) {
  1633. case PSE_BUDGET_EVAL_STRAT_STATIC:
  1634. if (prio >= pcdev->nr_lines) {
  1635. NL_SET_ERR_MSG_FMT(extack,
  1636. "priority %d exceed priority max %d",
  1637. prio, pcdev->nr_lines);
  1638. ret = -ERANGE;
  1639. goto out;
  1640. }
  1641. pcdev->pi[psec->id].prio = prio;
  1642. pse_pw_d_retry_power_delivery(pcdev, pcdev->pi[psec->id].pw_d);
  1643. break;
  1644. case PSE_BUDGET_EVAL_STRAT_DYNAMIC:
  1645. ops = psec->pcdev->ops;
  1646. if (!ops->pi_set_prio) {
  1647. NL_SET_ERR_MSG(extack,
  1648. "pse driver does not support setting port priority");
  1649. ret = -EOPNOTSUPP;
  1650. goto out;
  1651. }
  1652. if (prio > pcdev->pis_prio_max) {
  1653. NL_SET_ERR_MSG_FMT(extack,
  1654. "priority %d exceed priority max %d",
  1655. prio, pcdev->pis_prio_max);
  1656. ret = -ERANGE;
  1657. goto out;
  1658. }
  1659. ret = ops->pi_set_prio(pcdev, psec->id, prio);
  1660. break;
  1661. default:
  1662. ret = -EOPNOTSUPP;
  1663. }
  1664. out:
  1665. mutex_unlock(&pcdev->lock);
  1666. return ret;
  1667. }
  1668. EXPORT_SYMBOL_GPL(pse_ethtool_set_prio);
  1669. bool pse_has_podl(struct pse_control *psec)
  1670. {
  1671. return psec->pcdev->types & ETHTOOL_PSE_PODL;
  1672. }
  1673. EXPORT_SYMBOL_GPL(pse_has_podl);
  1674. bool pse_has_c33(struct pse_control *psec)
  1675. {
  1676. return psec->pcdev->types & ETHTOOL_PSE_C33;
  1677. }
  1678. EXPORT_SYMBOL_GPL(pse_has_c33);