27 May, 2020

3 commits

  • This code was using get_user_pages*(), in approximately a "Case 1"
    scenario (Direct IO), using the categorization from [1]. That means
    that it's time to convert the get_user_pages*() + put_page() calls to
    pin_user_pages*() + unpin_user_pages() calls.

    There is some helpful background in [2]: basically, this is a small
    part of fixing a long-standing disconnect between pinning pages, and
    file systems' use of those pages.

    [1] Documentation/core-api/pin_user_pages.rst

    [2] "Explicit pinning of user-space pages":
    https://lwn.net/Articles/807108/

    Cc: Derek Kiernan
    Cc: Dragan Cvetic
    Cc: Arnd Bergmann
    Cc: Greg Kroah-Hartman
    Cc: Michal Simek
    Cc: linux-arm-kernel@lists.infradead.org
    Signed-off-by: John Hubbard
    Link: https://lore.kernel.org/r/20200527012628.1100649-4-jhubbard@nvidia.com
    Signed-off-by: Greg Kroah-Hartman

    John Hubbard
     
  • Return 0 for success, rather than the value of an incrementing
    "reg" index. The reg value was never actually used, so this
    simplifies the caller slightly.

    Cc: Derek Kiernan
    Cc: Dragan Cvetic
    Cc: Arnd Bergmann
    Cc: Greg Kroah-Hartman
    Cc: Michal Simek
    Cc: linux-arm-kernel@lists.infradead.org
    Signed-off-by: John Hubbard
    Link: https://lore.kernel.org/r/20200527012628.1100649-3-jhubbard@nvidia.com
    Signed-off-by: Greg Kroah-Hartman

    John Hubbard
     
  • This fixes the case of get_user_pages_fast() returning a -errno.
    The result needs to be stored in a signed integer. And for safe
    signed/unsigned comparisons, it's best to keep everything signed.
    And get_user_pages_fast() also expects a signed value for number
    of pages to pin.

    Therefore, change most relevant variables, from u32 to int. Leave
    "n" unsigned, for convenience in checking for overflow. And provide
    a WARN_ON_ONCE() and early return, if overflow occurs.

    Also, as long as we're tidying up: rename the page array from page,
    to pages, in order to match the conventions used in most other call
    sites.

    Fixes: 20ec628e8007e ("misc: xilinx_sdfec: Add ability to configure LDPC")
    Cc: Derek Kiernan
    Cc: Dragan Cvetic
    Cc: Arnd Bergmann
    Cc: Greg Kroah-Hartman
    Cc: Michal Simek
    Cc: linux-arm-kernel@lists.infradead.org
    Signed-off-by: John Hubbard
    Link: https://lore.kernel.org/r/20200527012628.1100649-2-jhubbard@nvidia.com
    Signed-off-by: Greg Kroah-Hartman

    John Hubbard
     

15 May, 2020

1 commit

  • The driver init and exit function don't do anything besides registering
    and unregistering the platform driver, so the module_platform_driver()
    macro could just be used instead of having separate functions.

    Signed-off-by: Harshal Chaudhari
    Acked-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/20200510164308.31358-1-harshalchau04@gmail.com
    Signed-off-by: Greg Kroah-Hartman

    Harshal Chaudhari
     

23 Apr, 2020

1 commit

  • Fix coccicheck warning which recommends to use memdup_user().

    This patch fixes the following coccicheck warnings:

    drivers/misc/xilinx_sdfec.c:652:8-15: WARNING opportunity for memdup_user

    Reported-by: Hulk Robot
    Signed-off-by: Zou Wei
    Link: https://lore.kernel.org/r/1587524330-119776-1-git-send-email-zou_wei@huawei.com
    Signed-off-by: Greg Kroah-Hartman

    Zou Wei
     

14 Jan, 2020

