Lines Matching refs:binfo

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