Lines Matching refs:binfo
441 static int build_info_commit_dev(struct build_feature_devs_info *binfo) in build_info_commit_dev() argument
443 struct platform_device *fdev = binfo->feature_dev; in build_info_commit_dev()
457 pdata = kzalloc(dfl_feature_platform_data_size(binfo->feature_num), in build_info_commit_dev()
463 pdata->num = binfo->feature_num; in build_info_commit_dev()
464 pdata->dfl_cdev = binfo->cdev; in build_info_commit_dev()
478 fdev->num_resources = binfo->feature_num; in build_info_commit_dev()
479 fdev->resource = kcalloc(binfo->feature_num, sizeof(*fdev->resource), in build_info_commit_dev()
485 list_for_each_entry_safe(finfo, p, &binfo->sub_features, node) { in build_info_commit_dev()
498 ret = platform_device_add(binfo->feature_dev); in build_info_commit_dev()
500 if (feature_dev_id_type(binfo->feature_dev) == PORT_ID) in build_info_commit_dev()
501 dfl_fpga_cdev_add_port_dev(binfo->cdev, in build_info_commit_dev()
502 binfo->feature_dev); in build_info_commit_dev()
504 binfo->cdev->fme_dev = in build_info_commit_dev()
505 get_device(&binfo->feature_dev->dev); in build_info_commit_dev()
513 binfo->feature_dev = NULL; in build_info_commit_dev()
520 build_info_create_dev(struct build_feature_devs_info *binfo, in build_info_create_dev() argument
530 ret = build_info_commit_dev(binfo); in build_info_create_dev()
542 binfo->feature_dev = fdev; in build_info_create_dev()
543 binfo->feature_num = 0; in build_info_create_dev()
544 binfo->ioaddr = ioaddr; in build_info_create_dev()
545 INIT_LIST_HEAD(&binfo->sub_features); in build_info_create_dev()
551 fdev->dev.parent = &binfo->cdev->region->dev; in build_info_create_dev()
557 static void build_info_free(struct build_feature_devs_info *binfo) in build_info_free() argument
565 if (binfo->feature_dev && binfo->feature_dev->id >= 0) { in build_info_free()
566 dfl_id_free(feature_dev_id_type(binfo->feature_dev), in build_info_free()
567 binfo->feature_dev->id); in build_info_free()
569 list_for_each_entry_safe(finfo, p, &binfo->sub_features, node) { in build_info_free()
575 platform_device_put(binfo->feature_dev); in build_info_free()
577 devm_kfree(binfo->dev, binfo); in build_info_free()
613 create_feature_instance(struct build_feature_devs_info *binfo, in create_feature_instance() argument
636 list_add_tail(&finfo->node, &binfo->sub_features); in create_feature_instance()
637 binfo->feature_num++; in create_feature_instance()
642 static int parse_feature_port_afu(struct build_feature_devs_info *binfo, in parse_feature_port_afu() argument
646 u64 v = readq(binfo->ioaddr + PORT_HDR_CAP); in parse_feature_port_afu()
651 return create_feature_instance(binfo, dfl, ofst, size, FEATURE_ID_AFU); in parse_feature_port_afu()
654 static int parse_feature_afu(struct build_feature_devs_info *binfo, in parse_feature_afu() argument
658 if (!binfo->feature_dev) { in parse_feature_afu()
659 dev_err(binfo->dev, "this AFU does not belong to any FIU.\n"); in parse_feature_afu()
663 switch (feature_dev_id_type(binfo->feature_dev)) { in parse_feature_afu()
665 return parse_feature_port_afu(binfo, dfl, ofst); in parse_feature_afu()
667 dev_info(binfo->dev, "AFU belonging to FIU %s is not supported yet.\n", in parse_feature_afu()
668 binfo->feature_dev->name); in parse_feature_afu()
674 static int parse_feature_fiu(struct build_feature_devs_info *binfo, in parse_feature_fiu() argument
686 ret = build_info_create_dev(binfo, dfh_id_to_type(id), in parse_feature_fiu()
691 ret = create_feature_instance(binfo, dfl, ofst, 0, 0); in parse_feature_fiu()
702 return parse_feature_afu(binfo, dfl, ofst + offset); in parse_feature_fiu()
704 dev_dbg(binfo->dev, "No AFUs detected on FIU %d\n", id); in parse_feature_fiu()
709 static int parse_feature_private(struct build_feature_devs_info *binfo, in parse_feature_private() argument
713 if (!binfo->feature_dev) { in parse_feature_private()
714 dev_err(binfo->dev, "the private feature %llx does not belong to any AFU.\n", in parse_feature_private()
719 return create_feature_instance(binfo, dfl, ofst, 0, 0); in parse_feature_private()
729 static int parse_feature(struct build_feature_devs_info *binfo, in parse_feature() argument
740 return parse_feature_afu(binfo, dfl, ofst); in parse_feature()
742 return parse_feature_private(binfo, dfl, ofst); in parse_feature()
744 return parse_feature_fiu(binfo, dfl, ofst); in parse_feature()
746 dev_info(binfo->dev, in parse_feature()
753 static int parse_feature_list(struct build_feature_devs_info *binfo, in parse_feature_list() argument
765 dev_err(binfo->dev, "The region is too small to contain a feature.\n"); in parse_feature_list()
769 ret = parse_feature(binfo, dfl, start - dfl->ioaddr); in parse_feature_list()
782 return build_info_commit_dev(binfo); in parse_feature_list()
890 struct build_feature_devs_info *binfo; in dfl_fpga_feature_devs_enumerate() local
917 binfo = devm_kzalloc(info->dev, sizeof(*binfo), GFP_KERNEL); in dfl_fpga_feature_devs_enumerate()
918 if (!binfo) { in dfl_fpga_feature_devs_enumerate()
923 binfo->dev = info->dev; in dfl_fpga_feature_devs_enumerate()
924 binfo->cdev = cdev; in dfl_fpga_feature_devs_enumerate()
931 ret = parse_feature_list(binfo, dfl); in dfl_fpga_feature_devs_enumerate()
934 build_info_free(binfo); in dfl_fpga_feature_devs_enumerate()
939 build_info_free(binfo); in dfl_fpga_feature_devs_enumerate()