1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (C) 2018 Marvell International Ltd.
4 */
5
6 #include <dm.h>
7 #include <errno.h>
8 #include <malloc.h>
9 #include <misc.h>
10 #include <net.h>
11 #include <asm/io.h>
12
13 #include "rvu.h"
14
qmem_alloc(struct qmem * q,u32 qsize,size_t entry_sz)15 int qmem_alloc(struct qmem *q, u32 qsize, size_t entry_sz)
16 {
17 q->base = memalign(CONFIG_SYS_CACHELINE_SIZE, qsize * entry_sz);
18 if (!q->base)
19 return -ENOMEM;
20 q->entry_sz = entry_sz;
21 q->qsize = qsize;
22 q->alloc_sz = (size_t)qsize * entry_sz;
23 q->iova = (dma_addr_t)(q->base);
24 debug("NIX: qmem alloc for (%d * %d = %ld bytes) at %p\n",
25 q->qsize, q->entry_sz, q->alloc_sz, q->base);
26 return 0;
27 }
28
qmem_free(struct qmem * q)29 void qmem_free(struct qmem *q)
30 {
31 if (q->base)
32 free(q->base);
33 memset(q, 0, sizeof(*q));
34 }
35
36 /**
37 * Allocates an admin queue for instructions and results
38 *
39 * @param aq admin queue to allocate for
40 * @param qsize Number of entries in the queue
41 * @param inst_size Size of each instruction
42 * @param res_size Size of each result
43 *
44 * @return -ENOMEM on error, 0 on success
45 */
rvu_aq_alloc(struct admin_queue * aq,unsigned int qsize,size_t inst_size,size_t res_size)46 int rvu_aq_alloc(struct admin_queue *aq, unsigned int qsize,
47 size_t inst_size, size_t res_size)
48 {
49 int err;
50
51 err = qmem_alloc(&aq->inst, qsize, inst_size);
52 if (err)
53 return err;
54 err = qmem_alloc(&aq->res, qsize, res_size);
55 if (err)
56 qmem_free(&aq->inst);
57
58 return err;
59 }
60
61 /**
62 * Frees an admin queue
63 *
64 * @param aq Admin queue to free
65 */
rvu_aq_free(struct admin_queue * aq)66 void rvu_aq_free(struct admin_queue *aq)
67 {
68 qmem_free(&aq->inst);
69 qmem_free(&aq->res);
70 memset(aq, 0, sizeof(*aq));
71 }
72