Lines Matching full:feature

3  * Driver for FPGA Device Feature List (DFL) Support
23 * when adding a new feature dev support in DFL framework, it's required to
29 * if the new feature dev needs chardev support, then it's required to add
48 * dfl_dev_info - dfl feature device information.
49 * @name: name string of the feature platform device.
50 * @dfh_id: id value in Device Feature Header (DFH) register by DFL spec.
51 * @id: idr id of the feature dev.
70 * dfl_chardev_info - chardev information of dfl feature device
145 * in such list, then other feature devices (e.g. FME), could use the port
352 struct dfl_feature *feature) in dfl_dev_add() argument
381 ddev->feature_id = feature->id; in dfl_dev_add()
382 ddev->revision = feature->revision; in dfl_dev_add()
386 parent_res = &pdev->resource[feature->resource_index]; in dfl_dev_add()
399 if (feature->nr_irqs) { in dfl_dev_add()
400 ddev->irqs = kcalloc(feature->nr_irqs, in dfl_dev_add()
407 for (i = 0; i < feature->nr_irqs; i++) in dfl_dev_add()
408 ddev->irqs[i] = feature->irq_ctx[i].irq; in dfl_dev_add()
410 ddev->num_irqs = feature->nr_irqs; in dfl_dev_add()
428 struct dfl_feature *feature; in dfl_devs_remove() local
430 dfl_fpga_dev_for_each_feature(pdata, feature) { in dfl_devs_remove()
431 if (feature->ddev) { in dfl_devs_remove()
432 device_unregister(&feature->ddev->dev); in dfl_devs_remove()
433 feature->ddev = NULL; in dfl_devs_remove()
440 struct dfl_feature *feature; in dfl_devs_add() local
444 dfl_fpga_dev_for_each_feature(pdata, feature) { in dfl_devs_add()
445 if (feature->ioaddr) in dfl_devs_add()
448 if (feature->ddev) { in dfl_devs_add()
453 ddev = dfl_dev_add(pdata, feature); in dfl_devs_add()
459 feature->ddev = ddev; in dfl_devs_add()
487 #define is_header_feature(feature) ((feature)->id == FEATURE_ID_FIU_HEADER) argument
490 * dfl_fpga_dev_feature_uinit - uinit for sub features of dfl feature device
491 * @pdev: feature device.
496 struct dfl_feature *feature; in dfl_fpga_dev_feature_uinit() local
500 dfl_fpga_dev_for_each_feature(pdata, feature) { in dfl_fpga_dev_feature_uinit()
501 if (feature->ops) { in dfl_fpga_dev_feature_uinit()
502 if (feature->ops->uinit) in dfl_fpga_dev_feature_uinit()
503 feature->ops->uinit(pdev, feature); in dfl_fpga_dev_feature_uinit()
504 feature->ops = NULL; in dfl_fpga_dev_feature_uinit()
512 struct dfl_feature *feature, in dfl_feature_instance_init() argument
518 if (!is_header_feature(feature)) { in dfl_feature_instance_init()
520 feature->resource_index); in dfl_feature_instance_init()
523 "ioremap failed for feature 0x%x!\n", in dfl_feature_instance_init()
524 feature->id); in dfl_feature_instance_init()
528 feature->ioaddr = base; in dfl_feature_instance_init()
532 ret = drv->ops->init(pdev, feature); in dfl_feature_instance_init()
537 feature->ops = drv->ops; in dfl_feature_instance_init()
542 static bool dfl_feature_drv_match(struct dfl_feature *feature, in dfl_feature_drv_match() argument
549 if (ids->id == feature->id) in dfl_feature_drv_match()
558 * dfl_fpga_dev_feature_init - init for sub features of dfl feature device
559 * @pdev: feature device.
562 * This function will match sub features with given feature drvs list and
563 * use matched drv to init related sub feature.
572 struct dfl_feature *feature; in dfl_fpga_dev_feature_init() local
576 dfl_fpga_dev_for_each_feature(pdata, feature) { in dfl_fpga_dev_feature_init()
577 if (dfl_feature_drv_match(feature, drv)) { in dfl_fpga_dev_feature_init()
579 feature, drv); in dfl_fpga_dev_feature_init()
637 * dfl_fpga_dev_ops_register - register cdev ops for feature dev
639 * @pdev: feature dev.
640 * @fops: file operations for feature dev's cdev.
655 * set parent to the feature device so that its refcount is in dfl_fpga_dev_ops_register()
657 * makes sure the feature device is valid during device in dfl_fpga_dev_ops_register()
667 * dfl_fpga_dev_ops_unregister - unregister cdev ops for feature dev
668 * @pdev: feature dev.
679 * struct build_feature_devs_info - info collected during feature dev build.
682 * @cdev: the container device for all feature devices.
683 * @nr_irqs: number of irqs for all feature devices.
686 * @feature_dev: current feature device.
690 * @sub_features: a sub features linked list for feature device in enumeration.
691 * @feature_num: number of sub features for feature device in enumeration.
708 * struct dfl_feature_info - sub feature info collected during feature dev build
710 * @fid: id of this sub feature.
711 * @mmio_res: mmio resource of this sub feature.
714 * @irq_base: start of irq index in this sub feature.
715 * @nr_irqs: number of irqs of this sub feature.
739 * register current feature device, it is called when we need to switch to
740 * another feature parsing or we have parsed all features on given device
741 * feature list.
783 /* each sub feature has one MMIO resource */ in build_info_commit_dev()
790 /* fill features and resource information for feature dev */ in build_info_commit_dev()
792 struct dfl_feature *feature = &pdata->features[index++]; in build_info_commit_dev() local
796 /* save resource information for each feature */ in build_info_commit_dev()
797 feature->dev = fdev; in build_info_commit_dev()
798 feature->id = finfo->fid; in build_info_commit_dev()
799 feature->revision = finfo->revision; in build_info_commit_dev()
802 * the FIU header feature has some fundamental functions (sriov in build_info_commit_dev()
805 * DFL bus device. And we should not assign it to feature in build_info_commit_dev()
808 if (is_header_feature(feature)) { in build_info_commit_dev()
809 feature->resource_index = -1; in build_info_commit_dev()
810 feature->ioaddr = in build_info_commit_dev()
813 if (IS_ERR(feature->ioaddr)) in build_info_commit_dev()
814 return PTR_ERR(feature->ioaddr); in build_info_commit_dev()
816 feature->resource_index = res_idx; in build_info_commit_dev()
830 feature->irq_ctx = ctx; in build_info_commit_dev()
831 feature->nr_irqs = finfo->nr_irqs; in build_info_commit_dev()
849 * The resource of successfully registered feature devices in build_info_commit_dev()
949 * each feature in DFL Header, no field for interrupt resources. in parse_feature_irqs()
951 * registers of each private feature which supports interrupt. So in in parse_feature_irqs()
984 dev_dbg(binfo->dev, "feature: 0x%x, irq_base: %u, nr_irqs: %u\n", in parse_feature_irqs()
989 "Invalid interrupt number in feature 0x%x\n", fid); in parse_feature_irqs()
997 "Invalid irq table entry for feature 0x%x\n", in parse_feature_irqs()
1010 * when create sub feature instances, for private features, it doesn't need
1011 * to provide resource size and feature id as they could be read from DFH
1012 * register. For afu sub feature, its register region only contains user
1030 /* read feature size and id if inputs are invalid */ in create_feature_instance()
1148 /* create platform device for dfl feature dev */ in parse_feature_fiu()
1175 dev_err(binfo->dev, "the private feature 0x%x does not belong to any AFU.\n", in parse_feature_private()
1184 * parse_feature - parse a feature on given device feature list
1186 * @binfo: build feature devices information.
1207 "Feature Type %x is not supported.\n", type); in parse_feature()
1225 /* walk through the device feature list via DFH's next DFH pointer. */ in parse_feature_list()
1228 dev_err(binfo->dev, "The region is too small to contain a feature.\n"); in parse_feature_list()
1244 /* commit current feature device when reach the end of list */ in parse_feature_list()
1282 /* remove all device feature lists in the list. */ in dfl_fpga_enum_info_free()
1298 * dfl_fpga_enum_info_add_dfl - add info of a device feature list to enum info
1301 * @start: mmio resource address of the device feature list.
1302 * @len: mmio resource length of the device feature list.
1304 * One FPGA device may have one or more Device Feature Lists (DFLs), use this
1386 * dfl_fpga_feature_devs_enumerate - enumerate feature devices
1390 * feature devices based on the enumeration info and creates platform devices
1439 * start enumeration for all feature devices based on Device Feature in dfl_fpga_feature_devs_enumerate()
1464 * dfl_fpga_feature_devs_remove - remove all feature devices
1467 * Remove the container device and all feature devices under given container
1734 static int do_set_irq_trigger(struct dfl_feature *feature, unsigned int idx, in do_set_irq_trigger() argument
1737 struct platform_device *pdev = feature->dev; in do_set_irq_trigger()
1741 irq = feature->irq_ctx[idx].irq; in do_set_irq_trigger()
1743 if (feature->irq_ctx[idx].trigger) { in do_set_irq_trigger()
1744 free_irq(irq, feature->irq_ctx[idx].trigger); in do_set_irq_trigger()
1745 kfree(feature->irq_ctx[idx].name); in do_set_irq_trigger()
1746 eventfd_ctx_put(feature->irq_ctx[idx].trigger); in do_set_irq_trigger()
1747 feature->irq_ctx[idx].trigger = NULL; in do_set_irq_trigger()
1753 feature->irq_ctx[idx].name = in do_set_irq_trigger()
1755 dev_name(&pdev->dev), feature->id); in do_set_irq_trigger()
1756 if (!feature->irq_ctx[idx].name) in do_set_irq_trigger()
1766 feature->irq_ctx[idx].name, trigger); in do_set_irq_trigger()
1768 feature->irq_ctx[idx].trigger = trigger; in do_set_irq_trigger()
1774 kfree(feature->irq_ctx[idx].name); in do_set_irq_trigger()
1780 * dfl_fpga_set_irq_triggers - set eventfd triggers for dfl feature interrupts
1782 * @feature: dfl sub feature.
1783 * @start: start of irq index in this dfl sub feature.
1788 * Bind given eventfds with irqs in this dfl sub feature. Unbind related irq if
1794 int dfl_fpga_set_irq_triggers(struct dfl_feature *feature, unsigned int start, in dfl_fpga_set_irq_triggers() argument
1805 if (start + count > feature->nr_irqs) in dfl_fpga_set_irq_triggers()
1811 ret = do_set_irq_trigger(feature, start + i, fd); in dfl_fpga_set_irq_triggers()
1814 do_set_irq_trigger(feature, start + i, -1); in dfl_fpga_set_irq_triggers()
1824 * dfl_feature_ioctl_get_num_irqs - dfl feature _GET_IRQ_NUM ioctl interface.
1825 * @pdev: the feature device which has the sub feature
1826 * @feature: the dfl sub feature
1832 struct dfl_feature *feature, in dfl_feature_ioctl_get_num_irqs() argument
1835 return put_user(feature->nr_irqs, (__u32 __user *)arg); in dfl_feature_ioctl_get_num_irqs()
1840 * dfl_feature_ioctl_set_irq - dfl feature _SET_IRQ ioctl interface.
1841 * @pdev: the feature device which has the sub feature
1842 * @feature: the dfl sub feature
1848 struct dfl_feature *feature, in dfl_feature_ioctl_set_irq() argument
1856 if (!feature->nr_irqs) in dfl_feature_ioctl_set_irq()
1862 if (!hdr.count || (hdr.start + hdr.count > feature->nr_irqs) || in dfl_feature_ioctl_set_irq()
1872 ret = dfl_fpga_set_irq_triggers(feature, hdr.start, hdr.count, fds); in dfl_feature_ioctl_set_irq()
1890 MODULE_DESCRIPTION("FPGA Device Feature List (DFL) Support");