Skip to content

Commit bd2f66b

Browse files
nxpfranklivinodkoul
authored andcommitted
dmaengine: fsl-dpaa2-qdma: Update DPDMAI interfaces to version 3
Update the DPDMAI interfaces to support MC firmware up to 10.1x.x, which major change is to add dpaa domain id support. User space MC controller tool can create difference dpaa domain for difference virtual environment. DMA queues can map to difference service priorities. The MC command was basic compatible original one. The new command use previous reserved field. - Add queue number for dpdmai_get_tx(rx)_queue(). - Unified rx(tx)_queue_attr. - Update pad/reserved field of struct dpdmai_rsp_get_attributes and struct dpdmai_cmd_queue for new API. - Update command DPDMAI_SET(GET)_RX_QUEUE and DPDMAI_CMDID_GET_TX_QUEUE Signed-off-by: Frank Li <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent b52e28e commit bd2f66b

File tree

4 files changed

+67
-35
lines changed

4 files changed

+67
-35
lines changed

drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -362,21 +362,21 @@ static int __cold dpaa2_qdma_setup(struct fsl_mc_device *ls_dev)
362362

363363
for (i = 0; i < priv->num_pairs; i++) {
364364
err = dpdmai_get_rx_queue(priv->mc_io, 0, ls_dev->mc_handle,
365-
i, &priv->rx_queue_attr[i]);
365+
i, 0, &priv->rx_queue_attr[i]);
366366
if (err) {
367367
dev_err(dev, "dpdmai_get_rx_queue() failed\n");
368368
goto exit;
369369
}
370370
ppriv->rsp_fqid = priv->rx_queue_attr[i].fqid;
371371

