Lines Matching refs:binfo
743 static int build_info_commit_dev(struct build_feature_devs_info *binfo) in build_info_commit_dev() argument
745 struct platform_device *fdev = binfo->feature_dev; in build_info_commit_dev()
761 pdata = kzalloc(struct_size(pdata, features, binfo->feature_num), GFP_KERNEL); in build_info_commit_dev()
766 pdata->num = binfo->feature_num; in build_info_commit_dev()
767 pdata->dfl_cdev = binfo->cdev; in build_info_commit_dev()
784 fdev->num_resources = binfo->feature_num; in build_info_commit_dev()
785 fdev->resource = kcalloc(binfo->feature_num, sizeof(*fdev->resource), in build_info_commit_dev()
791 list_for_each_entry_safe(finfo, p, &binfo->sub_features, node) { in build_info_commit_dev()
810 devm_ioremap_resource(binfo->dev, in build_info_commit_dev()
820 ctx = devm_kcalloc(binfo->dev, finfo->nr_irqs, in build_info_commit_dev()
827 binfo->irq_table[finfo->irq_base + i]; in build_info_commit_dev()
837 ret = platform_device_add(binfo->feature_dev); in build_info_commit_dev()
840 dfl_fpga_cdev_add_port_dev(binfo->cdev, in build_info_commit_dev()
841 binfo->feature_dev); in build_info_commit_dev()
843 binfo->cdev->fme_dev = in build_info_commit_dev()
844 get_device(&binfo->feature_dev->dev); in build_info_commit_dev()
852 binfo->feature_dev = NULL; in build_info_commit_dev()
859 build_info_create_dev(struct build_feature_devs_info *binfo, in build_info_create_dev() argument
875 binfo->feature_dev = fdev; in build_info_create_dev()
876 binfo->feature_num = 0; in build_info_create_dev()
878 INIT_LIST_HEAD(&binfo->sub_features); in build_info_create_dev()
884 fdev->dev.parent = &binfo->cdev->region->dev; in build_info_create_dev()
890 static void build_info_free(struct build_feature_devs_info *binfo) in build_info_free() argument
898 if (binfo->feature_dev && binfo->feature_dev->id >= 0) { in build_info_free()
899 dfl_id_free(feature_dev_id_type(binfo->feature_dev), in build_info_free()
900 binfo->feature_dev->id); in build_info_free()
902 list_for_each_entry_safe(finfo, p, &binfo->sub_features, node) { in build_info_free()
908 platform_device_put(binfo->feature_dev); in build_info_free()
910 devm_kfree(binfo->dev, binfo); in build_info_free()
938 static int parse_feature_irqs(struct build_feature_devs_info *binfo, in parse_feature_irqs() argument
942 void __iomem *base = binfo->ioaddr + ofst; in parse_feature_irqs()
985 dev_dbg(binfo->dev, "feature: 0x%x, irq_base: %u, nr_irqs: %u\n", in parse_feature_irqs()
988 if (ibase + inr > binfo->nr_irqs) { in parse_feature_irqs()
989 dev_err(binfo->dev, in parse_feature_irqs()
995 virq = binfo->irq_table[ibase + i]; in parse_feature_irqs()
997 dev_err(binfo->dev, in parse_feature_irqs()
1018 create_feature_instance(struct build_feature_devs_info *binfo, in create_feature_instance() argument
1026 size = size ? size : feature_size(binfo->ioaddr + ofst); in create_feature_instance()
1027 fid = fid ? fid : feature_id(binfo->ioaddr + ofst); in create_feature_instance()
1029 if (binfo->len - ofst < size) in create_feature_instance()
1032 ret = parse_feature_irqs(binfo, ofst, fid, &irq_base, &nr_irqs); in create_feature_instance()
1041 finfo->mmio_res.start = binfo->start + ofst; in create_feature_instance()
1047 list_add_tail(&finfo->node, &binfo->sub_features); in create_feature_instance()
1048 binfo->feature_num++; in create_feature_instance()
1053 static int parse_feature_port_afu(struct build_feature_devs_info *binfo, in parse_feature_port_afu() argument
1056 u64 v = readq(binfo->ioaddr + PORT_HDR_CAP); in parse_feature_port_afu()
1061 return create_feature_instance(binfo, ofst, size, FEATURE_ID_AFU); in parse_feature_port_afu()
1064 #define is_feature_dev_detected(binfo) (!!(binfo)->feature_dev) argument
1066 static int parse_feature_afu(struct build_feature_devs_info *binfo, in parse_feature_afu() argument
1069 if (!is_feature_dev_detected(binfo)) { in parse_feature_afu()
1070 dev_err(binfo->dev, "this AFU does not belong to any FIU.\n"); in parse_feature_afu()
1074 switch (feature_dev_id_type(binfo->feature_dev)) { in parse_feature_afu()
1076 return parse_feature_port_afu(binfo, ofst); in parse_feature_afu()
1078 dev_info(binfo->dev, "AFU belonging to FIU %s is not supported yet.\n", in parse_feature_afu()
1079 binfo->feature_dev->name); in parse_feature_afu()
1085 static int build_info_prepare(struct build_feature_devs_info *binfo, in build_info_prepare() argument
1088 struct device *dev = binfo->dev; in build_info_prepare()
1104 binfo->start = start; in build_info_prepare()
1105 binfo->len = len; in build_info_prepare()
1106 binfo->ioaddr = ioaddr; in build_info_prepare()
1111 static void build_info_complete(struct build_feature_devs_info *binfo) in build_info_complete() argument
1113 devm_iounmap(binfo->dev, binfo->ioaddr); in build_info_complete()
1114 devm_release_mem_region(binfo->dev, binfo->start, binfo->len); in build_info_complete()
1117 static int parse_feature_fiu(struct build_feature_devs_info *binfo, in parse_feature_fiu() argument
1125 if (is_feature_dev_detected(binfo)) { in parse_feature_fiu()
1126 build_info_complete(binfo); in parse_feature_fiu()
1128 ret = build_info_commit_dev(binfo); in parse_feature_fiu()
1132 ret = build_info_prepare(binfo, binfo->start + ofst, in parse_feature_fiu()
1133 binfo->len - ofst); in parse_feature_fiu()
1138 v = readq(binfo->ioaddr + DFH); in parse_feature_fiu()
1142 ret = build_info_create_dev(binfo, dfh_id_to_type(id)); in parse_feature_fiu()
1146 ret = create_feature_instance(binfo, 0, 0, 0); in parse_feature_fiu()
1153 v = readq(binfo->ioaddr + NEXT_AFU); in parse_feature_fiu()
1157 return parse_feature_afu(binfo, offset); in parse_feature_fiu()
1159 dev_dbg(binfo->dev, "No AFUs detected on FIU %d\n", id); in parse_feature_fiu()
1164 static int parse_feature_private(struct build_feature_devs_info *binfo, in parse_feature_private() argument
1167 if (!is_feature_dev_detected(binfo)) { in parse_feature_private()
1168 dev_err(binfo->dev, "the private feature 0x%x does not belong to any AFU.\n", in parse_feature_private()
1169 feature_id(binfo->ioaddr + ofst)); in parse_feature_private()
1173 return create_feature_instance(binfo, ofst, 0, 0); in parse_feature_private()
1182 static int parse_feature(struct build_feature_devs_info *binfo, in parse_feature() argument
1188 v = readq(binfo->ioaddr + ofst + DFH); in parse_feature()
1193 return parse_feature_afu(binfo, ofst); in parse_feature()
1195 return parse_feature_private(binfo, ofst); in parse_feature()
1197 return parse_feature_fiu(binfo, ofst); in parse_feature()
1199 dev_info(binfo->dev, in parse_feature()
1206 static int parse_feature_list(struct build_feature_devs_info *binfo, in parse_feature_list() argument
1214 ret = build_info_prepare(binfo, start, len); in parse_feature_list()
1221 dev_err(binfo->dev, "The region is too small to contain a feature.\n"); in parse_feature_list()
1225 ret = parse_feature(binfo, start - binfo->start); in parse_feature_list()
1229 v = readq(binfo->ioaddr + start - binfo->start + DFH); in parse_feature_list()
1238 build_info_complete(binfo); in parse_feature_list()
1240 if (is_feature_dev_detected(binfo)) in parse_feature_list()
1241 ret = build_info_commit_dev(binfo); in parse_feature_list()
1391 struct build_feature_devs_info *binfo; in dfl_fpga_feature_devs_enumerate() local
1418 binfo = devm_kzalloc(info->dev, sizeof(*binfo), GFP_KERNEL); in dfl_fpga_feature_devs_enumerate()
1419 if (!binfo) { in dfl_fpga_feature_devs_enumerate()
1424 binfo->dev = info->dev; in dfl_fpga_feature_devs_enumerate()
1425 binfo->cdev = cdev; in dfl_fpga_feature_devs_enumerate()
1427 binfo->nr_irqs = info->nr_irqs; in dfl_fpga_feature_devs_enumerate()
1429 binfo->irq_table = info->irq_table; in dfl_fpga_feature_devs_enumerate()
1436 ret = parse_feature_list(binfo, dfl->start, dfl->len); in dfl_fpga_feature_devs_enumerate()
1439 build_info_free(binfo); in dfl_fpga_feature_devs_enumerate()
1444 build_info_free(binfo); in dfl_fpga_feature_devs_enumerate()