fpga-bridge.c 11 KB

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