sysfs.c 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright(c) 2019 Intel Corporation. All rights rsvd. */
  3. #include <linux/init.h>
  4. #include <linux/kernel.h>
  5. #include <linux/module.h>
  6. #include <linux/pci.h>
  7. #include <linux/device.h>
  8. #include <linux/io-64-nonatomic-lo-hi.h>
  9. #include <uapi/linux/idxd.h>
  10. #include "registers.h"
  11. #include "idxd.h"
  12. static char *idxd_wq_type_names[] = {
  13. [IDXD_WQT_NONE] = "none",
  14. [IDXD_WQT_KERNEL] = "kernel",
  15. [IDXD_WQT_USER] = "user",
  16. };
  17. /* IDXD engine attributes */
  18. static ssize_t engine_group_id_show(struct device *dev,
  19. struct device_attribute *attr, char *buf)
  20. {
  21. struct idxd_engine *engine = confdev_to_engine(dev);
  22. if (engine->group)
  23. return sysfs_emit(buf, "%d\n", engine->group->id);
  24. else
  25. return sysfs_emit(buf, "%d\n", -1);
  26. }
  27. static ssize_t engine_group_id_store(struct device *dev,
  28. struct device_attribute *attr,
  29. const char *buf, size_t count)
  30. {
  31. struct idxd_engine *engine = confdev_to_engine(dev);
  32. struct idxd_device *idxd = engine->idxd;
  33. long id;
  34. int rc;
  35. struct idxd_group *prevg;
  36. rc = kstrtol(buf, 10, &id);
  37. if (rc < 0)
  38. return -EINVAL;
  39. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  40. return -EPERM;
  41. if (id > idxd->max_groups - 1 || id < -1)
  42. return -EINVAL;
  43. if (id == -1) {
  44. if (engine->group) {
  45. engine->group->num_engines--;
  46. engine->group = NULL;
  47. }
  48. return count;
  49. }
  50. prevg = engine->group;
  51. if (prevg)
  52. prevg->num_engines--;
  53. engine->group = idxd->groups[id];
  54. engine->group->num_engines++;
  55. return count;
  56. }
  57. static struct device_attribute dev_attr_engine_group =
  58. __ATTR(group_id, 0644, engine_group_id_show,
  59. engine_group_id_store);
  60. static struct attribute *idxd_engine_attributes[] = {
  61. &dev_attr_engine_group.attr,
  62. NULL,
  63. };
  64. static const struct attribute_group idxd_engine_attribute_group = {
  65. .attrs = idxd_engine_attributes,
  66. };
  67. static const struct attribute_group *idxd_engine_attribute_groups[] = {
  68. &idxd_engine_attribute_group,
  69. NULL,
  70. };
  71. static void idxd_conf_engine_release(struct device *dev)
  72. {
  73. struct idxd_engine *engine = confdev_to_engine(dev);
  74. kfree(engine);
  75. }
  76. const struct device_type idxd_engine_device_type = {
  77. .name = "engine",
  78. .release = idxd_conf_engine_release,
  79. .groups = idxd_engine_attribute_groups,
  80. };
  81. /* Group attributes */
  82. static void idxd_set_free_rdbufs(struct idxd_device *idxd)
  83. {
  84. int i, rdbufs;
  85. for (i = 0, rdbufs = 0; i < idxd->max_groups; i++) {
  86. struct idxd_group *g = idxd->groups[i];
  87. rdbufs += g->rdbufs_reserved;
  88. }
  89. idxd->nr_rdbufs = idxd->max_rdbufs - rdbufs;
  90. }
  91. static ssize_t group_read_buffers_reserved_show(struct device *dev,
  92. struct device_attribute *attr,
  93. char *buf)
  94. {
  95. struct idxd_group *group = confdev_to_group(dev);
  96. return sysfs_emit(buf, "%u\n", group->rdbufs_reserved);
  97. }
  98. static ssize_t group_tokens_reserved_show(struct device *dev,
  99. struct device_attribute *attr,
  100. char *buf)
  101. {
  102. dev_warn_once(dev, "attribute deprecated, see read_buffers_reserved.\n");
  103. return group_read_buffers_reserved_show(dev, attr, buf);
  104. }
  105. static ssize_t group_read_buffers_reserved_store(struct device *dev,
  106. struct device_attribute *attr,
  107. const char *buf, size_t count)
  108. {
  109. struct idxd_group *group = confdev_to_group(dev);
  110. struct idxd_device *idxd = group->idxd;
  111. unsigned long val;
  112. int rc;
  113. rc = kstrtoul(buf, 10, &val);
  114. if (rc < 0)
  115. return -EINVAL;
  116. if (idxd->data->type == IDXD_TYPE_IAX)
  117. return -EOPNOTSUPP;
  118. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  119. return -EPERM;
  120. if (idxd->state == IDXD_DEV_ENABLED)
  121. return -EPERM;
  122. if (val > idxd->max_rdbufs)
  123. return -EINVAL;
  124. if (val > idxd->nr_rdbufs + group->rdbufs_reserved)
  125. return -EINVAL;
  126. group->rdbufs_reserved = val;
  127. idxd_set_free_rdbufs(idxd);
  128. return count;
  129. }
  130. static ssize_t group_tokens_reserved_store(struct device *dev,
  131. struct device_attribute *attr,
  132. const char *buf, size_t count)
  133. {
  134. dev_warn_once(dev, "attribute deprecated, see read_buffers_reserved.\n");
  135. return group_read_buffers_reserved_store(dev, attr, buf, count);
  136. }
  137. static struct device_attribute dev_attr_group_tokens_reserved =
  138. __ATTR(tokens_reserved, 0644, group_tokens_reserved_show,
  139. group_tokens_reserved_store);
  140. static struct device_attribute dev_attr_group_read_buffers_reserved =
  141. __ATTR(read_buffers_reserved, 0644, group_read_buffers_reserved_show,
  142. group_read_buffers_reserved_store);
  143. static ssize_t group_read_buffers_allowed_show(struct device *dev,
  144. struct device_attribute *attr,
  145. char *buf)
  146. {
  147. struct idxd_group *group = confdev_to_group(dev);
  148. return sysfs_emit(buf, "%u\n", group->rdbufs_allowed);
  149. }
  150. static ssize_t group_tokens_allowed_show(struct device *dev,
  151. struct device_attribute *attr,
  152. char *buf)
  153. {
  154. dev_warn_once(dev, "attribute deprecated, see read_buffers_allowed.\n");
  155. return group_read_buffers_allowed_show(dev, attr, buf);
  156. }
  157. static ssize_t group_read_buffers_allowed_store(struct device *dev,
  158. struct device_attribute *attr,
  159. const char *buf, size_t count)
  160. {
  161. struct idxd_group *group = confdev_to_group(dev);
  162. struct idxd_device *idxd = group->idxd;
  163. unsigned long val;
  164. int rc;
  165. rc = kstrtoul(buf, 10, &val);
  166. if (rc < 0)
  167. return -EINVAL;
  168. if (idxd->data->type == IDXD_TYPE_IAX)
  169. return -EOPNOTSUPP;
  170. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  171. return -EPERM;
  172. if (idxd->state == IDXD_DEV_ENABLED)
  173. return -EPERM;
  174. if (val < 4 * group->num_engines ||
  175. val > group->rdbufs_reserved + idxd->nr_rdbufs)
  176. return -EINVAL;
  177. group->rdbufs_allowed = val;
  178. return count;
  179. }
  180. static ssize_t group_tokens_allowed_store(struct device *dev,
  181. struct device_attribute *attr,
  182. const char *buf, size_t count)
  183. {
  184. dev_warn_once(dev, "attribute deprecated, see read_buffers_allowed.\n");
  185. return group_read_buffers_allowed_store(dev, attr, buf, count);
  186. }
  187. static struct device_attribute dev_attr_group_tokens_allowed =
  188. __ATTR(tokens_allowed, 0644, group_tokens_allowed_show,
  189. group_tokens_allowed_store);
  190. static struct device_attribute dev_attr_group_read_buffers_allowed =
  191. __ATTR(read_buffers_allowed, 0644, group_read_buffers_allowed_show,
  192. group_read_buffers_allowed_store);
  193. static ssize_t group_use_read_buffer_limit_show(struct device *dev,
  194. struct device_attribute *attr,
  195. char *buf)
  196. {
  197. struct idxd_group *group = confdev_to_group(dev);
  198. return sysfs_emit(buf, "%u\n", group->use_rdbuf_limit);
  199. }
  200. static ssize_t group_use_token_limit_show(struct device *dev,
  201. struct device_attribute *attr,
  202. char *buf)
  203. {
  204. dev_warn_once(dev, "attribute deprecated, see use_read_buffer_limit.\n");
  205. return group_use_read_buffer_limit_show(dev, attr, buf);
  206. }
  207. static ssize_t group_use_read_buffer_limit_store(struct device *dev,
  208. struct device_attribute *attr,
  209. const char *buf, size_t count)
  210. {
  211. struct idxd_group *group = confdev_to_group(dev);
  212. struct idxd_device *idxd = group->idxd;
  213. unsigned long val;
  214. int rc;
  215. rc = kstrtoul(buf, 10, &val);
  216. if (rc < 0)
  217. return -EINVAL;
  218. if (idxd->data->type == IDXD_TYPE_IAX)
  219. return -EOPNOTSUPP;
  220. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  221. return -EPERM;
  222. if (idxd->state == IDXD_DEV_ENABLED)
  223. return -EPERM;
  224. if (idxd->rdbuf_limit == 0)
  225. return -EPERM;
  226. group->use_rdbuf_limit = !!val;
  227. return count;
  228. }
  229. static ssize_t group_use_token_limit_store(struct device *dev,
  230. struct device_attribute *attr,
  231. const char *buf, size_t count)
  232. {
  233. dev_warn_once(dev, "attribute deprecated, see use_read_buffer_limit.\n");
  234. return group_use_read_buffer_limit_store(dev, attr, buf, count);
  235. }
  236. static struct device_attribute dev_attr_group_use_token_limit =
  237. __ATTR(use_token_limit, 0644, group_use_token_limit_show,
  238. group_use_token_limit_store);
  239. static struct device_attribute dev_attr_group_use_read_buffer_limit =
  240. __ATTR(use_read_buffer_limit, 0644, group_use_read_buffer_limit_show,
  241. group_use_read_buffer_limit_store);
  242. static ssize_t group_engines_show(struct device *dev,
  243. struct device_attribute *attr, char *buf)
  244. {
  245. struct idxd_group *group = confdev_to_group(dev);
  246. int i, rc = 0;
  247. struct idxd_device *idxd = group->idxd;
  248. for (i = 0; i < idxd->max_engines; i++) {
  249. struct idxd_engine *engine = idxd->engines[i];
  250. if (!engine->group)
  251. continue;
  252. if (engine->group->id == group->id)
  253. rc += sysfs_emit_at(buf, rc, "engine%d.%d ", idxd->id, engine->id);
  254. }
  255. if (!rc)
  256. return 0;
  257. rc--;
  258. rc += sysfs_emit_at(buf, rc, "\n");
  259. return rc;
  260. }
  261. static struct device_attribute dev_attr_group_engines =
  262. __ATTR(engines, 0444, group_engines_show, NULL);
  263. static ssize_t group_work_queues_show(struct device *dev,
  264. struct device_attribute *attr, char *buf)
  265. {
  266. struct idxd_group *group = confdev_to_group(dev);
  267. int i, rc = 0;
  268. struct idxd_device *idxd = group->idxd;
  269. for (i = 0; i < idxd->max_wqs; i++) {
  270. struct idxd_wq *wq = idxd->wqs[i];
  271. if (!wq->group)
  272. continue;
  273. if (wq->group->id == group->id)
  274. rc += sysfs_emit_at(buf, rc, "wq%d.%d ", idxd->id, wq->id);
  275. }
  276. if (!rc)
  277. return 0;
  278. rc--;
  279. rc += sysfs_emit_at(buf, rc, "\n");
  280. return rc;
  281. }
  282. static struct device_attribute dev_attr_group_work_queues =
  283. __ATTR(work_queues, 0444, group_work_queues_show, NULL);
  284. static ssize_t group_traffic_class_a_show(struct device *dev,
  285. struct device_attribute *attr,
  286. char *buf)
  287. {
  288. struct idxd_group *group = confdev_to_group(dev);
  289. return sysfs_emit(buf, "%d\n", group->tc_a);
  290. }
  291. static ssize_t group_traffic_class_a_store(struct device *dev,
  292. struct device_attribute *attr,
  293. const char *buf, size_t count)
  294. {
  295. struct idxd_group *group = confdev_to_group(dev);
  296. struct idxd_device *idxd = group->idxd;
  297. long val;
  298. int rc;
  299. rc = kstrtol(buf, 10, &val);
  300. if (rc < 0)
  301. return -EINVAL;
  302. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  303. return -EPERM;
  304. if (idxd->state == IDXD_DEV_ENABLED)
  305. return -EPERM;
  306. if (idxd->hw.version <= DEVICE_VERSION_2 && !tc_override)
  307. return -EPERM;
  308. if (val < 0 || val > 7)
  309. return -EINVAL;
  310. group->tc_a = val;
  311. return count;
  312. }
  313. static struct device_attribute dev_attr_group_traffic_class_a =
  314. __ATTR(traffic_class_a, 0644, group_traffic_class_a_show,
  315. group_traffic_class_a_store);
  316. static ssize_t group_traffic_class_b_show(struct device *dev,
  317. struct device_attribute *attr,
  318. char *buf)
  319. {
  320. struct idxd_group *group = confdev_to_group(dev);
  321. return sysfs_emit(buf, "%d\n", group->tc_b);
  322. }
  323. static ssize_t group_traffic_class_b_store(struct device *dev,
  324. struct device_attribute *attr,
  325. const char *buf, size_t count)
  326. {
  327. struct idxd_group *group = confdev_to_group(dev);
  328. struct idxd_device *idxd = group->idxd;
  329. long val;
  330. int rc;
  331. rc = kstrtol(buf, 10, &val);
  332. if (rc < 0)
  333. return -EINVAL;
  334. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  335. return -EPERM;
  336. if (idxd->state == IDXD_DEV_ENABLED)
  337. return -EPERM;
  338. if (idxd->hw.version <= DEVICE_VERSION_2 && !tc_override)
  339. return -EPERM;
  340. if (val < 0 || val > 7)
  341. return -EINVAL;
  342. group->tc_b = val;
  343. return count;
  344. }
  345. static struct device_attribute dev_attr_group_traffic_class_b =
  346. __ATTR(traffic_class_b, 0644, group_traffic_class_b_show,
  347. group_traffic_class_b_store);
  348. static ssize_t group_desc_progress_limit_show(struct device *dev,
  349. struct device_attribute *attr,
  350. char *buf)
  351. {
  352. struct idxd_group *group = confdev_to_group(dev);
  353. return sysfs_emit(buf, "%d\n", group->desc_progress_limit);
  354. }
  355. static ssize_t group_desc_progress_limit_store(struct device *dev,
  356. struct device_attribute *attr,
  357. const char *buf, size_t count)
  358. {
  359. struct idxd_group *group = confdev_to_group(dev);
  360. int val, rc;
  361. rc = kstrtoint(buf, 10, &val);
  362. if (rc < 0)
  363. return -EINVAL;
  364. if (val & ~GENMASK(1, 0))
  365. return -EINVAL;
  366. group->desc_progress_limit = val;
  367. return count;
  368. }
  369. static struct device_attribute dev_attr_group_desc_progress_limit =
  370. __ATTR(desc_progress_limit, 0644, group_desc_progress_limit_show,
  371. group_desc_progress_limit_store);
  372. static ssize_t group_batch_progress_limit_show(struct device *dev,
  373. struct device_attribute *attr,
  374. char *buf)
  375. {
  376. struct idxd_group *group = confdev_to_group(dev);
  377. return sysfs_emit(buf, "%d\n", group->batch_progress_limit);
  378. }
  379. static ssize_t group_batch_progress_limit_store(struct device *dev,
  380. struct device_attribute *attr,
  381. const char *buf, size_t count)
  382. {
  383. struct idxd_group *group = confdev_to_group(dev);
  384. int val, rc;
  385. rc = kstrtoint(buf, 10, &val);
  386. if (rc < 0)
  387. return -EINVAL;
  388. if (val & ~GENMASK(1, 0))
  389. return -EINVAL;
  390. group->batch_progress_limit = val;
  391. return count;
  392. }
  393. static struct device_attribute dev_attr_group_batch_progress_limit =
  394. __ATTR(batch_progress_limit, 0644, group_batch_progress_limit_show,
  395. group_batch_progress_limit_store);
  396. static struct attribute *idxd_group_attributes[] = {
  397. &dev_attr_group_work_queues.attr,
  398. &dev_attr_group_engines.attr,
  399. &dev_attr_group_use_token_limit.attr,
  400. &dev_attr_group_use_read_buffer_limit.attr,
  401. &dev_attr_group_tokens_allowed.attr,
  402. &dev_attr_group_read_buffers_allowed.attr,
  403. &dev_attr_group_tokens_reserved.attr,
  404. &dev_attr_group_read_buffers_reserved.attr,
  405. &dev_attr_group_traffic_class_a.attr,
  406. &dev_attr_group_traffic_class_b.attr,
  407. &dev_attr_group_desc_progress_limit.attr,
  408. &dev_attr_group_batch_progress_limit.attr,
  409. NULL,
  410. };
  411. static bool idxd_group_attr_progress_limit_invisible(struct attribute *attr,
  412. struct idxd_device *idxd)
  413. {
  414. return (attr == &dev_attr_group_desc_progress_limit.attr ||
  415. attr == &dev_attr_group_batch_progress_limit.attr) &&
  416. !idxd->hw.group_cap.progress_limit;
  417. }
  418. static bool idxd_group_attr_read_buffers_invisible(struct attribute *attr,
  419. struct idxd_device *idxd)
  420. {
  421. /*
  422. * Intel IAA does not support Read Buffer allocation control,
  423. * make these attributes invisible.
  424. */
  425. return (attr == &dev_attr_group_use_token_limit.attr ||
  426. attr == &dev_attr_group_use_read_buffer_limit.attr ||
  427. attr == &dev_attr_group_tokens_allowed.attr ||
  428. attr == &dev_attr_group_read_buffers_allowed.attr ||
  429. attr == &dev_attr_group_tokens_reserved.attr ||
  430. attr == &dev_attr_group_read_buffers_reserved.attr) &&
  431. idxd->data->type == IDXD_TYPE_IAX;
  432. }
  433. static umode_t idxd_group_attr_visible(struct kobject *kobj,
  434. struct attribute *attr, int n)
  435. {
  436. struct device *dev = container_of(kobj, struct device, kobj);
  437. struct idxd_group *group = confdev_to_group(dev);
  438. struct idxd_device *idxd = group->idxd;
  439. if (idxd_group_attr_progress_limit_invisible(attr, idxd))
  440. return 0;
  441. if (idxd_group_attr_read_buffers_invisible(attr, idxd))
  442. return 0;
  443. return attr->mode;
  444. }
  445. static const struct attribute_group idxd_group_attribute_group = {
  446. .attrs = idxd_group_attributes,
  447. .is_visible = idxd_group_attr_visible,
  448. };
  449. static const struct attribute_group *idxd_group_attribute_groups[] = {
  450. &idxd_group_attribute_group,
  451. NULL,
  452. };
  453. static void idxd_conf_group_release(struct device *dev)
  454. {
  455. struct idxd_group *group = confdev_to_group(dev);
  456. kfree(group);
  457. }
  458. const struct device_type idxd_group_device_type = {
  459. .name = "group",
  460. .release = idxd_conf_group_release,
  461. .groups = idxd_group_attribute_groups,
  462. };
  463. /* IDXD work queue attribs */
  464. static ssize_t wq_clients_show(struct device *dev,
  465. struct device_attribute *attr, char *buf)
  466. {
  467. struct idxd_wq *wq = confdev_to_wq(dev);
  468. return sysfs_emit(buf, "%d\n", wq->client_count);
  469. }
  470. static struct device_attribute dev_attr_wq_clients =
  471. __ATTR(clients, 0444, wq_clients_show, NULL);
  472. static ssize_t wq_state_show(struct device *dev,
  473. struct device_attribute *attr, char *buf)
  474. {
  475. struct idxd_wq *wq = confdev_to_wq(dev);
  476. switch (wq->state) {
  477. case IDXD_WQ_DISABLED:
  478. return sysfs_emit(buf, "disabled\n");
  479. case IDXD_WQ_ENABLED:
  480. return sysfs_emit(buf, "enabled\n");
  481. }
  482. return sysfs_emit(buf, "unknown\n");
  483. }
  484. static struct device_attribute dev_attr_wq_state =
  485. __ATTR(state, 0444, wq_state_show, NULL);
  486. static ssize_t wq_group_id_show(struct device *dev,
  487. struct device_attribute *attr, char *buf)
  488. {
  489. struct idxd_wq *wq = confdev_to_wq(dev);
  490. if (wq->group)
  491. return sysfs_emit(buf, "%u\n", wq->group->id);
  492. else
  493. return sysfs_emit(buf, "-1\n");
  494. }
  495. static ssize_t wq_group_id_store(struct device *dev,
  496. struct device_attribute *attr,
  497. const char *buf, size_t count)
  498. {
  499. struct idxd_wq *wq = confdev_to_wq(dev);
  500. struct idxd_device *idxd = wq->idxd;
  501. long id;
  502. int rc;
  503. struct idxd_group *prevg, *group;
  504. rc = kstrtol(buf, 10, &id);
  505. if (rc < 0)
  506. return -EINVAL;
  507. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  508. return -EPERM;
  509. if (wq->state != IDXD_WQ_DISABLED)
  510. return -EPERM;
  511. if (id > idxd->max_groups - 1 || id < -1)
  512. return -EINVAL;
  513. if (id == -1) {
  514. if (wq->group) {
  515. wq->group->num_wqs--;
  516. wq->group = NULL;
  517. }
  518. return count;
  519. }
  520. group = idxd->groups[id];
  521. prevg = wq->group;
  522. if (prevg)
  523. prevg->num_wqs--;
  524. wq->group = group;
  525. group->num_wqs++;
  526. return count;
  527. }
  528. static struct device_attribute dev_attr_wq_group_id =
  529. __ATTR(group_id, 0644, wq_group_id_show, wq_group_id_store);
  530. static ssize_t wq_mode_show(struct device *dev, struct device_attribute *attr,
  531. char *buf)
  532. {
  533. struct idxd_wq *wq = confdev_to_wq(dev);
  534. return sysfs_emit(buf, "%s\n", wq_dedicated(wq) ? "dedicated" : "shared");
  535. }
  536. static ssize_t wq_mode_store(struct device *dev,
  537. struct device_attribute *attr, const char *buf,
  538. size_t count)
  539. {
  540. struct idxd_wq *wq = confdev_to_wq(dev);
  541. struct idxd_device *idxd = wq->idxd;
  542. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  543. return -EPERM;
  544. if (wq->state != IDXD_WQ_DISABLED)
  545. return -EPERM;
  546. if (sysfs_streq(buf, "dedicated")) {
  547. set_bit(WQ_FLAG_DEDICATED, &wq->flags);
  548. wq->threshold = 0;
  549. } else if (sysfs_streq(buf, "shared")) {
  550. clear_bit(WQ_FLAG_DEDICATED, &wq->flags);
  551. } else {
  552. return -EINVAL;
  553. }
  554. return count;
  555. }
  556. static struct device_attribute dev_attr_wq_mode =
  557. __ATTR(mode, 0644, wq_mode_show, wq_mode_store);
  558. static ssize_t wq_size_show(struct device *dev, struct device_attribute *attr,
  559. char *buf)
  560. {
  561. struct idxd_wq *wq = confdev_to_wq(dev);
  562. return sysfs_emit(buf, "%u\n", wq->size);
  563. }
  564. static int total_claimed_wq_size(struct idxd_device *idxd)
  565. {
  566. int i;
  567. int wq_size = 0;
  568. for (i = 0; i < idxd->max_wqs; i++) {
  569. struct idxd_wq *wq = idxd->wqs[i];
  570. wq_size += wq->size;
  571. }
  572. return wq_size;
  573. }
  574. static ssize_t wq_size_store(struct device *dev,
  575. struct device_attribute *attr, const char *buf,
  576. size_t count)
  577. {
  578. struct idxd_wq *wq = confdev_to_wq(dev);
  579. unsigned long size;
  580. struct idxd_device *idxd = wq->idxd;
  581. int rc;
  582. rc = kstrtoul(buf, 10, &size);
  583. if (rc < 0)
  584. return -EINVAL;
  585. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  586. return -EPERM;
  587. if (idxd->state == IDXD_DEV_ENABLED)
  588. return -EPERM;
  589. if (size + total_claimed_wq_size(idxd) - wq->size > idxd->max_wq_size)
  590. return -EINVAL;
  591. wq->size = size;
  592. return count;
  593. }
  594. static struct device_attribute dev_attr_wq_size =
  595. __ATTR(size, 0644, wq_size_show, wq_size_store);
  596. static ssize_t wq_priority_show(struct device *dev,
  597. struct device_attribute *attr, char *buf)
  598. {
  599. struct idxd_wq *wq = confdev_to_wq(dev);
  600. return sysfs_emit(buf, "%u\n", wq->priority);
  601. }
  602. static ssize_t wq_priority_store(struct device *dev,
  603. struct device_attribute *attr,
  604. const char *buf, size_t count)
  605. {
  606. struct idxd_wq *wq = confdev_to_wq(dev);
  607. unsigned long prio;
  608. struct idxd_device *idxd = wq->idxd;
  609. int rc;
  610. rc = kstrtoul(buf, 10, &prio);
  611. if (rc < 0)
  612. return -EINVAL;
  613. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  614. return -EPERM;
  615. if (wq->state != IDXD_WQ_DISABLED)
  616. return -EPERM;
  617. if (prio > IDXD_MAX_PRIORITY)
  618. return -EINVAL;
  619. wq->priority = prio;
  620. return count;
  621. }
  622. static struct device_attribute dev_attr_wq_priority =
  623. __ATTR(priority, 0644, wq_priority_show, wq_priority_store);
  624. static ssize_t wq_block_on_fault_show(struct device *dev,
  625. struct device_attribute *attr, char *buf)
  626. {
  627. struct idxd_wq *wq = confdev_to_wq(dev);
  628. return sysfs_emit(buf, "%u\n", test_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags));
  629. }
  630. static ssize_t wq_block_on_fault_store(struct device *dev,
  631. struct device_attribute *attr,
  632. const char *buf, size_t count)
  633. {
  634. struct idxd_wq *wq = confdev_to_wq(dev);
  635. struct idxd_device *idxd = wq->idxd;
  636. bool bof;
  637. int rc;
  638. if (!idxd->hw.gen_cap.block_on_fault)
  639. return -EOPNOTSUPP;
  640. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  641. return -EPERM;
  642. if (wq->state != IDXD_WQ_DISABLED)
  643. return -ENXIO;
  644. rc = kstrtobool(buf, &bof);
  645. if (rc < 0)
  646. return rc;
  647. if (bof) {
  648. if (test_bit(WQ_FLAG_PRS_DISABLE, &wq->flags))
  649. return -EOPNOTSUPP;
  650. set_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags);
  651. } else {
  652. clear_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags);
  653. }
  654. return count;
  655. }
  656. static struct device_attribute dev_attr_wq_block_on_fault =
  657. __ATTR(block_on_fault, 0644, wq_block_on_fault_show,
  658. wq_block_on_fault_store);
  659. static ssize_t wq_threshold_show(struct device *dev,
  660. struct device_attribute *attr, char *buf)
  661. {
  662. struct idxd_wq *wq = confdev_to_wq(dev);
  663. return sysfs_emit(buf, "%u\n", wq->threshold);
  664. }
  665. static ssize_t wq_threshold_store(struct device *dev,
  666. struct device_attribute *attr,
  667. const char *buf, size_t count)
  668. {
  669. struct idxd_wq *wq = confdev_to_wq(dev);
  670. struct idxd_device *idxd = wq->idxd;
  671. unsigned int val;
  672. int rc;
  673. rc = kstrtouint(buf, 0, &val);
  674. if (rc < 0)
  675. return -EINVAL;
  676. if (val > wq->size || val <= 0)
  677. return -EINVAL;
  678. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  679. return -EPERM;
  680. if (wq->state != IDXD_WQ_DISABLED)
  681. return -ENXIO;
  682. if (test_bit(WQ_FLAG_DEDICATED, &wq->flags))
  683. return -EINVAL;
  684. wq->threshold = val;
  685. return count;
  686. }
  687. static struct device_attribute dev_attr_wq_threshold =
  688. __ATTR(threshold, 0644, wq_threshold_show, wq_threshold_store);
  689. static ssize_t wq_type_show(struct device *dev,
  690. struct device_attribute *attr, char *buf)
  691. {
  692. struct idxd_wq *wq = confdev_to_wq(dev);
  693. switch (wq->type) {
  694. case IDXD_WQT_KERNEL:
  695. return sysfs_emit(buf, "%s\n", idxd_wq_type_names[IDXD_WQT_KERNEL]);
  696. case IDXD_WQT_USER:
  697. return sysfs_emit(buf, "%s\n", idxd_wq_type_names[IDXD_WQT_USER]);
  698. case IDXD_WQT_NONE:
  699. default:
  700. return sysfs_emit(buf, "%s\n", idxd_wq_type_names[IDXD_WQT_NONE]);
  701. }
  702. return -EINVAL;
  703. }
  704. static ssize_t wq_type_store(struct device *dev,
  705. struct device_attribute *attr, const char *buf,
  706. size_t count)
  707. {
  708. struct idxd_wq *wq = confdev_to_wq(dev);
  709. enum idxd_wq_type old_type;
  710. if (wq->state != IDXD_WQ_DISABLED)
  711. return -EPERM;
  712. old_type = wq->type;
  713. if (sysfs_streq(buf, idxd_wq_type_names[IDXD_WQT_NONE]))
  714. wq->type = IDXD_WQT_NONE;
  715. else if (sysfs_streq(buf, idxd_wq_type_names[IDXD_WQT_KERNEL]))
  716. wq->type = IDXD_WQT_KERNEL;
  717. else if (sysfs_streq(buf, idxd_wq_type_names[IDXD_WQT_USER]))
  718. wq->type = IDXD_WQT_USER;
  719. else
  720. return -EINVAL;
  721. /* If we are changing queue type, clear the name */
  722. if (wq->type != old_type)
  723. memset(wq->name, 0, WQ_NAME_SIZE + 1);
  724. return count;
  725. }
  726. static struct device_attribute dev_attr_wq_type =
  727. __ATTR(type, 0644, wq_type_show, wq_type_store);
  728. static ssize_t wq_name_show(struct device *dev,
  729. struct device_attribute *attr, char *buf)
  730. {
  731. struct idxd_wq *wq = confdev_to_wq(dev);
  732. return sysfs_emit(buf, "%s\n", wq->name);
  733. }
  734. static ssize_t wq_name_store(struct device *dev,
  735. struct device_attribute *attr, const char *buf,
  736. size_t count)
  737. {
  738. struct idxd_wq *wq = confdev_to_wq(dev);
  739. char *input, *pos;
  740. if (wq->state != IDXD_WQ_DISABLED)
  741. return -EPERM;
  742. if (strlen(buf) > WQ_NAME_SIZE || strlen(buf) == 0)
  743. return -EINVAL;
  744. input = kstrndup(buf, count, GFP_KERNEL);
  745. if (!input)
  746. return -ENOMEM;
  747. pos = strim(input);
  748. memset(wq->name, 0, WQ_NAME_SIZE + 1);
  749. sprintf(wq->name, "%s", pos);
  750. kfree(input);
  751. return count;
  752. }
  753. static struct device_attribute dev_attr_wq_name =
  754. __ATTR(name, 0644, wq_name_show, wq_name_store);
  755. static ssize_t wq_cdev_minor_show(struct device *dev,
  756. struct device_attribute *attr, char *buf)
  757. {
  758. struct idxd_wq *wq = confdev_to_wq(dev);
  759. int minor = -1;
  760. mutex_lock(&wq->wq_lock);
  761. if (wq->idxd_cdev)
  762. minor = wq->idxd_cdev->minor;
  763. mutex_unlock(&wq->wq_lock);
  764. if (minor == -1)
  765. return -ENXIO;
  766. return sysfs_emit(buf, "%d\n", minor);
  767. }
  768. static struct device_attribute dev_attr_wq_cdev_minor =
  769. __ATTR(cdev_minor, 0444, wq_cdev_minor_show, NULL);
  770. static int __get_sysfs_u64(const char *buf, u64 *val)
  771. {
  772. int rc;
  773. rc = kstrtou64(buf, 0, val);
  774. if (rc < 0)
  775. return -EINVAL;
  776. if (*val == 0)
  777. return -EINVAL;
  778. *val = roundup_pow_of_two(*val);
  779. return 0;
  780. }
  781. static ssize_t wq_max_transfer_size_show(struct device *dev, struct device_attribute *attr,
  782. char *buf)
  783. {
  784. struct idxd_wq *wq = confdev_to_wq(dev);
  785. return sysfs_emit(buf, "%llu\n", wq->max_xfer_bytes);
  786. }
  787. static ssize_t wq_max_transfer_size_store(struct device *dev, struct device_attribute *attr,
  788. const char *buf, size_t count)
  789. {
  790. struct idxd_wq *wq = confdev_to_wq(dev);
  791. struct idxd_device *idxd = wq->idxd;
  792. u64 xfer_size;
  793. int rc;
  794. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  795. return -EPERM;
  796. if (wq->state != IDXD_WQ_DISABLED)
  797. return -EPERM;
  798. rc = __get_sysfs_u64(buf, &xfer_size);
  799. if (rc < 0)
  800. return rc;
  801. if (xfer_size > idxd->max_xfer_bytes)
  802. return -EINVAL;
  803. wq->max_xfer_bytes = xfer_size;
  804. return count;
  805. }
  806. static struct device_attribute dev_attr_wq_max_transfer_size =
  807. __ATTR(max_transfer_size, 0644,
  808. wq_max_transfer_size_show, wq_max_transfer_size_store);
  809. static ssize_t wq_max_batch_size_show(struct device *dev, struct device_attribute *attr, char *buf)
  810. {
  811. struct idxd_wq *wq = confdev_to_wq(dev);
  812. return sysfs_emit(buf, "%u\n", wq->max_batch_size);
  813. }
  814. static ssize_t wq_max_batch_size_store(struct device *dev, struct device_attribute *attr,
  815. const char *buf, size_t count)
  816. {
  817. struct idxd_wq *wq = confdev_to_wq(dev);
  818. struct idxd_device *idxd = wq->idxd;
  819. u64 batch_size;
  820. int rc;
  821. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  822. return -EPERM;
  823. if (wq->state != IDXD_WQ_DISABLED)
  824. return -EPERM;
  825. rc = __get_sysfs_u64(buf, &batch_size);
  826. if (rc < 0)
  827. return rc;
  828. if (batch_size > idxd->max_batch_size)
  829. return -EINVAL;
  830. idxd_wq_set_max_batch_size(idxd->data->type, wq, (u32)batch_size);
  831. return count;
  832. }
  833. static struct device_attribute dev_attr_wq_max_batch_size =
  834. __ATTR(max_batch_size, 0644, wq_max_batch_size_show, wq_max_batch_size_store);
  835. static ssize_t wq_ats_disable_show(struct device *dev, struct device_attribute *attr, char *buf)
  836. {
  837. struct idxd_wq *wq = confdev_to_wq(dev);
  838. return sysfs_emit(buf, "%u\n", test_bit(WQ_FLAG_ATS_DISABLE, &wq->flags));
  839. }
  840. static ssize_t wq_ats_disable_store(struct device *dev, struct device_attribute *attr,
  841. const char *buf, size_t count)
  842. {
  843. struct idxd_wq *wq = confdev_to_wq(dev);
  844. struct idxd_device *idxd = wq->idxd;
  845. bool ats_dis;
  846. int rc;
  847. if (wq->state != IDXD_WQ_DISABLED)
  848. return -EPERM;
  849. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  850. return -EPERM;
  851. rc = kstrtobool(buf, &ats_dis);
  852. if (rc < 0)
  853. return rc;
  854. if (ats_dis)
  855. set_bit(WQ_FLAG_ATS_DISABLE, &wq->flags);
  856. else
  857. clear_bit(WQ_FLAG_ATS_DISABLE, &wq->flags);
  858. return count;
  859. }
  860. static struct device_attribute dev_attr_wq_ats_disable =
  861. __ATTR(ats_disable, 0644, wq_ats_disable_show, wq_ats_disable_store);
  862. static ssize_t wq_prs_disable_show(struct device *dev, struct device_attribute *attr, char *buf)
  863. {
  864. struct idxd_wq *wq = confdev_to_wq(dev);
  865. return sysfs_emit(buf, "%u\n", test_bit(WQ_FLAG_PRS_DISABLE, &wq->flags));
  866. }
  867. static ssize_t wq_prs_disable_store(struct device *dev, struct device_attribute *attr,
  868. const char *buf, size_t count)
  869. {
  870. struct idxd_wq *wq = confdev_to_wq(dev);
  871. struct idxd_device *idxd = wq->idxd;
  872. bool prs_dis;
  873. int rc;
  874. if (wq->state != IDXD_WQ_DISABLED)
  875. return -EPERM;
  876. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  877. return -EPERM;
  878. rc = kstrtobool(buf, &prs_dis);
  879. if (rc < 0)
  880. return rc;
  881. if (prs_dis) {
  882. set_bit(WQ_FLAG_PRS_DISABLE, &wq->flags);
  883. /* when PRS is disabled, BOF needs to be off as well */
  884. clear_bit(WQ_FLAG_BLOCK_ON_FAULT, &wq->flags);
  885. } else {
  886. clear_bit(WQ_FLAG_PRS_DISABLE, &wq->flags);
  887. }
  888. return count;
  889. }
  890. static struct device_attribute dev_attr_wq_prs_disable =
  891. __ATTR(prs_disable, 0644, wq_prs_disable_show, wq_prs_disable_store);
  892. static ssize_t wq_occupancy_show(struct device *dev, struct device_attribute *attr, char *buf)
  893. {
  894. struct idxd_wq *wq = confdev_to_wq(dev);
  895. struct idxd_device *idxd = wq->idxd;
  896. u32 occup, offset;
  897. if (!idxd->hw.wq_cap.occupancy)
  898. return -EOPNOTSUPP;
  899. offset = WQCFG_OFFSET(idxd, wq->id, WQCFG_OCCUP_IDX);
  900. occup = ioread32(idxd->reg_base + offset) & WQCFG_OCCUP_MASK;
  901. return sysfs_emit(buf, "%u\n", occup);
  902. }
  903. static struct device_attribute dev_attr_wq_occupancy =
  904. __ATTR(occupancy, 0444, wq_occupancy_show, NULL);
  905. static ssize_t wq_enqcmds_retries_show(struct device *dev,
  906. struct device_attribute *attr, char *buf)
  907. {
  908. struct idxd_wq *wq = confdev_to_wq(dev);
  909. if (wq_dedicated(wq))
  910. return -EOPNOTSUPP;
  911. return sysfs_emit(buf, "%u\n", wq->enqcmds_retries);
  912. }
  913. static ssize_t wq_enqcmds_retries_store(struct device *dev, struct device_attribute *attr,
  914. const char *buf, size_t count)
  915. {
  916. struct idxd_wq *wq = confdev_to_wq(dev);
  917. int rc;
  918. unsigned int retries;
  919. if (wq_dedicated(wq))
  920. return -EOPNOTSUPP;
  921. rc = kstrtouint(buf, 10, &retries);
  922. if (rc < 0)
  923. return rc;
  924. if (retries > IDXD_ENQCMDS_MAX_RETRIES)
  925. retries = IDXD_ENQCMDS_MAX_RETRIES;
  926. wq->enqcmds_retries = retries;
  927. return count;
  928. }
  929. static struct device_attribute dev_attr_wq_enqcmds_retries =
  930. __ATTR(enqcmds_retries, 0644, wq_enqcmds_retries_show, wq_enqcmds_retries_store);
  931. static ssize_t op_cap_show_common(struct device *dev, char *buf, unsigned long *opcap_bmap)
  932. {
  933. ssize_t pos;
  934. int i;
  935. pos = 0;
  936. for (i = IDXD_MAX_OPCAP_BITS/64 - 1; i >= 0; i--) {
  937. unsigned long val = opcap_bmap[i];
  938. /* On systems where direct user submissions are not safe, we need to clear out
  939. * the BATCH capability from the capability mask in sysfs since we cannot support
  940. * that command on such systems.
  941. */
  942. if (i == DSA_OPCODE_BATCH/64 && !confdev_to_idxd(dev)->user_submission_safe)
  943. clear_bit(DSA_OPCODE_BATCH % 64, &val);
  944. pos += sysfs_emit_at(buf, pos, "%*pb", 64, &val);
  945. pos += sysfs_emit_at(buf, pos, "%c", i == 0 ? '\n' : ',');
  946. }
  947. return pos;
  948. }
  949. static ssize_t wq_op_config_show(struct device *dev,
  950. struct device_attribute *attr, char *buf)
  951. {
  952. struct idxd_wq *wq = confdev_to_wq(dev);
  953. return op_cap_show_common(dev, buf, wq->opcap_bmap);
  954. }
  955. static int idxd_verify_supported_opcap(struct idxd_device *idxd, unsigned long *opmask)
  956. {
  957. int bit;
  958. /*
  959. * The OPCAP is defined as 256 bits that represents each operation the device
  960. * supports per bit. Iterate through all the bits and check if the input mask
  961. * is set for bits that are not set in the OPCAP for the device. If no OPCAP
  962. * bit is set and input mask has the bit set, then return error.
  963. */
  964. for_each_set_bit(bit, opmask, IDXD_MAX_OPCAP_BITS) {
  965. if (!test_bit(bit, idxd->opcap_bmap))
  966. return -EINVAL;
  967. }
  968. return 0;
  969. }
  970. static ssize_t wq_op_config_store(struct device *dev, struct device_attribute *attr,
  971. const char *buf, size_t count)
  972. {
  973. struct idxd_wq *wq = confdev_to_wq(dev);
  974. struct idxd_device *idxd = wq->idxd;
  975. unsigned long *opmask;
  976. int rc;
  977. if (wq->state != IDXD_WQ_DISABLED)
  978. return -EPERM;
  979. opmask = bitmap_zalloc(IDXD_MAX_OPCAP_BITS, GFP_KERNEL);
  980. if (!opmask)
  981. return -ENOMEM;
  982. rc = bitmap_parse(buf, count, opmask, IDXD_MAX_OPCAP_BITS);
  983. if (rc < 0)
  984. goto err;
  985. rc = idxd_verify_supported_opcap(idxd, opmask);
  986. if (rc < 0)
  987. goto err;
  988. bitmap_copy(wq->opcap_bmap, opmask, IDXD_MAX_OPCAP_BITS);
  989. bitmap_free(opmask);
  990. return count;
  991. err:
  992. bitmap_free(opmask);
  993. return rc;
  994. }
  995. static struct device_attribute dev_attr_wq_op_config =
  996. __ATTR(op_config, 0644, wq_op_config_show, wq_op_config_store);
  997. static ssize_t wq_driver_name_show(struct device *dev, struct device_attribute *attr, char *buf)
  998. {
  999. struct idxd_wq *wq = confdev_to_wq(dev);
  1000. return sysfs_emit(buf, "%s\n", wq->driver_name);
  1001. }
  1002. static ssize_t wq_driver_name_store(struct device *dev, struct device_attribute *attr,
  1003. const char *buf, size_t count)
  1004. {
  1005. struct idxd_wq *wq = confdev_to_wq(dev);
  1006. char *input, *pos;
  1007. if (wq->state != IDXD_WQ_DISABLED)
  1008. return -EPERM;
  1009. if (strlen(buf) > DRIVER_NAME_SIZE || strlen(buf) == 0)
  1010. return -EINVAL;
  1011. input = kstrndup(buf, count, GFP_KERNEL);
  1012. if (!input)
  1013. return -ENOMEM;
  1014. pos = strim(input);
  1015. memset(wq->driver_name, 0, DRIVER_NAME_SIZE + 1);
  1016. sprintf(wq->driver_name, "%s", pos);
  1017. kfree(input);
  1018. return count;
  1019. }
  1020. static struct device_attribute dev_attr_wq_driver_name =
  1021. __ATTR(driver_name, 0644, wq_driver_name_show, wq_driver_name_store);
  1022. static struct attribute *idxd_wq_attributes[] = {
  1023. &dev_attr_wq_clients.attr,
  1024. &dev_attr_wq_state.attr,
  1025. &dev_attr_wq_group_id.attr,
  1026. &dev_attr_wq_mode.attr,
  1027. &dev_attr_wq_size.attr,
  1028. &dev_attr_wq_priority.attr,
  1029. &dev_attr_wq_block_on_fault.attr,
  1030. &dev_attr_wq_threshold.attr,
  1031. &dev_attr_wq_type.attr,
  1032. &dev_attr_wq_name.attr,
  1033. &dev_attr_wq_cdev_minor.attr,
  1034. &dev_attr_wq_max_transfer_size.attr,
  1035. &dev_attr_wq_max_batch_size.attr,
  1036. &dev_attr_wq_ats_disable.attr,
  1037. &dev_attr_wq_prs_disable.attr,
  1038. &dev_attr_wq_occupancy.attr,
  1039. &dev_attr_wq_enqcmds_retries.attr,
  1040. &dev_attr_wq_op_config.attr,
  1041. &dev_attr_wq_driver_name.attr,
  1042. NULL,
  1043. };
  1044. /* A WQ attr is invisible if the feature is not supported in WQCAP. */
  1045. #define idxd_wq_attr_invisible(name, cap_field, a, idxd) \
  1046. ((a) == &dev_attr_wq_##name.attr && !(idxd)->hw.wq_cap.cap_field)
  1047. static bool idxd_wq_attr_max_batch_size_invisible(struct attribute *attr,
  1048. struct idxd_device *idxd)
  1049. {
  1050. /* Intel IAA does not support batch processing, make it invisible */
  1051. return attr == &dev_attr_wq_max_batch_size.attr &&
  1052. idxd->data->type == IDXD_TYPE_IAX;
  1053. }
  1054. static umode_t idxd_wq_attr_visible(struct kobject *kobj,
  1055. struct attribute *attr, int n)
  1056. {
  1057. struct device *dev = container_of(kobj, struct device, kobj);
  1058. struct idxd_wq *wq = confdev_to_wq(dev);
  1059. struct idxd_device *idxd = wq->idxd;
  1060. if (idxd_wq_attr_invisible(op_config, op_config, attr, idxd))
  1061. return 0;
  1062. if (idxd_wq_attr_max_batch_size_invisible(attr, idxd))
  1063. return 0;
  1064. if (idxd_wq_attr_invisible(prs_disable, wq_prs_support, attr, idxd))
  1065. return 0;
  1066. if (idxd_wq_attr_invisible(ats_disable, wq_ats_support, attr, idxd))
  1067. return 0;
  1068. return attr->mode;
  1069. }
  1070. static const struct attribute_group idxd_wq_attribute_group = {
  1071. .attrs = idxd_wq_attributes,
  1072. .is_visible = idxd_wq_attr_visible,
  1073. };
  1074. static const struct attribute_group *idxd_wq_attribute_groups[] = {
  1075. &idxd_wq_attribute_group,
  1076. NULL,
  1077. };
  1078. static void idxd_conf_wq_release(struct device *dev)
  1079. {
  1080. struct idxd_wq *wq = confdev_to_wq(dev);
  1081. bitmap_free(wq->opcap_bmap);
  1082. kfree(wq->wqcfg);
  1083. xa_destroy(&wq->upasid_xa);
  1084. kfree(wq);
  1085. }
  1086. const struct device_type idxd_wq_device_type = {
  1087. .name = "wq",
  1088. .release = idxd_conf_wq_release,
  1089. .groups = idxd_wq_attribute_groups,
  1090. };
  1091. /* IDXD device attribs */
  1092. static ssize_t version_show(struct device *dev, struct device_attribute *attr,
  1093. char *buf)
  1094. {
  1095. struct idxd_device *idxd = confdev_to_idxd(dev);
  1096. return sysfs_emit(buf, "%#x\n", idxd->hw.version);
  1097. }
  1098. static DEVICE_ATTR_RO(version);
  1099. static ssize_t max_work_queues_size_show(struct device *dev,
  1100. struct device_attribute *attr,
  1101. char *buf)
  1102. {
  1103. struct idxd_device *idxd = confdev_to_idxd(dev);
  1104. return sysfs_emit(buf, "%u\n", idxd->max_wq_size);
  1105. }
  1106. static DEVICE_ATTR_RO(max_work_queues_size);
  1107. static ssize_t max_groups_show(struct device *dev,
  1108. struct device_attribute *attr, char *buf)
  1109. {
  1110. struct idxd_device *idxd = confdev_to_idxd(dev);
  1111. return sysfs_emit(buf, "%u\n", idxd->max_groups);
  1112. }
  1113. static DEVICE_ATTR_RO(max_groups);
  1114. static ssize_t max_work_queues_show(struct device *dev,
  1115. struct device_attribute *attr, char *buf)
  1116. {
  1117. struct idxd_device *idxd = confdev_to_idxd(dev);
  1118. return sysfs_emit(buf, "%u\n", idxd->max_wqs);
  1119. }
  1120. static DEVICE_ATTR_RO(max_work_queues);
  1121. static ssize_t max_engines_show(struct device *dev,
  1122. struct device_attribute *attr, char *buf)
  1123. {
  1124. struct idxd_device *idxd = confdev_to_idxd(dev);
  1125. return sysfs_emit(buf, "%u\n", idxd->max_engines);
  1126. }
  1127. static DEVICE_ATTR_RO(max_engines);
  1128. static ssize_t numa_node_show(struct device *dev,
  1129. struct device_attribute *attr, char *buf)
  1130. {
  1131. struct idxd_device *idxd = confdev_to_idxd(dev);
  1132. return sysfs_emit(buf, "%d\n", dev_to_node(&idxd->pdev->dev));
  1133. }
  1134. static DEVICE_ATTR_RO(numa_node);
  1135. static ssize_t max_batch_size_show(struct device *dev,
  1136. struct device_attribute *attr, char *buf)
  1137. {
  1138. struct idxd_device *idxd = confdev_to_idxd(dev);
  1139. return sysfs_emit(buf, "%u\n", idxd->max_batch_size);
  1140. }
  1141. static DEVICE_ATTR_RO(max_batch_size);
  1142. static ssize_t max_transfer_size_show(struct device *dev,
  1143. struct device_attribute *attr,
  1144. char *buf)
  1145. {
  1146. struct idxd_device *idxd = confdev_to_idxd(dev);
  1147. return sysfs_emit(buf, "%llu\n", idxd->max_xfer_bytes);
  1148. }
  1149. static DEVICE_ATTR_RO(max_transfer_size);
  1150. static ssize_t op_cap_show(struct device *dev,
  1151. struct device_attribute *attr, char *buf)
  1152. {
  1153. struct idxd_device *idxd = confdev_to_idxd(dev);
  1154. return op_cap_show_common(dev, buf, idxd->opcap_bmap);
  1155. }
  1156. static DEVICE_ATTR_RO(op_cap);
  1157. static ssize_t gen_cap_show(struct device *dev,
  1158. struct device_attribute *attr, char *buf)
  1159. {
  1160. struct idxd_device *idxd = confdev_to_idxd(dev);
  1161. return sysfs_emit(buf, "%#llx\n", idxd->hw.gen_cap.bits);
  1162. }
  1163. static DEVICE_ATTR_RO(gen_cap);
  1164. static ssize_t configurable_show(struct device *dev,
  1165. struct device_attribute *attr, char *buf)
  1166. {
  1167. struct idxd_device *idxd = confdev_to_idxd(dev);
  1168. return sysfs_emit(buf, "%u\n", test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags));
  1169. }
  1170. static DEVICE_ATTR_RO(configurable);
  1171. static ssize_t clients_show(struct device *dev,
  1172. struct device_attribute *attr, char *buf)
  1173. {
  1174. struct idxd_device *idxd = confdev_to_idxd(dev);
  1175. int count = 0, i;
  1176. spin_lock(&idxd->dev_lock);
  1177. for (i = 0; i < idxd->max_wqs; i++) {
  1178. struct idxd_wq *wq = idxd->wqs[i];
  1179. count += wq->client_count;
  1180. }
  1181. spin_unlock(&idxd->dev_lock);
  1182. return sysfs_emit(buf, "%d\n", count);
  1183. }
  1184. static DEVICE_ATTR_RO(clients);
  1185. static ssize_t pasid_enabled_show(struct device *dev,
  1186. struct device_attribute *attr, char *buf)
  1187. {
  1188. struct idxd_device *idxd = confdev_to_idxd(dev);
  1189. return sysfs_emit(buf, "%u\n", device_user_pasid_enabled(idxd));
  1190. }
  1191. static DEVICE_ATTR_RO(pasid_enabled);
  1192. static ssize_t state_show(struct device *dev,
  1193. struct device_attribute *attr, char *buf)
  1194. {
  1195. struct idxd_device *idxd = confdev_to_idxd(dev);
  1196. switch (idxd->state) {
  1197. case IDXD_DEV_DISABLED:
  1198. return sysfs_emit(buf, "disabled\n");
  1199. case IDXD_DEV_ENABLED:
  1200. return sysfs_emit(buf, "enabled\n");
  1201. case IDXD_DEV_HALTED:
  1202. return sysfs_emit(buf, "halted\n");
  1203. }
  1204. return sysfs_emit(buf, "unknown\n");
  1205. }
  1206. static DEVICE_ATTR_RO(state);
  1207. static ssize_t errors_show(struct device *dev,
  1208. struct device_attribute *attr, char *buf)
  1209. {
  1210. struct idxd_device *idxd = confdev_to_idxd(dev);
  1211. DECLARE_BITMAP(swerr_bmap, 256);
  1212. bitmap_zero(swerr_bmap, 256);
  1213. spin_lock(&idxd->dev_lock);
  1214. multi_u64_to_bmap(swerr_bmap, &idxd->sw_err.bits[0], 4);
  1215. spin_unlock(&idxd->dev_lock);
  1216. return sysfs_emit(buf, "%*pb\n", 256, swerr_bmap);
  1217. }
  1218. static DEVICE_ATTR_RO(errors);
  1219. static ssize_t max_read_buffers_show(struct device *dev,
  1220. struct device_attribute *attr, char *buf)
  1221. {
  1222. struct idxd_device *idxd = confdev_to_idxd(dev);
  1223. return sysfs_emit(buf, "%u\n", idxd->max_rdbufs);
  1224. }
  1225. static ssize_t max_tokens_show(struct device *dev,
  1226. struct device_attribute *attr, char *buf)
  1227. {
  1228. dev_warn_once(dev, "attribute deprecated, see max_read_buffers.\n");
  1229. return max_read_buffers_show(dev, attr, buf);
  1230. }
  1231. static DEVICE_ATTR_RO(max_tokens); /* deprecated */
  1232. static DEVICE_ATTR_RO(max_read_buffers);
  1233. static ssize_t read_buffer_limit_show(struct device *dev,
  1234. struct device_attribute *attr, char *buf)
  1235. {
  1236. struct idxd_device *idxd = confdev_to_idxd(dev);
  1237. return sysfs_emit(buf, "%u\n", idxd->rdbuf_limit);
  1238. }
  1239. static ssize_t token_limit_show(struct device *dev,
  1240. struct device_attribute *attr, char *buf)
  1241. {
  1242. dev_warn_once(dev, "attribute deprecated, see read_buffer_limit.\n");
  1243. return read_buffer_limit_show(dev, attr, buf);
  1244. }
  1245. static ssize_t read_buffer_limit_store(struct device *dev,
  1246. struct device_attribute *attr,
  1247. const char *buf, size_t count)
  1248. {
  1249. struct idxd_device *idxd = confdev_to_idxd(dev);
  1250. unsigned long val;
  1251. int rc;
  1252. rc = kstrtoul(buf, 10, &val);
  1253. if (rc < 0)
  1254. return -EINVAL;
  1255. if (idxd->state == IDXD_DEV_ENABLED)
  1256. return -EPERM;
  1257. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  1258. return -EPERM;
  1259. if (!idxd->hw.group_cap.rdbuf_limit)
  1260. return -EPERM;
  1261. if (val > idxd->hw.group_cap.total_rdbufs)
  1262. return -EINVAL;
  1263. idxd->rdbuf_limit = val;
  1264. return count;
  1265. }
  1266. static ssize_t token_limit_store(struct device *dev,
  1267. struct device_attribute *attr,
  1268. const char *buf, size_t count)
  1269. {
  1270. dev_warn_once(dev, "attribute deprecated, see read_buffer_limit\n");
  1271. return read_buffer_limit_store(dev, attr, buf, count);
  1272. }
  1273. static DEVICE_ATTR_RW(token_limit); /* deprecated */
  1274. static DEVICE_ATTR_RW(read_buffer_limit);
  1275. static ssize_t cdev_major_show(struct device *dev,
  1276. struct device_attribute *attr, char *buf)
  1277. {
  1278. struct idxd_device *idxd = confdev_to_idxd(dev);
  1279. return sysfs_emit(buf, "%u\n", idxd->major);
  1280. }
  1281. static DEVICE_ATTR_RO(cdev_major);
  1282. static ssize_t cmd_status_show(struct device *dev,
  1283. struct device_attribute *attr, char *buf)
  1284. {
  1285. struct idxd_device *idxd = confdev_to_idxd(dev);
  1286. return sysfs_emit(buf, "%#x\n", idxd->cmd_status);
  1287. }
  1288. static ssize_t cmd_status_store(struct device *dev, struct device_attribute *attr,
  1289. const char *buf, size_t count)
  1290. {
  1291. struct idxd_device *idxd = confdev_to_idxd(dev);
  1292. idxd->cmd_status = 0;
  1293. return count;
  1294. }
  1295. static DEVICE_ATTR_RW(cmd_status);
  1296. static ssize_t iaa_cap_show(struct device *dev,
  1297. struct device_attribute *attr, char *buf)
  1298. {
  1299. struct idxd_device *idxd = confdev_to_idxd(dev);
  1300. if (idxd->hw.version < DEVICE_VERSION_2)
  1301. return -EOPNOTSUPP;
  1302. return sysfs_emit(buf, "%#llx\n", idxd->hw.iaa_cap.bits);
  1303. }
  1304. static DEVICE_ATTR_RO(iaa_cap);
  1305. static ssize_t event_log_size_show(struct device *dev,
  1306. struct device_attribute *attr, char *buf)
  1307. {
  1308. struct idxd_device *idxd = confdev_to_idxd(dev);
  1309. if (!idxd->evl)
  1310. return -EOPNOTSUPP;
  1311. return sysfs_emit(buf, "%u\n", idxd->evl->size);
  1312. }
  1313. static ssize_t event_log_size_store(struct device *dev,
  1314. struct device_attribute *attr,
  1315. const char *buf, size_t count)
  1316. {
  1317. struct idxd_device *idxd = confdev_to_idxd(dev);
  1318. unsigned long val;
  1319. int rc;
  1320. if (!idxd->evl)
  1321. return -EOPNOTSUPP;
  1322. rc = kstrtoul(buf, 10, &val);
  1323. if (rc < 0)
  1324. return -EINVAL;
  1325. if (idxd->state == IDXD_DEV_ENABLED)
  1326. return -EPERM;
  1327. if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
  1328. return -EPERM;
  1329. if (val < IDXD_EVL_SIZE_MIN || val > IDXD_EVL_SIZE_MAX ||
  1330. (val * evl_ent_size(idxd) > ULONG_MAX - idxd->evl->dma))
  1331. return -EINVAL;
  1332. idxd->evl->size = val;
  1333. return count;
  1334. }
  1335. static DEVICE_ATTR_RW(event_log_size);
  1336. static bool idxd_device_attr_max_batch_size_invisible(struct attribute *attr,
  1337. struct idxd_device *idxd)
  1338. {
  1339. /* Intel IAA does not support batch processing, make it invisible */
  1340. return attr == &dev_attr_max_batch_size.attr &&
  1341. idxd->data->type == IDXD_TYPE_IAX;
  1342. }
  1343. static bool idxd_device_attr_read_buffers_invisible(struct attribute *attr,
  1344. struct idxd_device *idxd)
  1345. {
  1346. /*
  1347. * Intel IAA does not support Read Buffer allocation control,
  1348. * make these attributes invisible.
  1349. */
  1350. return (attr == &dev_attr_max_tokens.attr ||
  1351. attr == &dev_attr_max_read_buffers.attr ||
  1352. attr == &dev_attr_token_limit.attr ||
  1353. attr == &dev_attr_read_buffer_limit.attr) &&
  1354. idxd->data->type == IDXD_TYPE_IAX;
  1355. }
  1356. static bool idxd_device_attr_iaa_cap_invisible(struct attribute *attr,
  1357. struct idxd_device *idxd)
  1358. {
  1359. return attr == &dev_attr_iaa_cap.attr &&
  1360. (idxd->data->type != IDXD_TYPE_IAX ||
  1361. idxd->hw.version < DEVICE_VERSION_2);
  1362. }
  1363. static bool idxd_device_attr_event_log_size_invisible(struct attribute *attr,
  1364. struct idxd_device *idxd)
  1365. {
  1366. return (attr == &dev_attr_event_log_size.attr &&
  1367. !idxd->hw.gen_cap.evl_support);
  1368. }
  1369. static umode_t idxd_device_attr_visible(struct kobject *kobj,
  1370. struct attribute *attr, int n)
  1371. {
  1372. struct device *dev = container_of(kobj, struct device, kobj);
  1373. struct idxd_device *idxd = confdev_to_idxd(dev);
  1374. if (idxd_device_attr_max_batch_size_invisible(attr, idxd))
  1375. return 0;
  1376. if (idxd_device_attr_read_buffers_invisible(attr, idxd))
  1377. return 0;
  1378. if (idxd_device_attr_iaa_cap_invisible(attr, idxd))
  1379. return 0;
  1380. if (idxd_device_attr_event_log_size_invisible(attr, idxd))
  1381. return 0;
  1382. return attr->mode;
  1383. }
  1384. static struct attribute *idxd_device_attributes[] = {
  1385. &dev_attr_version.attr,
  1386. &dev_attr_max_groups.attr,
  1387. &dev_attr_max_work_queues.attr,
  1388. &dev_attr_max_work_queues_size.attr,
  1389. &dev_attr_max_engines.attr,
  1390. &dev_attr_numa_node.attr,
  1391. &dev_attr_max_batch_size.attr,
  1392. &dev_attr_max_transfer_size.attr,
  1393. &dev_attr_op_cap.attr,
  1394. &dev_attr_gen_cap.attr,
  1395. &dev_attr_configurable.attr,
  1396. &dev_attr_clients.attr,
  1397. &dev_attr_pasid_enabled.attr,
  1398. &dev_attr_state.attr,
  1399. &dev_attr_errors.attr,
  1400. &dev_attr_max_tokens.attr,
  1401. &dev_attr_max_read_buffers.attr,
  1402. &dev_attr_token_limit.attr,
  1403. &dev_attr_read_buffer_limit.attr,
  1404. &dev_attr_cdev_major.attr,
  1405. &dev_attr_cmd_status.attr,
  1406. &dev_attr_iaa_cap.attr,
  1407. &dev_attr_event_log_size.attr,
  1408. NULL,
  1409. };
  1410. static const struct attribute_group idxd_device_attribute_group = {
  1411. .attrs = idxd_device_attributes,
  1412. .is_visible = idxd_device_attr_visible,
  1413. };
  1414. static const struct attribute_group *idxd_attribute_groups[] = {
  1415. &idxd_device_attribute_group,
  1416. NULL,
  1417. };
  1418. static void idxd_conf_device_release(struct device *dev)
  1419. {
  1420. struct idxd_device *idxd = confdev_to_idxd(dev);
  1421. kfree(idxd->groups);
  1422. bitmap_free(idxd->wq_enable_map);
  1423. kfree(idxd->wqs);
  1424. kfree(idxd->engines);
  1425. kfree(idxd->evl);
  1426. kmem_cache_destroy(idxd->evl_cache);
  1427. ida_free(&idxd_ida, idxd->id);
  1428. bitmap_free(idxd->opcap_bmap);
  1429. kfree(idxd);
  1430. }
  1431. const struct device_type dsa_device_type = {
  1432. .name = "dsa",
  1433. .release = idxd_conf_device_release,
  1434. .groups = idxd_attribute_groups,
  1435. };
  1436. const struct device_type iax_device_type = {
  1437. .name = "iax",
  1438. .release = idxd_conf_device_release,
  1439. .groups = idxd_attribute_groups,
  1440. };
  1441. static int idxd_register_engine_devices(struct idxd_device *idxd)
  1442. {
  1443. struct idxd_engine *engine;
  1444. int i, j, rc;
  1445. for (i = 0; i < idxd->max_engines; i++) {
  1446. engine = idxd->engines[i];
  1447. rc = device_add(engine_confdev(engine));
  1448. if (rc < 0)
  1449. goto cleanup;
  1450. }
  1451. return 0;
  1452. cleanup:
  1453. j = i - 1;
  1454. for (; i < idxd->max_engines; i++) {
  1455. engine = idxd->engines[i];
  1456. put_device(engine_confdev(engine));
  1457. }
  1458. while (j--) {
  1459. engine = idxd->engines[j];
  1460. device_unregister(engine_confdev(engine));
  1461. }
  1462. return rc;
  1463. }
  1464. static int idxd_register_group_devices(struct idxd_device *idxd)
  1465. {
  1466. struct idxd_group *group;
  1467. int i, j, rc;
  1468. for (i = 0; i < idxd->max_groups; i++) {
  1469. group = idxd->groups[i];
  1470. rc = device_add(group_confdev(group));
  1471. if (rc < 0)
  1472. goto cleanup;
  1473. }
  1474. return 0;
  1475. cleanup:
  1476. j = i - 1;
  1477. for (; i < idxd->max_groups; i++) {
  1478. group = idxd->groups[i];
  1479. put_device(group_confdev(group));
  1480. }
  1481. while (j--) {
  1482. group = idxd->groups[j];
  1483. device_unregister(group_confdev(group));
  1484. }
  1485. return rc;
  1486. }
  1487. static int idxd_register_wq_devices(struct idxd_device *idxd)
  1488. {
  1489. struct idxd_wq *wq;
  1490. int i, rc, j;
  1491. for (i = 0; i < idxd->max_wqs; i++) {
  1492. wq = idxd->wqs[i];
  1493. rc = device_add(wq_confdev(wq));
  1494. if (rc < 0)
  1495. goto cleanup;
  1496. }
  1497. return 0;
  1498. cleanup:
  1499. j = i - 1;
  1500. for (; i < idxd->max_wqs; i++) {
  1501. wq = idxd->wqs[i];
  1502. put_device(wq_confdev(wq));
  1503. }
  1504. while (j--) {
  1505. wq = idxd->wqs[j];
  1506. device_unregister(wq_confdev(wq));
  1507. }
  1508. return rc;
  1509. }
  1510. int idxd_register_devices(struct idxd_device *idxd)
  1511. {
  1512. struct device *dev = &idxd->pdev->dev;
  1513. int rc, i;
  1514. rc = device_add(idxd_confdev(idxd));
  1515. if (rc < 0)
  1516. return rc;
  1517. rc = idxd_register_wq_devices(idxd);
  1518. if (rc < 0) {
  1519. dev_dbg(dev, "WQ devices registering failed: %d\n", rc);
  1520. goto err_wq;
  1521. }
  1522. rc = idxd_register_engine_devices(idxd);
  1523. if (rc < 0) {
  1524. dev_dbg(dev, "Engine devices registering failed: %d\n", rc);
  1525. goto err_engine;
  1526. }
  1527. rc = idxd_register_group_devices(idxd);
  1528. if (rc < 0) {
  1529. dev_dbg(dev, "Group device registering failed: %d\n", rc);
  1530. goto err_group;
  1531. }
  1532. return 0;
  1533. err_group:
  1534. for (i = 0; i < idxd->max_engines; i++)
  1535. device_unregister(engine_confdev(idxd->engines[i]));
  1536. err_engine:
  1537. for (i = 0; i < idxd->max_wqs; i++)
  1538. device_unregister(wq_confdev(idxd->wqs[i]));
  1539. err_wq:
  1540. device_del(idxd_confdev(idxd));
  1541. return rc;
  1542. }
  1543. void idxd_unregister_devices(struct idxd_device *idxd)
  1544. {
  1545. int i;
  1546. for (i = 0; i < idxd->max_wqs; i++) {
  1547. struct idxd_wq *wq = idxd->wqs[i];
  1548. device_unregister(wq_confdev(wq));
  1549. }
  1550. for (i = 0; i < idxd->max_engines; i++) {
  1551. struct idxd_engine *engine = idxd->engines[i];
  1552. device_unregister(engine_confdev(engine));
  1553. }
  1554. for (i = 0; i < idxd->max_groups; i++) {
  1555. struct idxd_group *group = idxd->groups[i];
  1556. device_unregister(group_confdev(group));
  1557. }
  1558. }
  1559. int idxd_register_bus_type(void)
  1560. {
  1561. return bus_register(&dsa_bus_type);
  1562. }
  1563. void idxd_unregister_bus_type(void)
  1564. {
  1565. bus_unregister(&dsa_bus_type);
  1566. }