drivers/net/ethernet/ti/k3-cppi-desc-pool.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/ti/k3-cppi-desc-pool.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/ti/k3-cppi-desc-pool.c- Extension
.c- Size
- 4431 bytes
- Lines
- 172
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/device.hlinux/dma-mapping.hlinux/err.hlinux/genalloc.hlinux/kernel.hk3-cppi-desc-pool.h
Detected Declarations
struct k3_cppi_desc_poolfunction k3_cppi_desc_pool_destroyfunction k3_cppi_desc_pool_create_namefunction k3_cppi_desc_pool_virt2dmafunction k3_cppi_desc_pool_freefunction k3_cppi_desc_pool_availfunction k3_cppi_desc_pool_desc_sizefunction k3_cppi_desc_pool_desc_info_setexport k3_cppi_desc_pool_destroyexport k3_cppi_desc_pool_create_nameexport k3_cppi_desc_pool_virt2dmaexport k3_cppi_desc_pool_dma2virtexport k3_cppi_desc_pool_allocexport k3_cppi_desc_pool_freeexport k3_cppi_desc_pool_availexport k3_cppi_desc_pool_desc_sizeexport k3_cppi_desc_pool_cpuaddrexport k3_cppi_desc_pool_desc_info_setexport k3_cppi_desc_pool_desc_info
Annotated Snippet
struct k3_cppi_desc_pool {
struct device *dev;
dma_addr_t dma_addr;
void *cpumem; /* dma_alloc map */
size_t desc_size;
size_t mem_size;
size_t num_desc;
struct gen_pool *gen_pool;
void **desc_infos;
};
void k3_cppi_desc_pool_destroy(struct k3_cppi_desc_pool *pool)
{
if (!pool)
return;
WARN(gen_pool_size(pool->gen_pool) != gen_pool_avail(pool->gen_pool),
"k3_knav_desc_pool size %zu != avail %zu",
gen_pool_size(pool->gen_pool),
gen_pool_avail(pool->gen_pool));
if (pool->cpumem)
dma_free_coherent(pool->dev, pool->mem_size, pool->cpumem,
pool->dma_addr);
kfree(pool->desc_infos);
gen_pool_destroy(pool->gen_pool); /* frees pool->name */
kfree(pool);
}
EXPORT_SYMBOL_GPL(k3_cppi_desc_pool_destroy);
struct k3_cppi_desc_pool *
k3_cppi_desc_pool_create_name(struct device *dev, size_t size,
size_t desc_size,
const char *name)
{
struct k3_cppi_desc_pool *pool;
const char *pool_name = NULL;
int ret = -ENOMEM;
pool = kzalloc_obj(*pool);
if (!pool)
return ERR_PTR(ret);
pool->dev = dev;
pool->desc_size = roundup_pow_of_two(desc_size);
pool->num_desc = size;
pool->mem_size = pool->num_desc * pool->desc_size;
pool_name = kstrdup_const(name ? name : dev_name(pool->dev),
GFP_KERNEL);
if (!pool_name)
goto gen_pool_create_fail;
pool->gen_pool = gen_pool_create(ilog2(pool->desc_size), -1);
if (!pool->gen_pool) {
kfree_const(pool_name);
goto gen_pool_create_fail;
}
pool->gen_pool->name = pool_name;
pool->desc_infos = kzalloc_objs(*pool->desc_infos, pool->num_desc);
if (!pool->desc_infos)
goto gen_pool_desc_infos_alloc_fail;
pool->cpumem = dma_alloc_coherent(pool->dev, pool->mem_size,
&pool->dma_addr, GFP_KERNEL);
if (!pool->cpumem)
goto dma_alloc_fail;
ret = gen_pool_add_virt(pool->gen_pool, (unsigned long)pool->cpumem,
(phys_addr_t)pool->dma_addr, pool->mem_size,
-1);
if (ret < 0) {
dev_err(pool->dev, "pool add failed %d\n", ret);
goto gen_pool_add_virt_fail;
}
return pool;
gen_pool_add_virt_fail:
dma_free_coherent(pool->dev, pool->mem_size, pool->cpumem,
pool->dma_addr);
dma_alloc_fail:
kfree(pool->desc_infos);
gen_pool_desc_infos_alloc_fail:
gen_pool_destroy(pool->gen_pool); /* frees pool->name */
Annotation
- Immediate include surface: `linux/device.h`, `linux/dma-mapping.h`, `linux/err.h`, `linux/genalloc.h`, `linux/kernel.h`, `k3-cppi-desc-pool.h`.
- Detected declarations: `struct k3_cppi_desc_pool`, `function k3_cppi_desc_pool_destroy`, `function k3_cppi_desc_pool_create_name`, `function k3_cppi_desc_pool_virt2dma`, `function k3_cppi_desc_pool_free`, `function k3_cppi_desc_pool_avail`, `function k3_cppi_desc_pool_desc_size`, `function k3_cppi_desc_pool_desc_info_set`, `export k3_cppi_desc_pool_destroy`, `export k3_cppi_desc_pool_create_name`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: integration implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.