Lines Matching refs:afu
18 struct ocxl_afu *afu; in alloc_afu() local
20 afu = kzalloc(sizeof(struct ocxl_afu), GFP_KERNEL); in alloc_afu()
21 if (!afu) in alloc_afu()
24 kref_init(&afu->kref); in alloc_afu()
25 mutex_init(&afu->contexts_lock); in alloc_afu()
26 mutex_init(&afu->afu_control_lock); in alloc_afu()
27 idr_init(&afu->contexts_idr); in alloc_afu()
28 afu->fn = fn; in alloc_afu()
30 return afu; in alloc_afu()
35 struct ocxl_afu *afu = container_of(kref, struct ocxl_afu, kref); in free_afu() local
37 idr_destroy(&afu->contexts_idr); in free_afu()
38 ocxl_fn_put(afu->fn); in free_afu()
39 kfree(afu); in free_afu()
42 void ocxl_afu_get(struct ocxl_afu *afu) in ocxl_afu_get() argument
44 kref_get(&afu->kref); in ocxl_afu_get()
48 void ocxl_afu_put(struct ocxl_afu *afu) in ocxl_afu_put() argument
50 kref_put(&afu->kref, free_afu); in ocxl_afu_put()
54 static int assign_afu_actag(struct ocxl_afu *afu) in assign_afu_actag() argument
56 struct ocxl_fn *fn = afu->fn; in assign_afu_actag()
64 actag_count = afu->config.actag_supported * in assign_afu_actag()
72 afu->actag_base = fn->actag_base + actag_offset; in assign_afu_actag()
73 afu->actag_enabled = actag_count; in assign_afu_actag()
75 ocxl_config_set_afu_actag(pci_dev, afu->config.dvsec_afu_control_pos, in assign_afu_actag()
76 afu->actag_base, afu->actag_enabled); in assign_afu_actag()
78 afu->actag_base, afu->actag_enabled); in assign_afu_actag()
82 static void reclaim_afu_actag(struct ocxl_afu *afu) in reclaim_afu_actag() argument
84 struct ocxl_fn *fn = afu->fn; in reclaim_afu_actag()
87 start_offset = afu->actag_base - fn->actag_base; in reclaim_afu_actag()
88 size = afu->actag_enabled; in reclaim_afu_actag()
89 ocxl_actag_afu_free(afu->fn, start_offset, size); in reclaim_afu_actag()
92 static int assign_afu_pasid(struct ocxl_afu *afu) in assign_afu_pasid() argument
94 struct ocxl_fn *fn = afu->fn; in assign_afu_pasid()
102 pasid_count = 1 << afu->config.pasid_supported_log; in assign_afu_pasid()
109 afu->pasid_base = fn->pasid_base + pasid_offset; in assign_afu_pasid()
110 afu->pasid_count = 0; in assign_afu_pasid()
111 afu->pasid_max = pasid_count; in assign_afu_pasid()
113 ocxl_config_set_afu_pasid(pci_dev, afu->config.dvsec_afu_control_pos, in assign_afu_pasid()
114 afu->pasid_base, in assign_afu_pasid()
115 afu->config.pasid_supported_log); in assign_afu_pasid()
117 afu->pasid_base, pasid_count); in assign_afu_pasid()
121 static void reclaim_afu_pasid(struct ocxl_afu *afu) in reclaim_afu_pasid() argument
123 struct ocxl_fn *fn = afu->fn; in reclaim_afu_pasid()
126 start_offset = afu->pasid_base - fn->pasid_base; in reclaim_afu_pasid()
127 size = 1 << afu->config.pasid_supported_log; in reclaim_afu_pasid()
128 ocxl_pasid_afu_free(afu->fn, start_offset, size); in reclaim_afu_pasid()
162 static int map_mmio_areas(struct ocxl_afu *afu) in map_mmio_areas() argument
165 struct pci_dev *pci_dev = to_pci_dev(afu->fn->dev.parent); in map_mmio_areas()
167 rc = reserve_fn_bar(afu->fn, afu->config.global_mmio_bar); in map_mmio_areas()
171 rc = reserve_fn_bar(afu->fn, afu->config.pp_mmio_bar); in map_mmio_areas()
173 release_fn_bar(afu->fn, afu->config.global_mmio_bar); in map_mmio_areas()
177 afu->global_mmio_start = in map_mmio_areas()
178 pci_resource_start(pci_dev, afu->config.global_mmio_bar) + in map_mmio_areas()
179 afu->config.global_mmio_offset; in map_mmio_areas()
180 afu->pp_mmio_start = in map_mmio_areas()
181 pci_resource_start(pci_dev, afu->config.pp_mmio_bar) + in map_mmio_areas()
182 afu->config.pp_mmio_offset; in map_mmio_areas()
184 afu->global_mmio_ptr = ioremap(afu->global_mmio_start, in map_mmio_areas()
185 afu->config.global_mmio_size); in map_mmio_areas()
186 if (!afu->global_mmio_ptr) { in map_mmio_areas()
187 release_fn_bar(afu->fn, afu->config.pp_mmio_bar); in map_mmio_areas()
188 release_fn_bar(afu->fn, afu->config.global_mmio_bar); in map_mmio_areas()
197 afu->irq_base_offset = afu->config.pp_mmio_stride + PAGE_SIZE; in map_mmio_areas()
201 static void unmap_mmio_areas(struct ocxl_afu *afu) in unmap_mmio_areas() argument
203 if (afu->global_mmio_ptr) { in unmap_mmio_areas()
204 iounmap(afu->global_mmio_ptr); in unmap_mmio_areas()
205 afu->global_mmio_ptr = NULL; in unmap_mmio_areas()
207 afu->global_mmio_start = 0; in unmap_mmio_areas()
208 afu->pp_mmio_start = 0; in unmap_mmio_areas()
209 release_fn_bar(afu->fn, afu->config.pp_mmio_bar); in unmap_mmio_areas()
210 release_fn_bar(afu->fn, afu->config.global_mmio_bar); in unmap_mmio_areas()
213 static int configure_afu(struct ocxl_afu *afu, u8 afu_idx, struct pci_dev *dev) in configure_afu() argument
217 rc = ocxl_config_read_afu(dev, &afu->fn->config, &afu->config, afu_idx); in configure_afu()
221 rc = assign_afu_actag(afu); in configure_afu()
225 rc = assign_afu_pasid(afu); in configure_afu()
229 rc = map_mmio_areas(afu); in configure_afu()
236 reclaim_afu_pasid(afu); in configure_afu()
238 reclaim_afu_actag(afu); in configure_afu()
242 static void deconfigure_afu(struct ocxl_afu *afu) in deconfigure_afu() argument
244 unmap_mmio_areas(afu); in deconfigure_afu()
245 reclaim_afu_pasid(afu); in deconfigure_afu()
246 reclaim_afu_actag(afu); in deconfigure_afu()
249 static int activate_afu(struct pci_dev *dev, struct ocxl_afu *afu) in activate_afu() argument
251 ocxl_config_set_afu_state(dev, afu->config.dvsec_afu_control_pos, 1); in activate_afu()
256 static void deactivate_afu(struct ocxl_afu *afu) in deactivate_afu() argument
258 struct pci_dev *dev = to_pci_dev(afu->fn->dev.parent); in deactivate_afu()
260 ocxl_config_set_afu_state(dev, afu->config.dvsec_afu_control_pos, 0); in deactivate_afu()
266 struct ocxl_afu *afu; in init_afu() local
268 afu = alloc_afu(fn); in init_afu()
269 if (!afu) in init_afu()
272 rc = configure_afu(afu, afu_idx, dev); in init_afu()
274 ocxl_afu_put(afu); in init_afu()
278 rc = activate_afu(dev, afu); in init_afu()
280 deconfigure_afu(afu); in init_afu()
281 ocxl_afu_put(afu); in init_afu()
285 list_add_tail(&afu->list, &fn->afu_list); in init_afu()
290 static void remove_afu(struct ocxl_afu *afu) in remove_afu() argument
292 list_del(&afu->list); in remove_afu()
293 ocxl_context_detach_all(afu); in remove_afu()
294 deactivate_afu(afu); in remove_afu()
295 deconfigure_afu(afu); in remove_afu()
296 ocxl_afu_put(afu); // matches the implicit get in alloc_afu in remove_afu()
478 u8 afu; in ocxl_function_open() local
493 for (afu = 0; afu <= fn->config.max_afu_index; afu++) { in ocxl_function_open()
494 rc = ocxl_config_check_afu_index(dev, &fn->config, afu); in ocxl_function_open()
496 rc = init_afu(dev, fn, afu); in ocxl_function_open()
499 "Can't initialize AFU index %d\n", afu); in ocxl_function_open()
518 struct ocxl_afu *afu; in ocxl_function_fetch_afu() local
520 list_for_each_entry(afu, &fn->afu_list, list) { in ocxl_function_fetch_afu()
521 if (afu->config.idx == afu_idx) in ocxl_function_fetch_afu()
522 return afu; in ocxl_function_fetch_afu()
537 struct ocxl_afu *afu, *tmp; in ocxl_function_close() local
539 list_for_each_entry_safe(afu, tmp, &fn->afu_list, list) { in ocxl_function_close()
540 remove_afu(afu); in ocxl_function_close()
550 struct ocxl_afu_config *ocxl_afu_config(struct ocxl_afu *afu) in ocxl_afu_config() argument
552 return &afu->config; in ocxl_afu_config()
556 void ocxl_afu_set_private(struct ocxl_afu *afu, void *private) in ocxl_afu_set_private() argument
558 afu->private = private; in ocxl_afu_set_private()
562 void *ocxl_afu_get_private(struct ocxl_afu *afu) in ocxl_afu_get_private() argument
564 if (afu) in ocxl_afu_get_private()
565 return afu->private; in ocxl_afu_get_private()