1*d81734caSHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2f38f61e9SShreyansh Jain *
3f38f61e9SShreyansh Jain * Copyright 2008-2016 Freescale Semiconductor Inc.
4*d81734caSHemant Agrawal * Copyright 2017 NXP
5f38f61e9SShreyansh Jain *
6f38f61e9SShreyansh Jain */
7f38f61e9SShreyansh Jain
8f38f61e9SShreyansh Jain #include "bman.h"
9f38f61e9SShreyansh Jain #include <rte_branch_prediction.h>
10f38f61e9SShreyansh Jain
11f38f61e9SShreyansh Jain /* Compilation constants */
12f38f61e9SShreyansh Jain #define RCR_THRESH 2 /* reread h/w CI when running out of space */
13f38f61e9SShreyansh Jain #define IRQNAME "BMan portal %d"
14f38f61e9SShreyansh Jain #define MAX_IRQNAME 16 /* big enough for "BMan portal %d" */
15f38f61e9SShreyansh Jain
16f38f61e9SShreyansh Jain struct bman_portal {
17f38f61e9SShreyansh Jain struct bm_portal p;
18f38f61e9SShreyansh Jain /* 2-element array. pools[0] is mask, pools[1] is snapshot. */
19f38f61e9SShreyansh Jain struct bman_depletion *pools;
20f38f61e9SShreyansh Jain int thresh_set;
21f38f61e9SShreyansh Jain unsigned long irq_sources;
22f38f61e9SShreyansh Jain u32 slowpoll; /* only used when interrupts are off */
23f38f61e9SShreyansh Jain /* When the cpu-affine portal is activated, this is non-NULL */
24f38f61e9SShreyansh Jain const struct bm_portal_config *config;
25f38f61e9SShreyansh Jain char irqname[MAX_IRQNAME];
26f38f61e9SShreyansh Jain };
27f38f61e9SShreyansh Jain
28f38f61e9SShreyansh Jain static cpumask_t affine_mask;
29f38f61e9SShreyansh Jain static DEFINE_SPINLOCK(affine_mask_lock);
30f38f61e9SShreyansh Jain static RTE_DEFINE_PER_LCORE(struct bman_portal, bman_affine_portal);
31f38f61e9SShreyansh Jain
get_affine_portal(void)32f38f61e9SShreyansh Jain static inline struct bman_portal *get_affine_portal(void)
33f38f61e9SShreyansh Jain {
34f38f61e9SShreyansh Jain return &RTE_PER_LCORE(bman_affine_portal);
35f38f61e9SShreyansh Jain }
36f38f61e9SShreyansh Jain
37f38f61e9SShreyansh Jain /*
38f38f61e9SShreyansh Jain * This object type refers to a pool, it isn't *the* pool. There may be
39f38f61e9SShreyansh Jain * more than one such object per BMan buffer pool, eg. if different users of
40f38f61e9SShreyansh Jain * the pool are operating via different portals.
41f38f61e9SShreyansh Jain */
42f38f61e9SShreyansh Jain struct bman_pool {
43f38f61e9SShreyansh Jain struct bman_pool_params params;
44f38f61e9SShreyansh Jain /* Used for hash-table admin when using depletion notifications. */
45f38f61e9SShreyansh Jain struct bman_portal *portal;
46f38f61e9SShreyansh Jain struct bman_pool *next;
47f38f61e9SShreyansh Jain #ifdef RTE_LIBRTE_DPAA_HWDEBUG
48f38f61e9SShreyansh Jain atomic_t in_use;
49f38f61e9SShreyansh Jain #endif
50f38f61e9SShreyansh Jain };
51f38f61e9SShreyansh Jain
52f38f61e9SShreyansh Jain static inline
bman_create_portal(struct bman_portal * portal,const struct bm_portal_config * c)53f38f61e9SShreyansh Jain struct bman_portal *bman_create_portal(struct bman_portal *portal,
54f38f61e9SShreyansh Jain const struct bm_portal_config *c)
55f38f61e9SShreyansh Jain {
56f38f61e9SShreyansh Jain struct bm_portal *p;
57f38f61e9SShreyansh Jain const struct bman_depletion *pools = &c->mask;
58f38f61e9SShreyansh Jain int ret;
59f38f61e9SShreyansh Jain u8 bpid = 0;
60f38f61e9SShreyansh Jain
61f38f61e9SShreyansh Jain p = &portal->p;
62f38f61e9SShreyansh Jain /*
63f38f61e9SShreyansh Jain * prep the low-level portal struct with the mapped addresses from the
64f38f61e9SShreyansh Jain * config, everything that follows depends on it and "config" is more
65f38f61e9SShreyansh Jain * for (de)reference...
66f38f61e9SShreyansh Jain */
67f38f61e9SShreyansh Jain p->addr.ce = c->addr_virt[DPAA_PORTAL_CE];
68f38f61e9SShreyansh Jain p->addr.ci = c->addr_virt[DPAA_PORTAL_CI];
69f38f61e9SShreyansh Jain if (bm_rcr_init(p, bm_rcr_pvb, bm_rcr_cce)) {
70f38f61e9SShreyansh Jain pr_err("Bman RCR initialisation failed\n");
71f38f61e9SShreyansh Jain return NULL;
72f38f61e9SShreyansh Jain }
73f38f61e9SShreyansh Jain if (bm_mc_init(p)) {
74f38f61e9SShreyansh Jain pr_err("Bman MC initialisation failed\n");
75f38f61e9SShreyansh Jain goto fail_mc;
76f38f61e9SShreyansh Jain }
77f38f61e9SShreyansh Jain portal->pools = kmalloc(2 * sizeof(*pools), GFP_KERNEL);
78f38f61e9SShreyansh Jain if (!portal->pools)
79f38f61e9SShreyansh Jain goto fail_pools;
80f38f61e9SShreyansh Jain portal->pools[0] = *pools;
81f38f61e9SShreyansh Jain bman_depletion_init(portal->pools + 1);
82f38f61e9SShreyansh Jain while (bpid < bman_pool_max) {
83f38f61e9SShreyansh Jain /*
84f38f61e9SShreyansh Jain * Default to all BPIDs disabled, we enable as required at
85f38f61e9SShreyansh Jain * run-time.
86f38f61e9SShreyansh Jain */
87f38f61e9SShreyansh Jain bm_isr_bscn_mask(p, bpid, 0);
88f38f61e9SShreyansh Jain bpid++;
89f38f61e9SShreyansh Jain }
90f38f61e9SShreyansh Jain portal->slowpoll = 0;
91f38f61e9SShreyansh Jain /* Write-to-clear any stale interrupt status bits */
92f38f61e9SShreyansh Jain bm_isr_disable_write(p, 0xffffffff);
93f38f61e9SShreyansh Jain portal->irq_sources = 0;
94f38f61e9SShreyansh Jain bm_isr_enable_write(p, portal->irq_sources);
95f38f61e9SShreyansh Jain bm_isr_status_clear(p, 0xffffffff);
96f38f61e9SShreyansh Jain snprintf(portal->irqname, MAX_IRQNAME, IRQNAME, c->cpu);
97f38f61e9SShreyansh Jain if (request_irq(c->irq, NULL, 0, portal->irqname,
98f38f61e9SShreyansh Jain portal)) {
99f38f61e9SShreyansh Jain pr_err("request_irq() failed\n");
100f38f61e9SShreyansh Jain goto fail_irq;
101f38f61e9SShreyansh Jain }
102f38f61e9SShreyansh Jain
103f38f61e9SShreyansh Jain /* Need RCR to be empty before continuing */
104f38f61e9SShreyansh Jain ret = bm_rcr_get_fill(p);
105f38f61e9SShreyansh Jain if (ret) {
106f38f61e9SShreyansh Jain pr_err("Bman RCR unclean\n");
107f38f61e9SShreyansh Jain goto fail_rcr_empty;
108f38f61e9SShreyansh Jain }
109f38f61e9SShreyansh Jain /* Success */
110f38f61e9SShreyansh Jain portal->config = c;
111f38f61e9SShreyansh Jain
112f38f61e9SShreyansh Jain bm_isr_disable_write(p, 0);
113f38f61e9SShreyansh Jain bm_isr_uninhibit(p);
114f38f61e9SShreyansh Jain return portal;
115f38f61e9SShreyansh Jain fail_rcr_empty:
116f38f61e9SShreyansh Jain free_irq(c->irq, portal);
117f38f61e9SShreyansh Jain fail_irq:
118f38f61e9SShreyansh Jain kfree(portal->pools);
119f38f61e9SShreyansh Jain fail_pools:
120f38f61e9SShreyansh Jain bm_mc_finish(p);
121f38f61e9SShreyansh Jain fail_mc:
122f38f61e9SShreyansh Jain bm_rcr_finish(p);
123f38f61e9SShreyansh Jain return NULL;
124f38f61e9SShreyansh Jain }
125f38f61e9SShreyansh Jain
126f38f61e9SShreyansh Jain struct bman_portal *
bman_create_affine_portal(const struct bm_portal_config * c)127f38f61e9SShreyansh Jain bman_create_affine_portal(const struct bm_portal_config *c)
128f38f61e9SShreyansh Jain {
129f38f61e9SShreyansh Jain struct bman_portal *portal = get_affine_portal();
130f38f61e9SShreyansh Jain
131f38f61e9SShreyansh Jain /*This function is called from the context which is already affine to
132f38f61e9SShreyansh Jain *CPU or in other words this in non-migratable to other CPUs.
133f38f61e9SShreyansh Jain */
134f38f61e9SShreyansh Jain portal = bman_create_portal(portal, c);
135f38f61e9SShreyansh Jain if (portal) {
136f38f61e9SShreyansh Jain spin_lock(&affine_mask_lock);
137f38f61e9SShreyansh Jain CPU_SET(c->cpu, &affine_mask);
138f38f61e9SShreyansh Jain spin_unlock(&affine_mask_lock);
139f38f61e9SShreyansh Jain }
140f38f61e9SShreyansh Jain return portal;
141f38f61e9SShreyansh Jain }
142f38f61e9SShreyansh Jain
143f38f61e9SShreyansh Jain static inline
bman_destroy_portal(struct bman_portal * bm)144f38f61e9SShreyansh Jain void bman_destroy_portal(struct bman_portal *bm)
145f38f61e9SShreyansh Jain {
146f38f61e9SShreyansh Jain const struct bm_portal_config *pcfg;
147f38f61e9SShreyansh Jain
148f38f61e9SShreyansh Jain pcfg = bm->config;
149f38f61e9SShreyansh Jain bm_rcr_cce_update(&bm->p);
150f38f61e9SShreyansh Jain bm_rcr_cce_update(&bm->p);
151f38f61e9SShreyansh Jain
152f38f61e9SShreyansh Jain free_irq(pcfg->irq, bm);
153f38f61e9SShreyansh Jain
154f38f61e9SShreyansh Jain kfree(bm->pools);
155f38f61e9SShreyansh Jain bm_mc_finish(&bm->p);
156f38f61e9SShreyansh Jain bm_rcr_finish(&bm->p);
157f38f61e9SShreyansh Jain bm->config = NULL;
158f38f61e9SShreyansh Jain }
159f38f61e9SShreyansh Jain
160f38f61e9SShreyansh Jain const struct
bman_destroy_affine_portal(void)161f38f61e9SShreyansh Jain bm_portal_config *bman_destroy_affine_portal(void)
162f38f61e9SShreyansh Jain {
163f38f61e9SShreyansh Jain struct bman_portal *bm = get_affine_portal();
164f38f61e9SShreyansh Jain const struct bm_portal_config *pcfg;
165f38f61e9SShreyansh Jain
166f38f61e9SShreyansh Jain pcfg = bm->config;
167f38f61e9SShreyansh Jain bman_destroy_portal(bm);
168f38f61e9SShreyansh Jain spin_lock(&affine_mask_lock);
169f38f61e9SShreyansh Jain CPU_CLR(pcfg->cpu, &affine_mask);
170f38f61e9SShreyansh Jain spin_unlock(&affine_mask_lock);
171f38f61e9SShreyansh Jain return pcfg;
172f38f61e9SShreyansh Jain }
173f38f61e9SShreyansh Jain
174f38f61e9SShreyansh Jain int
bman_get_portal_index(void)175f38f61e9SShreyansh Jain bman_get_portal_index(void)
176f38f61e9SShreyansh Jain {
177f38f61e9SShreyansh Jain struct bman_portal *p = get_affine_portal();
178f38f61e9SShreyansh Jain return p->config->index;
179f38f61e9SShreyansh Jain }
180f38f61e9SShreyansh Jain
181f38f61e9SShreyansh Jain static const u32 zero_thresholds[4] = {0, 0, 0, 0};
182f38f61e9SShreyansh Jain
bman_new_pool(const struct bman_pool_params * params)183f38f61e9SShreyansh Jain struct bman_pool *bman_new_pool(const struct bman_pool_params *params)
184f38f61e9SShreyansh Jain {
185f38f61e9SShreyansh Jain struct bman_pool *pool = NULL;
186f38f61e9SShreyansh Jain u32 bpid;
187f38f61e9SShreyansh Jain
188f38f61e9SShreyansh Jain if (params->flags & BMAN_POOL_FLAG_DYNAMIC_BPID) {
189f38f61e9SShreyansh Jain int ret = bman_alloc_bpid(&bpid);
190f38f61e9SShreyansh Jain
191f38f61e9SShreyansh Jain if (ret)
192f38f61e9SShreyansh Jain return NULL;
193f38f61e9SShreyansh Jain } else {
194f38f61e9SShreyansh Jain if (params->bpid >= bman_pool_max)
195f38f61e9SShreyansh Jain return NULL;
196f38f61e9SShreyansh Jain bpid = params->bpid;
197f38f61e9SShreyansh Jain }
198f38f61e9SShreyansh Jain if (params->flags & BMAN_POOL_FLAG_THRESH) {
199f38f61e9SShreyansh Jain int ret = bm_pool_set(bpid, params->thresholds);
200f38f61e9SShreyansh Jain
201f38f61e9SShreyansh Jain if (ret)
202f38f61e9SShreyansh Jain goto err;
203f38f61e9SShreyansh Jain }
204f38f61e9SShreyansh Jain
205f38f61e9SShreyansh Jain pool = kmalloc(sizeof(*pool), GFP_KERNEL);
206f38f61e9SShreyansh Jain if (!pool)
207f38f61e9SShreyansh Jain goto err;
208f38f61e9SShreyansh Jain pool->params = *params;
209f38f61e9SShreyansh Jain #ifdef RTE_LIBRTE_DPAA_HWDEBUG
210f38f61e9SShreyansh Jain atomic_set(&pool->in_use, 1);
211f38f61e9SShreyansh Jain #endif
212f38f61e9SShreyansh Jain if (params->flags & BMAN_POOL_FLAG_DYNAMIC_BPID)
213f38f61e9SShreyansh Jain pool->params.bpid = bpid;
214f38f61e9SShreyansh Jain
215f38f61e9SShreyansh Jain return pool;
216f38f61e9SShreyansh Jain err:
217f38f61e9SShreyansh Jain if (params->flags & BMAN_POOL_FLAG_THRESH)
218f38f61e9SShreyansh Jain bm_pool_set(bpid, zero_thresholds);
219f38f61e9SShreyansh Jain
220f38f61e9SShreyansh Jain if (params->flags & BMAN_POOL_FLAG_DYNAMIC_BPID)
221f38f61e9SShreyansh Jain bman_release_bpid(bpid);
222f38f61e9SShreyansh Jain kfree(pool);
223f38f61e9SShreyansh Jain
224f38f61e9SShreyansh Jain return NULL;
225f38f61e9SShreyansh Jain }
226f38f61e9SShreyansh Jain
bman_free_pool(struct bman_pool * pool)227f38f61e9SShreyansh Jain void bman_free_pool(struct bman_pool *pool)
228f38f61e9SShreyansh Jain {
229f38f61e9SShreyansh Jain if (pool->params.flags & BMAN_POOL_FLAG_THRESH)
230f38f61e9SShreyansh Jain bm_pool_set(pool->params.bpid, zero_thresholds);
231f38f61e9SShreyansh Jain if (pool->params.flags & BMAN_POOL_FLAG_DYNAMIC_BPID)
232f38f61e9SShreyansh Jain bman_release_bpid(pool->params.bpid);
233f38f61e9SShreyansh Jain kfree(pool);
234f38f61e9SShreyansh Jain }
235f38f61e9SShreyansh Jain
bman_get_params(const struct bman_pool * pool)236f38f61e9SShreyansh Jain const struct bman_pool_params *bman_get_params(const struct bman_pool *pool)
237f38f61e9SShreyansh Jain {
238f38f61e9SShreyansh Jain return &pool->params;
239f38f61e9SShreyansh Jain }
240f38f61e9SShreyansh Jain
update_rcr_ci(struct bman_portal * p,int avail)241f38f61e9SShreyansh Jain static void update_rcr_ci(struct bman_portal *p, int avail)
242f38f61e9SShreyansh Jain {
243f38f61e9SShreyansh Jain if (avail)
244f38f61e9SShreyansh Jain bm_rcr_cce_prefetch(&p->p);
245f38f61e9SShreyansh Jain else
246f38f61e9SShreyansh Jain bm_rcr_cce_update(&p->p);
247f38f61e9SShreyansh Jain }
248f38f61e9SShreyansh Jain
249f38f61e9SShreyansh Jain #define BMAN_BUF_MASK 0x0000fffffffffffful
bman_release(struct bman_pool * pool,const struct bm_buffer * bufs,u8 num,u32 flags __maybe_unused)250f38f61e9SShreyansh Jain int bman_release(struct bman_pool *pool, const struct bm_buffer *bufs, u8 num,
251f38f61e9SShreyansh Jain u32 flags __maybe_unused)
252f38f61e9SShreyansh Jain {
253f38f61e9SShreyansh Jain struct bman_portal *p;
254f38f61e9SShreyansh Jain struct bm_rcr_entry *r;
255f38f61e9SShreyansh Jain u32 i = num - 1;
256f38f61e9SShreyansh Jain u8 avail;
257f38f61e9SShreyansh Jain
258f38f61e9SShreyansh Jain #ifdef RTE_LIBRTE_DPAA_HWDEBUG
259f38f61e9SShreyansh Jain if (!num || (num > 8))
260f38f61e9SShreyansh Jain return -EINVAL;
261f38f61e9SShreyansh Jain if (pool->params.flags & BMAN_POOL_FLAG_NO_RELEASE)
262f38f61e9SShreyansh Jain return -EINVAL;
263f38f61e9SShreyansh Jain #endif
264f38f61e9SShreyansh Jain
265f38f61e9SShreyansh Jain p = get_affine_portal();
266f38f61e9SShreyansh Jain avail = bm_rcr_get_avail(&p->p);
267f38f61e9SShreyansh Jain if (avail < 2)
268f38f61e9SShreyansh Jain update_rcr_ci(p, avail);
269f38f61e9SShreyansh Jain r = bm_rcr_start(&p->p);
270f38f61e9SShreyansh Jain if (unlikely(!r))
271f38f61e9SShreyansh Jain return -EBUSY;
272f38f61e9SShreyansh Jain
273f38f61e9SShreyansh Jain /*
274f38f61e9SShreyansh Jain * we can copy all but the first entry, as this can trigger badness
275f38f61e9SShreyansh Jain * with the valid-bit
276f38f61e9SShreyansh Jain */
277f38f61e9SShreyansh Jain r->bufs[0].opaque =
278f38f61e9SShreyansh Jain cpu_to_be64(((u64)pool->params.bpid << 48) |
279f38f61e9SShreyansh Jain (bufs[0].opaque & BMAN_BUF_MASK));
280f38f61e9SShreyansh Jain if (i) {
281f38f61e9SShreyansh Jain for (i = 1; i < num; i++)
282f38f61e9SShreyansh Jain r->bufs[i].opaque =
283f38f61e9SShreyansh Jain cpu_to_be64(bufs[i].opaque & BMAN_BUF_MASK);
284f38f61e9SShreyansh Jain }
285f38f61e9SShreyansh Jain
286f38f61e9SShreyansh Jain bm_rcr_pvb_commit(&p->p, BM_RCR_VERB_CMD_BPID_SINGLE |
287f38f61e9SShreyansh Jain (num & BM_RCR_VERB_BUFCOUNT_MASK));
288f38f61e9SShreyansh Jain
289f38f61e9SShreyansh Jain return 0;
290f38f61e9SShreyansh Jain }
291f38f61e9SShreyansh Jain
bman_acquire(struct bman_pool * pool,struct bm_buffer * bufs,u8 num,u32 flags __maybe_unused)292f38f61e9SShreyansh Jain int bman_acquire(struct bman_pool *pool, struct bm_buffer *bufs, u8 num,
293f38f61e9SShreyansh Jain u32 flags __maybe_unused)
294f38f61e9SShreyansh Jain {
295f38f61e9SShreyansh Jain struct bman_portal *p = get_affine_portal();
296f38f61e9SShreyansh Jain struct bm_mc_command *mcc;
297f38f61e9SShreyansh Jain struct bm_mc_result *mcr;
298f38f61e9SShreyansh Jain int ret, i;
299f38f61e9SShreyansh Jain
300f38f61e9SShreyansh Jain #ifdef RTE_LIBRTE_DPAA_HWDEBUG
301f38f61e9SShreyansh Jain if (!num || (num > 8))
302f38f61e9SShreyansh Jain return -EINVAL;
303f38f61e9SShreyansh Jain if (pool->params.flags & BMAN_POOL_FLAG_ONLY_RELEASE)
304f38f61e9SShreyansh Jain return -EINVAL;
305f38f61e9SShreyansh Jain #endif
306f38f61e9SShreyansh Jain
307f38f61e9SShreyansh Jain mcc = bm_mc_start(&p->p);
308f38f61e9SShreyansh Jain mcc->acquire.bpid = pool->params.bpid;
309f38f61e9SShreyansh Jain bm_mc_commit(&p->p, BM_MCC_VERB_CMD_ACQUIRE |
310f38f61e9SShreyansh Jain (num & BM_MCC_VERB_ACQUIRE_BUFCOUNT));
311f38f61e9SShreyansh Jain while (!(mcr = bm_mc_result(&p->p)))
312f38f61e9SShreyansh Jain cpu_relax();
313f38f61e9SShreyansh Jain ret = mcr->verb & BM_MCR_VERB_ACQUIRE_BUFCOUNT;
314f38f61e9SShreyansh Jain if (bufs) {
315f38f61e9SShreyansh Jain for (i = 0; i < num; i++)
316f38f61e9SShreyansh Jain bufs[i].opaque =
317f38f61e9SShreyansh Jain be64_to_cpu(mcr->acquire.bufs[i].opaque);
318f38f61e9SShreyansh Jain }
319f38f61e9SShreyansh Jain if (ret != num)
320f38f61e9SShreyansh Jain ret = -ENOMEM;
321f38f61e9SShreyansh Jain return ret;
322f38f61e9SShreyansh Jain }
323f38f61e9SShreyansh Jain
bman_query_pools(struct bm_pool_state * state)324f38f61e9SShreyansh Jain int bman_query_pools(struct bm_pool_state *state)
325f38f61e9SShreyansh Jain {
326f38f61e9SShreyansh Jain struct bman_portal *p = get_affine_portal();
327f38f61e9SShreyansh Jain struct bm_mc_result *mcr;
328f38f61e9SShreyansh Jain
329f38f61e9SShreyansh Jain bm_mc_start(&p->p);
330f38f61e9SShreyansh Jain bm_mc_commit(&p->p, BM_MCC_VERB_CMD_QUERY);
331f38f61e9SShreyansh Jain while (!(mcr = bm_mc_result(&p->p)))
332f38f61e9SShreyansh Jain cpu_relax();
333f38f61e9SShreyansh Jain DPAA_ASSERT((mcr->verb & BM_MCR_VERB_CMD_MASK) ==
334f38f61e9SShreyansh Jain BM_MCR_VERB_CMD_QUERY);
335f38f61e9SShreyansh Jain *state = mcr->query;
336f38f61e9SShreyansh Jain state->as.state.state[0] = be32_to_cpu(state->as.state.state[0]);
337f38f61e9SShreyansh Jain state->as.state.state[1] = be32_to_cpu(state->as.state.state[1]);
338f38f61e9SShreyansh Jain state->ds.state.state[0] = be32_to_cpu(state->ds.state.state[0]);
339f38f61e9SShreyansh Jain state->ds.state.state[1] = be32_to_cpu(state->ds.state.state[1]);
340f38f61e9SShreyansh Jain return 0;
341f38f61e9SShreyansh Jain }
342f38f61e9SShreyansh Jain
bman_query_free_buffers(struct bman_pool * pool)343f38f61e9SShreyansh Jain u32 bman_query_free_buffers(struct bman_pool *pool)
344f38f61e9SShreyansh Jain {
345f38f61e9SShreyansh Jain return bm_pool_free_buffers(pool->params.bpid);
346f38f61e9SShreyansh Jain }
347f38f61e9SShreyansh Jain
bman_update_pool_thresholds(struct bman_pool * pool,const u32 * thresholds)348f38f61e9SShreyansh Jain int bman_update_pool_thresholds(struct bman_pool *pool, const u32 *thresholds)
349f38f61e9SShreyansh Jain {
350f38f61e9SShreyansh Jain u32 bpid;
351f38f61e9SShreyansh Jain
352f38f61e9SShreyansh Jain bpid = bman_get_params(pool)->bpid;
353f38f61e9SShreyansh Jain
354f38f61e9SShreyansh Jain return bm_pool_set(bpid, thresholds);
355f38f61e9SShreyansh Jain }
356f38f61e9SShreyansh Jain
bman_shutdown_pool(u32 bpid)357f38f61e9SShreyansh Jain int bman_shutdown_pool(u32 bpid)
358f38f61e9SShreyansh Jain {
359f38f61e9SShreyansh Jain struct bman_portal *p = get_affine_portal();
360f38f61e9SShreyansh Jain return bm_shutdown_pool(&p->p, bpid);
361f38f61e9SShreyansh Jain }
362