summaryrefslogtreecommitdiffstats
path: root/linux/drivers/soc/fsl/qbman/qman_test_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/soc/fsl/qbman/qman_test_api.c')
-rw-r--r--linux/drivers/soc/fsl/qbman/qman_test_api.c201
1 files changed, 115 insertions, 86 deletions
diff --git a/linux/drivers/soc/fsl/qbman/qman_test_api.c b/linux/drivers/soc/fsl/qbman/qman_test_api.c
index 63a6d11d..d5de4c9a 100644
--- a/linux/drivers/soc/fsl/qbman/qman_test_api.c
+++ b/linux/drivers/soc/fsl/qbman/qman_test_api.c
@@ -2,7 +2,7 @@
#include <rtems/bsd/local/opt_dpaa.h>
-/* Copyright 2008 - 2015 Freescale Semiconductor, Inc.
+/* Copyright 2008 - 2016 Freescale Semiconductor, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -34,10 +34,6 @@
#include "qman_test.h"
-/*************/
-/* constants */
-/*************/
-
#define CGR_ID 27
#define POOL_ID 2
#define FQ_FLAGS QMAN_FQ_FLAG_DYNAMIC_FQID
@@ -51,21 +47,13 @@
#define PORTAL_OPAQUE ((void *)0xf00dbeef)
#define VDQCR_FLAGS (QMAN_VOLATILE_FLAG_WAIT | QMAN_VOLATILE_FLAG_FINISH)
-/*************************************/
-/* Predeclarations (eg. for fq_base) */
-/*************************************/
-
static enum qman_cb_dqrr_result cb_dqrr(struct qman_portal *,
struct qman_fq *,
const struct qm_dqrr_entry *);
static void cb_ern(struct qman_portal *, struct qman_fq *,
- const struct qm_mr_entry *);
+ const union qm_mr_entry *);
static void cb_fqs(struct qman_portal *, struct qman_fq *,
- const struct qm_mr_entry *);
-
-/***************/
-/* global vars */
-/***************/
+ const union qm_mr_entry *);
static struct qm_fd fd, fd_dq;
static struct qman_fq fq_base = {
@@ -76,67 +64,68 @@ static struct qman_fq fq_base = {
static DECLARE_WAIT_QUEUE_HEAD(waitqueue);
static int retire_complete, sdqcr_complete;
-/**********************/
-/* internal functions */
-/**********************/
-
/* Helpers for initialising and "incrementing" a frame descriptor */
-static void fd_init(struct qm_fd *__fd)
+static void fd_init(struct qm_fd *fd)
{
- qm_fd_addr_set64(__fd, 0xabdeadbeefLLU);
- __fd->format = qm_fd_contig_big;
- __fd->length29 = 0x0000ffff;
- __fd->cmd = 0xfeedf00d;
+ qm_fd_addr_set64(fd, 0xabdeadbeefLLU);
+ qm_fd_set_contig_big(fd, 0x0000ffff);
+ fd->cmd = cpu_to_be32(0xfeedf00d);
}
-static void fd_inc(struct qm_fd *__fd)
+static void fd_inc(struct qm_fd *fd)
{
- u64 t = qm_fd_addr_get64(__fd);
+ u64 t = qm_fd_addr_get64(fd);
int z = t >> 40;
+ unsigned int len, off;
+ enum qm_fd_format fmt;
t <<= 1;
if (z)
t |= 1;
- qm_fd_addr_set64(__fd, t);
- __fd->length29--;
- __fd->cmd++;
+ qm_fd_addr_set64(fd, t);
+
+ fmt = qm_fd_get_format(fd);
+ off = qm_fd_get_offset(fd);
+ len = qm_fd_get_length(fd);
+ len--;
+ qm_fd_set_param(fd, fmt, off, len);
+
+ fd->cmd = cpu_to_be32(be32_to_cpu(fd->cmd) + 1);
}
/* The only part of the 'fd' we can't memcmp() is the ppid */
-static int fd_cmp(const struct qm_fd *a, const struct qm_fd *b)
+static bool fd_neq(const struct qm_fd *a, const struct qm_fd *b)
{
- int r = (qm_fd_addr_get64(a) == qm_fd_addr_get64(b)) ? 0 : -1;
-
- if (!r)
- r = a->format - b->format;
- if (!r)
- r = a->opaque - b->opaque;
- if (!r)
- r = a->cmd - b->cmd;
- return r;
+ bool neq = qm_fd_addr_get64(a) != qm_fd_addr_get64(b);
+
+ neq |= qm_fd_get_format(a) != qm_fd_get_format(b);
+ neq |= a->cfg != b->cfg;
+ neq |= a->cmd != b->cmd;
+
+ return neq;
}
-/********/
/* test */
-/********/
-
-static void do_enqueues(struct qman_fq *fq)
+static int do_enqueues(struct qman_fq *fq)
{
unsigned int loop;
+ int err = 0;
for (loop = 0; loop < NUM_ENQUEUES; loop++) {
- if (qman_enqueue(fq, &fd, QMAN_ENQUEUE_FLAG_WAIT |
- (((loop + 1) == NUM_ENQUEUES) ?
- QMAN_ENQUEUE_FLAG_WAIT_SYNC : 0)))
- panic("qman_enqueue() failed\n");
+ if (qman_enqueue(fq, &fd)) {
+ pr_crit("qman_enqueue() failed\n");
+ err = -EIO;
+ }
fd_inc(&fd);
}
+
+ return err;
}
-void qman_test_api(void)
+int qman_test_api(void)
{
- u32 flags;
- int res;
+ u32 flags, frmcnt;
+ int err;
struct qman_fq *fq = &fq_base;
pr_info("%s(): Starting\n", __func__);
@@ -144,57 +133,93 @@ void qman_test_api(void)
fd_init(&fd_dq);
/* Initialise (parked) FQ */
- if (qman_create_fq(0, FQ_FLAGS, fq))
- panic("qman_create_fq() failed\n");
- if (qman_init_fq(fq, QMAN_INITFQ_FLAG_LOCAL, NULL))
- panic("qman_init_fq() failed\n");
-
+ err = qman_create_fq(0, FQ_FLAGS, fq);
+ if (err) {
+ pr_crit("qman_create_fq() failed\n");
+ goto failed;
+ }
+ err = qman_init_fq(fq, QMAN_INITFQ_FLAG_LOCAL, NULL);
+ if (err) {
+ pr_crit("qman_init_fq() failed\n");
+ goto failed;
+ }
/* Do enqueues + VDQCR, twice. (Parked FQ) */
- do_enqueues(fq);
+ err = do_enqueues(fq);
+ if (err)
+ goto failed;
pr_info("VDQCR (till-empty);\n");
- if (qman_volatile_dequeue(fq, VDQCR_FLAGS,
- QM_VDQCR_NUMFRAMES_TILLEMPTY))
- panic("qman_volatile_dequeue() failed\n");
- do_enqueues(fq);
+ frmcnt = QM_VDQCR_NUMFRAMES_TILLEMPTY;
+ err = qman_volatile_dequeue(fq, VDQCR_FLAGS, frmcnt);
+ if (err) {
+ pr_crit("qman_volatile_dequeue() failed\n");
+ goto failed;
+ }
+ err = do_enqueues(fq);
+ if (err)
+ goto failed;
pr_info("VDQCR (%d of %d);\n", NUM_PARTIAL, NUM_ENQUEUES);
- if (qman_volatile_dequeue(fq, VDQCR_FLAGS,
- QM_VDQCR_NUMFRAMES_SET(NUM_PARTIAL)))
- panic("qman_volatile_dequeue() failed\n");
+ frmcnt = QM_VDQCR_NUMFRAMES_SET(NUM_PARTIAL);
+ err = qman_volatile_dequeue(fq, VDQCR_FLAGS, frmcnt);
+ if (err) {
+ pr_crit("qman_volatile_dequeue() failed\n");
+ goto failed;
+ }
pr_info("VDQCR (%d of %d);\n", NUM_ENQUEUES - NUM_PARTIAL,
- NUM_ENQUEUES);
- if (qman_volatile_dequeue(fq, VDQCR_FLAGS,
- QM_VDQCR_NUMFRAMES_SET(NUM_ENQUEUES - NUM_PARTIAL)))
- panic("qman_volatile_dequeue() failed\n");
+ NUM_ENQUEUES);
+ frmcnt = QM_VDQCR_NUMFRAMES_SET(NUM_ENQUEUES - NUM_PARTIAL);
+ err = qman_volatile_dequeue(fq, VDQCR_FLAGS, frmcnt);
+ if (err) {
+ pr_err("qman_volatile_dequeue() failed\n");
+ goto failed;
+ }
- do_enqueues(fq);
+ err = do_enqueues(fq);
+ if (err)
+ goto failed;
pr_info("scheduled dequeue (till-empty)\n");
- if (qman_schedule_fq(fq))
- panic("qman_schedule_fq() failed\n");
+ err = qman_schedule_fq(fq);
+ if (err) {
+ pr_crit("qman_schedule_fq() failed\n");
+ goto failed;
+ }
wait_event(waitqueue, sdqcr_complete);
/* Retire and OOS the FQ */
- res = qman_retire_fq(fq, &flags);
- if (res < 0)
- panic("qman_retire_fq() failed\n");
+ err = qman_retire_fq(fq, &flags);
+ if (err < 0) {
+ pr_crit("qman_retire_fq() failed\n");
+ goto failed;
+ }
wait_event(waitqueue, retire_complete);
- if (flags & QMAN_FQ_STATE_BLOCKOOS)
- panic("leaking frames\n");
- if (qman_oos_fq(fq))
- panic("qman_oos_fq() failed\n");
- qman_destroy_fq(fq, 0);
+ if (flags & QMAN_FQ_STATE_BLOCKOOS) {
+ err = -EIO;
+ pr_crit("leaking frames\n");
+ goto failed;
+ }
+ err = qman_oos_fq(fq);
+ if (err) {
+ pr_crit("qman_oos_fq() failed\n");
+ goto failed;
+ }
+ qman_destroy_fq(fq);
pr_info("%s(): Finished\n", __func__);
+ return 0;
+
+failed:
+ WARN_ON(1);
+ return err;
}
static enum qman_cb_dqrr_result cb_dqrr(struct qman_portal *p,
struct qman_fq *fq,
const struct qm_dqrr_entry *dq)
{
- if (fd_cmp(&fd_dq, &dq->fd)) {
+ if (WARN_ON(fd_neq(&fd_dq, &dq->fd))) {
pr_err("BADNESS: dequeued frame doesn't match;\n");
- BUG();
+ return qman_cb_dqrr_consume;
}
fd_inc(&fd_dq);
- if (!(dq->stat & QM_DQRR_STAT_UNSCHEDULED) && !fd_cmp(&fd_dq, &fd)) {
+ if (!(dq->stat & QM_DQRR_STAT_UNSCHEDULED) && !fd_neq(&fd_dq, &fd)) {
sdqcr_complete = 1;
wake_up(&waitqueue);
}
@@ -202,18 +227,22 @@ static enum qman_cb_dqrr_result cb_dqrr(struct qman_portal *p,
}
static void cb_ern(struct qman_portal *p, struct qman_fq *fq,
- const struct qm_mr_entry *msg)
+ const union qm_mr_entry *msg)
{
- panic("cb_ern() unimplemented");
+ pr_crit("cb_ern() unimplemented");
+ WARN_ON(1);
}
static void cb_fqs(struct qman_portal *p, struct qman_fq *fq,
- const struct qm_mr_entry *msg)
+ const union qm_mr_entry *msg)
{
u8 verb = (msg->verb & QM_MR_VERB_TYPE_MASK);
- if ((verb != QM_MR_VERB_FQRN) && (verb != QM_MR_VERB_FQRNI))
- panic("unexpected FQS message");
+ if ((verb != QM_MR_VERB_FQRN) && (verb != QM_MR_VERB_FQRNI)) {
+ pr_crit("unexpected FQS message");
+ WARN_ON(1);
+ return;
+ }
#ifndef __rtems__
pr_info("Retirement message received\n");
#endif /* __rtems__ */