Lines Matching refs:binfo

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