Lines Matching defs:fn

6 static struct ocxl_fn *ocxl_fn_get(struct ocxl_fn *fn)
8 return (get_device(&fn->dev) == NULL) ? NULL : fn;
11 static void ocxl_fn_put(struct ocxl_fn *fn)
13 put_device(&fn->dev);
16 static struct ocxl_afu *alloc_afu(struct ocxl_fn *fn)
28 afu->fn = fn;
29 ocxl_fn_get(fn);
38 ocxl_fn_put(afu->fn);
56 struct ocxl_fn *fn = afu->fn;
58 struct pci_dev *pci_dev = to_pci_dev(fn->dev.parent);
65 fn->actag_enabled / fn->actag_supported;
66 actag_offset = ocxl_actag_afu_alloc(fn, actag_count);
72 afu->actag_base = fn->actag_base + actag_offset;
84 struct ocxl_fn *fn = afu->fn;
87 start_offset = afu->actag_base - fn->actag_base;
89 ocxl_actag_afu_free(afu->fn, start_offset, size);
94 struct ocxl_fn *fn = afu->fn;
96 struct pci_dev *pci_dev = to_pci_dev(fn->dev.parent);
103 pasid_offset = ocxl_pasid_afu_alloc(fn, pasid_count);
109 afu->pasid_base = fn->pasid_base + pasid_offset;
123 struct ocxl_fn *fn = afu->fn;
126 start_offset = afu->pasid_base - fn->pasid_base;
128 ocxl_pasid_afu_free(afu->fn, start_offset, size);
131 static int reserve_fn_bar(struct ocxl_fn *fn, int bar)
133 struct pci_dev *dev = to_pci_dev(fn->dev.parent);
140 if (fn->bar_used[idx]++ == 0) {
148 static void release_fn_bar(struct ocxl_fn *fn, int bar)
150 struct pci_dev *dev = to_pci_dev(fn->dev.parent);
157 if (--fn->bar_used[idx] == 0)
159 WARN_ON(fn->bar_used[idx] < 0);
165 struct pci_dev *pci_dev = to_pci_dev(afu->fn->dev.parent);
167 rc = reserve_fn_bar(afu->fn, afu->config.global_mmio_bar);
171 rc = reserve_fn_bar(afu->fn, afu->config.pp_mmio_bar);
173 release_fn_bar(afu->fn, afu->config.global_mmio_bar);
187 release_fn_bar(afu->fn, afu->config.pp_mmio_bar);
188 release_fn_bar(afu->fn, afu->config.global_mmio_bar);
209 release_fn_bar(afu->fn, afu->config.pp_mmio_bar);
210 release_fn_bar(afu->fn, afu->config.global_mmio_bar);
217 rc = ocxl_config_read_afu(dev, &afu->fn->config, &afu->config, afu_idx);
258 struct pci_dev *dev = to_pci_dev(afu->fn->dev.parent);
263 static int init_afu(struct pci_dev *dev, struct ocxl_fn *fn, u8 afu_idx)
268 afu = alloc_afu(fn);
285 list_add_tail(&afu->list, &fn->afu_list);
301 struct ocxl_fn *fn;
303 fn = kzalloc(sizeof(struct ocxl_fn), GFP_KERNEL);
304 if (!fn)
307 INIT_LIST_HEAD(&fn->afu_list);
308 INIT_LIST_HEAD(&fn->pasid_list);
309 INIT_LIST_HEAD(&fn->actag_list);
311 return fn;
314 static void free_function(struct ocxl_fn *fn)
316 WARN_ON(!list_empty(&fn->afu_list));
317 WARN_ON(!list_empty(&fn->pasid_list));
318 kfree(fn);
323 struct ocxl_fn *fn = container_of(dev, struct ocxl_fn, dev);
325 free_function(fn);
328 static int set_function_device(struct ocxl_fn *fn, struct pci_dev *dev)
330 fn->dev.parent = &dev->dev;
331 fn->dev.release = free_function_dev;
332 return dev_set_name(&fn->dev, "ocxlfn.%s", dev_name(&dev->dev));
335 static int assign_function_actag(struct ocxl_fn *fn)
337 struct pci_dev *dev = to_pci_dev(fn->dev.parent);
345 fn->actag_base = base;
346 fn->actag_enabled = enabled;
347 fn->actag_supported = supported;
349 ocxl_config_set_actag(dev, fn->config.dvsec_function_pos,
350 fn->actag_base, fn->actag_enabled);
351 dev_dbg(&fn->dev, "actag range starting at %d, enabled %d\n",
352 fn->actag_base, fn->actag_enabled);
356 static int set_function_pasid(struct ocxl_fn *fn)
358 struct pci_dev *dev = to_pci_dev(fn->dev.parent);
362 if (fn->config.max_pasid_log < 0)
369 desired_count = 1 << fn->config.max_pasid_log;
372 dev_err(&fn->dev,
378 fn->pasid_base = 0;
382 static int configure_function(struct ocxl_fn *fn, struct pci_dev *dev)
413 rc = ocxl_config_read_function(dev, &fn->config);
417 rc = set_function_device(fn, dev);
421 rc = assign_function_actag(fn);
425 rc = set_function_pasid(fn);
429 rc = ocxl_link_setup(dev, 0, &fn->link);
433 rc = ocxl_config_set_TL(dev, fn->config.dvsec_tl_pos);
435 ocxl_link_release(dev, fn->link);
441 static void deconfigure_function(struct ocxl_fn *fn)
443 struct pci_dev *dev = to_pci_dev(fn->dev.parent);
445 ocxl_link_release(dev, fn->link);
451 struct ocxl_fn *fn;
454 fn = alloc_function();
455 if (!fn)
458 rc = configure_function(fn, dev);
460 free_function(fn);
464 rc = device_register(&fn->dev);
466 deconfigure_function(fn);
467 put_device(&fn->dev);
470 return fn;
479 struct ocxl_fn *fn;
486 fn = init_function(dev);
487 if (IS_ERR(fn)) {
489 PTR_ERR(fn));
490 return fn;
493 for (afu = 0; afu <= fn->config.max_afu_index; afu++) {
494 rc = ocxl_config_check_afu_index(dev, &fn->config, afu);
496 rc = init_afu(dev, fn, afu);
506 return fn;
510 struct list_head *ocxl_function_afu_list(struct ocxl_fn *fn)
512 return &fn->afu_list;
516 struct ocxl_afu *ocxl_function_fetch_afu(struct ocxl_fn *fn, u8 afu_idx)
520 list_for_each_entry(afu, &fn->afu_list, list) {
529 const struct ocxl_fn_config *ocxl_function_config(struct ocxl_fn *fn)
531 return &fn->config;
535 void ocxl_function_close(struct ocxl_fn *fn)
539 list_for_each_entry_safe(afu, tmp, &fn->afu_list, list) {
543 deconfigure_function(fn);
544 device_unregister(&fn->dev);