On 10/10/19 3:35 PM, Kees Cook wrote:
> 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
>> -- 

eh? ^^^^^

anyway,
Tested-by: Randy Dunlap <rdun...@infradead.org>


-- 
~Randy

Reply via email to