Lines Matching refs:binfo
748 binfo_create_feature_dev_data(struct build_feature_devs_info *binfo) in binfo_create_feature_dev_data() argument
750 enum dfl_id_type type = binfo->type; in binfo_create_feature_dev_data()
758 fdata = devm_kzalloc(binfo->dev, sizeof(*fdata), GFP_KERNEL); in binfo_create_feature_dev_data()
762 fdata->features = devm_kcalloc(binfo->dev, binfo->feature_num, in binfo_create_feature_dev_data()
767 fdata->resources = devm_kcalloc(binfo->dev, binfo->feature_num, in binfo_create_feature_dev_data()
774 fdata->pdev_id = dfl_id_alloc(type, binfo->dev); in binfo_create_feature_dev_data()
778 ret = devm_add_action_or_reset(binfo->dev, dfl_id_free_action, fdata); in binfo_create_feature_dev_data()
783 fdata->num = binfo->feature_num; in binfo_create_feature_dev_data()
784 fdata->dfl_cdev = binfo->cdev; in binfo_create_feature_dev_data()
799 list_for_each_entry_safe(finfo, p, &binfo->sub_features, node) { in binfo_create_feature_dev_data()
810 feature->params = devm_kmemdup(binfo->dev, in binfo_create_feature_dev_data()
828 devm_ioremap_resource(binfo->dev, in binfo_create_feature_dev_data()
838 ctx = devm_kcalloc(binfo->dev, finfo->nr_irqs, in binfo_create_feature_dev_data()
845 binfo->irq_table[finfo->irq_base + i]; in binfo_create_feature_dev_data()
923 static int build_info_commit_dev(struct build_feature_devs_info *binfo) in build_info_commit_dev() argument
928 fdata = binfo_create_feature_dev_data(binfo); in build_info_commit_dev()
936 if (binfo->type == PORT_ID) in build_info_commit_dev()
937 dfl_fpga_cdev_add_port_data(binfo->cdev, fdata); in build_info_commit_dev()
939 binfo->cdev->fme_dev = get_device(&fdata->dev->dev); in build_info_commit_dev()
942 binfo->type = DFL_ID_MAX; in build_info_commit_dev()
947 static void build_info_free(struct build_feature_devs_info *binfo) in build_info_free() argument
951 list_for_each_entry_safe(finfo, p, &binfo->sub_features, node) { in build_info_free()
956 devm_kfree(binfo->dev, binfo); in build_info_free()
1024 static int parse_feature_irqs(struct build_feature_devs_info *binfo, in parse_feature_irqs() argument
1027 void __iomem *base = binfo->ioaddr + ofst; in parse_feature_irqs()
1044 type = binfo->type; in parse_feature_irqs()
1084 dev_warn(binfo->dev, "unexpected DFH version %d\n", finfo->dfh_version); in parse_feature_irqs()
1094 dev_dbg(binfo->dev, "feature: 0x%x, irq_base: %u, nr_irqs: %u\n", in parse_feature_irqs()
1097 if (ibase + inr > binfo->nr_irqs) { in parse_feature_irqs()
1098 dev_err(binfo->dev, in parse_feature_irqs()
1104 virq = binfo->irq_table[ibase + i]; in parse_feature_irqs()
1106 dev_err(binfo->dev, in parse_feature_irqs()
1152 create_feature_instance(struct build_feature_devs_info *binfo, in create_feature_instance() argument
1164 v = readq(binfo->ioaddr + ofst); in create_feature_instance()
1171 dfh_psize = dfh_get_param_size(binfo->ioaddr + ofst, size); in create_feature_instance()
1173 dev_err(binfo->dev, in create_feature_instance()
1178 dev_dbg(binfo->dev, "dfhv1_psize %d\n", dfh_psize); in create_feature_instance()
1182 if (binfo->len - ofst < size) in create_feature_instance()
1189 memcpy_fromio(finfo->params, binfo->ioaddr + ofst + DFHv1_PARAM_HDR, dfh_psize); in create_feature_instance()
1196 v = readq(binfo->ioaddr + ofst + DFHv1_CSR_ADDR); in create_feature_instance()
1201 start = binfo->start + ofst + addr_off; in create_feature_instance()
1203 v = readq(binfo->ioaddr + ofst + DFHv1_CSR_SIZE_GRP); in create_feature_instance()
1206 start = binfo->start + ofst; in create_feature_instance()
1213 ret = parse_feature_irqs(binfo, ofst, finfo); in create_feature_instance()
1219 list_add_tail(&finfo->node, &binfo->sub_features); in create_feature_instance()
1220 binfo->feature_num++; in create_feature_instance()
1225 static int parse_feature_port_afu(struct build_feature_devs_info *binfo, in parse_feature_port_afu() argument
1228 u64 v = readq(binfo->ioaddr + PORT_HDR_CAP); in parse_feature_port_afu()
1233 return create_feature_instance(binfo, ofst, size, FEATURE_ID_AFU); in parse_feature_port_afu()
1236 #define is_feature_dev_detected(binfo) ((binfo)->type != DFL_ID_MAX) argument
1238 static int parse_feature_afu(struct build_feature_devs_info *binfo, in parse_feature_afu() argument
1241 if (!is_feature_dev_detected(binfo)) { in parse_feature_afu()
1242 dev_err(binfo->dev, "this AFU does not belong to any FIU.\n"); in parse_feature_afu()
1246 switch (binfo->type) { in parse_feature_afu()
1248 return parse_feature_port_afu(binfo, ofst); in parse_feature_afu()
1250 dev_info(binfo->dev, "AFU belonging to FIU is not supported yet.\n"); in parse_feature_afu()
1256 static int build_info_prepare(struct build_feature_devs_info *binfo, in build_info_prepare() argument
1259 struct device *dev = binfo->dev; in build_info_prepare()
1275 binfo->start = start; in build_info_prepare()
1276 binfo->len = len; in build_info_prepare()
1277 binfo->ioaddr = ioaddr; in build_info_prepare()
1282 static void build_info_complete(struct build_feature_devs_info *binfo) in build_info_complete() argument
1284 devm_iounmap(binfo->dev, binfo->ioaddr); in build_info_complete()
1285 devm_release_mem_region(binfo->dev, binfo->start, binfo->len); in build_info_complete()
1288 static int parse_feature_fiu(struct build_feature_devs_info *binfo, in parse_feature_fiu() argument
1297 if (is_feature_dev_detected(binfo)) { in parse_feature_fiu()
1298 build_info_complete(binfo); in parse_feature_fiu()
1300 ret = build_info_commit_dev(binfo); in parse_feature_fiu()
1304 ret = build_info_prepare(binfo, binfo->start + ofst, in parse_feature_fiu()
1305 binfo->len - ofst); in parse_feature_fiu()
1310 v = readq(binfo->ioaddr + DFH); in parse_feature_fiu()
1317 binfo->type = type; in parse_feature_fiu()
1318 binfo->feature_num = 0; in parse_feature_fiu()
1319 INIT_LIST_HEAD(&binfo->sub_features); in parse_feature_fiu()
1321 ret = create_feature_instance(binfo, 0, 0, 0); in parse_feature_fiu()
1328 v = readq(binfo->ioaddr + NEXT_AFU); in parse_feature_fiu()
1332 return parse_feature_afu(binfo, offset); in parse_feature_fiu()
1334 dev_dbg(binfo->dev, "No AFUs detected on FIU %d\n", id); in parse_feature_fiu()
1339 static int parse_feature_private(struct build_feature_devs_info *binfo, in parse_feature_private() argument
1342 if (!is_feature_dev_detected(binfo)) { in parse_feature_private()
1343 dev_err(binfo->dev, "the private feature 0x%x does not belong to any AFU.\n", in parse_feature_private()
1344 feature_id(readq(binfo->ioaddr + ofst))); in parse_feature_private()
1348 return create_feature_instance(binfo, ofst, 0, 0); in parse_feature_private()
1357 static int parse_feature(struct build_feature_devs_info *binfo, in parse_feature() argument
1363 v = readq(binfo->ioaddr + ofst + DFH); in parse_feature()
1368 return parse_feature_afu(binfo, ofst); in parse_feature()
1370 return parse_feature_private(binfo, ofst); in parse_feature()
1372 return parse_feature_fiu(binfo, ofst); in parse_feature()
1374 dev_info(binfo->dev, in parse_feature()
1381 static int parse_feature_list(struct build_feature_devs_info *binfo, in parse_feature_list() argument
1389 ret = build_info_prepare(binfo, start, len); in parse_feature_list()
1396 dev_err(binfo->dev, "The region is too small to contain a feature.\n"); in parse_feature_list()
1400 ret = parse_feature(binfo, start - binfo->start); in parse_feature_list()
1404 v = readq(binfo->ioaddr + start - binfo->start + DFH); in parse_feature_list()
1413 build_info_complete(binfo); in parse_feature_list()
1415 if (is_feature_dev_detected(binfo)) in parse_feature_list()
1416 ret = build_info_commit_dev(binfo); in parse_feature_list()
1562 struct build_feature_devs_info *binfo; in dfl_fpga_feature_devs_enumerate() local
1585 binfo = devm_kzalloc(info->dev, sizeof(*binfo), GFP_KERNEL); in dfl_fpga_feature_devs_enumerate()
1586 if (!binfo) { in dfl_fpga_feature_devs_enumerate()
1591 binfo->type = DFL_ID_MAX; in dfl_fpga_feature_devs_enumerate()
1592 binfo->dev = info->dev; in dfl_fpga_feature_devs_enumerate()
1593 binfo->cdev = cdev; in dfl_fpga_feature_devs_enumerate()
1595 binfo->nr_irqs = info->nr_irqs; in dfl_fpga_feature_devs_enumerate()
1597 binfo->irq_table = info->irq_table; in dfl_fpga_feature_devs_enumerate()
1604 ret = parse_feature_list(binfo, dfl->start, dfl->len); in dfl_fpga_feature_devs_enumerate()
1607 build_info_free(binfo); in dfl_fpga_feature_devs_enumerate()
1612 build_info_free(binfo); in dfl_fpga_feature_devs_enumerate()