On Thu, Oct 10, 2019 at 03:38:42PM -0700, Randy Dunlap wrote: > 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? ^^^^^
Ah, weird. That appears to have come from the original series and I didn't notice! Thanks for catching it. > anyway, > Tested-by: Randy Dunlap <rdun...@infradead.org> Thanks! Jon, do you want me to respin this? -- Kees Cook