1 /* Copyright 2008 - 2016 Freescale Semiconductor, Inc.
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are met:
5 * * Redistributions of source code must retain the above copyright
6 * notice, this list of conditions and the following disclaimer.
7 * * Redistributions in binary form must reproduce the above copyright
8 * notice, this list of conditions and the following disclaimer in the
9 * documentation and/or other materials provided with the distribution.
10 * * Neither the name of Freescale Semiconductor nor the
11 * names of its contributors may be used to endorse or promote products
12 * derived from this software without specific prior written permission.
14 * ALTERNATIVELY, this software may be distributed under the terms of the
15 * GNU General Public License ("GPL") as published by the Free Software
16 * Foundation, either version 2 of that License or (at your option) any
19 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include "bman_priv.h"
33 #define IRQNAME "BMan portal %d"
34 #define MAX_IRQNAME 16 /* big enough for "BMan portal %d" */
36 /* Portal register assists */
38 /* Cache-inhibited register offsets */
39 #define BM_REG_RCR_PI_CINH 0x0000
40 #define BM_REG_RCR_CI_CINH 0x0004
41 #define BM_REG_RCR_ITR 0x0008
42 #define BM_REG_CFG 0x0100
43 #define BM_REG_SCN(n) (0x0200 + ((n) << 2))
44 #define BM_REG_ISR 0x0e00
45 #define BM_REG_IER 0x0e04
46 #define BM_REG_ISDR 0x0e08
47 #define BM_REG_IIR 0x0e0c
49 /* Cache-enabled register offsets */
50 #define BM_CL_CR 0x0000
51 #define BM_CL_RR0 0x0100
52 #define BM_CL_RR1 0x0140
53 #define BM_CL_RCR 0x1000
54 #define BM_CL_RCR_PI_CENA 0x3000
55 #define BM_CL_RCR_CI_CENA 0x3100
60 * pmode == production mode
61 * cmode == consumption mode,
62 * Enum values use 3 letter codes. First letter matches the portal mode,
63 * remaining two letters indicate;
64 * ci == cache-inhibited portal register
65 * ce == cache-enabled portal register
66 * vb == in-band valid-bit (cache-enabled)
68 enum bm_rcr_pmode
{ /* matches BCSP_CFG::RPM */
69 bm_rcr_pci
= 0, /* PI index, cache-inhibited */
70 bm_rcr_pce
= 1, /* PI index, cache-enabled */
71 bm_rcr_pvb
= 2 /* valid-bit */
73 enum bm_rcr_cmode
{ /* s/w-only */
74 bm_rcr_cci
, /* CI index, cache-inhibited */
75 bm_rcr_cce
/* CI index, cache-enabled */
79 /* --- Portal structures --- */
87 u8 _ncw_verb
; /* writes to this are non-coherent */
88 u8 bpid
; /* used with BM_RCR_VERB_CMD_BPID_SINGLE */
91 struct bm_buffer bufs
[8];
94 #define BM_RCR_VERB_VBIT 0x80
95 #define BM_RCR_VERB_CMD_MASK 0x70 /* one of two values; */
96 #define BM_RCR_VERB_CMD_BPID_SINGLE 0x20
97 #define BM_RCR_VERB_CMD_BPID_MULTI 0x30
98 #define BM_RCR_VERB_BUFCOUNT_MASK 0x0f /* values 1..8 */
101 struct bm_rcr_entry
*ring
, *cursor
;
102 u8 ci
, available
, ithresh
, vbit
;
103 #ifdef CONFIG_FSL_DPAA_CHECKING
105 enum bm_rcr_pmode pmode
;
106 enum bm_rcr_cmode cmode
;
110 /* MC (Management Command) command */
111 struct bm_mc_command
{
112 u8 _ncw_verb
; /* writes to this are non-coherent */
113 u8 bpid
; /* used by acquire command */
116 #define BM_MCC_VERB_VBIT 0x80
117 #define BM_MCC_VERB_CMD_MASK 0x70 /* where the verb contains; */
118 #define BM_MCC_VERB_CMD_ACQUIRE 0x10
119 #define BM_MCC_VERB_CMD_QUERY 0x40
120 #define BM_MCC_VERB_ACQUIRE_BUFCOUNT 0x0f /* values 1..8 go here */
122 /* MC result, Acquire and Query Response */
129 struct bm_buffer bufs
[8];
131 #define BM_MCR_VERB_VBIT 0x80
132 #define BM_MCR_VERB_CMD_MASK BM_MCC_VERB_CMD_MASK
133 #define BM_MCR_VERB_CMD_ACQUIRE BM_MCC_VERB_CMD_ACQUIRE
134 #define BM_MCR_VERB_CMD_QUERY BM_MCC_VERB_CMD_QUERY
135 #define BM_MCR_VERB_CMD_ERR_INVALID 0x60
136 #define BM_MCR_VERB_CMD_ERR_ECC 0x70
137 #define BM_MCR_VERB_ACQUIRE_BUFCOUNT BM_MCC_VERB_ACQUIRE_BUFCOUNT /* 0..8 */
138 #define BM_MCR_TIMEOUT 10000 /* us */
141 struct bm_mc_command
*cr
;
142 union bm_mc_result
*rr
;
144 #ifdef CONFIG_FSL_DPAA_CHECKING
146 /* Can only be _mc_start()ed */
148 /* Can only be _mc_commit()ed or _mc_abort()ed */
150 /* Can only be _mc_retry()ed */
157 void __iomem
*ce
; /* cache-enabled */
158 void __iomem
*ci
; /* cache-inhibited */
165 } ____cacheline_aligned
;
167 /* Cache-inhibited register access. */
168 static inline u32
bm_in(struct bm_portal
*p
, u32 offset
)
170 return be32_to_cpu(__raw_readl(p
->addr
.ci
+ offset
));
173 static inline void bm_out(struct bm_portal
*p
, u32 offset
, u32 val
)
175 __raw_writel(cpu_to_be32(val
), p
->addr
.ci
+ offset
);
178 /* Cache Enabled Portal Access */
179 static inline void bm_cl_invalidate(struct bm_portal
*p
, u32 offset
)
181 dpaa_invalidate(p
->addr
.ce
+ offset
);
184 static inline void bm_cl_touch_ro(struct bm_portal
*p
, u32 offset
)
186 dpaa_touch_ro(p
->addr
.ce
+ offset
);
189 static inline u32
bm_ce_in(struct bm_portal
*p
, u32 offset
)
191 return be32_to_cpu(__raw_readl(p
->addr
.ce
+ offset
));
196 /* interrupt sources processed by portal_isr(), configurable */
197 unsigned long irq_sources
;
198 /* probing time config params for cpu-affine portals */
199 const struct bm_portal_config
*config
;
200 char irqname
[MAX_IRQNAME
];
203 static cpumask_t affine_mask
;
204 static DEFINE_SPINLOCK(affine_mask_lock
);
205 static DEFINE_PER_CPU(struct bman_portal
, bman_affine_portal
);
207 static inline struct bman_portal
*get_affine_portal(void)
209 return &get_cpu_var(bman_affine_portal
);
212 static inline void put_affine_portal(void)
214 put_cpu_var(bman_affine_portal
);
218 * This object type refers to a pool, it isn't *the* pool. There may be
219 * more than one such object per BMan buffer pool, eg. if different users of the
220 * pool are operating via different portals.
223 /* index of the buffer pool to encapsulate (0-63) */
225 /* Used for hash-table admin when using depletion notifications. */
226 struct bman_portal
*portal
;
227 struct bman_pool
*next
;
230 static u32
poll_portal_slow(struct bman_portal
*p
, u32 is
);
232 static irqreturn_t
portal_isr(int irq
, void *ptr
)
234 struct bman_portal
*p
= ptr
;
235 struct bm_portal
*portal
= &p
->p
;
236 u32 clear
= p
->irq_sources
;
237 u32 is
= bm_in(portal
, BM_REG_ISR
) & p
->irq_sources
;
242 clear
|= poll_portal_slow(p
, is
);
243 bm_out(portal
, BM_REG_ISR
, clear
);
247 /* --- RCR API --- */
249 #define RCR_SHIFT ilog2(sizeof(struct bm_rcr_entry))
250 #define RCR_CARRY (uintptr_t)(BM_RCR_SIZE << RCR_SHIFT)
252 /* Bit-wise logic to wrap a ring pointer by clearing the "carry bit" */
253 static struct bm_rcr_entry
*rcr_carryclear(struct bm_rcr_entry
*p
)
255 uintptr_t addr
= (uintptr_t)p
;
259 return (struct bm_rcr_entry
*)addr
;
262 #ifdef CONFIG_FSL_DPAA_CHECKING
263 /* Bit-wise logic to convert a ring pointer to a ring index */
264 static int rcr_ptr2idx(struct bm_rcr_entry
*e
)
266 return ((uintptr_t)e
>> RCR_SHIFT
) & (BM_RCR_SIZE
- 1);
270 /* Increment the 'cursor' ring pointer, taking 'vbit' into account */
271 static inline void rcr_inc(struct bm_rcr
*rcr
)
273 /* increment to the next RCR pointer and handle overflow and 'vbit' */
274 struct bm_rcr_entry
*partial
= rcr
->cursor
+ 1;
276 rcr
->cursor
= rcr_carryclear(partial
);
277 if (partial
!= rcr
->cursor
)
278 rcr
->vbit
^= BM_RCR_VERB_VBIT
;
281 static int bm_rcr_get_avail(struct bm_portal
*portal
)
283 struct bm_rcr
*rcr
= &portal
->rcr
;
285 return rcr
->available
;
288 static int bm_rcr_get_fill(struct bm_portal
*portal
)
290 struct bm_rcr
*rcr
= &portal
->rcr
;
292 return BM_RCR_SIZE
- 1 - rcr
->available
;
295 static void bm_rcr_set_ithresh(struct bm_portal
*portal
, u8 ithresh
)
297 struct bm_rcr
*rcr
= &portal
->rcr
;
299 rcr
->ithresh
= ithresh
;
300 bm_out(portal
, BM_REG_RCR_ITR
, ithresh
);
303 static void bm_rcr_cce_prefetch(struct bm_portal
*portal
)
305 __maybe_unused
struct bm_rcr
*rcr
= &portal
->rcr
;
307 DPAA_ASSERT(rcr
->cmode
== bm_rcr_cce
);
308 bm_cl_touch_ro(portal
, BM_CL_RCR_CI_CENA
);
311 static u8
bm_rcr_cce_update(struct bm_portal
*portal
)
313 struct bm_rcr
*rcr
= &portal
->rcr
;
314 u8 diff
, old_ci
= rcr
->ci
;
316 DPAA_ASSERT(rcr
->cmode
== bm_rcr_cce
);
317 rcr
->ci
= bm_ce_in(portal
, BM_CL_RCR_CI_CENA
) & (BM_RCR_SIZE
- 1);
318 bm_cl_invalidate(portal
, BM_CL_RCR_CI_CENA
);
319 diff
= dpaa_cyc_diff(BM_RCR_SIZE
, old_ci
, rcr
->ci
);
320 rcr
->available
+= diff
;
324 static inline struct bm_rcr_entry
*bm_rcr_start(struct bm_portal
*portal
)
326 struct bm_rcr
*rcr
= &portal
->rcr
;
328 DPAA_ASSERT(!rcr
->busy
);
331 #ifdef CONFIG_FSL_DPAA_CHECKING
334 dpaa_zero(rcr
->cursor
);
338 static inline void bm_rcr_pvb_commit(struct bm_portal
*portal
, u8 myverb
)
340 struct bm_rcr
*rcr
= &portal
->rcr
;
341 struct bm_rcr_entry
*rcursor
;
343 DPAA_ASSERT(rcr
->busy
);
344 DPAA_ASSERT(rcr
->pmode
== bm_rcr_pvb
);
345 DPAA_ASSERT(rcr
->available
>= 1);
347 rcursor
= rcr
->cursor
;
348 rcursor
->_ncw_verb
= myverb
| rcr
->vbit
;
352 #ifdef CONFIG_FSL_DPAA_CHECKING
357 static int bm_rcr_init(struct bm_portal
*portal
, enum bm_rcr_pmode pmode
,
358 enum bm_rcr_cmode cmode
)
360 struct bm_rcr
*rcr
= &portal
->rcr
;
364 rcr
->ring
= portal
->addr
.ce
+ BM_CL_RCR
;
365 rcr
->ci
= bm_in(portal
, BM_REG_RCR_CI_CINH
) & (BM_RCR_SIZE
- 1);
366 pi
= bm_in(portal
, BM_REG_RCR_PI_CINH
) & (BM_RCR_SIZE
- 1);
367 rcr
->cursor
= rcr
->ring
+ pi
;
368 rcr
->vbit
= (bm_in(portal
, BM_REG_RCR_PI_CINH
) & BM_RCR_SIZE
) ?
369 BM_RCR_VERB_VBIT
: 0;
370 rcr
->available
= BM_RCR_SIZE
- 1
371 - dpaa_cyc_diff(BM_RCR_SIZE
, rcr
->ci
, pi
);
372 rcr
->ithresh
= bm_in(portal
, BM_REG_RCR_ITR
);
373 #ifdef CONFIG_FSL_DPAA_CHECKING
378 cfg
= (bm_in(portal
, BM_REG_CFG
) & 0xffffffe0)
379 | (pmode
& 0x3); /* BCSP_CFG::RPM */
380 bm_out(portal
, BM_REG_CFG
, cfg
);
384 static void bm_rcr_finish(struct bm_portal
*portal
)
386 #ifdef CONFIG_FSL_DPAA_CHECKING
387 struct bm_rcr
*rcr
= &portal
->rcr
;
390 DPAA_ASSERT(!rcr
->busy
);
392 i
= bm_in(portal
, BM_REG_RCR_PI_CINH
) & (BM_RCR_SIZE
- 1);
393 if (i
!= rcr_ptr2idx(rcr
->cursor
))
394 pr_crit("losing uncommitted RCR entries\n");
396 i
= bm_in(portal
, BM_REG_RCR_CI_CINH
) & (BM_RCR_SIZE
- 1);
398 pr_crit("missing existing RCR completions\n");
399 if (rcr
->ci
!= rcr_ptr2idx(rcr
->cursor
))
400 pr_crit("RCR destroyed unquiesced\n");
404 /* --- Management command API --- */
405 static int bm_mc_init(struct bm_portal
*portal
)
407 struct bm_mc
*mc
= &portal
->mc
;
409 mc
->cr
= portal
->addr
.ce
+ BM_CL_CR
;
410 mc
->rr
= portal
->addr
.ce
+ BM_CL_RR0
;
411 mc
->rridx
= (__raw_readb(&mc
->cr
->_ncw_verb
) & BM_MCC_VERB_VBIT
) ?
413 mc
->vbit
= mc
->rridx
? BM_MCC_VERB_VBIT
: 0;
414 #ifdef CONFIG_FSL_DPAA_CHECKING
420 static void bm_mc_finish(struct bm_portal
*portal
)
422 #ifdef CONFIG_FSL_DPAA_CHECKING
423 struct bm_mc
*mc
= &portal
->mc
;
425 DPAA_ASSERT(mc
->state
== mc_idle
);
426 if (mc
->state
!= mc_idle
)
427 pr_crit("Losing incomplete MC command\n");
431 static inline struct bm_mc_command
*bm_mc_start(struct bm_portal
*portal
)
433 struct bm_mc
*mc
= &portal
->mc
;
435 DPAA_ASSERT(mc
->state
== mc_idle
);
436 #ifdef CONFIG_FSL_DPAA_CHECKING
443 static inline void bm_mc_commit(struct bm_portal
*portal
, u8 myverb
)
445 struct bm_mc
*mc
= &portal
->mc
;
446 union bm_mc_result
*rr
= mc
->rr
+ mc
->rridx
;
448 DPAA_ASSERT(mc
->state
== mc_user
);
450 mc
->cr
->_ncw_verb
= myverb
| mc
->vbit
;
452 dpaa_invalidate_touch_ro(rr
);
453 #ifdef CONFIG_FSL_DPAA_CHECKING
458 static inline union bm_mc_result
*bm_mc_result(struct bm_portal
*portal
)
460 struct bm_mc
*mc
= &portal
->mc
;
461 union bm_mc_result
*rr
= mc
->rr
+ mc
->rridx
;
463 DPAA_ASSERT(mc
->state
== mc_hw
);
465 * The inactive response register's verb byte always returns zero until
466 * its command is submitted and completed. This includes the valid-bit,
467 * in case you were wondering...
469 if (!__raw_readb(&rr
->verb
)) {
470 dpaa_invalidate_touch_ro(rr
);
474 mc
->vbit
^= BM_MCC_VERB_VBIT
;
475 #ifdef CONFIG_FSL_DPAA_CHECKING
481 static inline int bm_mc_result_timeout(struct bm_portal
*portal
,
482 union bm_mc_result
**mcr
)
484 int timeout
= BM_MCR_TIMEOUT
;
487 *mcr
= bm_mc_result(portal
);
496 /* Disable all BSCN interrupts for the portal */
497 static void bm_isr_bscn_disable(struct bm_portal
*portal
)
499 bm_out(portal
, BM_REG_SCN(0), 0);
500 bm_out(portal
, BM_REG_SCN(1), 0);
503 static int bman_create_portal(struct bman_portal
*portal
,
504 const struct bm_portal_config
*c
)
511 * prep the low-level portal struct with the mapped addresses from the
512 * config, everything that follows depends on it and "config" is more
513 * for (de)reference...
515 p
->addr
.ce
= c
->addr_virt
[DPAA_PORTAL_CE
];
516 p
->addr
.ci
= c
->addr_virt
[DPAA_PORTAL_CI
];
517 if (bm_rcr_init(p
, bm_rcr_pvb
, bm_rcr_cce
)) {
518 dev_err(c
->dev
, "RCR initialisation failed\n");
522 dev_err(c
->dev
, "MC initialisation failed\n");
526 * Default to all BPIDs disabled, we enable as required at
529 bm_isr_bscn_disable(p
);
531 /* Write-to-clear any stale interrupt status bits */
532 bm_out(p
, BM_REG_ISDR
, 0xffffffff);
533 portal
->irq_sources
= 0;
534 bm_out(p
, BM_REG_IER
, 0);
535 bm_out(p
, BM_REG_ISR
, 0xffffffff);
536 snprintf(portal
->irqname
, MAX_IRQNAME
, IRQNAME
, c
->cpu
);
537 if (request_irq(c
->irq
, portal_isr
, 0, portal
->irqname
, portal
)) {
538 dev_err(c
->dev
, "request_irq() failed\n");
541 if (c
->cpu
!= -1 && irq_can_set_affinity(c
->irq
) &&
542 irq_set_affinity(c
->irq
, cpumask_of(c
->cpu
))) {
543 dev_err(c
->dev
, "irq_set_affinity() failed\n");
547 /* Need RCR to be empty before continuing */
548 ret
= bm_rcr_get_fill(p
);
550 dev_err(c
->dev
, "RCR unclean\n");
556 bm_out(p
, BM_REG_ISDR
, 0);
557 bm_out(p
, BM_REG_IIR
, 0);
563 free_irq(c
->irq
, portal
);
572 struct bman_portal
*bman_create_affine_portal(const struct bm_portal_config
*c
)
574 struct bman_portal
*portal
;
577 portal
= &per_cpu(bman_affine_portal
, c
->cpu
);
578 err
= bman_create_portal(portal
, c
);
582 spin_lock(&affine_mask_lock
);
583 cpumask_set_cpu(c
->cpu
, &affine_mask
);
584 spin_unlock(&affine_mask_lock
);
589 static u32
poll_portal_slow(struct bman_portal
*p
, u32 is
)
593 if (is
& BM_PIRQ_RCRI
) {
594 bm_rcr_cce_update(&p
->p
);
595 bm_rcr_set_ithresh(&p
->p
, 0);
596 bm_out(&p
->p
, BM_REG_ISR
, BM_PIRQ_RCRI
);
600 /* There should be no status register bits left undefined */
605 int bman_p_irqsource_add(struct bman_portal
*p
, u32 bits
)
607 unsigned long irqflags
;
609 local_irq_save(irqflags
);
610 set_bits(bits
& BM_PIRQ_VISIBLE
, &p
->irq_sources
);
611 bm_out(&p
->p
, BM_REG_IER
, p
->irq_sources
);
612 local_irq_restore(irqflags
);
616 static int bm_shutdown_pool(u32 bpid
)
618 struct bm_mc_command
*bm_cmd
;
619 union bm_mc_result
*bm_res
;
622 struct bman_portal
*p
= get_affine_portal();
623 /* Acquire buffers until empty */
624 bm_cmd
= bm_mc_start(&p
->p
);
626 bm_mc_commit(&p
->p
, BM_MCC_VERB_CMD_ACQUIRE
| 1);
627 if (!bm_mc_result_timeout(&p
->p
, &bm_res
)) {
629 pr_crit("BMan Acquire Command timedout\n");
632 if (!(bm_res
->verb
& BM_MCR_VERB_ACQUIRE_BUFCOUNT
)) {
643 struct gen_pool
*bm_bpalloc
;
645 static int bm_alloc_bpid_range(u32
*result
, u32 count
)
649 addr
= gen_pool_alloc(bm_bpalloc
, count
);
653 *result
= addr
& ~DPAA_GENALLOC_OFF
;
658 static int bm_release_bpid(u32 bpid
)
662 ret
= bm_shutdown_pool(bpid
);
664 pr_debug("BPID %d leaked\n", bpid
);
668 gen_pool_free(bm_bpalloc
, bpid
| DPAA_GENALLOC_OFF
, 1);
672 struct bman_pool
*bman_new_pool(void)
674 struct bman_pool
*pool
= NULL
;
677 if (bm_alloc_bpid_range(&bpid
, 1))
680 pool
= kmalloc(sizeof(*pool
), GFP_KERNEL
);
688 bm_release_bpid(bpid
);
692 EXPORT_SYMBOL(bman_new_pool
);
694 void bman_free_pool(struct bman_pool
*pool
)
696 bm_release_bpid(pool
->bpid
);
700 EXPORT_SYMBOL(bman_free_pool
);
702 int bman_get_bpid(const struct bman_pool
*pool
)
706 EXPORT_SYMBOL(bman_get_bpid
);
708 static void update_rcr_ci(struct bman_portal
*p
, int avail
)
711 bm_rcr_cce_prefetch(&p
->p
);
713 bm_rcr_cce_update(&p
->p
);
716 int bman_release(struct bman_pool
*pool
, const struct bm_buffer
*bufs
, u8 num
)
718 struct bman_portal
*p
;
719 struct bm_rcr_entry
*r
;
720 unsigned long irqflags
;
721 int avail
, timeout
= 1000; /* 1ms */
724 DPAA_ASSERT(num
> 0 && num
<= 8);
727 p
= get_affine_portal();
728 local_irq_save(irqflags
);
729 avail
= bm_rcr_get_avail(&p
->p
);
731 update_rcr_ci(p
, avail
);
732 r
= bm_rcr_start(&p
->p
);
733 local_irq_restore(irqflags
);
741 if (unlikely(!timeout
))
744 p
= get_affine_portal();
745 local_irq_save(irqflags
);
747 * we can copy all but the first entry, as this can trigger badness
750 bm_buffer_set64(r
->bufs
, bm_buffer_get64(bufs
));
751 bm_buffer_set_bpid(r
->bufs
, pool
->bpid
);
753 memcpy(&r
->bufs
[1], &bufs
[1], i
* sizeof(bufs
[0]));
755 bm_rcr_pvb_commit(&p
->p
, BM_RCR_VERB_CMD_BPID_SINGLE
|
756 (num
& BM_RCR_VERB_BUFCOUNT_MASK
));
758 local_irq_restore(irqflags
);
762 EXPORT_SYMBOL(bman_release
);
764 int bman_acquire(struct bman_pool
*pool
, struct bm_buffer
*bufs
, u8 num
)
766 struct bman_portal
*p
= get_affine_portal();
767 struct bm_mc_command
*mcc
;
768 union bm_mc_result
*mcr
;
771 DPAA_ASSERT(num
> 0 && num
<= 8);
773 mcc
= bm_mc_start(&p
->p
);
774 mcc
->bpid
= pool
->bpid
;
775 bm_mc_commit(&p
->p
, BM_MCC_VERB_CMD_ACQUIRE
|
776 (num
& BM_MCC_VERB_ACQUIRE_BUFCOUNT
));
777 if (!bm_mc_result_timeout(&p
->p
, &mcr
)) {
779 pr_crit("BMan Acquire Timeout\n");
782 ret
= mcr
->verb
& BM_MCR_VERB_ACQUIRE_BUFCOUNT
;
784 memcpy(&bufs
[0], &mcr
->bufs
[0], num
* sizeof(bufs
[0]));
791 EXPORT_SYMBOL(bman_acquire
);
793 const struct bm_portal_config
*
794 bman_get_bm_portal_config(const struct bman_portal
*portal
)
796 return portal
->config
;