dpdk/drivers/bus/fslmc/rte_fslmc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 *
   3 *   Copyright 2016,2021 NXP
   4 *
   5 */
   6
   7#ifndef _RTE_FSLMC_H_
   8#define _RTE_FSLMC_H_
   9
  10/**
  11 * @file
  12 *
  13 * RTE FSLMC Bus Interface
  14 */
  15
  16#ifdef __cplusplus
  17extern "C" {
  18#endif
  19
  20#include <stdio.h>
  21#include <stdlib.h>
  22#include <limits.h>
  23#include <errno.h>
  24#include <sys/queue.h>
  25#include <stdint.h>
  26#include <inttypes.h>
  27#include <linux/vfio.h>
  28
  29#include <rte_debug.h>
  30#include <rte_interrupts.h>
  31#include <rte_dev.h>
  32#include <rte_bus.h>
  33#include <rte_tailq.h>
  34#include <rte_devargs.h>
  35#include <rte_mbuf.h>
  36#include <rte_mbuf_dyn.h>
  37
  38#include <fslmc_vfio.h>
  39
  40#include "portal/dpaa2_hw_pvt.h"
  41#include "portal/dpaa2_hw_dpio.h"
  42
  43#define FSLMC_OBJECT_MAX_LEN 32   /**< Length of each device on bus */
  44
  45#define DPAA2_INVALID_MBUF_SEQN        0
  46
  47typedef uint32_t dpaa2_seqn_t;
  48extern int dpaa2_seqn_dynfield_offset;
  49
  50/**
  51 * Read dpaa2 sequence number from mbuf.
  52 *
  53 * @param mbuf Structure to read from.
  54 * @return pointer to dpaa2 sequence number.
  55 */
  56__rte_internal
  57static inline dpaa2_seqn_t *
  58dpaa2_seqn(struct rte_mbuf *mbuf)
  59{
  60        return RTE_MBUF_DYNFIELD(mbuf, dpaa2_seqn_dynfield_offset,
  61                dpaa2_seqn_t *);
  62}
  63
  64/** Device driver supports link state interrupt */
  65#define RTE_DPAA2_DRV_INTR_LSC  0x0008
  66
  67/** Device driver supports IOVA as VA */
  68#define RTE_DPAA2_DRV_IOVA_AS_VA 0X0040
  69
  70struct rte_dpaa2_driver;
  71
  72/* DPAA2 Device and Driver lists for FSLMC bus */
  73TAILQ_HEAD(rte_fslmc_device_list, rte_dpaa2_device);
  74TAILQ_HEAD(rte_fslmc_driver_list, rte_dpaa2_driver);
  75
  76#define RTE_DEV_TO_FSLMC_CONST(ptr) \
  77        container_of(ptr, const struct rte_dpaa2_device, device)
  78
  79extern struct rte_fslmc_bus rte_fslmc_bus;
  80
  81enum rte_dpaa2_dev_type {
  82        /* Devices backed by DPDK driver */
  83        DPAA2_ETH,      /**< DPNI type device*/
  84        DPAA2_CRYPTO,   /**< DPSECI type device */
  85        DPAA2_CON,      /**< DPCONC type device */
  86        /* Devices not backed by a DPDK driver: DPIO, DPBP, DPCI, DPMCP */
  87        DPAA2_BPOOL,    /**< DPBP type device */
  88        DPAA2_IO,       /**< DPIO type device */
  89        DPAA2_CI,       /**< DPCI type device */
  90        DPAA2_MPORTAL,  /**< DPMCP type device */
  91        DPAA2_QDMA,     /**< DPDMAI type device */
  92        DPAA2_MUX,      /**< DPDMUX type device */
  93        DPAA2_DPRTC,    /**< DPRTC type device */
  94        DPAA2_DPRC,     /**< DPRC type device */
  95        DPAA2_MAC,      /**< DPMAC type device */
  96        /* Unknown device placeholder */
  97        DPAA2_UNKNOWN,
  98        DPAA2_DEVTYPE_MAX,
  99};
 100
 101TAILQ_HEAD(rte_dpaa2_object_list, rte_dpaa2_object);
 102
 103typedef int (*rte_dpaa2_obj_create_t)(int vdev_fd,
 104                                      struct vfio_device_info *obj_info,
 105                                      int object_id);
 106
 107/**
 108 * A structure describing a DPAA2 object.
 109 */
 110struct rte_dpaa2_object {
 111        TAILQ_ENTRY(rte_dpaa2_object) next; /**< Next in list. */
 112        const char *name;                   /**< Name of Object. */
 113        enum rte_dpaa2_dev_type dev_type;   /**< Type of device */
 114        rte_dpaa2_obj_create_t create;
 115};
 116
 117/**
 118 * A structure describing a DPAA2 device.
 119 */
 120struct rte_dpaa2_device {
 121        TAILQ_ENTRY(rte_dpaa2_device) next; /**< Next probed DPAA2 device. */
 122        struct rte_device device;           /**< Inherit core device */
 123        union {
 124                struct rte_eth_dev *eth_dev;        /**< ethernet device */
 125                struct rte_cryptodev *cryptodev;    /**< Crypto Device */
 126                struct rte_rawdev *rawdev;          /**< Raw Device */
 127        };
 128        enum rte_dpaa2_dev_type dev_type;   /**< Device Type */
 129        uint16_t object_id;                 /**< DPAA2 Object ID */
 130        enum rte_dpaa2_dev_type ep_dev_type;   /**< Endpoint Device Type */
 131        uint16_t ep_object_id;                 /**< Endpoint DPAA2 Object ID */
 132        char ep_name[RTE_DEV_NAME_MAX_LEN];
 133        struct rte_intr_handle *intr_handle; /**< Interrupt handle */
 134        struct rte_dpaa2_driver *driver;    /**< Associated driver */
 135        char name[FSLMC_OBJECT_MAX_LEN];    /**< DPAA2 Object name*/
 136};
 137
 138typedef int (*rte_dpaa2_probe_t)(struct rte_dpaa2_driver *dpaa2_drv,
 139                                 struct rte_dpaa2_device *dpaa2_dev);
 140typedef int (*rte_dpaa2_remove_t)(struct rte_dpaa2_device *dpaa2_dev);
 141
 142/**
 143 * A structure describing a DPAA2 driver.
 144 */
 145struct rte_dpaa2_driver {
 146        TAILQ_ENTRY(rte_dpaa2_driver) next; /**< Next in list. */
 147        struct rte_driver driver;           /**< Inherit core driver. */
 148        struct rte_fslmc_bus *fslmc_bus;    /**< FSLMC bus reference */
 149        uint32_t drv_flags;                 /**< Flags for controlling device.*/
 150        enum rte_dpaa2_dev_type drv_type;   /**< Driver Type */
 151        rte_dpaa2_probe_t probe;
 152        rte_dpaa2_remove_t remove;
 153};
 154
 155/*
 156 * FSLMC bus
 157 */
 158struct rte_fslmc_bus {
 159        struct rte_bus bus;     /**< Generic Bus object */
 160        struct rte_fslmc_device_list device_list;
 161                                /**< FSLMC DPAA2 Device list */
 162        struct rte_fslmc_driver_list driver_list;
 163                                /**< FSLMC DPAA2 Driver list */
 164        int device_count[DPAA2_DEVTYPE_MAX];
 165                                /**< Count of all devices scanned */
 166};
 167
 168/**
 169 * Register a DPAA2 driver.
 170 *
 171 * @param driver
 172 *   A pointer to a rte_dpaa2_driver structure describing the driver
 173 *   to be registered.
 174 */
 175__rte_internal
 176void rte_fslmc_driver_register(struct rte_dpaa2_driver *driver);
 177
 178/**
 179 * Unregister a DPAA2 driver.
 180 *
 181 * @param driver
 182 *   A pointer to a rte_dpaa2_driver structure describing the driver
 183 *   to be unregistered.
 184 */
 185__rte_internal
 186void rte_fslmc_driver_unregister(struct rte_dpaa2_driver *driver);
 187
 188/** Helper for DPAA2 device registration from driver (eth, crypto) instance */
 189#define RTE_PMD_REGISTER_DPAA2(nm, dpaa2_drv) \
 190RTE_INIT(dpaa2initfn_ ##nm) \
 191{\
 192        (dpaa2_drv).driver.name = RTE_STR(nm);\
 193        rte_fslmc_driver_register(&dpaa2_drv); \
 194} \
 195RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
 196
 197/**
 198 * Register a DPAA2 MC Object driver.
 199 *
 200 * @param mc_object
 201 *   A pointer to a rte_dpaa_object structure describing the mc object
 202 *   to be registered.
 203 */
 204__rte_internal
 205void rte_fslmc_object_register(struct rte_dpaa2_object *object);
 206
 207/**
 208 * Count of a particular type of DPAA2 device scanned on the bus.
 209 *
 210 * @param dev_type
 211 *   Type of device as rte_dpaa2_dev_type enumerator
 212 * @return
 213 *   >=0 for count; 0 indicates either no device of the said type scanned or
 214 *   invalid device type.
 215 */
 216__rte_internal
 217uint32_t rte_fslmc_get_device_count(enum rte_dpaa2_dev_type device_type);
 218
 219/** Helper for DPAA2 object registration */
 220#define RTE_PMD_REGISTER_DPAA2_OBJECT(nm, dpaa2_obj) \
 221RTE_INIT(dpaa2objinitfn_ ##nm) \
 222{\
 223        (dpaa2_obj).name = RTE_STR(nm);\
 224        rte_fslmc_object_register(&dpaa2_obj); \
 225} \
 226RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
 227
 228#ifdef __cplusplus
 229}
 230#endif
 231
 232#endif /* _RTE_FSLMC_H_ */
 233