372372
err = dpdmai_get_tx_queue(priv->mc_io, 0, ls_dev->mc_handle,
373-
i, &priv->tx_fqid[i]);
373+
i, 0, &priv->tx_queue_attr[i]);
374374
if (err) {
375375
dev_err(dev, "dpdmai_get_tx_queue() failed\n");
376376
goto exit;
377377
}
378-
ppriv->req_fqid = priv->tx_fqid[i];
379-
ppriv->prio = i;
378+
ppriv->req_fqid = priv->tx_queue_attr[i].fqid;
379+
ppriv->prio = DPAA2_QDMA_DEFAULT_PRIORITY;
380380
ppriv->priv = priv;
381381
ppriv++;
382382
}
@@ -542,7 +542,7 @@ static int __cold dpaa2_dpdmai_bind(struct dpaa2_qdma_priv *priv)
542542
rx_queue_cfg.dest_cfg.dest_id = ppriv->nctx.dpio_id;
543543
rx_queue_cfg.dest_cfg.priority = ppriv->prio;
544544
err = dpdmai_set_rx_queue(priv->mc_io, 0, ls_dev->mc_handle,
545-
rx_queue_cfg.dest_cfg.priority,
545+
rx_queue_cfg.dest_cfg.priority, 0,
546546
&rx_queue_cfg);
547547
if (err) {
548548
dev_err(dev, "dpdmai_set_rx_queue() failed\n");
@@ -642,7 +642,7 @@ static int dpaa2_dpdmai_init_channels(struct dpaa2_qdma_engine *dpaa2_qdma)
642642
for (i = 0; i < dpaa2_qdma->n_chans; i++) {
643643
dpaa2_chan = &dpaa2_qdma->chans[i];
644644
dpaa2_chan->qdma = dpaa2_qdma;
645-
dpaa2_chan->fqid = priv->tx_fqid[i % num];
645+
dpaa2_chan->fqid = priv->tx_queue_attr[i % num].fqid;
646646
dpaa2_chan->vchan.desc_free = dpaa2_qdma_free_desc;
647647
vchan_init(&dpaa2_chan->vchan, &dpaa2_qdma->dma_dev);
648648
spin_lock_init(&dpaa2_chan->queue_lock);
@@ -802,7 +802,7 @@ static void dpaa2_qdma_shutdown(struct fsl_mc_device *ls_dev)
802802
dpdmai_disable(priv->mc_io, 0, ls_dev->mc_handle);
803803
dpaa2_dpdmai_dpio_unbind(priv);
804804
dpdmai_close(priv->mc_io, 0, ls_dev->mc_handle);
805-
dpdmai_destroy(priv->mc_io, 0, ls_dev->mc_handle);
805+
dpdmai_destroy(priv->mc_io, 0, priv->dpqdma_id, ls_dev->mc_handle);
806806
}
807807

808808
static const struct fsl_mc_device_id dpaa2_qdma_id_table[] = {

drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#define DPAA2_QDMA_STORE_SIZE 16
88
#define NUM_CH 8
9+
#define DPAA2_QDMA_DEFAULT_PRIORITY 0
910

1011
struct dpaa2_qdma_sd_d {
1112
u32 rsv:32;
@@ -122,8 +123,8 @@ struct dpaa2_qdma_priv {
122123
struct dpaa2_qdma_engine *dpaa2_qdma;
123124
struct dpaa2_qdma_priv_per_prio *ppriv;
124125

125-
struct dpdmai_rx_queue_attr rx_queue_attr[DPDMAI_PRIO_NUM];
126-
u32 tx_fqid[DPDMAI_PRIO_NUM];
126+
struct dpdmai_rx_queue_attr rx_queue_attr[DPDMAI_MAX_QUEUE_NUM];
127+
struct dpdmai_tx_queue_attr tx_queue_attr[DPDMAI_MAX_QUEUE_NUM];
127128
};
128129

129130
struct dpaa2_qdma_priv_per_prio {

drivers/dma/fsl-dpaa2-qdma/dpdmai.c

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,39 @@
11
// SPDX-License-Identifier: GPL-2.0
22
// Copyright 2019 NXP
33

4+
#include <linux/bitfield.h>
45
#include <linux/module.h>
56
#include <linux/types.h>
67
#include <linux/io.h>
78
#include <linux/fsl/mc.h>
89
#include "dpdmai.h"
910

11+
#define DEST_TYPE_MASK 0xF
12+
1013
struct dpdmai_rsp_get_attributes {
1114
__le32 id;
1215
u8 num_of_priorities;
13-
u8 pad0[3];
16+
u8 num_of_queues;
17+
u8 pad0[2];
1418
__le16 major;
1519
__le16 minor;
1620
};
1721

1822
struct dpdmai_cmd_queue {
1923
__le32 dest_id;
20-
u8 priority;
21-
u8 queue;
24+
u8 dest_priority;
25+
union {
26+
u8 queue;
27+
u8 pri;
28+
};
2229
u8 dest_type;
23-
u8 pad;
30+
u8 queue_idx;
2431
__le64 user_ctx;
2532
union {
2633
__le32 options;
2734
__le32 fqid;
2835
};
29-
};
36+
} __packed;
3037

3138
struct dpdmai_rsp_get_tx_queue {
3239
__le64 pad;
@@ -37,6 +44,10 @@ struct dpdmai_cmd_open {
3744
__le32 dpdmai_id;
3845
} __packed;
3946

47+
struct dpdmai_cmd_destroy {
48+
__le32 dpdmai_id;
49+
} __packed;
50+
4051
static inline u64 mc_enc(int lsoffset, int width, u64 val)
4152
{
4253
return (val & MAKE_UMASK64(width)) << lsoffset;
@@ -113,18 +124,23 @@ EXPORT_SYMBOL_GPL(dpdmai_close);
113124
* dpdmai_destroy() - Destroy the DPDMAI object and release all its resources.
114125
* @mc_io: Pointer to MC portal's I/O object
115126
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
127+
* @dpdmai_id: The object id; it must be a valid id within the container that created this object;
116128
* @token: Token of DPDMAI object
117129
*
118130
* Return: '0' on Success; error code otherwise.
119131
*/
120-
int dpdmai_destroy(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
132+
int dpdmai_destroy(struct fsl_mc_io *mc_io, u32 cmd_flags, u32 dpdmai_id, u16 token)
121133
{
134+
struct dpdmai_cmd_destroy *cmd_params;
122135
struct fsl_mc_command cmd = { 0 };
123136

124137
/* prepare command */
125138
cmd.header = mc_encode_cmd_header(DPDMAI_CMDID_DESTROY,
126139
cmd_flags, token);
127140

141+
cmd_params = (struct dpdmai_cmd_destroy *)&cmd.params;
142+
cmd_params->dpdmai_id = cpu_to_le32(dpdmai_id);
143+
128144
/* send command to mc*/
129145
return mc_send_command(mc_io, &cmd);
130146
}
@@ -224,6 +240,7 @@ int dpdmai_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags,
224240
attr->version.major = le16_to_cpu(rsp_params->major);
225241
attr->version.minor = le16_to_cpu(rsp_params->minor);
226242
attr->num_of_priorities = rsp_params->num_of_priorities;
243+
attr->num_of_queues = rsp_params->num_of_queues;
227244

228245
return 0;
229246
}
@@ -240,7 +257,7 @@ EXPORT_SYMBOL_GPL(dpdmai_get_attributes);
240257
*
241258
* Return: '0' on Success; Error code otherwise.
242259
*/
243-
int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
260+
int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u8 queue_idx,
244261
u8 priority, const struct dpdmai_rx_queue_cfg *cfg)
245262
{
246263
struct dpdmai_cmd_queue *cmd_params;
@@ -252,11 +269,12 @@ int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
252269

253270
cmd_params = (struct dpdmai_cmd_queue *)cmd.params;
254271
cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
255-
cmd_params->priority = cfg->dest_cfg.priority;
256-
cmd_params->queue = priority;
272+
cmd_params->dest_priority = cfg->dest_cfg.priority;
273+
cmd_params->pri = priority;
257274
cmd_params->dest_type = cfg->dest_cfg.dest_type;
258275
cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx);
259276
cmd_params->options = cpu_to_le32(cfg->options);
277+
cmd_params->queue_idx = queue_idx;
260278

261279
/* send command to mc*/
262280
return mc_send_command(mc_io, &cmd);
@@ -274,7 +292,7 @@ EXPORT_SYMBOL_GPL(dpdmai_set_rx_queue);
274292
*
275293
* Return: '0' on Success; Error code otherwise.
276294
*/
277-
int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
295+
int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, u8 queue_idx,
278296
u8 priority, struct dpdmai_rx_queue_attr *attr)
279297
{
280298
struct dpdmai_cmd_queue *cmd_params;
@@ -287,6 +305,7 @@ int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
287305

288306
cmd_params = (struct dpdmai_cmd_queue *)cmd.params;
289307
cmd_params->queue = priority;
308+
cmd_params->queue_idx = queue_idx;
290309

291310
/* send command to mc*/
292311
err = mc_send_command(mc_io, &cmd);
@@ -295,8 +314,8 @@ int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
295314

296315
/* retrieve response parameters */
297316
attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id);
298-
attr->dest_cfg.priority = cmd_params->priority;
299-
attr->dest_cfg.dest_type = cmd_params->dest_type;
317+
attr->dest_cfg.priority = cmd_params->dest_priority;
318+
attr->dest_cfg.dest_type = FIELD_GET(DEST_TYPE_MASK, cmd_params->dest_type);
300319
attr->user_ctx = le64_to_cpu(cmd_params->user_ctx);
301320
attr->fqid = le32_to_cpu(cmd_params->fqid);
302321

@@ -316,7 +335,7 @@ EXPORT_SYMBOL_GPL(dpdmai_get_rx_queue);
316335
* Return: '0' on Success; Error code otherwise.
317336
*/
318337
int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags,
319-
u16 token, u8 priority, u32 *fqid)
338+
u16 token, u8 queue_idx, u8 priority, struct dpdmai_tx_queue_attr *attr)
320339
{
321340
struct dpdmai_rsp_get_tx_queue *rsp_params;
322341
struct dpdmai_cmd_queue *cmd_params;
@@ -329,6 +348,7 @@ int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags,
329348

330349
cmd_params = (struct dpdmai_cmd_queue *)cmd.params;
331350
cmd_params->queue = priority;
351+
cmd_params->queue_idx = queue_idx;
332352

333353
/* send command to mc*/
334354
err = mc_send_command(mc_io, &cmd);
@@ -338,7 +358,7 @@ int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags,
338358
/* retrieve response parameters */
339359

340360
rsp_params = (struct dpdmai_rsp_get_tx_queue *)cmd.params;
341-
*fqid = le32_to_cpu(rsp_params->fqid);
361+
attr->fqid = le32_to_cpu(rsp_params->fqid);
342362

343363
return 0;
344364
}

drivers/dma/fsl-dpaa2-qdma/dpdmai.h

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55
#define __FSL_DPDMAI_H
66

77
/* DPDMAI Version */
8-
#define DPDMAI_VER_MAJOR 2
9-
#define DPDMAI_VER_MINOR 2
8+
#define DPDMAI_VER_MAJOR 3
9+
#define DPDMAI_VER_MINOR 3
1010

11-
#define DPDMAI_CMD_BASE_VERSION 0
11+
#define DPDMAI_CMD_BASE_VERSION 1
1212
#define DPDMAI_CMD_ID_OFFSET 4
1313

14-
#define DPDMAI_CMDID_FORMAT(x) (((x) << DPDMAI_CMD_ID_OFFSET) | \
15-
DPDMAI_CMD_BASE_VERSION)
14+
/*
15+
* Maximum number of Tx/Rx queues per DPDMAI object
16+
*/
17+
#define DPDMAI_MAX_QUEUE_NUM 8
18+
19+
#define DPDMAI_CMDID_FORMAT_V(x, v) (((x) << DPDMAI_CMD_ID_OFFSET) | (v))
20+
#define DPDMAI_CMDID_FORMAT(x) DPDMAI_CMDID_FORMAT_V(x, DPDMAI_CMD_BASE_VERSION)
1621

