On Wed, Oct 02, 2019 at 10:03:55AM -0700, Kees Cook wrote:
> From: Derek Kiernan <derek.kier...@xilinx.com>
> 
> Add SD-FEC driver documentation.
> 
> Signed-off-by: Derek Kiernan <derek.kier...@xilinx.com>
> Signed-off-by: Dragan Cvetic <dragan.cve...@xilinx.com>
> Link: 
> https://lore.kernel.org/r/1560274185-264438-11-git-send-email-dragan.cve...@xilinx.com
> [kees: extracted from v7 as it was missing in the commit for v8]
> Signed-off-by: Kees Cook <keesc...@chromium.org>
> ---
> As mentioned[1], this file went missing and causes a warning in ReST
> parsing, so I've extracted the patch and am sending it directly to Jon.
> [1] https://lore.kernel.org/lkml/201909231450.4C6CF32@keescook/
> ---

friendly ping! :)

-Kees

>  Documentation/misc-devices/xilinx_sdfec.rst | 291 ++++++++++++++++++++
>  1 file changed, 291 insertions(+)
>  create mode 100644 Documentation/misc-devices/xilinx_sdfec.rst
> 
> diff --git a/Documentation/misc-devices/xilinx_sdfec.rst 
> b/Documentation/misc-devices/xilinx_sdfec.rst
> new file mode 100644
> index 000000000000..87966e3aa5fe
> --- /dev/null
> +++ b/Documentation/misc-devices/xilinx_sdfec.rst
> @@ -0,0 +1,291 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +====================
> +Xilinx SD-FEC Driver
> +====================
> +
> +Overview
> +========
> +
> +This driver supports SD-FEC Integrated Block for Zynq |Ultrascale+ (TM)| 
> RFSoCs.
> +
> +.. |Ultrascale+ (TM)| unicode:: Ultrascale+ U+2122
> +   .. with trademark sign
> +
> +For a full description of SD-FEC core features, see the `SD-FEC Product 
> Guide (PG256) 
> <https://www.xilinx.com/cgi-bin/docs/ipdoc?c=sd_fec;v=latest;d=pg256-sdfec-integrated-block.pdf>`_
> +
> +This driver supports the following features:
> +
> +  - Retrieval of the Integrated Block configuration and status information
> +  - Configuration of LDPC codes
> +  - Configuration of Turbo decoding
> +  - Monitoring errors
> +
> +Missing features, known issues, and limitations of the SD-FEC driver are as
> +follows:
> +
> +  - Only allows a single open file handler to any instance of the driver at 
> any time
> +  - Reset of the SD-FEC Integrated Block is not controlled by this driver
> +  - Does not support shared LDPC code table wraparound
> +
> +The device tree entry is described in:
> +`linux-xlnx/Documentation/devicetree/bindings/misc/xlnx,sd-fec.txt 
> <https://github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/misc/xlnx%2Csd-fec.txt>`_
> +
> +
> +Modes of Operation
> +------------------
> +
> +The driver works with the SD-FEC core in two modes of operation:
> +
> +  - Run-time configuration
> +  - Programmable Logic (PL) initialization
> +
> +
> +Run-time Configuration
> +~~~~~~~~~~~~~~~~~~~~~~
> +
> +For Run-time configuration the role of driver is to allow the software 
> application to do the following:
> +
> +     - Load the configuration parameters for either Turbo decode or LDPC 
> encode or decode
> +     - Activate the SD-FEC core
> +     - Monitor the SD-FEC core for errors
> +     - Retrieve the status and configuration of the SD-FEC core
> +
> +Programmable Logic (PL) Initialization
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +For PL initialization, supporting logic loads configuration parameters for 
> either
> +the Turbo decode or LDPC encode or decode.  The role of the driver is to 
> allow
> +the software application to do the following:
> +
> +     - Activate the SD-FEC core
> +     - Monitor the SD-FEC core for errors
> +     - Retrieve the status and configuration of the SD-FEC core
> +
> +
> +Driver Structure
> +================
> +
> +The driver provides a platform device where the ``probe`` and ``remove``
> +operations are provided.
> +
> +  - probe: Updates configuration register with device-tree entries plus 
> determines the current activate state of the core, for example, is the core 
> bypassed or has the core been started.
> +
> +
> +The driver defines the following driver file operations to provide user
> +application interfaces:
> +
> +  - open: Implements restriction that only a single file descriptor can be 
> open per SD-FEC instance at any time
> +  - release: Allows another file descriptor to be open, that is after 
> current file descriptor is closed
> +  - poll: Provides a method to monitor for SD-FEC Error events
> +  - unlocked_ioctl: Provides the the following ioctl commands that allows 
> the application configure the SD-FEC core:
> +
> +             - :c:macro:`XSDFEC_START_DEV`
> +             - :c:macro:`XSDFEC_STOP_DEV`
> +             - :c:macro:`XSDFEC_GET_STATUS`
> +             - :c:macro:`XSDFEC_SET_IRQ`
> +             - :c:macro:`XSDFEC_SET_TURBO`
> +             - :c:macro:`XSDFEC_ADD_LDPC_CODE_PARAMS`
> +             - :c:macro:`XSDFEC_GET_CONFIG`
> +             - :c:macro:`XSDFEC_SET_ORDER`
> +             - :c:macro:`XSDFEC_SET_BYPASS`
> +             - :c:macro:`XSDFEC_IS_ACTIVE`
> +             - :c:macro:`XSDFEC_CLEAR_STATS`
> +             - :c:macro:`XSDFEC_SET_DEFAULT_CONFIG`
> +
> +
> +Driver Usage
> +============
> +
> +
> +Overview
> +--------
> +
> +After opening the driver, the user should find out what operations need to be
> +performed to configure and activate the SD-FEC core and determine the
> +configuration of the driver.
> +The following outlines the flow the user should perform:
> +
> +  - Determine Configuration
> +  - Set the order, if not already configured as desired
> +  - Set Turbo decode, LPDC encode or decode parameters, depending on how the
> +    SD-FEC core is configured plus if the SD-FEC has not been configured for 
> PL
> +    initialization
> +  - Enable interrupts, if not already enabled
> +  - Bypass the SD-FEC core, if required
> +  - Start the SD-FEC core if not already started
> +  - Get the SD-FEC core status
> +  - Monitor for interrupts
> +  - Stop the SD-FEC core
> +
> +
> +Note: When monitoring for interrupts if a critical error is detected where a 
> reset is required, the driver will be required to load the default 
> configuration.
> +
> +
> +Determine Configuration
> +-----------------------
> +
> +Determine the configuration of the SD-FEC core by using the ioctl
> +:c:macro:`XSDFEC_GET_CONFIG`.
> +
> +Set the Order
> +-------------
> +
> +Setting the order determines how the order of Blocks can change from input 
> to output.
> +
> +Setting the order is done by using the ioctl :c:macro:`XSDFEC_SET_ORDER`
> +
> +Setting the order can only be done if the following restrictions are met:
> +
> +     - The ``state`` member of struct :c:type:`xsdfec_status 
> <xsdfec_status>` filled by the ioctl :c:macro:`XSDFEC_GET_STATUS` indicates 
> the SD-FEC core has not STARTED
> +
> +
> +Add LDPC Codes
> +--------------
> +
> +The following steps indicate how to add LDPC codes to the SD-FEC core:
> +
> +     - Use the auto-generated parameters to fill the :c:type:`struct 
> xsdfec_ldpc_params <xsdfec_ldpc_params>` for the desired LDPC code.
> +     - Set the SC, QA, and LA table offsets for the LPDC parameters and the 
> parameters in the structure :c:type:`struct xsdfec_ldpc_params 
> <xsdfec_ldpc_params>`
> +     - Set the desired Code Id value in the structure :c:type:`struct 
> xsdfec_ldpc_params <xsdfec_ldpc_params>`
> +     - Add the LPDC Code Parameters using the ioctl 
> :c:macro:`XSDFEC_ADD_LDPC_CODE_PARAMS`
> +     - For the applied LPDC Code Parameter use the function 
> :c:func:`xsdfec_calculate_shared_ldpc_table_entry_size` to calculate the size 
> of shared LPDC code tables. This allows the user to determine the shared 
> table usage so when selecting the table offsets for the next LDPC code 
> parameters unused table areas can be selected.
> +     - Repeat for each LDPC code parameter.
> +
> +Adding LDPC codes can only be done if the following restrictions are met:
> +
> +     - The ``code`` member of :c:type:`struct xsdfec_config <xsdfec_config>` 
> filled by the ioctl :c:macro:`XSDFEC_GET_CONFIG` indicates the SD-FEC core is 
> configured as LDPC
> +     - The ``code_wr_protect`` of :c:type:`struct xsdfec_config 
> <xsdfec_config>` filled by the ioctl :c:macro:`XSDFEC_GET_CONFIG` indicates 
> that write protection is not enabled
> +     - The ``state`` member of struct :c:type:`xsdfec_status 
> <xsdfec_status>` filled by the ioctl :c:macro:`XSDFEC_GET_STATUS` indicates 
> the SD-FEC core has not started
> +
> +Set Turbo Decode
> +----------------
> +
> +Configuring the Turbo decode parameters is done by using the ioctl 
> :c:macro:`XSDFEC_SET_TURBO` using auto-generated parameters to fill the 
> :c:type:`struct xsdfec_turbo <xsdfec_turbo>` for the desired Turbo code.
> +
> +Adding Turbo decode can only be done if the following restrictions are met:
> +
> +     - The ``code`` member of :c:type:`struct xsdfec_config <xsdfec_config>` 
> filled by the ioctl :c:macro:`XSDFEC_GET_CONFIG` indicates the SD-FEC core is 
> configured as TURBO
> +     - The ``state`` member of struct :c:type:`xsdfec_status 
> <xsdfec_status>` filled by the ioctl :c:macro:`XSDFEC_GET_STATUS` indicates 
> the SD-FEC core has not STARTED
> +
> +Enable Interrupts
> +-----------------
> +
> +Enabling or disabling interrupts is done by using the ioctl 
> :c:macro:`XSDFEC_SET_IRQ`. The members of the parameter passed, 
> :c:type:`struct xsdfec_irq <xsdfec_irq>`, to the ioctl are used to set and 
> clear different categories of interrupts. The category of interrupt is 
> controlled as following:
> +
> +  - ``enable_isr`` controls the ``tlast`` interrupts
> +  - ``enable_ecc_isr`` controls the ECC interrupts
> +
> +If the ``code`` member of :c:type:`struct xsdfec_config <xsdfec_config>` 
> filled by the ioctl :c:macro:`XSDFEC_GET_CONFIG` indicates the SD-FEC core is 
> configured as TURBO then the enabling ECC errors is not required.
> +
> +Bypass the SD-FEC
> +-----------------
> +
> +Bypassing the SD-FEC is done by using the ioctl :c:macro:`XSDFEC_SET_BYPASS`
> +
> +Bypassing the SD-FEC can only be done if the following restrictions are met:
> +
> +     - The ``state`` member of :c:type:`struct xsdfec_status 
> <xsdfec_status>` filled by the ioctl :c:macro:`XSDFEC_GET_STATUS` indicates 
> the SD-FEC core has not STARTED
> +
> +Start the SD-FEC core
> +---------------------
> +
> +Start the SD-FEC core by using the ioctl :c:macro:`XSDFEC_START_DEV`
> +
> +Get SD-FEC Status
> +-----------------
> +
> +Get the SD-FEC status of the device by using the ioctl 
> :c:macro:`XSDFEC_GET_STATUS`, which will fill the :c:type:`struct 
> xsdfec_status <xsdfec_status>`
> +
> +Monitor for Interrupts
> +----------------------
> +
> +     - Use the poll system call to monitor for an interrupt. The poll system 
> call waits for an interrupt to wake it up or times out if no interrupt occurs.
> +     - On return Poll ``revents`` will indicate whether stats and/or state 
> have been updated
> +             - ``POLLPRI`` indicates a critical error and the user should 
> use :c:macro:`XSDFEC_GET_STATUS` and :c:macro:`XSDFEC_GET_STATS` to confirm
> +             - ``POLLRDNORM`` indicates a non-critical error has occurred 
> and the user should use  :c:macro:`XSDFEC_GET_STATS` to confirm
> +     - Get stats by using the ioctl :c:macro:`XSDFEC_GET_STATS`
> +             - For critical error the ``isr_err_count`` or ``uecc_count`` 
> member  of :c:type:`struct xsdfec_stats <xsdfec_stats>` is non-zero
> +             - For non-critical errors the ``cecc_count`` member of 
> :c:type:`struct xsdfec_stats <xsdfec_stats>` is non-zero
> +     - Get state by using the ioctl :c:macro:`XSDFEC_GET_STATUS`
> +             - For a critical error the ``state`` of :c:type:`xsdfec_status 
> <xsdfec_status>` will indicate a Reset Is Required
> +     - Clear stats by using the ioctl :c:macro:`XSDFEC_CLEAR_STATS`
> +
> +If a critical error is detected where a reset is required. The application 
> is required to call the ioctl :c:macro:`XSDFEC_SET_DEFAULT_CONFIG`, after the 
> reset and it is not required to call the ioctl :c:macro:`XSDFEC_STOP_DEV`
> +
> +Note: Using poll system call prevents busy looping using 
> :c:macro:`XSDFEC_GET_STATS` and :c:macro:`XSDFEC_GET_STATUS`
> +
> +Stop the SD-FEC Core
> +---------------------
> +
> +Stop the device by using the ioctl :c:macro:`XSDFEC_STOP_DEV`
> +
> +Set the Default Configuration
> +-----------------------------
> +
> +Load default configuration by using the ioctl 
> :c:macro:`XSDFEC_SET_DEFAULT_CONFIG` to restore the driver.
> +
> +Limitations
> +-----------
> +
> +Users should not duplicate SD-FEC device file handlers, for example fork() 
> or dup() a process that has a created an SD-FEC file handler.
> +
> +Driver IOCTLs
> +==============
> +
> +.. c:macro:: XSDFEC_START_DEV
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_START_DEV
> +
> +.. c:macro:: XSDFEC_STOP_DEV
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_STOP_DEV
> +
> +.. c:macro:: XSDFEC_GET_STATUS
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_GET_STATUS
> +
> +.. c:macro:: XSDFEC_SET_IRQ
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_SET_IRQ
> +
> +.. c:macro:: XSDFEC_SET_TURBO
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_SET_TURBO
> +
> +.. c:macro:: XSDFEC_ADD_LDPC_CODE_PARAMS
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_ADD_LDPC_CODE_PARAMS
> +
> +.. c:macro:: XSDFEC_GET_CONFIG
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_GET_CONFIG
> +
> +.. c:macro:: XSDFEC_SET_ORDER
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_SET_ORDER
> +
> +.. c:macro:: XSDFEC_SET_BYPASS
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_SET_BYPASS
> +
> +.. c:macro:: XSDFEC_IS_ACTIVE
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_IS_ACTIVE
> +
> +.. c:macro:: XSDFEC_CLEAR_STATS
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_CLEAR_STATS
> +
> +.. c:macro:: XSDFEC_GET_STATS
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_GET_STATS
> +
> +.. c:macro:: XSDFEC_SET_DEFAULT_CONFIG
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :doc: XSDFEC_SET_DEFAULT_CONFIG
> +
> +Driver Type Definitions
> +=======================
> +
> +.. kernel-doc:: include/uapi/misc/xilinx_sdfec.h
> +   :internal:
> \ No newline at end of file
> -- 
> 2.17.1
> 
> 
> -- 
> Kees Cook

-- 
Kees Cook

Reply via email to