raw/dpaa2_qdma: support configuration APIs
[dpdk.git] / drivers / raw / dpaa2_qdma / dpaa2_qdma.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2018 NXP
3  */
4
5 #ifndef __DPAA2_QDMA_H__
6 #define __DPAA2_QDMA_H__
7
8 struct qdma_sdd;
9 struct qdma_io_meta;
10
11 #define DPAA2_QDMA_MAX_FLE 3
12 #define DPAA2_QDMA_MAX_SDD 2
13
14 /** FLE pool size: 3 Frame list + 2 source/destination descriptor */
15 #define QDMA_FLE_POOL_SIZE (sizeof(struct qdma_io_meta) + \
16                 sizeof(struct qbman_fle) * DPAA2_QDMA_MAX_FLE + \
17                 sizeof(struct qdma_sdd) * DPAA2_QDMA_MAX_SDD)
18 /** FLE pool cache size */
19 #define QDMA_FLE_CACHE_SIZE(_num) (_num/(RTE_MAX_LCORE * 2))
20
21 /** Maximum possible H/W Queues on each core */
22 #define MAX_HW_QUEUE_PER_CORE           64
23
24 /**
25  * Represents a QDMA device.
26  * A single QDMA device exists which is combination of multiple DPDMAI rawdev's.
27  */
28 struct qdma_device {
29         /** total number of hw queues. */
30         uint16_t num_hw_queues;
31         /**
32          * Maximum number of hw queues to be alocated per core.
33          * This is limited by MAX_HW_QUEUE_PER_CORE
34          */
35         uint16_t max_hw_queues_per_core;
36         /** Maximum number of VQ's */
37         uint16_t max_vqs;
38         /** mode of operation - physical(h/w) or virtual */
39         uint8_t mode;
40         /** Device state - started or stopped */
41         uint8_t state;
42         /** FLE pool for the device */
43         struct rte_mempool *fle_pool;
44         /** FLE pool size */
45         int fle_pool_count;
46         /** A lock to QDMA device whenever required */
47         rte_spinlock_t lock;
48 };
49
50 /** Represents a QDMA H/W queue */
51 struct qdma_hw_queue {
52         /** Pointer to Next instance */
53         TAILQ_ENTRY(qdma_hw_queue) next;
54         /** DPDMAI device to communicate with HW */
55         struct dpaa2_dpdmai_dev *dpdmai_dev;
56         /** queue ID to communicate with HW */
57         uint16_t queue_id;
58         /** Associated lcore id */
59         uint32_t lcore_id;
60         /** Number of users of this hw queue */
61         uint32_t num_users;
62 };
63
64 /** Represents a QDMA virtual queue */
65 struct qdma_virt_queue {
66         /** Status ring of the virtual queue */
67         struct rte_ring *status_ring;
68         /** Associated hw queue */
69         struct qdma_hw_queue *hw_queue;
70         /** Associated lcore id */
71         uint32_t lcore_id;
72         /** States if this vq is in use or not */
73         uint8_t in_use;
74         /** States if this vq has exclusively associated hw queue */
75         uint8_t exclusive_hw_queue;
76         /* Total number of enqueues on this VQ */
77         uint64_t num_enqueues;
78         /* Total number of dequeues from this VQ */
79         uint64_t num_dequeues;
80 };
81
82 /** Represents a QDMA per core hw queues allocation in virtual mode */
83 struct qdma_per_core_info {
84         /** list for allocated hw queues */
85         struct qdma_hw_queue *hw_queues[MAX_HW_QUEUE_PER_CORE];
86         /* Number of hw queues allocated for this core */
87         uint16_t num_hw_queues;
88 };
89
90 /** Metadata which is stored with each operation */
91 struct qdma_io_meta {
92         /**
93          * Context which is stored in the FLE pool (just before the FLE).
94          * QDMA job is stored as a this context as a part of metadata.
95          */
96         uint64_t cnxt;
97         /** VQ ID is stored as a part of metadata of the enqueue command */
98          uint64_t id;
99 };
100
101 /** Source/Destination Descriptor */
102 struct qdma_sdd {
103         uint32_t rsv;
104         /** Stride configuration */
105         uint32_t stride;
106         /** Route-by-port command */
107         uint32_t rbpcmd;
108         uint32_t cmd;
109 } __attribute__((__packed__));
110
111 /** Represents a DPDMAI raw device */
112 struct dpaa2_dpdmai_dev {
113         /** Pointer to Next device instance */
114         TAILQ_ENTRY(dpaa2_qdma_device) next;
115         /** handle to DPDMAI object */
116         struct fsl_mc_io dpdmai;
117         /** HW ID for DPDMAI object */
118         uint32_t dpdmai_id;
119         /** Tocken of this device */
120         uint16_t token;
121         /** Number of queue in this DPDMAI device */
122         uint8_t num_queues;
123         /** RX queues */
124         struct dpaa2_queue rx_queue[DPDMAI_PRIO_NUM];
125         /** TX queues */
126         struct dpaa2_queue tx_queue[DPDMAI_PRIO_NUM];
127 };
128
129 #endif /* __DPAA2_QDMA_H__ */