1722
/* Command IDs */
1823
#define DPDMAI_CMDID_CLOSE DPDMAI_CMDID_FORMAT(0x800)
@@ -26,9 +31,9 @@
2631
#define DPDMAI_CMDID_RESET DPDMAI_CMDID_FORMAT(0x005)
2732
#define DPDMAI_CMDID_IS_ENABLED DPDMAI_CMDID_FORMAT(0x006)
2833

29-
#define DPDMAI_CMDID_SET_RX_QUEUE DPDMAI_CMDID_FORMAT(0x1A0)
30-
#define DPDMAI_CMDID_GET_RX_QUEUE DPDMAI_CMDID_FORMAT(0x1A1)
31-
#define DPDMAI_CMDID_GET_TX_QUEUE DPDMAI_CMDID_FORMAT(0x1A2)
34+
#define DPDMAI_CMDID_SET_RX_QUEUE DPDMAI_CMDID_FORMAT_V(0x1A0, 2)
35+
#define DPDMAI_CMDID_GET_RX_QUEUE DPDMAI_CMDID_FORMAT_V(0x1A1, 2)
36+
#define DPDMAI_CMDID_GET_TX_QUEUE DPDMAI_CMDID_FORMAT_V(0x1A2, 2)
3237

3338
#define MC_CMD_HDR_TOKEN_O 32 /* Token field offset */
3439
#define MC_CMD_HDR_TOKEN_S 16 /* Token field size */
@@ -64,6 +69,7 @@
6469
* should be configured with 0
6570
*/
6671
struct dpdmai_cfg {
72+
u8 num_queues;
6773
u8 priorities[DPDMAI_PRIO_NUM];
6874
};
6975

