Lines Matching refs:area

57  * @waitq:		area wait queue
86 struct nfp_cpp_area *area;
93 struct mutex mutex; /* Lock for the area's refcount */
132 struct nfp_cpp_area *area =
134 struct nfp_cpp *cpp = nfp_cpp_area_cpp(area);
136 if (area->cpp->op->area_cleanup)
137 area->cpp->op->area_cleanup(area);
140 __resource_del(&area->resource);
142 kfree(area);
145 static void nfp_cpp_area_put(struct nfp_cpp_area *area)
147 kref_put(&area->kref, __release_cpp_area);
150 static struct nfp_cpp_area *nfp_cpp_area_get(struct nfp_cpp_area *area)
152 kref_get(&area->kref);
154 return area;
170 nfp_cpp_area_release(cache->area);
171 nfp_cpp_area_free(cache->area);
180 struct nfp_cpp_area *area = container_of(res,
184 dev_err(cpp->dev.parent, "Dangling area: %d:%d:%d:0x%0llx-0x%0llx%s%s\n",
192 if (area->cpp->op->area_release)
193 area->cpp->op->area_release(area);
195 __release_cpp_area(&area->kref);
270 * nfp_cpp_area_alloc_with_name() - allocate a new CPP area
277 * Allocate and initialize a CPP area structure. The area must later
282 * Return: NFP CPP area handle, or NULL
288 struct nfp_cpp_area *area;
303 area = kzalloc(sizeof(*area) + cpp->op->area_priv_size + name_len,
305 if (!area)
308 area->cpp = cpp;
309 area->resource.name = (void *)area + sizeof(*area) +
311 memcpy((char *)area->resource.name, name, name_len);
313 area->resource.cpp_id = dest;
314 area->resource.start = address;
315 area->resource.end = area->resource.start + size - 1;
316 INIT_LIST_HEAD(&area->resource.list);
318 atomic_set(&area->refcount, 0);
319 kref_init(&area->kref);
320 mutex_init(&area->mutex);
325 err = cpp->op->area_init(area, dest, address, size);
327 kfree(area);
333 __resource_add(&cpp->resource_list, &area->resource);
336 area->offset = address;
337 area->size = size;
339 return area;
343 * nfp_cpp_area_alloc() - allocate a new CPP area
347 * @size: Size of area in bytes
349 * Allocate and initialize a CPP area structure. The area must later
364 * nfp_cpp_area_alloc_acquire() - allocate a new CPP area and lock it down
369 * @size: Size of area
371 * Allocate and initialize a CPP area structure, and lock it down so
375 * The area must also be 'released' when the structure is freed.
383 struct nfp_cpp_area *area;
385 area = nfp_cpp_area_alloc_with_name(cpp, dest, name, address, size);
386 if (!area)
389 if (nfp_cpp_area_acquire(area)) {
390 nfp_cpp_area_free(area);
394 return area;
398 * nfp_cpp_area_free() - free up the CPP area
399 * @area: CPP area handle
401 * Frees up memory resources held by the CPP area.
403 void nfp_cpp_area_free(struct nfp_cpp_area *area)
405 if (atomic_read(&area->refcount))
406 nfp_warn(area->cpp, "Warning: freeing busy area\n");
407 nfp_cpp_area_put(area);
410 static bool nfp_cpp_area_acquire_try(struct nfp_cpp_area *area, int *status)
412 *status = area->cpp->op->area_acquire(area);
417 static int __nfp_cpp_area_acquire(struct nfp_cpp_area *area)
421 if (atomic_inc_return(&area->refcount) > 1)
424 if (!area->cpp->op->area_acquire)
427 err = wait_event_interruptible(area->cpp->waitq,
428 nfp_cpp_area_acquire_try(area, &status));
432 nfp_warn(area->cpp, "Warning: area wait failed: %d\n", err);
433 atomic_dec(&area->refcount);
437 nfp_cpp_area_get(area);
443 * nfp_cpp_area_acquire() - lock down a CPP area for access
444 * @area: CPP area handle
446 * Locks down the CPP area for a potential long term activity. Area
451 int nfp_cpp_area_acquire(struct nfp_cpp_area *area)
455 mutex_lock(&area->mutex);
456 ret = __nfp_cpp_area_acquire(area);
457 mutex_unlock(&area->mutex);
463 * nfp_cpp_area_acquire_nonblocking() - lock down a CPP area for access
464 * @area: CPP area handle
466 * Locks down the CPP area for a potential long term activity. Area
469 * NOTE: Returns -EAGAIN is no area is available
473 int nfp_cpp_area_acquire_nonblocking(struct nfp_cpp_area *area)
475 mutex_lock(&area->mutex);
476 if (atomic_inc_return(&area->refcount) == 1) {
477 if (area->cpp->op->area_acquire) {
480 err = area->cpp->op->area_acquire(area);
482 atomic_dec(&area->refcount);
483 mutex_unlock(&area->mutex);
488 mutex_unlock(&area->mutex);
490 nfp_cpp_area_get(area);
495 * nfp_cpp_area_release() - release a locked down CPP area
496 * @area: CPP area handle
498 * Releases a previously locked down CPP area.
500 void nfp_cpp_area_release(struct nfp_cpp_area *area)
502 mutex_lock(&area->mutex);
504 if (atomic_dec_and_test(&area->refcount)) {
505 if (area->cpp->op->area_release) {
506 area->cpp->op->area_release(area);
508 wake_up_interruptible_all(&area->cpp->waitq);
511 mutex_unlock(&area->mutex);
513 nfp_cpp_area_put(area);
517 * nfp_cpp_area_release_free() - release CPP area and free it
518 * @area: CPP area handle
520 * Releases CPP area and frees up memory resources held by the it.
522 void nfp_cpp_area_release_free(struct nfp_cpp_area *area)
524 nfp_cpp_area_release(area);
525 nfp_cpp_area_free(area);
529 * nfp_cpp_area_read() - read data from CPP area
530 * @area: CPP area handle
531 * @offset: offset into CPP area
542 int nfp_cpp_area_read(struct nfp_cpp_area *area,
546 return area->cpp->op->area_read(area, kernel_vaddr, offset, length);
550 * nfp_cpp_area_write() - write data to CPP area
551 * @area: CPP area handle
552 * @offset: offset into CPP area
563 int nfp_cpp_area_write(struct nfp_cpp_area *area,
567 return area->cpp->op->area_write(area, kernel_vaddr, offset, length);
571 * nfp_cpp_area_size() - return size of a CPP area
572 * @cpp_area: CPP area handle
574 * Return: Size of the area
582 * nfp_cpp_area_name() - return name of a CPP area
583 * @cpp_area: CPP area handle
585 * Return: Name of the area, or NULL
593 * nfp_cpp_area_priv() - return private struct for CPP area
594 * @cpp_area: CPP area handle
596 * Return: Private data for the CPP area
604 * nfp_cpp_area_cpp() - return CPP handle for CPP area
605 * @cpp_area: CPP area handle
616 * @area: CPP area handle
622 struct resource *nfp_cpp_area_resource(struct nfp_cpp_area *area)
626 if (area->cpp->op->area_resource)
627 res = area->cpp->op->area_resource(area);
633 * nfp_cpp_area_phys() - get physical address of CPP area
634 * @area: CPP area handle
638 * Return: phy_addr_t of the area, or NULL
640 phys_addr_t nfp_cpp_area_phys(struct nfp_cpp_area *area)
644 if (area->cpp->op->area_phys)
645 addr = area->cpp->op->area_phys(area);
651 * nfp_cpp_area_iomem() - get IOMEM region for CPP area
652 * @area: CPP area handle
659 * Return: __iomem pointer to the area, or NULL
661 void __iomem *nfp_cpp_area_iomem(struct nfp_cpp_area *area)
665 if (area->cpp->op->area_iomem)
666 iomem = area->cpp->op->area_iomem(area);
672 * nfp_cpp_area_readl() - Read a u32 word from an area
673 * @area: CPP Area handle
674 * @offset: Offset into area
679 int nfp_cpp_area_readl(struct nfp_cpp_area *area,
685 n = nfp_cpp_area_read(area, offset, &tmp, sizeof(tmp));
694 * nfp_cpp_area_writel() - Write a u32 word to an area
695 * @area: CPP Area handle
696 * @offset: Offset into area
701 int nfp_cpp_area_writel(struct nfp_cpp_area *area,
708 n = nfp_cpp_area_write(area, offset, &tmp, sizeof(tmp));
714 * nfp_cpp_area_readq() - Read a u64 word from an area
715 * @area: CPP Area handle
716 * @offset: Offset into area
721 int nfp_cpp_area_readq(struct nfp_cpp_area *area,
727 n = nfp_cpp_area_read(area, offset, &tmp, sizeof(tmp));
736 * nfp_cpp_area_writeq() - Write a u64 word to an area
737 * @area: CPP Area handle
738 * @offset: Offset into area
743 int nfp_cpp_area_writeq(struct nfp_cpp_area *area,
750 n = nfp_cpp_area_write(area, offset, &tmp, sizeof(tmp));
756 * nfp_cpp_area_fill() - fill a CPP area with a value
757 * @area: CPP area
758 * @offset: offset into CPP area
760 * @length: length of area to fill
762 * Fill indicated area with given value.
766 int nfp_cpp_area_fill(struct nfp_cpp_area *area,
779 k = nfp_cpp_area_write(area, offset + i, &tmp, sizeof(tmp));
788 * nfp_cpp_area_cache_add() - Permanently reserve and area for the hot cache
790 * @size: Size of the area - MUST BE A POWER OF 2.
795 struct nfp_cpp_area *area;
797 /* Allocate an area - we use the MU target's base as a placeholder,
800 area = nfp_cpp_area_alloc(cpp, NFP_CPP_ID(7, NFP_CPP_ACTION_RW, 0),
802 if (!area)
807 nfp_cpp_area_free(area);
814 cache->area = area;
871 nfp_cpp_area_release(cache->area);
881 err = cpp->op->area_init(cache->area,
890 err = nfp_cpp_area_acquire(cache->area);
921 struct nfp_cpp_area *area;
927 area = cache->area;
929 area = nfp_cpp_area_alloc(cpp, destination, address, length);
930 if (!area)
933 err = nfp_cpp_area_acquire(area);
935 nfp_cpp_area_free(area);
940 err = nfp_cpp_area_read(area, offset, kernel_vaddr, length);
945 nfp_cpp_area_release_free(area);
990 struct nfp_cpp_area *area;
996 area = cache->area;
998 area = nfp_cpp_area_alloc(cpp, destination, address, length);
999 if (!area)
1002 err = nfp_cpp_area_acquire(area);
1004 nfp_cpp_area_free(area);
1009 err = nfp_cpp_area_write(area, offset, kernel_vaddr, length);
1014 nfp_cpp_area_release_free(area);