fpga-bridge.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * FPGA Bridge Framework Driver
  4. *
  5. * Copyright (C) 2013-2016 Altera Corporation, All Rights Reserved.
  6. * Copyright (C) 2017 Intel Corporation
  7. */
  8. #include <linux/fpga/fpga-bridge.h>
  9. #include <linux/idr.h>
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/of_platform.h>
  13. #include <linux/slab.h>
  14. #include <linux/spinlock.h>
  15. static DEFINE_IDA(fpga_bridge_ida);
  16. static const struct class fpga_bridge_class;
  17. /* Lock for adding/removing bridges to linked lists*/
  18. static DEFINE_SPINLOCK(bridge_list_lock);
  19. /**
  20. * fpga_bridge_enable - Enable transactions on the bridge
  21. *
  22. * @bridge: FPGA bridge
  23. *
  24. * Return: 0 for success, error code otherwise.
  25. */
  26. int fpga_bridge_enable(struct fpga_bridge *bridge)
  27. {
  28. dev_dbg(&bridge->dev, "enable\n");
  29. if (bridge->br_ops->enable_set)
  30. return bridge->br_ops->enable_set(bridge, 1);
  31. return 0;
  32. }
  33. EXPORT_SYMBOL_GPL(fpga_bridge_enable);
  34. /**
  35. * fpga_bridge_disable - Disable transactions on the bridge
  36. *
  37. * @bridge: FPGA bridge
  38. *
  39. * Return: 0 for success, error code otherwise.
  40. */
  41. int fpga_bridge_disable(struct fpga_bridge *bridge)
  42. {
  43. dev_dbg(&bridge->dev, "disable\n");
  44. if (bridge->br_ops->enable_set)
  45. return bridge->br_ops->enable_set(bridge, 0);
  46. return 0;
  47. }
  48. EXPORT_SYMBOL_GPL(fpga_bridge_disable);
  49. static struct fpga_bridge *__fpga_bridge_get(struct device *bridge_dev,
  50. struct fpga_image_info *info)
  51. {
  52. struct fpga_bridge *bridge;
  53. bridge = to_fpga_bridge(bridge_dev);
  54. bridge->info = info;
  55. if (!mutex_trylock(&bridge->mutex))
  56. return ERR_PTR(-EBUSY);
  57. if (!try_module_get(bridge->br_ops_owner)) {
  58. mutex_unlock(&bridge->mutex);
  59. return ERR_PTR(-ENODEV);
  60. }
  61. dev_dbg(&bridge->dev, "get\n");
  62. return bridge;
  63. }
  64. /**
  65. * of_fpga_bridge_get - get an exclusive reference to an fpga bridge
  66. *
  67. * @np: node pointer of an FPGA bridge.
  68. * @info: fpga image specific information.
  69. *
  70. * Return:
  71. * * fpga_bridge struct pointer if successful.
  72. * * -EBUSY if someone already has a reference to the bridge.
  73. * * -ENODEV if @np is not an FPGA Bridge or can't take parent driver refcount.
  74. */
  75. struct fpga_bridge *of_fpga_bridge_get(struct device_node *np,
  76. struct fpga_image_info *info)
  77. {
  78. struct fpga_bridge *bridge;
  79. struct device *bridge_dev;
  80. bridge_dev = class_find_device_by_of_node(&fpga_bridge_class, np);
  81. if (!bridge_dev)
  82. return ERR_PTR(-ENODEV);
  83. bridge = __fpga_bridge_get(bridge_dev, info);
  84. if (IS_ERR(bridge))
  85. put_device(bridge_dev);
  86. return bridge;
  87. }
  88. EXPORT_SYMBOL_GPL(of_fpga_bridge_get);
  89. static int fpga_bridge_dev_match(struct device *dev, const void *data)
  90. {
  91. return dev->parent == data;
  92. }
  93. /**
  94. * fpga_bridge_get - get an exclusive reference to an fpga bridge
  95. * @dev: parent device that fpga bridge was registered with
  96. * @info: fpga image specific information
  97. *
  98. * Given a device, get an exclusive reference to an fpga bridge.
  99. *
  100. * Return: fpga bridge struct or IS_ERR() condition containing error code.
  101. */
  102. struct fpga_bridge *fpga_bridge_get(struct device *dev,
  103. struct fpga_image_info *info)
  104. {
  105. struct fpga_bridge *bridge;
  106. struct device *bridge_dev;
  107. bridge_dev = class_find_device(&fpga_bridge_class, NULL, dev,
  108. fpga_bridge_dev_match);
  109. if (!bridge_dev)
  110. return ERR_PTR(-ENODEV);
  111. bridge = __fpga_bridge_get(bridge_dev, info);
  112. if (IS_ERR(bridge))
  113. put_device(bridge_dev);
  114. return bridge;
  115. }
  116. EXPORT_SYMBOL_GPL(fpga_bridge_get);
  117. /**
  118. * fpga_bridge_put - release a reference to a bridge
  119. *
  120. * @bridge: FPGA bridge
  121. */
  122. void fpga_bridge_put(struct fpga_bridge *bridge)
  123. {
  124. dev_dbg(&bridge->dev, "put\n");
  125. bridge->info = NULL;
  126. module_put(bridge->br_ops_owner);
  127. mutex_unlock(&bridge->mutex);
  128. put_device(&bridge->dev);
  129. }
  130. EXPORT_SYMBOL_GPL(fpga_bridge_put);
  131. /**
  132. * fpga_bridges_enable - enable bridges in a list
  133. * @bridge_list: list of FPGA bridges
  134. *
  135. * Enable each bridge in the list. If list is empty, do nothing.
  136. *
  137. * Return: 0 for success or empty bridge list or an error code otherwise.
  138. */
  139. int fpga_bridges_enable(struct list_head *bridge_list)
  140. {
  141. struct fpga_bridge *bridge;
  142. int ret;
  143. list_for_each_entry(bridge, bridge_list, node) {
  144. ret = fpga_bridge_enable(bridge);
  145. if (ret)
  146. return ret;
  147. }
  148. return 0;
  149. }
  150. EXPORT_SYMBOL_GPL(fpga_bridges_enable);
  151. /**
  152. * fpga_bridges_disable - disable bridges in a list
  153. *
  154. * @bridge_list: list of FPGA bridges
  155. *
  156. * Disable each bridge in the list. If list is empty, do nothing.
  157. *
  158. * Return: 0 for success or empty bridge list or an error code otherwise.
  159. */
  160. int fpga_bridges_disable(struct list_head *bridge_list)
  161. {
  162. struct fpga_bridge *bridge;
  163. int ret;
  164. list_for_each_entry(bridge, bridge_list, node) {
  165. ret = fpga_bridge_disable(bridge);
  166. if (ret)
  167. return ret;
  168. }
  169. return 0;
  170. }
  171. EXPORT_SYMBOL_GPL(fpga_bridges_disable);
  172. /**
  173. * fpga_bridges_put - put bridges
  174. *
  175. * @bridge_list: list of FPGA bridges
  176. *
  177. * For each bridge in the list, put the bridge and remove it from the list.
  178. * If list is empty, do nothing.
  179. */
  180. void fpga_bridges_put(struct list_head *bridge_list)
  181. {
  182. struct fpga_bridge *bridge, *next;
  183. unsigned long flags;
  184. list_for_each_entry_safe(bridge, next, bridge_list, node) {
  185. fpga_bridge_put(bridge);
  186. spin_lock_irqsave(&bridge_list_lock, flags);
  187. list_del(&bridge->node);
  188. spin_unlock_irqrestore(&bridge_list_lock, flags);
  189. }
  190. }
  191. EXPORT_SYMBOL_GPL(fpga_bridges_put);
  192. /**
  193. * of_fpga_bridge_get_to_list - get a bridge, add it to a list
  194. *
  195. * @np: node pointer of an FPGA bridge
  196. * @info: fpga image specific information
  197. * @bridge_list: list of FPGA bridges
  198. *
  199. * Get an exclusive reference to the bridge and it to the list.
  200. *
  201. * Return: 0 for success, error code from of_fpga_bridge_get() otherwise.
  202. */
  203. int of_fpga_bridge_get_to_list(struct device_node *np,
  204. struct fpga_image_info *info,
  205. struct list_head *bridge_list)
  206. {
  207. struct fpga_bridge *bridge;
  208. unsigned long flags;
  209. bridge = of_fpga_bridge_get(np, info);
  210. if (IS_ERR(bridge))
  211. return PTR_ERR(bridge);
  212. spin_lock_irqsave(&bridge_list_lock, flags);
  213. list_add(&bridge->node, bridge_list);
  214. spin_unlock_irqrestore(&bridge_list_lock, flags);
  215. return 0;
  216. }
  217. EXPORT_SYMBOL_GPL(of_fpga_bridge_get_to_list);
  218. /**
  219. * fpga_bridge_get_to_list - given device, get a bridge, add it to a list
  220. *
  221. * @dev: FPGA bridge device
  222. * @info: fpga image specific information
  223. * @bridge_list: list of FPGA bridges
  224. *
  225. * Get an exclusive reference to the bridge and it to the list.
  226. *
  227. * Return: 0 for success, error code from fpga_bridge_get() otherwise.
  228. */
  229. int fpga_bridge_get_to_list(struct device *dev,
  230. struct fpga_image_info *info,
  231. struct list_head *bridge_list)
  232. {
  233. struct fpga_bridge *bridge;
  234. unsigned long flags;
  235. bridge = fpga_bridge_get(dev, info);
  236. if (IS_ERR(bridge))
  237. return PTR_ERR(bridge);
  238. spin_lock_irqsave(&bridge_list_lock, flags);
  239. list_add(&bridge->node, bridge_list);
  240. spin_unlock_irqrestore(&bridge_list_lock, flags);
  241. return 0;
  242. }
  243. EXPORT_SYMBOL_GPL(fpga_bridge_get_to_list);
  244. static ssize_t name_show(struct device *dev,
  245. struct device_attribute *attr, char *buf)
  246. {
  247. struct fpga_bridge *bridge = to_fpga_bridge(dev);
  248. return sprintf(buf, "%s\n", bridge->name);
  249. }
  250. static ssize_t state_show(struct device *dev,
  251. struct device_attribute *attr, char *buf)
  252. {
  253. struct fpga_bridge *bridge = to_fpga_bridge(dev);
  254. int state = 1;
  255. if (bridge->br_ops->enable_show) {
  256. state = bridge->br_ops->enable_show(bridge);
  257. if (state < 0)
  258. return state;
  259. }
  260. return sysfs_emit(buf, "%s\n", state ? "enabled" : "disabled");
  261. }
  262. static DEVICE_ATTR_RO(name);
  263. static DEVICE_ATTR_RO(state);
  264. static struct attribute *fpga_bridge_attrs[] = {
  265. &dev_attr_name.attr,
  266. &dev_attr_state.attr,
  267. NULL,
  268. };
  269. ATTRIBUTE_GROUPS(fpga_bridge);
  270. /**
  271. * __fpga_bridge_register - create and register an FPGA Bridge device
  272. * @parent: FPGA bridge device from pdev
  273. * @name: FPGA bridge name
  274. * @br_ops: pointer to structure of fpga bridge ops
  275. * @priv: FPGA bridge private data
  276. * @owner: owner module containing the br_ops
  277. *
  278. * Return: struct fpga_bridge pointer or ERR_PTR()
  279. */
  280. struct fpga_bridge *
  281. __fpga_bridge_register(struct device *parent, const char *name,
  282. const struct fpga_bridge_ops *br_ops,
  283. void *priv, struct module *owner)
  284. {
  285. struct fpga_bridge *bridge;
  286. int id, ret;
  287. if (!br_ops) {
  288. dev_err(parent, "Attempt to register without fpga_bridge_ops\n");
  289. return ERR_PTR(-EINVAL);
  290. }
  291. if (!name || !strlen(name)) {
  292. dev_err(parent, "Attempt to register with no name!\n");
  293. return ERR_PTR(-EINVAL);
  294. }
  295. bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
  296. if (!bridge)
  297. return ERR_PTR(-ENOMEM);
  298. id = ida_alloc(&fpga_bridge_ida, GFP_KERNEL);
  299. if (id < 0) {
  300. ret = id;
  301. goto error_kfree;
  302. }
  303. mutex_init(&bridge->mutex);
  304. INIT_LIST_HEAD(&bridge->node);
  305. bridge->name = name;
  306. bridge->br_ops = br_ops;
  307. bridge->br_ops_owner = owner;
  308. bridge->priv = priv;
  309. bridge->dev.groups = br_ops->groups;
  310. bridge->dev.class = &fpga_bridge_class;
  311. bridge->dev.parent = parent;
  312. bridge->dev.of_node = parent->of_node;
  313. bridge->dev.id = id;
  314. ret = dev_set_name(&bridge->dev, "br%d", id);
  315. if (ret)
  316. goto error_device;
  317. ret = device_register(&bridge->dev);
  318. if (ret) {
  319. put_device(&bridge->dev);
  320. return ERR_PTR(ret);
  321. }
  322. of_platform_populate(bridge->dev.of_node, NULL, NULL, &bridge->dev);
  323. return bridge;
  324. error_device:
  325. ida_free(&fpga_bridge_ida, id);
  326. error_kfree:
  327. kfree(bridge);
  328. return ERR_PTR(ret);
  329. }
  330. EXPORT_SYMBOL_GPL(__fpga_bridge_register);
  331. /**
  332. * fpga_bridge_unregister - unregister an FPGA bridge
  333. *
  334. * @bridge: FPGA bridge struct
  335. *
  336. * This function is intended for use in an FPGA bridge driver's remove function.
  337. */
  338. void fpga_bridge_unregister(struct fpga_bridge *bridge)
  339. {
  340. /*
  341. * If the low level driver provides a method for putting bridge into
  342. * a desired state upon unregister, do it.
  343. */
  344. if (bridge->br_ops->fpga_bridge_remove)
  345. bridge->br_ops->fpga_bridge_remove(bridge);
  346. device_unregister(&bridge->dev);
  347. }
  348. EXPORT_SYMBOL_GPL(fpga_bridge_unregister);
  349. static void fpga_bridge_dev_release(struct device *dev)
  350. {
  351. struct fpga_bridge *bridge = to_fpga_bridge(dev);
  352. ida_free(&fpga_bridge_ida, bridge->dev.id);
  353. kfree(bridge);
  354. }
  355. static const struct class fpga_bridge_class = {
  356. .name = "fpga_bridge",
  357. .dev_groups = fpga_bridge_groups,
  358. .dev_release = fpga_bridge_dev_release,
  359. };
  360. static int __init fpga_bridge_dev_init(void)
  361. {
  362. return class_register(&fpga_bridge_class);
  363. }
  364. static void __exit fpga_bridge_dev_exit(void)
  365. {
  366. class_unregister(&fpga_bridge_class);
  367. ida_destroy(&fpga_bridge_ida);
  368. }
  369. MODULE_DESCRIPTION("FPGA Bridge Driver");
  370. MODULE_AUTHOR("Alan Tull <atull@kernel.org>");
  371. MODULE_LICENSE("GPL v2");
  372. subsys_initcall(fpga_bridge_dev_init);
  373. module_exit(fpga_bridge_dev_exit);