Lines Matching +full:bm +full:- +full:work

32 	writel(data, priv->reg_base + offset);  in mvneta_bm_write()
37 return readl(priv->reg_base + offset); in mvneta_bm_read()
48 /* Clear BM cause register */ in mvneta_bm_pool_enable()
96 (struct mvneta_bm_pool *)hwbm_pool->priv; in mvneta_bm_construct()
97 struct mvneta_bm *priv = bm_pool->priv; in mvneta_bm_construct()
101 * BM hardware expects buf virtual address to be placed in the in mvneta_bm_construct()
105 phys_addr = dma_map_single(&priv->pdev->dev, buf, bm_pool->buf_size, in mvneta_bm_construct()
107 if (unlikely(dma_mapping_error(&priv->pdev->dev, phys_addr))) in mvneta_bm_construct()
108 return -ENOMEM; in mvneta_bm_construct()
119 struct platform_device *pdev = priv->pdev; in mvneta_bm_pool_create()
122 size_bytes = sizeof(u32) * bm_pool->hwbm_pool.size; in mvneta_bm_pool_create()
123 bm_pool->virt_addr = dma_alloc_coherent(&pdev->dev, size_bytes, in mvneta_bm_pool_create()
124 &bm_pool->phys_addr, in mvneta_bm_pool_create()
126 if (!bm_pool->virt_addr) in mvneta_bm_pool_create()
127 return -ENOMEM; in mvneta_bm_pool_create()
129 if (!IS_ALIGNED((u32)bm_pool->virt_addr, MVNETA_BM_POOL_PTR_ALIGN)) { in mvneta_bm_pool_create()
130 dma_free_coherent(&pdev->dev, size_bytes, bm_pool->virt_addr, in mvneta_bm_pool_create()
131 bm_pool->phys_addr); in mvneta_bm_pool_create()
132 dev_err(&pdev->dev, "BM pool %d is not %d bytes aligned\n", in mvneta_bm_pool_create()
133 bm_pool->id, MVNETA_BM_POOL_PTR_ALIGN); in mvneta_bm_pool_create()
134 return -ENOMEM; in mvneta_bm_pool_create()
137 err = mvebu_mbus_get_dram_win_info(bm_pool->phys_addr, &target_id, in mvneta_bm_pool_create()
140 dma_free_coherent(&pdev->dev, size_bytes, bm_pool->virt_addr, in mvneta_bm_pool_create()
141 bm_pool->phys_addr); in mvneta_bm_pool_create()
146 mvneta_bm_write(priv, MVNETA_BM_POOL_BASE_REG(bm_pool->id), in mvneta_bm_pool_create()
147 bm_pool->phys_addr); in mvneta_bm_pool_create()
149 mvneta_bm_pool_target_set(priv, bm_pool->id, target_id, attr); in mvneta_bm_pool_create()
150 mvneta_bm_pool_enable(priv, bm_pool->id); in mvneta_bm_pool_create()
155 /* Notify the driver that BM pool is being used as specific type and return the
162 struct mvneta_bm_pool *new_pool = &priv->bm_pools[pool_id]; in mvneta_bm_pool_use()
165 if (new_pool->type == MVNETA_BM_LONG && in mvneta_bm_pool_use()
166 new_pool->port_map != 1 << port_id) { in mvneta_bm_pool_use()
167 dev_err(&priv->pdev->dev, in mvneta_bm_pool_use()
172 if (new_pool->type == MVNETA_BM_SHORT && new_pool->type != type) { in mvneta_bm_pool_use()
173 dev_err(&priv->pdev->dev, in mvneta_bm_pool_use()
178 if (new_pool->pkt_size == 0 || type != MVNETA_BM_SHORT) in mvneta_bm_pool_use()
179 new_pool->pkt_size = pkt_size; in mvneta_bm_pool_use()
181 /* Allocate buffers in case BM pool hasn't been used yet */ in mvneta_bm_pool_use()
182 if (new_pool->type == MVNETA_BM_FREE) { in mvneta_bm_pool_use()
183 struct hwbm_pool *hwbm_pool = &new_pool->hwbm_pool; in mvneta_bm_pool_use()
185 new_pool->priv = priv; in mvneta_bm_pool_use()
186 new_pool->type = type; in mvneta_bm_pool_use()
187 new_pool->buf_size = MVNETA_RX_BUF_SIZE(new_pool->pkt_size); in mvneta_bm_pool_use()
188 hwbm_pool->frag_size = in mvneta_bm_pool_use()
189 SKB_DATA_ALIGN(MVNETA_RX_BUF_SIZE(new_pool->pkt_size)) + in mvneta_bm_pool_use()
191 hwbm_pool->construct = mvneta_bm_construct; in mvneta_bm_pool_use()
192 hwbm_pool->priv = new_pool; in mvneta_bm_pool_use()
193 mutex_init(&hwbm_pool->buf_lock); in mvneta_bm_pool_use()
198 dev_err(&priv->pdev->dev, "fail to create pool %d\n", in mvneta_bm_pool_use()
199 new_pool->id); in mvneta_bm_pool_use()
204 num = hwbm_pool_add(hwbm_pool, hwbm_pool->size); in mvneta_bm_pool_use()
205 if (num != hwbm_pool->size) { in mvneta_bm_pool_use()
207 new_pool->id, num, hwbm_pool->size); in mvneta_bm_pool_use()
222 bm_pool->port_map &= ~port_map; in mvneta_bm_bufs_free()
223 if (bm_pool->port_map) in mvneta_bm_bufs_free()
228 for (i = 0; i < bm_pool->hwbm_pool.buf_num; i++) { in mvneta_bm_bufs_free()
235 /* Work-around to the problems when destroying the pool, in mvneta_bm_bufs_free()
245 dma_unmap_single(&priv->pdev->dev, buf_phys_addr, in mvneta_bm_bufs_free()
246 bm_pool->buf_size, DMA_FROM_DEVICE); in mvneta_bm_bufs_free()
247 hwbm_buf_free(&bm_pool->hwbm_pool, vaddr); in mvneta_bm_bufs_free()
252 /* Update BM driver with number of buffers removed from pool */ in mvneta_bm_bufs_free()
253 bm_pool->hwbm_pool.buf_num -= i; in mvneta_bm_bufs_free()
261 struct hwbm_pool *hwbm_pool = &bm_pool->hwbm_pool; in mvneta_bm_pool_destroy()
262 bm_pool->port_map &= ~port_map; in mvneta_bm_pool_destroy()
263 if (bm_pool->port_map) in mvneta_bm_pool_destroy()
266 bm_pool->type = MVNETA_BM_FREE; in mvneta_bm_pool_destroy()
269 if (hwbm_pool->buf_num) in mvneta_bm_pool_destroy()
270 WARN(1, "cannot free all buffers in pool %d\n", bm_pool->id); in mvneta_bm_pool_destroy()
272 if (bm_pool->virt_addr) { in mvneta_bm_pool_destroy()
273 dma_free_coherent(&priv->pdev->dev, in mvneta_bm_pool_destroy()
274 sizeof(u32) * hwbm_pool->size, in mvneta_bm_pool_destroy()
275 bm_pool->virt_addr, bm_pool->phys_addr); in mvneta_bm_pool_destroy()
276 bm_pool->virt_addr = NULL; in mvneta_bm_pool_destroy()
279 mvneta_bm_pool_disable(priv, bm_pool->id); in mvneta_bm_pool_destroy()
285 struct device_node *dn = priv->pdev->dev.of_node; in mvneta_bm_pools_init()
291 /* Activate BM unit */ in mvneta_bm_pools_init()
296 bm_pool = &priv->bm_pools[i]; in mvneta_bm_pools_init()
297 bm_pool->id = i; in mvneta_bm_pools_init()
298 bm_pool->type = MVNETA_BM_FREE; in mvneta_bm_pools_init()
311 dev_warn(&priv->pdev->dev, in mvneta_bm_pools_init()
316 dev_warn(&priv->pdev->dev, in mvneta_bm_pools_init()
321 dev_warn(&priv->pdev->dev, in mvneta_bm_pools_init()
327 bm_pool->hwbm_pool.size = size; in mvneta_bm_pools_init()
330 bm_pool->hwbm_pool.size); in mvneta_bm_pools_init()
333 sprintf(prop, "pool%d,pkt-size", i); in mvneta_bm_pools_init()
334 if (of_property_read_u32(dn, prop, &bm_pool->pkt_size)) in mvneta_bm_pools_init()
335 bm_pool->pkt_size = 0; in mvneta_bm_pools_init()
343 /* Mask BM all interrupts */ in mvneta_bm_default_set()
346 /* Clear BM cause register */ in mvneta_bm_default_set()
349 /* Set BM configuration register */ in mvneta_bm_default_set()
362 /* Allocate and initialize BM pools structures */ in mvneta_bm_init()
363 priv->bm_pools = devm_kcalloc(&priv->pdev->dev, MVNETA_BM_POOLS_NUM, in mvneta_bm_init()
366 if (!priv->bm_pools) in mvneta_bm_init()
367 return -ENOMEM; in mvneta_bm_init()
377 priv->bppi_pool = of_gen_pool_get(dn, "internal-mem", 0); in mvneta_bm_get_sram()
378 if (!priv->bppi_pool) in mvneta_bm_get_sram()
379 return -ENOMEM; in mvneta_bm_get_sram()
381 priv->bppi_virt_addr = gen_pool_dma_alloc(priv->bppi_pool, in mvneta_bm_get_sram()
383 &priv->bppi_phys_addr); in mvneta_bm_get_sram()
384 if (!priv->bppi_virt_addr) in mvneta_bm_get_sram()
385 return -ENOMEM; in mvneta_bm_get_sram()
392 gen_pool_free(priv->bppi_pool, priv->bppi_phys_addr, in mvneta_bm_put_sram()
406 platform_device_put(priv->pdev); in mvneta_bm_put()
412 struct device_node *dn = pdev->dev.of_node; in mvneta_bm_probe()
416 priv = devm_kzalloc(&pdev->dev, sizeof(struct mvneta_bm), GFP_KERNEL); in mvneta_bm_probe()
418 return -ENOMEM; in mvneta_bm_probe()
420 priv->reg_base = devm_platform_ioremap_resource(pdev, 0); in mvneta_bm_probe()
421 if (IS_ERR(priv->reg_base)) in mvneta_bm_probe()
422 return PTR_ERR(priv->reg_base); in mvneta_bm_probe()
424 priv->clk = devm_clk_get(&pdev->dev, NULL); in mvneta_bm_probe()
425 if (IS_ERR(priv->clk)) in mvneta_bm_probe()
426 return PTR_ERR(priv->clk); in mvneta_bm_probe()
427 err = clk_prepare_enable(priv->clk); in mvneta_bm_probe()
433 dev_err(&pdev->dev, "failed to allocate internal memory\n"); in mvneta_bm_probe()
437 priv->pdev = pdev; in mvneta_bm_probe()
442 dev_err(&pdev->dev, "failed to initialize controller\n"); in mvneta_bm_probe()
446 dn->data = priv; in mvneta_bm_probe()
449 dev_info(&pdev->dev, "Buffer Manager for network controller enabled\n"); in mvneta_bm_probe()
456 clk_disable_unprepare(priv->clk); in mvneta_bm_probe()
467 struct mvneta_bm_pool *bm_pool = &priv->bm_pools[i]; in mvneta_bm_remove()
474 /* Dectivate BM unit */ in mvneta_bm_remove()
477 clk_disable_unprepare(priv->clk); in mvneta_bm_remove()
483 { .compatible = "marvell,armada-380-neta-bm" },
499 MODULE_DESCRIPTION("Marvell NETA Buffer Manager Driver - www.marvell.com");