1 /* 2 * FPGA Region - Device Tree support for FPGA programming under Linux 3 * 4 * Copyright (C) 2013-2016 Altera Corporation 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms and conditions of the GNU General Public License, 8 * version 2, as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 * more details. 14 * 15 * You should have received a copy of the GNU General Public License along with 16 * this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #include <linux/fpga/fpga-bridge.h> 20 #include <linux/fpga/fpga-mgr.h> 21 #include <linux/idr.h> 22 #include <linux/kernel.h> 23 #include <linux/list.h> 24 #include <linux/module.h> 25 #include <linux/of_platform.h> 26 #include <linux/slab.h> 27 #include <linux/spinlock.h> 28 29 /** 30 * struct fpga_region - FPGA Region structure 31 * @dev: FPGA Region device 32 * @mutex: enforces exclusive reference to region 33 * @bridge_list: list of FPGA bridges specified in region 34 * @info: fpga image specific information 35 */ 36 struct fpga_region { 37 struct device dev; 38 struct mutex mutex; /* for exclusive reference to region */ 39 struct list_head bridge_list; 40 struct fpga_image_info *info; 41 }; 42 43 #define to_fpga_region(d) container_of(d, struct fpga_region, dev) 44 45 static DEFINE_IDA(fpga_region_ida); 46 static struct class *fpga_region_class; 47 48 static const struct of_device_id fpga_region_of_match[] = { 49 { .compatible = "fpga-region", }, 50 {}, 51 }; 52 MODULE_DEVICE_TABLE(of, fpga_region_of_match); 53 54 static int fpga_region_of_node_match(struct device *dev, const void *data) 55 { 56 return dev->of_node == data; 57 } 58 59 /** 60 * fpga_region_find - find FPGA region 61 * @np: device node of FPGA Region 62 * Caller will need to put_device(®ion->dev) when done. 63 * Returns FPGA Region struct or NULL 64 */ 65 static struct fpga_region *fpga_region_find(struct device_node *np) 66 { 67 struct device *dev; 68 69 dev = class_find_device(fpga_region_class, NULL, np, 70 fpga_region_of_node_match); 71 if (!dev) 72 return NULL; 73 74 return to_fpga_region(dev); 75 } 76 77 /** 78 * fpga_region_get - get an exclusive reference to a fpga region 79 * @region: FPGA Region struct 80 * 81 * Caller should call fpga_region_put() when done with region. 82 * 83 * Return fpga_region struct if successful. 84 * Return -EBUSY if someone already has a reference to the region. 85 * Return -ENODEV if @np is not a FPGA Region. 86 */ 87 static struct fpga_region *fpga_region_get(struct fpga_region *region) 88 { 89 struct device *dev = ®ion->dev; 90 91 if (!mutex_trylock(®ion->mutex)) { 92 dev_dbg(dev, "%s: FPGA Region already in use\n", __func__); 93 return ERR_PTR(-EBUSY); 94 } 95 96 get_device(dev); 97 of_node_get(dev->of_node); 98 if (!try_module_get(dev->parent->driver->owner)) { 99 of_node_put(dev->of_node); 100 put_device(dev); 101 mutex_unlock(®ion->mutex); 102 return ERR_PTR(-ENODEV); 103 } 104 105 dev_dbg(®ion->dev, "get\n"); 106 107 return region; 108 } 109 110 /** 111 * fpga_region_put - release a reference to a region 112 * 113 * @region: FPGA region 114 */ 115 static void fpga_region_put(struct fpga_region *region) 116 { 117 struct device *dev = ®ion->dev; 118 119 dev_dbg(®ion->dev, "put\n"); 120 121 module_put(dev->parent->driver->owner); 122 of_node_put(dev->of_node); 123 put_device(dev); 124 mutex_unlock(®ion->mutex); 125 } 126 127 /** 128 * fpga_region_get_manager - get exclusive reference for FPGA manager 129 * @region: FPGA region 130 * 131 * Get FPGA Manager from "fpga-mgr" property or from ancestor region. 132 * 133 * Caller should call fpga_mgr_put() when done with manager. 134 * 135 * Return: fpga manager struct or IS_ERR() condition containing error code. 136 */ 137 static struct fpga_manager *fpga_region_get_manager(struct fpga_region *region) 138 { 139 struct device *dev = ®ion->dev; 140 struct device_node *np = dev->of_node; 141 struct device_node *mgr_node; 142 struct fpga_manager *mgr; 143 144 of_node_get(np); 145 while (np) { 146 if (of_device_is_compatible(np, "fpga-region")) { 147 mgr_node = of_parse_phandle(np, "fpga-mgr", 0); 148 if (mgr_node) { 149 mgr = of_fpga_mgr_get(mgr_node); 150 of_node_put(np); 151 return mgr; 152 } 153 } 154 np = of_get_next_parent(np); 155 } 156 of_node_put(np); 157 158 return ERR_PTR(-EINVAL); 159 } 160 161 /** 162 * fpga_region_get_bridges - create a list of bridges 163 * @region: FPGA region 164 * @overlay: device node of the overlay 165 * 166 * Create a list of bridges including the parent bridge and the bridges 167 * specified by "fpga-bridges" property. Note that the 168 * fpga_bridges_enable/disable/put functions are all fine with an empty list 169 * if that happens. 170 * 171 * Caller should call fpga_bridges_put(®ion->bridge_list) when 172 * done with the bridges. 173 * 174 * Return 0 for success (even if there are no bridges specified) 175 * or -EBUSY if any of the bridges are in use. 176 */ 177 static int fpga_region_get_bridges(struct fpga_region *region, 178 struct device_node *overlay) 179 { 180 struct device *dev = ®ion->dev; 181 struct device_node *region_np = dev->of_node; 182 struct device_node *br, *np, *parent_br = NULL; 183 int i, ret; 184 185 /* If parent is a bridge, add to list */ 186 ret = fpga_bridge_get_to_list(region_np->parent, region->info, 187 ®ion->bridge_list); 188 if (ret == -EBUSY) 189 return ret; 190 191 if (!ret) 192 parent_br = region_np->parent; 193 194 /* If overlay has a list of bridges, use it. */ 195 if (of_parse_phandle(overlay, "fpga-bridges", 0)) 196 np = overlay; 197 else 198 np = region_np; 199 200 for (i = 0; ; i++) { 201 br = of_parse_phandle(np, "fpga-bridges", i); 202 if (!br) 203 break; 204 205 /* If parent bridge is in list, skip it. */ 206 if (br == parent_br) 207 continue; 208 209 /* If node is a bridge, get it and add to list */ 210 ret = fpga_bridge_get_to_list(br, region->info, 211 ®ion->bridge_list); 212 213 /* If any of the bridges are in use, give up */ 214 if (ret == -EBUSY) { 215 fpga_bridges_put(®ion->bridge_list); 216 return -EBUSY; 217 } 218 } 219 220 return 0; 221 } 222 223 /** 224 * fpga_region_program_fpga - program FPGA 225 * @region: FPGA region 226 * @firmware_name: name of FPGA image firmware file 227 * @overlay: device node of the overlay 228 * Program an FPGA using information in the device tree. 229 * Function assumes that there is a firmware-name property. 230 * Return 0 for success or negative error code. 231 */ 232 static int fpga_region_program_fpga(struct fpga_region *region, 233 const char *firmware_name, 234 struct device_node *overlay) 235 { 236 struct fpga_manager *mgr; 237 int ret; 238 239 region = fpga_region_get(region); 240 if (IS_ERR(region)) { 241 pr_err("failed to get fpga region\n"); 242 return PTR_ERR(region); 243 } 244 245 mgr = fpga_region_get_manager(region); 246 if (IS_ERR(mgr)) { 247 pr_err("failed to get fpga region manager\n"); 248 ret = PTR_ERR(mgr); 249 goto err_put_region; 250 } 251 252 ret = fpga_region_get_bridges(region, overlay); 253 if (ret) { 254 pr_err("failed to get fpga region bridges\n"); 255 goto err_put_mgr; 256 } 257 258 ret = fpga_bridges_disable(®ion->bridge_list); 259 if (ret) { 260 pr_err("failed to disable region bridges\n"); 261 goto err_put_br; 262 } 263 264 ret = fpga_mgr_firmware_load(mgr, region->info, firmware_name); 265 if (ret) { 266 pr_err("failed to load fpga image\n"); 267 goto err_put_br; 268 } 269 270 ret = fpga_bridges_enable(®ion->bridge_list); 271 if (ret) { 272 pr_err("failed to enable region bridges\n"); 273 goto err_put_br; 274 } 275 276 fpga_mgr_put(mgr); 277 fpga_region_put(region); 278 279 return 0; 280 281 err_put_br: 282 fpga_bridges_put(®ion->bridge_list); 283 err_put_mgr: 284 fpga_mgr_put(mgr); 285 err_put_region: 286 fpga_region_put(region); 287 288 return ret; 289 } 290 291 /** 292 * child_regions_with_firmware 293 * @overlay: device node of the overlay 294 * 295 * If the overlay adds child FPGA regions, they are not allowed to have 296 * firmware-name property. 297 * 298 * Return 0 for OK or -EINVAL if child FPGA region adds firmware-name. 299 */ 300 static int child_regions_with_firmware(struct device_node *overlay) 301 { 302 struct device_node *child_region; 303 const char *child_firmware_name; 304 int ret = 0; 305 306 of_node_get(overlay); 307 308 child_region = of_find_matching_node(overlay, fpga_region_of_match); 309 while (child_region) { 310 if (!of_property_read_string(child_region, "firmware-name", 311 &child_firmware_name)) { 312 ret = -EINVAL; 313 break; 314 } 315 child_region = of_find_matching_node(child_region, 316 fpga_region_of_match); 317 } 318 319 of_node_put(child_region); 320 321 if (ret) 322 pr_err("firmware-name not allowed in child FPGA region: %s", 323 child_region->full_name); 324 325 return ret; 326 } 327 328 /** 329 * fpga_region_notify_pre_apply - pre-apply overlay notification 330 * 331 * @region: FPGA region that the overlay was applied to 332 * @nd: overlay notification data 333 * 334 * Called after when an overlay targeted to a FPGA Region is about to be 335 * applied. Function will check the properties that will be added to the FPGA 336 * region. If the checks pass, it will program the FPGA. 337 * 338 * The checks are: 339 * The overlay must add either firmware-name or external-fpga-config property 340 * to the FPGA Region. 341 * 342 * firmware-name : program the FPGA 343 * external-fpga-config : FPGA is already programmed 344 * encrypted-fpga-config : FPGA bitstream is encrypted 345 * 346 * The overlay can add other FPGA regions, but child FPGA regions cannot have a 347 * firmware-name property since those regions don't exist yet. 348 * 349 * If the overlay that breaks the rules, notifier returns an error and the 350 * overlay is rejected before it goes into the main tree. 351 * 352 * Returns 0 for success or negative error code for failure. 353 */ 354 static int fpga_region_notify_pre_apply(struct fpga_region *region, 355 struct of_overlay_notify_data *nd) 356 { 357 const char *firmware_name = NULL; 358 struct fpga_image_info *info; 359 int ret; 360 361 info = devm_kzalloc(®ion->dev, sizeof(*info), GFP_KERNEL); 362 if (!info) 363 return -ENOMEM; 364 365 region->info = info; 366 367 /* Reject overlay if child FPGA Regions have firmware-name property */ 368 ret = child_regions_with_firmware(nd->overlay); 369 if (ret) 370 return ret; 371 372 /* Read FPGA region properties from the overlay */ 373 if (of_property_read_bool(nd->overlay, "partial-fpga-config")) 374 info->flags |= FPGA_MGR_PARTIAL_RECONFIG; 375 376 if (of_property_read_bool(nd->overlay, "external-fpga-config")) 377 info->flags |= FPGA_MGR_EXTERNAL_CONFIG; 378 379 if (of_property_read_bool(nd->overlay, "encrypted-fpga-config")) 380 info->flags |= FPGA_MGR_ENCRYPTED_BITSTREAM; 381 382 of_property_read_string(nd->overlay, "firmware-name", &firmware_name); 383 384 of_property_read_u32(nd->overlay, "region-unfreeze-timeout-us", 385 &info->enable_timeout_us); 386 387 of_property_read_u32(nd->overlay, "region-freeze-timeout-us", 388 &info->disable_timeout_us); 389 390 of_property_read_u32(nd->overlay, "config-complete-timeout-us", 391 &info->config_complete_timeout_us); 392 393 /* If FPGA was externally programmed, don't specify firmware */ 394 if ((info->flags & FPGA_MGR_EXTERNAL_CONFIG) && firmware_name) { 395 pr_err("error: specified firmware and external-fpga-config"); 396 return -EINVAL; 397 } 398 399 /* FPGA is already configured externally. We're done. */ 400 if (info->flags & FPGA_MGR_EXTERNAL_CONFIG) 401 return 0; 402 403 /* If we got this far, we should be programming the FPGA */ 404 if (!firmware_name) { 405 pr_err("should specify firmware-name or external-fpga-config\n"); 406 return -EINVAL; 407 } 408 409 return fpga_region_program_fpga(region, firmware_name, nd->overlay); 410 } 411 412 /** 413 * fpga_region_notify_post_remove - post-remove overlay notification 414 * 415 * @region: FPGA region that was targeted by the overlay that was removed 416 * @nd: overlay notification data 417 * 418 * Called after an overlay has been removed if the overlay's target was a 419 * FPGA region. 420 */ 421 static void fpga_region_notify_post_remove(struct fpga_region *region, 422 struct of_overlay_notify_data *nd) 423 { 424 fpga_bridges_disable(®ion->bridge_list); 425 fpga_bridges_put(®ion->bridge_list); 426 devm_kfree(®ion->dev, region->info); 427 region->info = NULL; 428 } 429 430 /** 431 * of_fpga_region_notify - reconfig notifier for dynamic DT changes 432 * @nb: notifier block 433 * @action: notifier action 434 * @arg: reconfig data 435 * 436 * This notifier handles programming a FPGA when a "firmware-name" property is 437 * added to a fpga-region. 438 * 439 * Returns NOTIFY_OK or error if FPGA programming fails. 440 */ 441 static int of_fpga_region_notify(struct notifier_block *nb, 442 unsigned long action, void *arg) 443 { 444 struct of_overlay_notify_data *nd = arg; 445 struct fpga_region *region; 446 int ret; 447 448 switch (action) { 449 case OF_OVERLAY_PRE_APPLY: 450 pr_debug("%s OF_OVERLAY_PRE_APPLY\n", __func__); 451 break; 452 case OF_OVERLAY_POST_APPLY: 453 pr_debug("%s OF_OVERLAY_POST_APPLY\n", __func__); 454 return NOTIFY_OK; /* not for us */ 455 case OF_OVERLAY_PRE_REMOVE: 456 pr_debug("%s OF_OVERLAY_PRE_REMOVE\n", __func__); 457 return NOTIFY_OK; /* not for us */ 458 case OF_OVERLAY_POST_REMOVE: 459 pr_debug("%s OF_OVERLAY_POST_REMOVE\n", __func__); 460 break; 461 default: /* should not happen */ 462 return NOTIFY_OK; 463 } 464 465 region = fpga_region_find(nd->target); 466 if (!region) 467 return NOTIFY_OK; 468 469 ret = 0; 470 switch (action) { 471 case OF_OVERLAY_PRE_APPLY: 472 ret = fpga_region_notify_pre_apply(region, nd); 473 break; 474 475 case OF_OVERLAY_POST_REMOVE: 476 fpga_region_notify_post_remove(region, nd); 477 break; 478 } 479 480 put_device(®ion->dev); 481 482 if (ret) 483 return notifier_from_errno(ret); 484 485 return NOTIFY_OK; 486 } 487 488 static struct notifier_block fpga_region_of_nb = { 489 .notifier_call = of_fpga_region_notify, 490 }; 491 492 static int fpga_region_probe(struct platform_device *pdev) 493 { 494 struct device *dev = &pdev->dev; 495 struct device_node *np = dev->of_node; 496 struct fpga_region *region; 497 int id, ret = 0; 498 499 region = kzalloc(sizeof(*region), GFP_KERNEL); 500 if (!region) 501 return -ENOMEM; 502 503 id = ida_simple_get(&fpga_region_ida, 0, 0, GFP_KERNEL); 504 if (id < 0) { 505 ret = id; 506 goto err_kfree; 507 } 508 509 mutex_init(®ion->mutex); 510 INIT_LIST_HEAD(®ion->bridge_list); 511 512 device_initialize(®ion->dev); 513 region->dev.class = fpga_region_class; 514 region->dev.parent = dev; 515 region->dev.of_node = np; 516 region->dev.id = id; 517 dev_set_drvdata(dev, region); 518 519 ret = dev_set_name(®ion->dev, "region%d", id); 520 if (ret) 521 goto err_remove; 522 523 ret = device_add(®ion->dev); 524 if (ret) 525 goto err_remove; 526 527 of_platform_populate(np, fpga_region_of_match, NULL, ®ion->dev); 528 529 dev_info(dev, "FPGA Region probed\n"); 530 531 return 0; 532 533 err_remove: 534 ida_simple_remove(&fpga_region_ida, id); 535 err_kfree: 536 kfree(region); 537 538 return ret; 539 } 540 541 static int fpga_region_remove(struct platform_device *pdev) 542 { 543 struct fpga_region *region = platform_get_drvdata(pdev); 544 545 device_unregister(®ion->dev); 546 547 return 0; 548 } 549 550 static struct platform_driver fpga_region_driver = { 551 .probe = fpga_region_probe, 552 .remove = fpga_region_remove, 553 .driver = { 554 .name = "fpga-region", 555 .of_match_table = of_match_ptr(fpga_region_of_match), 556 }, 557 }; 558 559 static void fpga_region_dev_release(struct device *dev) 560 { 561 struct fpga_region *region = to_fpga_region(dev); 562 563 ida_simple_remove(&fpga_region_ida, region->dev.id); 564 kfree(region); 565 } 566 567 /** 568 * fpga_region_init - init function for fpga_region class 569 * Creates the fpga_region class and registers a reconfig notifier. 570 */ 571 static int __init fpga_region_init(void) 572 { 573 int ret; 574 575 fpga_region_class = class_create(THIS_MODULE, "fpga_region"); 576 if (IS_ERR(fpga_region_class)) 577 return PTR_ERR(fpga_region_class); 578 579 fpga_region_class->dev_release = fpga_region_dev_release; 580 581 ret = of_overlay_notifier_register(&fpga_region_of_nb); 582 if (ret) 583 goto err_class; 584 585 ret = platform_driver_register(&fpga_region_driver); 586 if (ret) 587 goto err_plat; 588 589 return 0; 590 591 err_plat: 592 of_overlay_notifier_unregister(&fpga_region_of_nb); 593 err_class: 594 class_destroy(fpga_region_class); 595 ida_destroy(&fpga_region_ida); 596 return ret; 597 } 598 599 static void __exit fpga_region_exit(void) 600 { 601 platform_driver_unregister(&fpga_region_driver); 602 of_overlay_notifier_unregister(&fpga_region_of_nb); 603 class_destroy(fpga_region_class); 604 ida_destroy(&fpga_region_ida); 605 } 606 607 subsys_initcall(fpga_region_init); 608 module_exit(fpga_region_exit); 609 610 MODULE_DESCRIPTION("FPGA Region"); 611 MODULE_AUTHOR("Alan Tull <atull@opensource.altera.com>"); 612 MODULE_LICENSE("GPL v2"); 613