Lines Matching refs:binfo

762 static int build_info_commit_dev(struct build_feature_devs_info *binfo)  in build_info_commit_dev()  argument
764 struct platform_device *fdev = binfo->feature_dev; in build_info_commit_dev()
780 pdata = kzalloc(struct_size(pdata, features, binfo->feature_num), GFP_KERNEL); in build_info_commit_dev()
785 pdata->num = binfo->feature_num; in build_info_commit_dev()
786 pdata->dfl_cdev = binfo->cdev; in build_info_commit_dev()
803 fdev->num_resources = binfo->feature_num; in build_info_commit_dev()
804 fdev->resource = kcalloc(binfo->feature_num, sizeof(*fdev->resource), in build_info_commit_dev()
810 list_for_each_entry_safe(finfo, p, &binfo->sub_features, node) { in build_info_commit_dev()
822 feature->params = devm_kmemdup(binfo->dev, in build_info_commit_dev()
840 devm_ioremap_resource(binfo->dev, in build_info_commit_dev()
850 ctx = devm_kcalloc(binfo->dev, finfo->nr_irqs, in build_info_commit_dev()
857 binfo->irq_table[finfo->irq_base + i]; in build_info_commit_dev()
867 ret = platform_device_add(binfo->feature_dev); in build_info_commit_dev()
870 dfl_fpga_cdev_add_port_dev(binfo->cdev, in build_info_commit_dev()
871 binfo->feature_dev); in build_info_commit_dev()
873 binfo->cdev->fme_dev = in build_info_commit_dev()
874 get_device(&binfo->feature_dev->dev); in build_info_commit_dev()
882 binfo->feature_dev = NULL; in build_info_commit_dev()
889 build_info_create_dev(struct build_feature_devs_info *binfo, in build_info_create_dev() argument
905 binfo->feature_dev = fdev; in build_info_create_dev()
906 binfo->feature_num = 0; in build_info_create_dev()
908 INIT_LIST_HEAD(&binfo->sub_features); in build_info_create_dev()
914 fdev->dev.parent = &binfo->cdev->region->dev; in build_info_create_dev()
920 static void build_info_free(struct build_feature_devs_info *binfo) in build_info_free() argument
928 if (binfo->feature_dev && binfo->feature_dev->id >= 0) { in build_info_free()
929 dfl_id_free(feature_dev_id_type(binfo->feature_dev), in build_info_free()
930 binfo->feature_dev->id); in build_info_free()
932 list_for_each_entry_safe(finfo, p, &binfo->sub_features, node) { in build_info_free()
938 platform_device_put(binfo->feature_dev); in build_info_free()
940 devm_kfree(binfo->dev, binfo); in build_info_free()
1008 static int parse_feature_irqs(struct build_feature_devs_info *binfo, in parse_feature_irqs() argument
1011 void __iomem *base = binfo->ioaddr + ofst; in parse_feature_irqs()
1028 type = feature_dev_id_type(binfo->feature_dev); in parse_feature_irqs()
1068 dev_warn(binfo->dev, "unexpected DFH version %d\n", finfo->dfh_version); in parse_feature_irqs()
1078 dev_dbg(binfo->dev, "feature: 0x%x, irq_base: %u, nr_irqs: %u\n", in parse_feature_irqs()
1081 if (ibase + inr > binfo->nr_irqs) { in parse_feature_irqs()
1082 dev_err(binfo->dev, in parse_feature_irqs()
1088 virq = binfo->irq_table[ibase + i]; in parse_feature_irqs()
1090 dev_err(binfo->dev, in parse_feature_irqs()
1136 create_feature_instance(struct build_feature_devs_info *binfo, in create_feature_instance() argument
1148 v = readq(binfo->ioaddr + ofst); in create_feature_instance()
1155 dfh_psize = dfh_get_param_size(binfo->ioaddr + ofst, size); in create_feature_instance()
1157 dev_err(binfo->dev, in create_feature_instance()
1162 dev_dbg(binfo->dev, "dfhv1_psize %d\n", dfh_psize); in create_feature_instance()
1166 if (binfo->len - ofst < size) in create_feature_instance()
1173 memcpy_fromio(finfo->params, binfo->ioaddr + ofst + DFHv1_PARAM_HDR, dfh_psize); in create_feature_instance()
1180 v = readq(binfo->ioaddr + ofst + DFHv1_CSR_ADDR); in create_feature_instance()
1185 start = binfo->start + ofst + addr_off; in create_feature_instance()
1187 v = readq(binfo->ioaddr + ofst + DFHv1_CSR_SIZE_GRP); in create_feature_instance()
1190 start = binfo->start + ofst; in create_feature_instance()
1197 ret = parse_feature_irqs(binfo, ofst, finfo); in create_feature_instance()
1203 list_add_tail(&finfo->node, &binfo->sub_features); in create_feature_instance()
1204 binfo->feature_num++; in create_feature_instance()
1209 static int parse_feature_port_afu(struct build_feature_devs_info *binfo, in parse_feature_port_afu() argument
1212 u64 v = readq(binfo->ioaddr + PORT_HDR_CAP); in parse_feature_port_afu()
1217 return create_feature_instance(binfo, ofst, size, FEATURE_ID_AFU); in parse_feature_port_afu()
1220 #define is_feature_dev_detected(binfo) (!!(binfo)->feature_dev) argument
1222 static int parse_feature_afu(struct build_feature_devs_info *binfo, in parse_feature_afu() argument
1225 if (!is_feature_dev_detected(binfo)) { in parse_feature_afu()
1226 dev_err(binfo->dev, "this AFU does not belong to any FIU.\n"); in parse_feature_afu()
1230 switch (feature_dev_id_type(binfo->feature_dev)) { in parse_feature_afu()
1232 return parse_feature_port_afu(binfo, ofst); in parse_feature_afu()
1234 dev_info(binfo->dev, "AFU belonging to FIU %s is not supported yet.\n", in parse_feature_afu()
1235 binfo->feature_dev->name); in parse_feature_afu()
1241 static int build_info_prepare(struct build_feature_devs_info *binfo, in build_info_prepare() argument
1244 struct device *dev = binfo->dev; in build_info_prepare()
1260 binfo->start = start; in build_info_prepare()
1261 binfo->len = len; in build_info_prepare()
1262 binfo->ioaddr = ioaddr; in build_info_prepare()
1267 static void build_info_complete(struct build_feature_devs_info *binfo) in build_info_complete() argument
1269 devm_iounmap(binfo->dev, binfo->ioaddr); in build_info_complete()
1270 devm_release_mem_region(binfo->dev, binfo->start, binfo->len); in build_info_complete()
1273 static int parse_feature_fiu(struct build_feature_devs_info *binfo, in parse_feature_fiu() argument
1281 if (is_feature_dev_detected(binfo)) { in parse_feature_fiu()
1282 build_info_complete(binfo); in parse_feature_fiu()
1284 ret = build_info_commit_dev(binfo); in parse_feature_fiu()
1288 ret = build_info_prepare(binfo, binfo->start + ofst, in parse_feature_fiu()
1289 binfo->len - ofst); in parse_feature_fiu()
1294 v = readq(binfo->ioaddr + DFH); in parse_feature_fiu()
1298 ret = build_info_create_dev(binfo, dfh_id_to_type(id)); in parse_feature_fiu()
1302 ret = create_feature_instance(binfo, 0, 0, 0); in parse_feature_fiu()
1309 v = readq(binfo->ioaddr + NEXT_AFU); in parse_feature_fiu()
1313 return parse_feature_afu(binfo, offset); in parse_feature_fiu()
1315 dev_dbg(binfo->dev, "No AFUs detected on FIU %d\n", id); in parse_feature_fiu()
1320 static int parse_feature_private(struct build_feature_devs_info *binfo, in parse_feature_private() argument
1323 if (!is_feature_dev_detected(binfo)) { in parse_feature_private()
1324 dev_err(binfo->dev, "the private feature 0x%x does not belong to any AFU.\n", in parse_feature_private()
1325 feature_id(readq(binfo->ioaddr + ofst))); in parse_feature_private()
1329 return create_feature_instance(binfo, ofst, 0, 0); in parse_feature_private()
1338 static int parse_feature(struct build_feature_devs_info *binfo, in parse_feature() argument
1344 v = readq(binfo->ioaddr + ofst + DFH); in parse_feature()
1349 return parse_feature_afu(binfo, ofst); in parse_feature()
1351 return parse_feature_private(binfo, ofst); in parse_feature()
1353 return parse_feature_fiu(binfo, ofst); in parse_feature()
1355 dev_info(binfo->dev, in parse_feature()
1362 static int parse_feature_list(struct build_feature_devs_info *binfo, in parse_feature_list() argument
1370 ret = build_info_prepare(binfo, start, len); in parse_feature_list()
1377 dev_err(binfo->dev, "The region is too small to contain a feature.\n"); in parse_feature_list()
1381 ret = parse_feature(binfo, start - binfo->start); in parse_feature_list()
1385 v = readq(binfo->ioaddr + start - binfo->start + DFH); in parse_feature_list()
1394 build_info_complete(binfo); in parse_feature_list()
1396 if (is_feature_dev_detected(binfo)) in parse_feature_list()
1397 ret = build_info_commit_dev(binfo); in parse_feature_list()
1547 struct build_feature_devs_info *binfo; in dfl_fpga_feature_devs_enumerate() local
1570 binfo = devm_kzalloc(info->dev, sizeof(*binfo), GFP_KERNEL); in dfl_fpga_feature_devs_enumerate()
1571 if (!binfo) { in dfl_fpga_feature_devs_enumerate()
1576 binfo->dev = info->dev; in dfl_fpga_feature_devs_enumerate()
1577 binfo->cdev = cdev; in dfl_fpga_feature_devs_enumerate()
1579 binfo->nr_irqs = info->nr_irqs; in dfl_fpga_feature_devs_enumerate()
1581 binfo->irq_table = info->irq_table; in dfl_fpga_feature_devs_enumerate()
1588 ret = parse_feature_list(binfo, dfl->start, dfl->len); in dfl_fpga_feature_devs_enumerate()
1591 build_info_free(binfo); in dfl_fpga_feature_devs_enumerate()
1596 build_info_free(binfo); in dfl_fpga_feature_devs_enumerate()