2 commits

  • xsdfec_poll() is defined as returning 'unsigned int' but the
    .poll method is declared as returning '__poll_t', a bitwise type.

    Fix this by using the proper return type and using the EPOLL
    constants instead of the POLL ones, as required for __poll_t.

    CC: Derek Kiernan
    CC: Dragan Cvetic
    Signed-off-by: Luc Van Oostenryck
    Acked-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/20191209213655.57985-1-luc.vanoostenryck@gmail.com
    Signed-off-by: Greg Kroah-Hartman

    Luc Van Oostenryck
     
  • The second arg of xsdfec_set_order() is a 'void __user *'
    and this pointer is then used in get_user() which expect
    a __user pointer.

    But get_user() can't be used with a void pointer, it a
    pointer to the effective type. This is done here by casting
    the argument to a pointer to the effective type but the
    __user is missing in the cast.

    Fix this by adding the missing __user in the cast.

    CC: Derek Kiernan
    CC: Dragan Cvetic
    Signed-off-by: Luc Van Oostenryck
    Acked-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/20191209213719.58037-1-luc.vanoostenryck@gmail.com
    Signed-off-by: Greg Kroah-Hartman

    Luc Van Oostenryck
     

23 Aug, 2019

5 commits

  • There is a spelling mistake in a dev_dbg message, fix it.

    Signed-off-by: Colin Ian King
    Reviewed-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/20190819094137.390-1-colin.king@canonical.com
    Signed-off-by: Greg Kroah-Hartman

    Colin Ian King
     
  • The checking here needs to handle integer overflows because "offset" and
    "len" come from the user.

    Fixes: 20ec628e8007 ("misc: xilinx_sdfec: Add ability to configure LDPC")
    Signed-off-by: Dan Carpenter
    Reviewed-by: Michal Simek
    Reviewed-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/20190821071122.GD26957@mwanda
    Signed-off-by: Greg Kroah-Hartman

    Dan Carpenter
     
  • The "psize" value comes from the user so we need to verify that it's
    non-zero before we check if "n % psize" or it will crash.

    Fixes: 20ec628e8007 ("misc: xilinx_sdfec: Add ability to configure LDPC")
    Signed-off-by: Dan Carpenter
    Reviewed-by: Michal Simek
    Link: https://lore.kernel.org/r/20190821070953.GC26957@mwanda
    Signed-off-by: Greg Kroah-Hartman

    Dan Carpenter
     
  • The copy_from_user() function returns the number of bytes remaining to
    be copied but we want to return -EFAULT to the user.

    Fixes: 20ec628e8007 ("misc: xilinx_sdfec: Add ability to configure LDPC")
    Signed-off-by: Dan Carpenter
    Reviewed-by: Michal Simek
    Reviewed-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/20190822083105.GI3964@kadam
    Signed-off-by: Greg Kroah-Hartman

    Dan Carpenter
     
  • These structs have holes in them so we end up disclosing a few bytes of
    uninitialized stack data.

    drivers/misc/xilinx_sdfec.c:305 xsdfec_get_status() warn: check that 'status' doesn't leak information (struct has a hole after 'activity')
    drivers/misc/xilinx_sdfec.c:449 xsdfec_get_turbo() warn: check that 'turbo_params' doesn't leak information (struct has a hole after 'scale')

    We need to zero out the holes with memset().

    Fixes: 6bd6a690c2e7 ("misc: xilinx_sdfec: Add stats & status ioctls")
    Signed-off-by: Dan Carpenter
    Reviewed-by: Dragan Cvetic
    Reviewed-by: Michal Simek
    Link: https://lore.kernel.org/r/20190821070606.GA26957@mwanda
    Signed-off-by: Greg Kroah-Hartman

    Dan Carpenter
     

15 Aug, 2019

