uboot/drivers/net/octeontx2/rvu_common.c
<<
>>
Prefs
   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
  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}
  72