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: Dragan Cvetic <dragan.cvetic@xilinx.com>,
Derek Kiernan <derek.kiernan@xilinx.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH 08/12] misc: xilinx_sdfec: Add ability to get/set config
Date: Tue, 19 Mar 2019 12:04:20 +0000 [thread overview]
Message-ID: <1552997064-432700-9-git-send-email-dragan.cvetic@xilinx.com> (raw)
In-Reply-To: <1552997064-432700-1-git-send-email-dragan.cvetic@xilinx.com>
- Add capability to get SD-FEC config data using ioctl
XSDFEC_GET_CONFIG.
- Add capability to set SD-FEC data order using ioctl
SDFEC_SET_ORDER. The order of data blocks can change
from input to output or to be maintained.
- Add capability to set SD-FEC bypass option using ioctl
XSDFEC_SET_BYPASS. The bypass mode is when HW is
configured to skip SD-FEC engine and redirect input
directly to output.
- Add capability to set SD-FEC active state using ioctl
XSDFEC_IS_ACTIVE. Support for ioctl which puts SD-FEC
in active or non-active state.
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 | 86 ++++++++++++++++++++++++++++++++++++++++
include/uapi/misc/xilinx_sdfec.h | 57 ++++++++++++++++++++++++++
2 files changed, 143 insertions(+)
diff --git a/drivers/misc/xilinx_sdfec.c b/drivers/misc/xilinx_sdfec.c
index 088ad9d..e980b70 100644
--- a/drivers/misc/xilinx_sdfec.c
+++ b/drivers/misc/xilinx_sdfec.c
@@ -309,6 +309,19 @@ static int xsdfec_dev_release(struct inode *iptr, struct file *fptr)
return 0;
}
+static int xsdfec_get_config(struct xsdfec_dev *xsdfec, void __user *arg)
+{
+ int err;
+
+ err = copy_to_user(arg, &xsdfec->config, sizeof(xsdfec->config));
+ if (err) {
+ dev_err(xsdfec->dev, "%s failed for SDFEC%d", __func__,
+ xsdfec->config.fec_id);
+ err = -EFAULT;
+ }
+ return err;
+}
+
static int xsdfec_set_turbo(struct xsdfec_dev *xsdfec, void __user *arg)
{
struct xsdfec_turbo turbo;
@@ -670,6 +683,67 @@ static int xsdfec_add_ldpc(struct xsdfec_dev *xsdfec, void __user *arg)
return ret;
}
+static int xsdfec_set_order(struct xsdfec_dev *xsdfec, void __user *arg)
+{
+ bool order_invalid;
+ enum xsdfec_order order = *((enum xsdfec_order *)arg);
+
+ order_invalid = (order != XSDFEC_MAINTAIN_ORDER) &&
+ (order != XSDFEC_OUT_OF_ORDER);
+ if (order_invalid) {
+ dev_err(xsdfec->dev, "%s invalid order value %d for SDFEC%d",
+ __func__, order, xsdfec->config.fec_id);
+ return -EINVAL;
+ }
+
+ /* Verify Device has not started */
+ if (xsdfec->state == XSDFEC_STARTED) {
+ dev_err(xsdfec->dev,
+ "%s attempting to set Order while started for SDFEC%d",
+ __func__, xsdfec->config.fec_id);
+ return -EIO;
+ }
+
+ xsdfec_regwrite(xsdfec, XSDFEC_ORDER_ADDR, order);
+
+ xsdfec->config.order = order;
+
+ return 0;
+}
+
+static int xsdfec_set_bypass(struct xsdfec_dev *xsdfec, bool __user *arg)
+{
+ bool bypass = *arg;
+
+ /* Verify Device has not started */
+ if (xsdfec->state == XSDFEC_STARTED) {
+ dev_err(xsdfec->dev,
+ "%s attempting to set bypass while started for SDFEC%d",
+ __func__, xsdfec->config.fec_id);
+ return -EIO;
+ }
+
+ if (bypass)
+ xsdfec_regwrite(xsdfec, XSDFEC_BYPASS_ADDR, 1);
+ else
+ xsdfec_regwrite(xsdfec, XSDFEC_BYPASS_ADDR, 0);
+
+ xsdfec->config.bypass = bypass;
+
+ return 0;
+}
+
+static int xsdfec_is_active(struct xsdfec_dev *xsdfec, bool __user *is_active)
+{
+ u32 reg_value;
+
+ reg_value = xsdfec_regread(xsdfec, XSDFEC_ACTIVE_ADDR);
+ /* using a double ! operator instead of casting */
+ *is_active = !!(reg_value & XSDFEC_IS_ACTIVITY_SET);
+
+ return 0;
+}
+
static u32
xsdfec_translate_axis_width_cfg_val(enum xsdfec_axis_width axis_width_cfg)
{
@@ -771,6 +845,9 @@ static long xsdfec_dev_ioctl(struct file *fptr, unsigned int cmd,
}
switch (cmd) {
+ case XSDFEC_GET_CONFIG:
+ rval = xsdfec_get_config(xsdfec, arg);
+ break;
case XSDFEC_SET_TURBO:
rval = xsdfec_set_turbo(xsdfec, arg);
break;
@@ -780,6 +857,15 @@ static long xsdfec_dev_ioctl(struct file *fptr, unsigned int cmd,
case XSDFEC_ADD_LDPC_CODE_PARAMS:
rval = xsdfec_add_ldpc(xsdfec, arg);
break;
+ case XSDFEC_SET_ORDER:
+ rval = xsdfec_set_order(xsdfec, arg);
+ break;
+ case XSDFEC_SET_BYPASS:
+ rval = xsdfec_set_bypass(xsdfec, arg);
+ break;
+ case XSDFEC_IS_ACTIVE:
+ rval = xsdfec_is_active(xsdfec, (bool __user *)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 b70dbff..c6584a4 100644
--- a/include/uapi/misc/xilinx_sdfec.h
+++ b/include/uapi/misc/xilinx_sdfec.h
@@ -310,6 +310,19 @@ xsdfec_calculate_shared_ldpc_table_entry_size(struct xsdfec_ldpc_params *ldpc,
#define XSDFEC_ADD_LDPC_CODE_PARAMS \
_IOW(XSDFEC_MAGIC, 5, struct xsdfec_ldpc_params *)
/**
+ * DOC: XSDFEC_GET_CONFIG
+ * @Parameters
+ *
+ * @struct xsdfec_config *
+ * Pointer to the &struct xsdfec_config that contains the current
+ * configuration settings of the SD-FEC Block
+ *
+ * @Description
+ *
+ * ioctl that returns SD-FEC core configuration
+ */
+#define XSDFEC_GET_CONFIG _IOR(XSDFEC_MAGIC, 6, struct xsdfec_config *)
+/**
* DOC: XSDFEC_GET_TURBO
* @Parameters
*
@@ -322,4 +335,48 @@ xsdfec_calculate_shared_ldpc_table_entry_size(struct xsdfec_ldpc_params *ldpc,
* ioctl that returns SD-FEC turbo param values
*/
#define XSDFEC_GET_TURBO _IOR(XSDFEC_MAGIC, 7, struct xsdfec_turbo *)
+/**
+ * DOC: XSDFEC_SET_ORDER
+ * @Parameters
+ *
+ * @struct unsigned long *
+ * Pointer to the unsigned long that contains a value from the
+ * @enum xsdfec_order
+ *
+ * @Description
+ *
+ * ioctl that sets order, if order of blocks can change from input to output
+ *
+ * This can only be used when the driver is in the XSDFEC_STOPPED state
+ */
+#define XSDFEC_SET_ORDER _IOW(XSDFEC_MAGIC, 8, unsigned long *)
+/**
+ * DOC: XSDFEC_SET_BYPASS
+ * @Parameters
+ *
+ * @struct bool *
+ * Pointer to bool that sets the bypass value, where false results in
+ * normal operation and false results in the SD-FEC performing the
+ * configured operations (same number of cycles) but output data matches
+ * the input data
+ *
+ * @Description
+ *
+ * ioctl that sets bypass.
+ *
+ * This can only be used when the driver is in the XSDFEC_STOPPED state
+ */
+#define XSDFEC_SET_BYPASS _IOW(XSDFEC_MAGIC, 9, bool *)
+/**
+ * DOC: XSDFEC_IS_ACTIVE
+ * @Parameters
+ *
+ * @struct bool *
+ * Pointer to bool that returns true if the SD-FEC is processing data
+ *
+ * @Description
+ *
+ * ioctl that determines if SD-FEC is processing data
+ */
+#define XSDFEC_IS_ACTIVE _IOR(XSDFEC_MAGIC, 10, bool *)
#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.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev 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 ` [PATCH 06/12] misc: xilinx_sdfec: Add ability to configure turbo mode Dragan Cvetic
2019-03-19 12:04 ` [PATCH 07/12] misc: xilinx_sdfec: Add ability to configure LDPC Dragan Cvetic
2019-03-19 12:04 ` Dragan Cvetic [this message]
2019-03-19 13:05 ` [PATCH 08/12] misc: xilinx_sdfec: Add ability to get/set config 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-9-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).