Lines Matching refs:binfo

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