dpdk/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 *
   3 *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
   4 *   Copyright 2016 NXP
   5 *
   6 */
   7
   8#include <unistd.h>
   9#include <stdio.h>
  10#include <sys/types.h>
  11#include <string.h>
  12#include <stdlib.h>
  13#include <fcntl.h>
  14#include <errno.h>
  15
  16#include <rte_malloc.h>
  17#include <rte_memcpy.h>
  18#include <rte_string_fns.h>
  19#include <rte_cycles.h>
  20#include <rte_kvargs.h>
  21#include <rte_dev.h>
  22#include <ethdev_driver.h>
  23#include <rte_mbuf_pool_ops.h>
  24
  25#include <fslmc_logs.h>
  26#include <rte_fslmc.h>
  27#include <mc/fsl_dpbp.h>
  28#include "portal/dpaa2_hw_pvt.h"
  29#include "portal/dpaa2_hw_dpio.h"
  30
  31
  32TAILQ_HEAD(dpbp_dev_list, dpaa2_dpbp_dev);
  33static struct dpbp_dev_list dpbp_dev_list
  34        = TAILQ_HEAD_INITIALIZER(dpbp_dev_list); /*!< DPBP device list */
  35
  36static int
  37dpaa2_create_dpbp_device(int vdev_fd __rte_unused,
  38                         struct vfio_device_info *obj_info __rte_unused,
  39                         int dpbp_id)
  40{
  41        struct dpaa2_dpbp_dev *dpbp_node;
  42        int ret;
  43        static int register_once;
  44
  45        /* Allocate DPAA2 dpbp handle */
  46        dpbp_node = rte_malloc(NULL, sizeof(struct dpaa2_dpbp_dev), 0);
  47        if (!dpbp_node) {
  48                DPAA2_BUS_ERR("Memory allocation failed for DPBP Device");
  49                return -1;
  50        }
  51
  52        /* Open the dpbp object */
  53        dpbp_node->dpbp.regs = dpaa2_get_mcp_ptr(MC_PORTAL_INDEX);
  54        ret = dpbp_open(&dpbp_node->dpbp,
  55                        CMD_PRI_LOW, dpbp_id, &dpbp_node->token);
  56        if (ret) {
  57                DPAA2_BUS_ERR("Unable to open buffer pool object: err(%d)",
  58                              ret);
  59                rte_free(dpbp_node);
  60                return -1;
  61        }
  62
  63        /* Clean the device first */
  64        ret = dpbp_reset(&dpbp_node->dpbp, CMD_PRI_LOW, dpbp_node->token);
  65        if (ret) {
  66                DPAA2_BUS_ERR("Unable to reset buffer pool device. err(%d)",
  67                              ret);
  68                dpbp_close(&dpbp_node->dpbp, CMD_PRI_LOW, dpbp_node->token);
  69                rte_free(dpbp_node);
  70                return -1;
  71        }
  72
  73        dpbp_node->dpbp_id = dpbp_id;
  74        rte_atomic16_init(&dpbp_node->in_use);
  75
  76        TAILQ_INSERT_TAIL(&dpbp_dev_list, dpbp_node, next);
  77
  78        if (!register_once) {
  79                rte_mbuf_set_platform_mempool_ops(DPAA2_MEMPOOL_OPS_NAME);
  80                register_once = 1;
  81        }
  82
  83        return 0;
  84}
  85
  86struct dpaa2_dpbp_dev *dpaa2_alloc_dpbp_dev(void)
  87{
  88        struct dpaa2_dpbp_dev *dpbp_dev = NULL;
  89
  90        /* Get DPBP dev handle from list using index */
  91        TAILQ_FOREACH(dpbp_dev, &dpbp_dev_list, next) {
  92                if (dpbp_dev && rte_atomic16_test_and_set(&dpbp_dev->in_use))
  93                        break;
  94        }
  95
  96        return dpbp_dev;
  97}
  98
  99void dpaa2_free_dpbp_dev(struct dpaa2_dpbp_dev *dpbp)
 100{
 101        struct dpaa2_dpbp_dev *dpbp_dev = NULL;
 102
 103        /* Match DPBP handle and mark it free */
 104        TAILQ_FOREACH(dpbp_dev, &dpbp_dev_list, next) {
 105                if (dpbp_dev == dpbp) {
 106                        rte_atomic16_dec(&dpbp_dev->in_use);
 107                        return;
 108                }
 109        }
 110}
 111
 112int dpaa2_dpbp_supported(void)
 113{
 114        if (TAILQ_EMPTY(&dpbp_dev_list))
 115                return -1;
 116        return 0;
 117}
 118
 119static struct rte_dpaa2_object rte_dpaa2_dpbp_obj = {
 120        .dev_type = DPAA2_BPOOL,
 121        .create = dpaa2_create_dpbp_device,
 122};
 123
 124RTE_PMD_REGISTER_DPAA2_OBJECT(dpbp, rte_dpaa2_dpbp_obj);
 125