diff options
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0221-soc-fsl-dpio-Adding-QMAN-multiple-enqueue-interface.patch')
-rw-r--r-- | target/linux/layerscape/patches-5.4/701-net-0221-soc-fsl-dpio-Adding-QMAN-multiple-enqueue-interface.patch | 304 |
1 files changed, 0 insertions, 304 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0221-soc-fsl-dpio-Adding-QMAN-multiple-enqueue-interface.patch b/target/linux/layerscape/patches-5.4/701-net-0221-soc-fsl-dpio-Adding-QMAN-multiple-enqueue-interface.patch deleted file mode 100644 index 3c76eefe71..0000000000 --- a/target/linux/layerscape/patches-5.4/701-net-0221-soc-fsl-dpio-Adding-QMAN-multiple-enqueue-interface.patch +++ /dev/null @@ -1,304 +0,0 @@ -From 1da6ba0350da068295d5bc5556193b21da38a388 Mon Sep 17 00:00:00 2001 -From: Youri Querry <youri.querry_1@nxp.com> -Date: Mon, 4 Nov 2019 10:32:37 -0500 -Subject: [PATCH] soc: fsl: dpio: Adding QMAN multiple enqueue interface. - -Update of QMAN the interface to enqueue frame. We now support multiple -enqueue (qbman_swp_enqueue_multiple) and multiple enqueue with -a table of descriptor (qbman_swp_enqueue_multiple_desc). - -Signed-off-by: Youri Querry <youri.querry_1@nxp.com> ---- - drivers/soc/fsl/dpio/dpio-service.c | 69 ++++++++++++++++++++++++++++++++-- - drivers/soc/fsl/dpio/qbman-portal.c | 75 +++++++++++++++++++++++++++++++------ - drivers/soc/fsl/dpio/qbman-portal.h | 17 +++++++++ - include/soc/fsl/dpaa2-io.h | 6 ++- - 4 files changed, 152 insertions(+), 15 deletions(-) - ---- a/drivers/soc/fsl/dpio/dpio-service.c -+++ b/drivers/soc/fsl/dpio/dpio-service.c -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) - /* - * Copyright 2014-2016 Freescale Semiconductor Inc. -- * Copyright 2016 NXP -+ * Copyright 2016-2019 NXP - * - */ - #include <linux/types.h> -@@ -437,6 +437,69 @@ int dpaa2_io_service_enqueue_fq(struct d - EXPORT_SYMBOL(dpaa2_io_service_enqueue_fq); - - /** -+ * dpaa2_io_service_enqueue_multiple_fq() - Enqueue multiple frames -+ * to a frame queue using one fqid. -+ * @d: the given DPIO service. -+ * @fqid: the given frame queue id. -+ * @fd: the frame descriptor which is enqueued. -+ * @nb: number of frames to be enqueud -+ * -+ * Return 0 for successful enqueue, -EBUSY if the enqueue ring is not ready, -+ * or -ENODEV if there is no dpio service. -+ */ -+int dpaa2_io_service_enqueue_multiple_fq(struct dpaa2_io *d, -+ u32 fqid, -+ const struct dpaa2_fd *fd, -+ int nb) -+{ -+ struct qbman_eq_desc ed; -+ -+ d = service_select(d); -+ if (!d) -+ return -ENODEV; -+ -+ qbman_eq_desc_clear(&ed); -+ qbman_eq_desc_set_no_orp(&ed, 0); -+ qbman_eq_desc_set_fq(&ed, fqid); -+ -+ return qbman_swp_enqueue_multiple(d->swp, &ed, fd, 0, nb); -+} -+EXPORT_SYMBOL(dpaa2_io_service_enqueue_multiple_fq); -+ -+/** -+ * dpaa2_io_service_enqueue_multiple_desc_fq() - Enqueue multiple frames -+ * to different frame queue using a list of fqids. -+ * @d: the given DPIO service. -+ * @fqid: the given list of frame queue ids. -+ * @fd: the frame descriptor which is enqueued. -+ * @nb: number of frames to be enqueud -+ * -+ * Return 0 for successful enqueue, -EBUSY if the enqueue ring is not ready, -+ * or -ENODEV if there is no dpio service. -+ */ -+int dpaa2_io_service_enqueue_multiple_desc_fq(struct dpaa2_io *d, -+ u32 *fqid, -+ const struct dpaa2_fd *fd, -+ int nb) -+{ -+ int i; -+ struct qbman_eq_desc ed[32]; -+ -+ d = service_select(d); -+ if (!d) -+ return -ENODEV; -+ -+ for (i = 0; i < nb; i++) { -+ qbman_eq_desc_clear(&ed[i]); -+ qbman_eq_desc_set_no_orp(&ed[i], 0); -+ qbman_eq_desc_set_fq(&ed[i], fqid[i]); -+ } -+ -+ return qbman_swp_enqueue_multiple_desc(d->swp, &ed[0], fd, nb); -+} -+EXPORT_SYMBOL(dpaa2_io_service_enqueue_multiple_desc_fq); -+ -+/** - * dpaa2_io_service_enqueue_qd() - Enqueue a frame to a QD. - * @d: the given DPIO service. - * @qdid: the given queuing destination id. -@@ -530,7 +593,7 @@ EXPORT_SYMBOL_GPL(dpaa2_io_service_acqui - - /** - * dpaa2_io_store_create() - Create the dma memory storage for dequeue result. -- * @max_frames: the maximum number of dequeued result for frames, must be <= 16. -+ * @max_frames: the maximum number of dequeued result for frames, must be <= 32. - * @dev: the device to allow mapping/unmapping the DMAable region. - * - * The size of the storage is "max_frames*sizeof(struct dpaa2_dq)". -@@ -545,7 +608,7 @@ struct dpaa2_io_store *dpaa2_io_store_cr - struct dpaa2_io_store *ret; - size_t size; - -- if (!max_frames || (max_frames > 16)) -+ if (!max_frames || (max_frames > 32)) - return NULL; - - ret = kmalloc(sizeof(*ret), GFP_KERNEL); ---- a/drivers/soc/fsl/dpio/qbman-portal.c -+++ b/drivers/soc/fsl/dpio/qbman-portal.c -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) - /* - * Copyright (C) 2014-2016 Freescale Semiconductor, Inc. -- * Copyright 2016 NXP -+ * Copyright 2016-2019 NXP - * - */ - -@@ -86,7 +86,7 @@ enum qbman_sdqcr_fc { - - #define dccvac(p) { asm volatile("dc cvac, %0;" : : "r" (p) : "memory"); } - #define dcivac(p) { asm volatile("dc ivac, %0" : : "r"(p) : "memory"); } --static inline void qbman_inval_prefetch(struct qbman_swp *p, uint32_t offset) -+static inline void qbman_inval_prefetch(struct qbman_swp *p, u32 offset) - { - dcivac(p->addr_cena + offset); - prefetch(p->addr_cena + offset); -@@ -158,7 +158,7 @@ static inline u32 qbman_set_swp_cfg(u8 m - */ - struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d) - { -- struct qbman_swp *p = kmalloc(sizeof(*p), GFP_KERNEL); -+ struct qbman_swp *p = kzalloc(sizeof(*p), GFP_KERNEL); - u32 reg; - - if (!p) -@@ -380,7 +380,6 @@ enum qb_enqueue_commands { - }; - - #define QB_ENQUEUE_CMD_ORP_ENABLE_SHIFT 2 --#define QB_ENQUEUE_CMD_IRQ_ON_DISPATCH_SHIFT 3 - #define QB_ENQUEUE_CMD_TARGET_TYPE_SHIFT 4 - - /** -@@ -508,7 +507,7 @@ static inline void qbman_write_eqcr_am_r - int qbman_swp_enqueue(struct qbman_swp *s, const struct qbman_eq_desc *d, - const struct dpaa2_fd *fd) - { -- struct qbman_eq_desc *p; -+ struct qbman_eq_desc_with_fd *p; - u32 eqar = qbman_read_register(s, QBMAN_CINH_SWP_EQAR); - - if (!EQAR_SUCCESS(eqar)) -@@ -522,19 +521,19 @@ int qbman_swp_enqueue(struct qbman_swp * - * desc.orpid address alignment = 4 - * desc.tgtid address alignment = 8 - */ -- p->dca = d->dca; -- p->seqnum = d->seqnum; -- p->orpid = d->orpid; -- memcpy(&p->tgtid, &d->tgtid, 24); -+ p->desc.dca = d->dca; -+ p->desc.seqnum = d->seqnum; -+ p->desc.orpid = d->orpid; -+ memcpy(&p->desc.tgtid, &d->tgtid, 24); - memcpy(&p->fd, fd, sizeof(*fd)); - - if ((s->desc->qman_version & QMAN_REV_MASK) < QMAN_REV_5000) { - /* Set the verb byte, have to substitute in the valid-bit */ - dma_wmb(); -- p->verb = d->verb | EQAR_VB(eqar); -+ p->desc.verb = d->verb | EQAR_VB(eqar); - dccvac(p); - } else { -- p->verb = d->verb | EQAR_VB(eqar); -+ p->desc.verb = d->verb | EQAR_VB(eqar); - dma_wmb(); - qbman_write_eqcr_am_rt_register(s, EQAR_IDX(eqar)); - } -@@ -542,6 +541,60 @@ int qbman_swp_enqueue(struct qbman_swp * - return 0; - } - -+/** -+ * qbman_swp_enqueue_multiple() - Issue a multi enqueue command -+ * using one enqueue descriptor -+ * @s: the software portal used for enqueue -+ * @d: the enqueue descriptor -+ * @fd: table pointer of frame descriptor table to be enqueued -+ * @flags: table pointer of flags, not used for the moment -+ * @num_frames: number of fd to be enqueued -+ * -+ * Return the number of fd enqueued, or a negative error number. -+ */ -+int qbman_swp_enqueue_multiple(struct qbman_swp *s, -+ const struct qbman_eq_desc *d, -+ const struct dpaa2_fd *fd, -+ uint32_t *flags, -+ int num_frames) -+{ -+ int count = 0; -+ -+ while (count < num_frames) { -+ if (qbman_swp_enqueue(s, d, fd) != 0) -+ break; -+ count++; -+ } -+ -+ return count; -+} -+ -+/** -+ * qbman_swp_enqueue_multiple_desc() - Issue a multi enqueue command -+ * using multiple enqueue descriptor -+ * @s: the software portal used for enqueue -+ * @d: table of minimal enqueue descriptor -+ * @fd: table pointer of frame descriptor table to be enqueued -+ * @num_frames: number of fd to be enqueued -+ * -+ * Return the number of fd enqueued, or a negative error number. -+ */ -+int qbman_swp_enqueue_multiple_desc(struct qbman_swp *s, -+ const struct qbman_eq_desc *d, -+ const struct dpaa2_fd *fd, -+ int num_frames) -+{ -+ int count = 0; -+ -+ while (count < num_frames) { -+ if (qbman_swp_enqueue(s, &(d[count]), fd) != 0) -+ break; -+ count++; -+ } -+ -+ return count; -+} -+ - /* Static (push) dequeue */ - - /** ---- a/drivers/soc/fsl/dpio/qbman-portal.h -+++ b/drivers/soc/fsl/dpio/qbman-portal.h -@@ -88,6 +88,10 @@ struct qbman_eq_desc { - u8 wae; - u8 rspid; - __le64 rsp_addr; -+}; -+ -+struct qbman_eq_desc_with_fd { -+ struct qbman_eq_desc desc; - u8 fd[32]; - }; - -@@ -205,6 +209,19 @@ void *qbman_swp_mc_start(struct qbman_sw - void qbman_swp_mc_submit(struct qbman_swp *p, void *cmd, u8 cmd_verb); - void *qbman_swp_mc_result(struct qbman_swp *p); - -+int -+qbman_swp_enqueue_multiple(struct qbman_swp *s, -+ const struct qbman_eq_desc *d, -+ const struct dpaa2_fd *fd, -+ uint32_t *flags, -+ int num_frames); -+ -+int -+qbman_swp_enqueue_multiple_desc(struct qbman_swp *s, -+ const struct qbman_eq_desc *d, -+ const struct dpaa2_fd *fd, -+ int num_frames); -+ - /** - * qbman_result_is_DQ() - check if the dequeue result is a dequeue response - * @dq: the dequeue result to be checked ---- a/include/soc/fsl/dpaa2-io.h -+++ b/include/soc/fsl/dpaa2-io.h -@@ -1,7 +1,7 @@ - /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ - /* - * Copyright 2014-2016 Freescale Semiconductor Inc. -- * Copyright 2017 NXP -+ * Copyright 2017-2019 NXP - * - */ - #ifndef __FSL_DPAA2_IO_H -@@ -109,6 +109,10 @@ int dpaa2_io_service_pull_channel(struct - - int dpaa2_io_service_enqueue_fq(struct dpaa2_io *d, u32 fqid, - const struct dpaa2_fd *fd); -+int dpaa2_io_service_enqueue_multiple_fq(struct dpaa2_io *d, u32 fqid, -+ const struct dpaa2_fd *fd, int number_of_frame); -+int dpaa2_io_service_enqueue_multiple_desc_fq(struct dpaa2_io *d, u32 *fqid, -+ const struct dpaa2_fd *fd, int number_of_frame); - int dpaa2_io_service_enqueue_qd(struct dpaa2_io *d, u32 qdid, u8 prio, - u16 qdbin, const struct dpaa2_fd *fd); - int dpaa2_io_service_release(struct dpaa2_io *d, u16 bpid, |