linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dragan Cvetic <dragan.cvetic@xilinx.com>
To: <arnd@arndb.de>, <gregkh@linuxfoundation.org>,
	<michal.simek@xilinx.com>, <linux-arm-kernel@lists.infradead.org>
Cc: <linux-kernel@vger.kernel.org>,
	Dragan Cvetic <dragan.cvetic@xilinx.com>,
	Derek Kiernan <derek.kiernan@xilinx.com>
Subject: [PATCH 06/12] misc: xilinx_sdfec: Add ability to configure turbo mode
Date: Tue, 19 Mar 2019 12:04:18 +0000	[thread overview]
Message-ID: <1552997064-432700-7-git-send-email-dragan.cvetic@xilinx.com> (raw)
In-Reply-To: <1552997064-432700-1-git-send-email-dragan.cvetic@xilinx.com>

Add the capability to configure and retrieve turbo mode
via the ioctls XSDFEC_SET_TURBO and XSDFEC_GET_TURBO.

Reviewed-by: Michal Simek <michal.simek@xilinx.com>
Tested-by: Dragan Cvetic <dragan.cvetic@xilinx.com>
Signed-off-by: Derek Kiernan <derek.kiernan@xilinx.com>
Signed-off-by: Dragan Cvetic <dragan.cvetic@xilinx.com>
---
 drivers/misc/xilinx_sdfec.c      | 83 ++++++++++++++++++++++++++++++++++++++++
 include/uapi/misc/xilinx_sdfec.h | 71 ++++++++++++++++++++++++++++++++++
 2 files changed, 154 insertions(+)

diff --git a/drivers/misc/xilinx_sdfec.c b/drivers/misc/xilinx_sdfec.c
index d9ead0b..58b1c57 100644
--- a/drivers/misc/xilinx_sdfec.c
+++ b/drivers/misc/xilinx_sdfec.c
@@ -115,6 +115,12 @@ static dev_t xsdfec_devt;
 /* BYPASS Register */
 #define XSDFEC_BYPASS_ADDR (0x3C)