@@ -85,6 +91,7 @@ struct dpdmai_attr {
8591
u16 minor;
8692
} version;
8793
u8 num_of_priorities;
94+
u8 num_of_queues;
8895
};
8996

9097
/**
@@ -149,20 +156,24 @@ struct dpdmai_rx_queue_attr {
149156
u32 fqid;
150157
};
151158

159+
struct dpdmai_tx_queue_attr {
160+
u32 fqid;
161+
};
162+
152163
int dpdmai_open(struct fsl_mc_io *mc_io, u32 cmd_flags,
153164
int dpdmai_id, u16 *token);
154165
int dpdmai_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
155-
int dpdmai_destroy(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
166+
int dpdmai_destroy(struct fsl_mc_io *mc_io, u32 cmd_flags, u32 dpdmai_id, u16 token);
156167
int dpdmai_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
157168
int dpdmai_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
158169
int dpdmai_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);
159170
int dpdmai_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags,
160171
u16 token, struct dpdmai_attr *attr);
161172
int dpdmai_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
162-
u8 priority, const struct dpdmai_rx_queue_cfg *cfg);
173+
u8 queue_idx, u8 priority, const struct dpdmai_rx_queue_cfg *cfg);
163174
int dpdmai_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
164-
u8 priority, struct dpdmai_rx_queue_attr *attr);
175+
u8 queue_idx, u8 priority, struct dpdmai_rx_queue_attr *attr);
165176
int dpdmai_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags,
166-
u16 token, u8 priority, u32 *fqid);
177+
u16 token, u8 queue_idx, u8 priority, struct dpdmai_tx_queue_attr *attr);
167178

168179
#endif /* __FSL_DPDMAI_H */

0 commit comments

Comments
 (0)