// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 Marvell International Ltd. */ #include #include #include #include #include #include #include "rvu.h" int qmem_alloc(struct qmem *q, u32 qsize, size_t entry_sz) { q->base = memalign(CONFIG_SYS_CACHELINE_SIZE, qsize * entry_sz); if (!q->base) return -ENOMEM; q->entry_sz = entry_sz; q->qsize = qsize; q->alloc_sz = (size_t)qsize * entry_sz; q->iova = (dma_addr_t)(q->base); debug("NIX: qmem alloc for (%d * %d = %ld bytes) at %p\n", q->qsize, q->entry_sz, q->alloc_sz, q->base); return 0; } void qmem_free(struct qmem *q) { if (q->base) free(q->base); memset(q, 0, sizeof(*q)); } /** * Allocates an admin queue for instructions and results * * @param aq admin queue to allocate for * @param qsize Number of entries in the queue * @param inst_size Size of each instruction * @param res_size Size of each result * * Return: -ENOMEM on error, 0 on success */ int rvu_aq_alloc(struct admin_queue *aq, unsigned int qsize, size_t inst_size, size_t res_size) { int err; err = qmem_alloc(&aq->inst, qsize, inst_size); if (err) return err; err = qmem_alloc(&aq->res, qsize, res_size); if (err) qmem_free(&aq->inst); return err; } /** * Frees an admin queue * * @param aq Admin queue to free */ void rvu_aq_free(struct admin_queue *aq) { qmem_free(&aq->inst); qmem_free(&aq->res); memset(aq, 0, sizeof(*aq)); }