+/* Turbo Code Register */
+#define XSDFEC_TURBO_ADDR (0x100)
+#define XSDFEC_TURBO_SCALE_MASK (0xFFF)
+#define XSDFEC_TURBO_SCALE_BIT_POS (8)
+#define XSDFEC_TURBO_SCALE_MAX (15)
+
 /**
  * struct xsdfec_clks - For managing SD-FEC clocks
  * @core_clk: Main processing clock for core
@@ -251,6 +257,77 @@ static int xsdfec_dev_release(struct inode *iptr, struct file *fptr)
        return 0;
 }

+static int xsdfec_set_turbo(struct xsdfec_dev *xsdfec, void __user *arg)
+{
+       struct xsdfec_turbo turbo;
+       int err;
+       u32 turbo_write;
+
+       err = copy_from_user(&turbo, arg, sizeof(turbo));
+       if (err) {
+               dev_err(xsdfec->dev, "%s failed for SDFEC%d", __func__,
+                       xsdfec->config.fec_id);
+               return -EFAULT;
+       }
+
+       if (turbo.alg >= XSDFEC_TURBO_ALG_MAX) {
+               dev_err(xsdfec->dev,
+                       "%s invalid turbo alg value %d for SDFEC%d", __func__,
+                       turbo.alg, xsdfec->config.fec_id);
+               return -EINVAL;
+       }
+
+       if (turbo.scale > XSDFEC_TURBO_SCALE_MAX) {
+               dev_err(xsdfec->dev,
+                       "%s invalid turbo scale value %d for SDFEC%d", __func__,
+                       turbo.scale, xsdfec->config.fec_id);
+               return -EINVAL;
+       }
+
+       /* Check to see what device tree says about the FEC codes */
+       if (xsdfec->config.code == XSDFEC_LDPC_CODE) {
+               dev_err(xsdfec->dev,
+                       "%s: Unable to write Turbo to SDFEC%d check DT",
+                       __func__, xsdfec->config.fec_id);
+               return -EIO;
+       }
+
+       turbo_write = ((turbo.scale & XSDFEC_TURBO_SCALE_MASK)
+                      << XSDFEC_TURBO_SCALE_BIT_POS) |
+                     turbo.alg;
+       xsdfec_regwrite(xsdfec, XSDFEC_TURBO_ADDR, turbo_write);
+       return err;
+}
+
+static int xsdfec_get_turbo(struct xsdfec_dev *xsdfec, void __user *arg)
+{
+       u32 reg_value;
+       struct xsdfec_turbo turbo_params;
+       int err;
+
+       if (xsdfec->config.code == XSDFEC_LDPC_CODE) {
+               dev_err(xsdfec->dev,
+                       "%s: SDFEC%d is configured for LDPC, check DT",
+                       __func__, xsdfec->config.fec_id);
+               return -EIO;
+       }
+
+       reg_value = xsdfec_regread(xsdfec, XSDFEC_TURBO_ADDR);
+
+       turbo_params.scale = (reg_value & XSDFEC_TURBO_SCALE_MASK) >>
+                            XSDFEC_TURBO_SCALE_BIT_POS;
+       turbo_params.alg = reg_value & 0x1;
+
+       err = copy_to_user(arg, &turbo_params, sizeof(turbo_params));
+       if (err) {
+               dev_err(xsdfec->dev, "%s failed for SDFEC%d", __func__,
+                       xsdfec->config.fec_id);
+               err = -EFAULT;
+       }
+
+       return err;
+}
+
 static u32
 xsdfec_translate_axis_width_cfg_val(enum xsdfec_axis_width axis_width_cfg)
 {
@@ -352,6 +429,12 @@ static long xsdfec_dev_ioctl(struct file *fptr, unsigned int cmd,
        }

        switch (cmd) {
+       case XSDFEC_SET_TURBO:
+               rval = xsdfec_set_turbo(xsdfec, arg);
+               break;
+       case XSDFEC_GET_TURBO:
+               rval = xsdfec_get_turbo(xsdfec, arg);
+               break;
        default:
                /* Should not get here */
                dev_err(xsdfec->dev, "Undefined SDFEC IOCTL");
diff --git a/include/uapi/misc/xilinx_sdfec.h b/include/uapi/misc/xilinx_sdfec.h
index 0497b66..1a15771 100644
--- a/include/uapi/misc/xilinx_sdfec.h
+++ b/include/uapi/misc/xilinx_sdfec.h
@@ -39,6 +39,22 @@ enum xsdfec_order {
 };

 /**
+ * enum xsdfec_turbo_alg - Turbo Algorithm Type.
+ * @XSDFEC_MAX_SCALE: Max Log-Map algorithm with extrinsic scaling. When
+ *                   scaling is set to this is equivalent to the Max Log-Map
+ *                   algorithm.
+ * @XSDFEC_MAX_STAR: Log-Map algorithm.
+ * @XSDFEC_TURBO_ALG_MAX: Used to indicate out of bound Turbo algorithms.
+ *
+ * This enum specifies which Turbo Decode algorithm is in use.
+ */
+enum xsdfec_turbo_alg {
+       XSDFEC_MAX_SCALE = 0,
+       XSDFEC_MAX_STAR,
+       XSDFEC_TURBO_ALG_MAX,
+};
+
+/**
  * enum xsdfec_state - State.
  * @XSDFEC_INIT: Driver is initialized.
  * @XSDFEC_STARTED: Driver is started.
@@ -96,6 +112,33 @@ enum xsdfec_axis_word_include {
 };

 /**
+ * struct xsdfec_turbo - User data for Turbo codes.
+ * @alg: Specifies which Turbo decode algorithm to use
+ * @scale: Specifies the extrinsic scaling to apply when the Max Scale algorithm
+ *        has been selected
+ *
+ * Turbo code structure to communicate parameters to XSDFEC driver.
+ */
+struct xsdfec_turbo {
+       enum xsdfec_turbo_alg alg;
+       u8 scale;
+};
+
+/**
+ * struct xsdfec_status - Status of SD-FEC core.
+ * @fec_id: ID of SD-FEC instance. ID is limited to the number of active
+ *          SD-FEC's in the FPGA and is related to the driver instance
+ *          Minor number.
+ * @state: State of the SD-FEC core
+ * @activity: Describes if the SD-FEC instance is Active
+ */
+struct xsdfec_status {
+       s32 fec_id;
+       enum xsdfec_state state;
+       char activity;
+};
+
+/**
  * struct xsdfec_irq - Enabling or Disabling Interrupts.
  * @enable_isr: If true enables the ISR
  * @enable_ecc_isr: If true enables the ECC ISR
@@ -137,4 +180,32 @@ struct xsdfec_config {
  * XSDFEC IOCTL List
  */
 #define XSDFEC_MAGIC 'f'
+/**
+ * DOC: XSDFEC_SET_TURBO
+ * @Parameters
+ *
+ * @struct xsdfec_turbo *
+ *     Pointer to the &struct xsdfec_turbo that contains the Turbo decode
+ *     settings for the SD-FEC core
+ *
+ * @Description
+ *
+ * ioctl that sets the SD-FEC Turbo parameter values
+ *
+ * This can only be used when the driver is in the XSDFEC_STOPPED state
+ */
+#define XSDFEC_SET_TURBO _IOW(XSDFEC_MAGIC, 4, struct xsdfec_turbo *)
+/**
+ * DOC: XSDFEC_GET_TURBO
+ * @Parameters
+ *
+ * @struct xsdfec_turbo *
+ *     Pointer to the &struct xsdfec_turbo that contains the current Turbo
+ *     decode settings of the SD-FEC Block
+ *
+ * @Description
+ *
+ * ioctl that returns SD-FEC turbo param values
+ */
+#define XSDFEC_GET_TURBO _IOR(XSDFEC_MAGIC, 7, struct xsdfec_turbo *)
 #endif /* __XILINX_SDFEC_H__ */
--
2.7.4

This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.

  parent reply	other threads:[~2019-03-19 12:05 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-19 12:04 [PATCH 00/12] misc: xilinx sd-fec driver Dragan Cvetic
2019-03-19 12:04 ` [PATCH 01/12] dt-bindings: xilinx-sdfec: Add SDFEC binding Dragan Cvetic
2019-03-19 12:04 ` [PATCH 02/12] misc: xilinx-sdfec: add core driver Dragan Cvetic
2019-03-19 12:04 ` [PATCH 03/12] misc: xilinx_sdfec: Add CCF support Dragan Cvetic
2019-03-19 12:04 ` [PATCH 04/12] misc: xilinx_sdfec: Add open, close and ioctl Dragan Cvetic
2019-03-19 13:17   ` Arnd Bergmann
2019-03-19 14:59     ` Dragan Cvetic
2019-03-19 15:36       ` Arnd Bergmann
2019-03-19 18:10         ` Dragan Cvetic
2019-03-19 19:46           ` Arnd Bergmann
2019-04-09  8:35             ` Dragan Cvetic
2019-03-19 12:04 ` [PATCH 05/12] misc: xilinx_sdfec: Store driver config and state Dragan Cvetic
2019-03-19 12:04 ` Dragan Cvetic [this message]
2019-03-19 12:04 ` [PATCH 07/12] misc: xilinx_sdfec: Add ability to configure LDPC Dragan Cvetic
2019-03-19 12:04 ` [PATCH 08/12] misc: xilinx_sdfec: Add ability to get/set config Dragan Cvetic
2019-03-19 13:05   ` Arnd Bergmann
2019-03-19 14:02     ` Dragan Cvetic
2019-03-19 12:04 ` [PATCH 09/12] misc: xilinx_sdfec: Support poll file operation Dragan Cvetic
2019-03-19 12:04 ` [PATCH 10/12] misc: xilinx_sdfec: Add stats & status ioctls Dragan Cvetic
2019-03-19 12:04 ` [PATCH 11/12] Docs: misc: xilinx_sdfec: Add documentation Dragan Cvetic
2019-03-19 12:04 ` [PATCH 12/12] MAINTAINERS: add maintainer for SD-FEC support Dragan Cvetic
2019-03-19 12:17 ` [PATCH 00/12] misc: xilinx sd-fec driver Michal Simek
2019-03-19 13:44   ` Dragan Cvetic
2019-03-19 13:51     ` Michal Simek
2019-03-19 13:55       ` Dragan Cvetic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1552997064-432700-7-git-send-email-dragan.cvetic@xilinx.com \
    --to=dragan.cvetic@xilinx.com \
    --cc=arnd@arndb.de \
    --cc=derek.kiernan@xilinx.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michal.simek@xilinx.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).