blob: 173b28ba4bb42bc5ba7f00c928e01d3a0db43041 [file] [log] [blame]
Suneel Garapati4684a7a2020-08-26 14:37:42 +02001// 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
15int 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
29void 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 */
46int 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 */
66void 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}