7 commits

  • This driver does not use the lookup abilities of the IDR, so convert it
    to the more space-efficient IDA.

    Signed-off-by: Matthew Wilcox (Oracle)
    Link: https://lore.kernel.org/r/20190807025050.28367-1-willy@infradead.org
    Signed-off-by: Greg Kroah-Hartman

    Matthew Wilcox (Oracle)
     
  • SD-FEC statistic data are:
    - count of data interface errors (isr_err_count)
    - count of Correctable ECC errors (cecc_count)
    - count of Uncorrectable ECC errors (uecc_count)

    Add support:
    1. clear stats ioctl callback which clears collected
    statistic data,
    2. get stats ioctl callback which reads a collected
    statistic data,
    3. set default configuration ioctl callback,
    4. start ioctl callback enables SD-FEC HW,
    5. stop ioctl callback disables SD-FEC HW.

    In a failed state driver enables the following ioctls:
    - get status
    - get statistics
    - clear stats
    - set default SD-FEC device configuration

    Tested-by: Santhosh Dyavanapally
    Tested by: Punnaiah Choudary Kalluri
    Tested-by: Derek Kiernan
    Tested-by: Dragan Cvetic
    Signed-off-by: Derek Kiernan
    Signed-off-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/1564216438-322406-7-git-send-email-dragan.cvetic@xilinx.com
    Signed-off-by: Greg Kroah-Hartman

    Dragan Cvetic
     
  • Support monitoring and detecting the SD-FEC error events
    through IRQ and poll file operation.

    The SD-FEC device can detect one-error or multi-error events.
    An error triggers an interrupt which creates and run the ONE_SHOT
    IRQ thread.
    The ONE_SHOT IRQ thread detects type of error and pass that
    information to the poll function.
    The file_operation callback poll(), collects the events and
    updates the statistics accordingly.
    The function poll blocks() on waiting queue which can be
    unblocked by ONE_SHOT IRQ handling thread.

    Support SD-FEC interrupt set ioctl callback.
    The SD-FEC can detect two type of errors: coding errors (ECC) and
    a data interface errors (TLAST).
    The errors are events which can trigger an IRQ if enabled.
    The driver can monitor and detect these errors through IRQ.
    Also the driver updates the statistical data.

    Tested-by: Dragan Cvetic
    Signed-off-by: Derek Kiernan
    Signed-off-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/1564216438-322406-6-git-send-email-dragan.cvetic@xilinx.com
    Signed-off-by: Greg Kroah-Hartman

    Dragan Cvetic
     
  • - 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.

    - Add capability to set SD-FEC bypass option using ioctl
    XSDFEC_SET_BYPASS.

    - Add capability to set SD-FEC active state using ioctl
    XSDFEC_IS_ACTIVE.

    Tested-by: Dragan Cvetic
    Signed-off-by: Derek Kiernan
    Signed-off-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/1564216438-322406-5-git-send-email-dragan.cvetic@xilinx.com
    Signed-off-by: Greg Kroah-Hartman

    Dragan Cvetic
     
  • Add the capability to configure LDPC mode via the ioctl
    XSDFEC_ADD_LDPC_CODE_PARAMS.

    Tested-by: Dragan Cvetic
    Signed-off-by: Derek Kiernan
    Signed-off-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/1564216438-322406-4-git-send-email-dragan.cvetic@xilinx.com
    Signed-off-by: Greg Kroah-Hartman

    Dragan Cvetic
     
  • Add the capability to configure and retrieve turbo mode
    via the ioctls XSDFEC_SET_TURBO and XSDFEC_GET_TURBO.
    Add char device interface per DT node present and support
    file operations:
    - open(),
    - close(),
    - unlocked_ioctl(),
    - compat_ioctl().

    Tested-by: Dragan Cvetic
    Signed-off-by: Derek Kiernan
    Signed-off-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/1564216438-322406-3-git-send-email-dragan.cvetic@xilinx.com
    Signed-off-by: Greg Kroah-Hartman

    Dragan Cvetic
     
  • Stores configuration based on parameters from the DT
    node and values from the SD-FEC core plus reads
    the default state from the SD-FEC core. To obtain
    values from the core register read, write capabilities
    have been added plus related register map details.

    Tested-by: Dragan Cvetic
    Signed-off-by: Derek Kiernan
    Signed-off-by: Dragan Cvetic
    Link: https://lore.kernel.org/r/1564216438-322406-2-git-send-email-dragan.cvetic@xilinx.com
    Signed-off-by: Greg Kroah-Hartman

    Dragan Cvetic
     

21 Jun, 2019

2 commits

  • Add the support for Linux Clock Control Framework (CCF).
    Registers and enables clocks with the Clock Control
    Framework (CCF), to prevent shared clocks from been
    disabled.

    Tested-by: Dragan Cvetic
    Signed-off-by: Derek Kiernan
    Signed-off-by: Dragan Cvetic
    Signed-off-by: Greg Kroah-Hartman

    Dragan Cvetic
     
  • Implement a platform driver that matches with xlnx,
    sd-fec-1.1 device tree node and registers as a character
    device, including:
    - SD-FEC driver binds to sdfec DT node.
    - creates and initialise an initial driver dev structure.
    - add the driver in Linux build and Kconfig.

    Tested-by: Dragan Cvetic
    Signed-off-by: Derek Kiernan
    Signed-off-by: Dragan Cvetic
    Signed-off-by: Greg Kroah-Hartman

    Dragan Cvetic