Skip to content
  1. Jun 18, 2020
    • notro's avatar
      BCM2708: Add core Device Tree support · 292ab07a
      notro authored
      
      
      Add the bare minimum needed to boot BCM2708 from a Device Tree.
      
      Signed-off-by: default avatarNoralf Tronnes <notro@tronnes.org>
      
      BCM2708: DT: change 'axi' nodename to 'soc'
      
      Change DT node named 'axi' to 'soc' so it matches ARCH_BCM2835.
      The VC4 bootloader fills in certain properties in the 'axi' subtree,
      but since this is part of an upstreaming effort, the name is changed.
      
      Signed-off-by: default avatarNoralf Tronnes <notro@tronnes.org>
      
      BCM2708_DT: Correct length of the peripheral space
      
      Use dts-dirs feature for overlays.
      
      The kernel makefiles have a dts-dirs target that is for vendor subdirectories.
      
      Using this fixes the install_dtbs target, which previously did not install the overlays.
      
      BCM270X_DT: configure I2S DMA channels
      
      Signed-off-by: default avatarMatthias Reichl <hias@horus.com>
      
      BCM270X_DT: switch to bcm2835-i2s
      
      I2S soundcard drivers with proper devicetree support (i.e. not linking
      to the cpu_dai/platform via name but to cpu/platform via of_node)
      will work out of the box without any modifications.
      
      When the kernel is compiled without devicetree support the platform
      code will instantiate the bcm2708-i2s driver and I2S soundcard drivers
      will link to it via name, as before.
      
      Signed-off-by: default avatarMatthias Reichl <hias@horus.com>
      
      SDIO-overlay: add poll_once-boolean parameter
      
      Add paramter to toggle sdio-device-polling
      done every second or once at boot-time.
      
      Signed-off-by: default avatarPatrick Boettcher <patrick.boettcher@posteo.de>
      
      BCM270X_DT: Make mmc overlay compatible with current firmware
      
      The original DT overlay logic followed a merge-then-patch procedure,
      i.e. parameters are applied to the loaded overlay before the overlay
      is merged into the base DTB. This sequence has been changed to
      patch-then-merge, in order to support parameterised node names, and
      to protect against bad overlays. As a result, overrides (parameters)
      must only target labels in the overlay, but the overlay can obviously target nodes in the base DTB.
      
      mmc-overlay.dts (that switches back to the original mmc sdcard
      driver) is the only overlay violating that rule, and this patch
      fixes it.
      
      bcm270x_dt: Use the sdhost MMC controller by default
      
      The "mmc" overlay reverts to using the other controller.
      
      squash: Add cprman to dt
      
      BCM270X_DT: Use clk_core for I2C interfaces
      
      BCM270X_DT: Use bcm283x.dtsi, bcm2835.dtsi and bcm2836.dtsi
      
      The mainline Device Tree files are quite close to downstream now.
      Let's use bcm283x.dtsi, bcm2835.dtsi and bcm2836.dtsi as base files
      for our dts files.
      
      Mainline dts files are based on these files:
      
                bcm2835-rpi.dtsi
        bcm2835.dtsi    bcm2836.dtsi
                bcm283x.dtsi
      
      Current downstream are based on these:
      
        bcm2708.dtsi    bcm2709.dtsi    bcm2710.dtsi
                   bcm2708_common.dtsi
      
      This patch introduces this dependency:
      
        bcm2708.dtsi    bcm2709.dtsi
                bcm2708-rpi.dtsi
                bcm270x.dtsi
        bcm2835.dtsi    bcm2836.dtsi
                bcm283x.dtsi
      
      And:
                bcm2710.dtsi
                bcm2708-rpi.dtsi
                bcm270x.dtsi
                bcm283x.dtsi
      
      bcm270x.dtsi contains the downstream bcm283x.dtsi diff.
      bcm2708-rpi.dtsi is the downstream version of bcm2835-rpi.dtsi.
      
      Other changes:
      - The led node has moved from /soc/leds to /leds. This is not a problem
        since the label is used to reference it.
      - The clk_osc reg property changes from 6 to 3.
      - The gpu nodes has their interrupt property set in the base file.
      - the clocks label does not point to the /clocks node anymore, but
        points to the cprman node. This is not a problem since the overlays
        that use the clock node refer to it directly: target-path = "/clocks";
      - some nodes now have 2 labels since mainline and downstream differs in
        this respect: cprman/clocks, spi0/spi, gpu/vc4.
      - some nodes doesn't have an explicit status = "okay" since they're not
        disabled in the base file: watchdog and random.
      - gpiomem doesn't need an explicit status = "okay".
      - bcm2708-rpi-cm.dts got the hpd-gpios property from bcm2708_common.dtsi,
        it's now set directly in that file.
      - bcm2709-rpi-2-b.dts has the timer node moved from /soc/timer to /timer.
      - Removed clock-frequency property on the bcm{2709,2710}.dtsi timer nodes.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      BCM270X_DT: Use raspberrypi-power to turn on USB power
      
      Use the raspberrypi-power driver to turn on USB power.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      BCM270X_DT: Add a .dtbo target, use for overlays
      
      Change the filenames and extensions to keep the pre-DDT style of
      overlay (<name>-overlay.dtb) distinct from new ones that use a
      different style of local fixups (<name>.dtbo), and to match other
      platforms.
      
      The RPi firmware uses the DDTK trailer atom to choose which type of
      overlay to use for each kernel.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      BCM270X_DT: Don't generate "linux,phandle" props
      
      The EPAPR standard says to use "phandle" properties to store phandles,
      rather than the deprecated "linux,phandle" version. By default, dtc
      generates both, but adding "-H epapr" causes it to only generate
      "phandle"s, saving some space and clutter.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      BCM270X_DT: Add overlay for enc28j60 on SPI2
      
      Works on SPI2 for compute module
      
      BCM270X_DT: Add midi-uart0 overlay
      
      MIDI requires 31.25kbaud, a baudrate unsupported by Linux. The
      midi-uart0 overlay configures uart0 (ttyAMA0) to use a fake clock
      so that requesting 38.4kbaud actually gets 31.25kbaud.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      BCM270X_DT: Add i2c-sensor overlay
      
      The i2c-sensor overlay is a container for various pressure and
      temperature sensors, currently bmp085 and bmp280. The standalone
      bmp085_i2c-sensor overlay is now deprecated.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      BCM270X_DT: overlays/*-overlay.dtb -> overlays/*.dtbo (#1752)
      
      We now create overlays as .dtbo files.
      
      build: support for .dtbo files for dtb overlays
      
      Kernel 4.4.6+ on RaspberryPi support .dtbo files for overlays, instead of .dtb.
      Patch the kernel, which has faulty rules to generate .dtbo the way yocto does
      
      Signed-off-by: default avatarHerve Jourdain <herve.jourdain@neuf.fr>
      Signed-off-by: default avatarKhem Raj <raj.khem@gmail.com>
      
      BCM270X: Drop position requirement for CMA in VC4 overlay.
      
      No longer necessary since 2aefcd57
      
      ,
      and will probably let peeople that want to choose a larger CMA
      allocation (particularly on pi0/1).
      
      Signed-off-by: default avatarEric Anholt <eric@anholt.net>
      
      BCM270X_DT: RPi Device Tree tidy
      
      Use the upstream sdhost node, add thermal-zones, and factor out some
      common elements.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      kbuild: Silence unhelpful DTC warnings
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      BCM270X_DT: DT build rules no longer arch-specific
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      292ab07a
    • Noralf Trønnes's avatar
      firmware: bcm2835: Support ARCH_BCM270x · f2aeae84
      Noralf Trønnes authored
      
      
      Support booting without Device Tree.
      Turn on USB power.
      Load driver early because of lacking support for deferred probing
      in many drivers.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      firmware: bcm2835: Don't turn on USB power
      
      The raspberrypi-power driver is now used to turn on USB power.
      
      This partly reverts commit:
      firmware: bcm2835: Support ARCH_BCM270x
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      f2aeae84
    • Noralf Trønnes's avatar
      char: broadcom: Add vcio module · a439d709
      Noralf Trønnes authored
      
      
      Add module for accessing the mailbox property channel through
      /dev/vcio. Was previously in bcm2708-vcio.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      char: vcio: Add compat ioctl handling
      
      There was no compat ioctl handler, so 32 bit userspace on a
      64 bit kernel failed as IOCTL_MBOX_PROPERTY used the size
      of char*.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      
      char: vcio: Fail probe if rpi_firmware is not found.
      
      Device Tree is now the only supported config mechanism, therefore
      uncomment the block of code that fails the probe if the
      firmware node can't be found.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      a439d709
    • popcornmix's avatar
      Add Chris Boot's i2c driver · f9680198
      popcornmix authored
      
      
      i2c-bcm2708: fixed baudrate
      
      Fixed issue where the wrong CDIV value was set for baudrates below 3815 Hz (for 250MHz bus clock).
      In that case the computed CDIV value was more than 0xffff. However the CDIV register width is only 16 bits.
      This resulted in incorrect setting of CDIV and higher baudrate than intended.
      Example: 3500Hz -> CDIV=0x11704 -> CDIV(16bit)=0x1704 -> 42430Hz
      After correction: 3500Hz -> CDIV=0x11704 -> CDIV(16bit)=0xffff -> 3815Hz
      The correct baudrate is shown in the log after the cdiv > 0xffff correction.
      
      Perform I2C combined transactions when possible
      
      Perform I2C combined transactions whenever possible, within the
      restrictions of the Broadcomm Serial Controller.
      
      Disable DONE interrupt during TA poll
      
      Prevent interrupt from being triggered if poll is missed and transfer
      starts and finishes.
      
      i2c: Make combined transactions optional and disabled by default
      
      i2c: bcm2708: add device tree support
      
      Add DT support to driver and add to .dtsi file.
      Setup pins in .dts file.
      i2c is disabled by default.
      
      Signed-off-by: default avatarNoralf Tronnes <notro@tronnes.org>
      
      bcm2708: don't register i2c controllers when using DT
      
      The devices for the i2c controllers are in the Device Tree.
      Only register devices when not using DT.
      
      Signed-off-by: default avatarNoralf Tronnes <notro@tronnes.org>
      
      I2C: Only register the I2C device for the current board revision
      
      i2c_bcm2708: Fix clock reference counting
      
      Fix grabbing lock from atomic context in i2c driver
      
      2 main changes:
      - check for timeouts in the bcm2708_bsc_setup function as indicated by this comment:
            /* poll for transfer start bit (should only take 1-20 polls) */
        This implies that the setup function can now fail so account for this everywhere it's called
      - Removed the clk_get_rate call from inside the setup function as it locks a mutex and that's not ok since we call it from under a spin lock.
      
      i2c-bcm2708: When using DT, leave the GPIO setup to pinctrl
      
      i2c-bcm2708: Increase timeouts to allow larger transfers
      
      Use the timeout value provided by the I2C_TIMEOUT ioctl when waiting
      for completion. The default timeout is 1 second.
      
      See: https://github.com/raspberrypi/linux/issues/260
      
      
      
      i2c-bcm2708/BCM270X_DT: Add support for I2C2
      
      The third I2C bus (I2C2) is normally reserved for HDMI use. Careless
      use of this bus can break an attached display - use with caution.
      
      It is recommended to disable accesses by VideoCore by setting
      hdmi_ignore_edid=1 or hdmi_edid_file=1 in config.txt.
      
      The interface is disabled by default - enable using the
      i2c2_iknowwhatimdoing DT parameter.
      
      bcm2708-spi: Don't use static pin configuration with DT
      
      Also remove superfluous error checking - the SPI framework ensures the
      validity of the chip_select value.
      
      i2c-bcm2708: Remove non-DT support
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      Set the BSC_CLKT clock streching timeout to 35ms as per SMBus specs.
      
      Fixes i2c_bcm2708: Write to FIFO correctly - v2 (#1574)
      
      * i2c: fix i2c_bcm2708: Clear FIFO before sending data
      
      Make sure FIFO gets cleared before trying to send
      data in case of a repeated start (COMBINED=Y).
      
      * i2c: fix i2c_bcm2708: Only write to FIFO when not full
      
      Check if FIFO can accept data before writing.
      To avoid a peripheral read on the last iteration of a loop,
      both bcm2708_bsc_fifo_fill and ~drain are changed as well.
      f9680198
    • popcornmix's avatar
      Add cpufreq driver · 29a9dd5d
      popcornmix authored
      
      
      Signed-off-by: default avatarpopcornmix <popcornmix@gmail.com>
      
      bcm2835-cpufreq: Change licence to GPLv2
      
      Signed-off-by: default avatarEben Upton <eben.upton@broadcom.com>
      Signed-off-by: default avatarDom Cobley <dom@raspberrypi.com>
      29a9dd5d
    • Luke Wren's avatar
      Add SMI driver · fb19d58a
      Luke Wren authored
      
      
      Signed-off-by: default avatarLuke Wren <wren6991@gmail.com>
      
      MISC: bcm2835: smi: use clock manager and fix reload issues
      
      Use clock manager instead of self-made clockmanager.
      
      Also fix some error paths that showd up during development
      (especially missing release of dma resources on rmmod)
      
      Signed-off-by: default avatarMartin Sperl <kernel@martin.sperl.org>
      
      bcm2835_smi: re-add dereference to fix DMA transfers
      fb19d58a
    • Luke Wren's avatar
      Add /dev/gpiomem device for rootless user GPIO access · 178b2301
      Luke Wren authored
      
      
      Signed-off-by: default avatarLuke Wren <luke@raspberrypi.org>
      
      bcm2835-gpiomem: Fix for ARCH_BCM2835 builds
      
      Build on ARCH_BCM2835, and fail to probe if no IO resource.
      
      See: https://github.com/raspberrypi/linux/issues/1154
      178b2301
    • Tim Gover's avatar
      vcsm: VideoCore shared memory service for BCM2835 · df720d3d
      Tim Gover authored
      
      
      Add experimental support for the VideoCore shared memory service.
      This allows user processes to allocate memory from VideoCore's
      GPU relocatable heap and mmap the buffers. Additionally, the memory
      handles can passed to other VideoCore services such as MMAL, OpenMax
      and DispmanX
      
      TODO
      * This driver was originally released for BCM28155 which has a different
        cache architecture to BCM2835. Consequently, in this release only
        uncached mappings are supported. However, there's no fundamental
        reason which cached mappings cannot be support or BCM2835
      * More refactoring is required to remove the typedefs.
      * Re-enable the some of the commented out debug-fs statistics which were
        disabled when migrating code from proc-fs.
      * There's a lot of code to support sharing of VCSM in order to support
        Android. This could probably done more cleanly or perhaps just
        removed.
      
      Signed-off-by: default avatarTim Gover <timgover@gmail.com>
      
      config: Disable VC_SM for now to fix hang with cutdown kernel
      
      vcsm: Use boolean as it cannot be built as module
      
      On building the bcm_vc_sm as a module we get the following error:
      
      v7_dma_flush_range and do_munmap are undefined in vc-sm.ko.
      
      Fix by making it not an option to build as module
      
      vcsm: Add ioctl for custom cache flushing
      
      vc-sm: Move headers out of arch directory
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      vcsm: Treat EBUSY as success rather than SIGBUS
      
      Currently if two cores access the same page concurrently one will return VM_FAULT_NOPAGE
      and the other VM_FAULT_SIGBUS crashing the user code.
      
      Also report when mapping fails.
      
      Signed-off-by: default avatarpopcornmix <popcornmix@gmail.com>
      
      vcsm: Provide new ioctl to clean/invalidate a 2D block
      
      vcsm: Convert to loading via device tree.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      
      VCSM: New option to import a DMABUF for VPU use
      
      Takes a dmabuf, and then calls over to the VPU to wrap
      it into a suitable handle.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      
      vcsm: fix multi-platform build
      
      vcsm: add macros for cache functions
      
      vcsm: use dma APIs for cache functions
      
      * Will handle multi-platform builds
      
      vcsm: Fix up macros to avoid breaking numbers used by existing apps
      
      vcsm: Define cache operation constants in user header
      
      Without this change, users have to use raw values (1, 2, 3) to specify
      cache operation.
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Support for finding user/vc handle in memory pool
      
      vmcs_sm_{usr,vc}_handle_from_pid_and_address() were failing to find
      handle if specified user pointer is not exactly the one that the memory
      locking call returned even if the pointer is in range of map/resource.
      So fixed the functions to match the range.
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Unify cache manipulating functions
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Fix obscure conditions
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Fix memory leaking on clean_invalid2 ioctl handler
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Describe the use of cache operation constants
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Fix obscure conditions again
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Add no-op cache operation constant
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Revert to do page-table-walk-based cache manipulating on some ioctl calls
      
      On FLUSH, INVALID, CLEAN_INVALID ioctl calls, cache operations based on
      page table walk were used in case that the buffer of the cache is not
      pinned.  So reverted to do page-table-based cache manipulating.
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Define cache operation constants in user header
      
      Without this change, users have to use raw values (1, 2, 3) to specify
      cache operation.
      
      Signed-off-by: default avatarSugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
      
      vcsm: Updates for changed vchiq interface
      
      vcsm: Fix an NULL dereference in the import_dmabuf error path
      
      resource was dereferenced even though it was NULL.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      
      vcsm: Use struct service_creation
      
      vcsm: Fix makefile include on out-of-tree builds
      
      The vc_sm module tries to include the 'fs' directory from the
      $(srctree). $(srctree) is already provided by the build system, and
      causes the include path to be duplicated.
      
      With -Werror this fails to compile.
      
      Remove the unnecessary variable.
      
      Signed-off-by: default avatarKieran Bingham <kieran.bingham@ideasonboard.com>
      
      vcsm: Remove set but unused variable
      
      The 'success' variable is set by the call to vchi_service_close() but never checked.
      Remove it, keeping the call in place.
      
      Signed-off-by: default avatarKieran Bingham <kieran.bingham@ideasonboard.com>
      
      vcsm: Reduce scope of local functions
      
      The functions:
      
        vc_vchi_sm_send_msg
        vc_sm_ioctl_alloc
        vc_sm_ioctl_alloc_share
        vc_sm_ioctl_import_dmabuf
      
      Are declared without a prototype. They are not used outside of this
      module, thus - convert them to static functions.
      
      Signed-off-by: default avatarKieran Bingham <kieran.bingham@ideasonboard.com>
      
      vc_sm: Let it support to build in the non-src folder
      
      If we build the kernel with "-O=$non-src-folder", this driver will
      introdcue a building error because of the header's location.
      
      Signed-off-by: default avatarHui Wang <hui.wang@canonical.com>
      df720d3d
    • popcornmix's avatar
      vc_mem: Add vc_mem driver for querying firmware memory addresses · d877b9c4
      popcornmix authored
      
      
      Signed-off-by: default avatarpopcornmix <popcornmix@gmail.com>
      
      BCM270x: Move vc_mem
      
      Make the vc_mem module available for ARCH_BCM2835 by moving it.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      char: vc_mem: Fix up compat ioctls for 64bit kernel
      
      compat_ioctl wasn't defined, so 32bit user/64bit kernel
      always failed.
      VC_MEM_IOC_MEM_PHYS_ADDR was defined with parameter size
      unsigned long, so the ioctl cmd changes between sizes.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      
      char: vc_mem: Fix all coding style issues.
      
      Cleans up all checkpatch errors in vc_mem.c and vc_mem.h
      No functional change to the code.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      d877b9c4
    • Phil Elwell's avatar
      Adding bcm2835-sdhost driver, and an overlay to enable it · d5a03746
      Phil Elwell authored
      BCM2835 has two SD card interfaces. This driver uses the other one.
      
      bcm2835-sdhost: Error handling fix, and code clarification
      
      bcm2835-sdhost: Adding overclocking option
      
      Allow a different clock speed to be substitued for a requested 50MHz.
      This option is exposed using the "overclock_50" DT parameter.
      Note that the sdhost interface is restricted to integer divisions of
      core_freq, and the highest sensible option for a core_freq of 250MHz
      is 84 (250/3 = 83.3MHz), the next being 125 (250/2) which is much too
      high.
      
      Use at your own risk.
      
      bcm2835-sdhost: Round up the overclock, so 62 works for 62.5Mhz
      
      Also only warn once for each overclock setting.
      
      bcm2835-sdhost: Improve error handling and recovery
      
      1) Expose the hw_reset method to the MMC framework, removing many
         internal calls by the driver.
      
      2) Reduce overclock setting on error.
      
      3) Increase timeout to cope with high capacity cards.
      
      4) Add properties and parameters to control pio_limit and debug.
      
      5) Reduce messages at probe time.
      
      bcm2835-sdhost: Further improve overclock back-off
      
      bcm2835-sdhost: Clear HBLC for PIO mode
      
      Also update pio_limit default in overlay README.
      
      bcm2835-sdhost: Add the ERASE capability
      
      See: https://github.com/raspberrypi/linux/issues/1076
      
      
      
      bcm2835-sdhost: Ignore CRC7 for MMC CMD1
      
      It seems that the sdhost interface returns CRC7 errors for CMD1,
      which is the MMC-specific SEND_OP_COND. Returning these errors to
      the MMC layer causes a downward spiral, but ignoring them seems
      to be harmless.
      
      bcm2835-mmc/sdhost: Remove ARCH_BCM2835 differences
      
      The bcm2835-mmc driver (and -sdhost driver that copied from it)
      contains code to handle SDIO interrupts in a threaded interrupt
      handler rather than waking the MMC framework thread. The change
      follows a patch from Russell King that adds the facility as the
      preferred way of working.
      
      However, the new code path is only present in ARCH_BCM2835
      builds, which I have taken to be a way of testing the waters
      rather than making the change across the board; I can't see
      any technical reason why it wouldn't be enabled for MACH_BCM270X
      builds. So this patch standardises on the ARCH_BCM2835 code,
      removing the old code paths.
      
      bcm2835-sdhost: Don't log timeout errors unless debug=1
      
      The MMC card-discovery process generates timeouts. This is
      expected behaviour, so reporting it to the user serves no purpose.
      Suppress the reporting of timeout errors unless the debug flag
      is on.
      
      bcm2835-sdhost: Add workaround for odd behaviour on some cards
      
      For reasons not understood, the sdhost driver fails when reading
      sectors very near the end of some SD cards. The problem could
      be related to the similar issue that reading the final sector
      of any card as part of a multiple read never completes, and the
      workaround is an extension of the mechanism introduced to solve
      that problem which ensures those sectors are always read singly.
      
      bcm2835-sdhost: Major revision
      
      This is a significant revision of the bcm2835-sdhost driver. It
      improves on the original in a number of ways:
      
      1) Through the use of CMD23 for reads it appears to avoid problems
         reading some sectors on certain high speed cards.
      2) Better atomicity to prevent crashes.
      3) Higher performance.
      4) Activity logging included, for easier diagnosis in the event
         of a problem.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-sdhost: Restore ATOMIC flag to PIO sg mapping
      
      Allocation problems have been seen in a wireless driver, and
      this is the only change which might have been responsible.
      
      SQUASH: bcm2835-sdhost: Only claim one DMA channel
      
      With both MMC controllers enabled there are few DMA channels left. The
      bcm2835-sdhost driver only uses DMA in one direction at a time, so it
      doesn't need to claim two channels.
      
      See: https://github.com/raspberrypi/linux/issues/1327
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-sdhost: Workaround for "slow" sectors
      
      Some cards have been seen to cause timeouts after certain sectors are
      read. This workaround enforces a minimum delay between the stop after
      reading one of those sectors and a subsequent data command.
      
      Using CMD23 (SET_BLOCK_COUNT) avoids this problem, so good cards will
      not be penalised by this workaround.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-sdhost: Firmware manages the clock divisor
      
      The bcm2835-sdhost driver hands control of the CDIV clock divisor
      register to matching firmware, allowing it to adjust to a changing
      core clock. This removes the need to use the performance governor or
      to enable io_is_busy on the on-demand governor in order to get the
      best SD performance.
      
      N.B. As SD clocks must be an integer divisor of the core clock, it is
      possible that the SD clock for "turbo" mode can be different (even
      lower) than "normal" mode.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-sdhost: Reset the clock in task context
      
      Since reprogramming the clock can now involve a round-trip to the
      firmware it must not be done at atomic context, and a tasklet
      is not a task.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-sdhost: Don't exit cmd wait loop on error
      
      The FAIL flag can be set in the CMD register before command processing
      is complete, leading to spurious "failed to complete" errors. This has
      the effect of promoting harmless CRC7 errors during CMD1 processing
      into errors that can delay and even prevent booting.
      
      Also:
      1) Convert the last KERN_ERROR message in the register dumping to
         KERN_INFO.
      2) Remove an unnecessary reset call from  bcm2835_sdhost_add_host.
      
      See: https://github.com/raspberrypi/linux/pull/1492
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-sdhost: mmc_card_blockaddr fix
      
      Get the definition of mmc_card_blockaddr from drivers/mmc/core/card.h.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-sdhost: New timer API
      
      mmc: bcm2835-sdhost: Support underclocking
      
      Support underclocking of the SD bus in two ways:
      1. using the max-frequency DT property (which currently has no DT
         parameter), and
      2. using the exiting sd_overclock parameter.
      
      The two methods differ slightly - in the former the MMC subsystem is
      aware of the underclocking, while in the latter it isn't - but the
      end results should be the same.
      
      See: https://github.com/raspberrypi/linux/issues/2350
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      mmc: bcm2835-sdhost: Add include
      
      highmem.h (needed for kmap_atomic) is pulled in by one of the other
      include files, but only with some CONFIG settings. Make the inclusion
      explicit to cater for cases where the CONFIG setting is absent.
      
      See: https://github.com/raspberrypi/linux/issues/2366
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      mmc/bcm2835-sdhost: Recover from MMC_SEND_EXT_CSD
      
      If the user issues an "mmc extcsd read", the SD controller receives
      what it thinks is a SEND_IF_COND command with an unexpected data block.
      The resulting operations leave the FSM stuck in READWAIT, a state which
      persists until the MMC framework resets the controller, by which point
      the root filesystem is likely to have been unmounted.
      
      A less heavyweight solution is to detect the condition and nudge the
      FSM by asserting the (self-clearing) FORCE_DATA_MODE bit.
      
      N.B. This workaround was essentially discovered by accident and without
      a full understanding the inner workings of the controller, so it is
      fortunate that the "fix" only modifies error paths.
      
      See: https://github.com/raspberrypi/linux/issues/2728
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      mmc: bcm2835-sdhost: Fix warnings on arm64
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-sdhost: Allow for sg entries that cross pages
      
      The dma_complete handling code calculates a virtual address for a page
      then adds an offset, but if the offset is more than a page and HIGHMEM
      is in use then the summed address could be in an unmapped (or just
      incorrect) page.
      
      The upstream SDHOST driver allows for this possibility - copy the code
      that does so.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-sdhost: Fix DMA channel leak on error/remove
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      mmc: bcm2835-sdhost: Support 64-bit physical addresses
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      d5a03746
    • gellert's avatar
      MMC: added alternative MMC driver · 56e5a236
      gellert authored
      
      
      mmc: Disable CMD23 transfers on all cards
      
      Pending wire-level investigation of these types of transfers
      and associated errors on bcm2835-mmc, disable for now. Fallback of
      CMD18/CMD25 transfers will be used automatically by the MMC layer.
      
      Reported/Tested-by: default avatarGellert Weisz <gellert@raspberrypi.org>
      
      mmc: bcm2835-mmc: enable DT support for all architectures
      
      Both ARCH_BCM2835 and ARCH_BCM270x are built with OF now.
      Enable Device Tree support for all architectures.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      mmc: bcm2835-mmc: fix probe error handling
      
      Probe error handling is broken in several places.
      Simplify error handling by using device managed functions.
      Replace pr_{err,info} with dev_{err,info}.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      bcm2835-mmc: Add locks when accessing sdhost registers
      
      bcm2835-mmc: Add range of debug options for slowing things down
      
      bcm2835-mmc: Add option to disable some delays
      
      bcm2835-mmc: Add option to disable MMC_QUIRK_BLK_NO_CMD23
      
      bcm2835-mmc: Default to disabling MMC_QUIRK_BLK_NO_CMD23
      
      bcm2835-mmc: Adding overclocking option
      
      Allow a different clock speed to be substitued for a requested 50MHz.
      This option is exposed using the "overclock_50" DT parameter.
      Note that the mmc interface is restricted to EVEN integer divisions of
      250MHz, and the highest sensible option is 63 (250/4 = 62.5), the
      next being 125 (250/2) which is much too high.
      
      Use at your own risk.
      
      bcm2835-mmc: Round up the overclock, so 62 works for 62.5Mhz
      
      Also only warn once for each overclock setting.
      
      mmc: bcm2835-mmc: Make available on ARCH_BCM2835
      
      Make the bcm2835-mmc driver available for use on ARCH_BCM2835.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      BCM270x_DT: add bcm2835-mmc entry
      
      Add Device Tree entry for bcm2835-mmc.
      In non-DT mode, don't add the device in the board file.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      bcm2835-mmc: Don't overwrite MMC capabilities from DT
      
      bcm2835-mmc: Don't override bus width capabilities from devicetree
      
      Take out the force setting of the MMC_CAP_4_BIT_DATA host capability
      so that the result read from devicetree via mmc_of_parse() is
      preserved.
      
      bcm2835-mmc: Only claim one DMA channel
      
      With both MMC controllers enabled there are few DMA channels left. The
      bcm2835-mmc driver only uses DMA in one direction at a time, so it
      doesn't need to claim two channels.
      
      See: https://github.com/raspberrypi/linux/issues/1327
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-mmc: New timer API
      
      mmc: bcm2835-mmc: Support underclocking
      
      Support underclocking of the SD bus using the max-frequency DT property
      (which currently has no DT parameter). The sd_overclock parameter
      already provides another way to achieve the same thing which should be
      equivalent in end result, but it is a bug not to support max-frequency
      as well.
      
      See: https://github.com/raspberrypi/linux/issues/2350
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      mmc/bcm2835: Recover from MMC_SEND_EXT_CSD
      
      If the user issues an "mmc extcsd read", the SD controller receives
      what it thinks is a SEND_IF_COND command with an unexpected data block.
      The resulting operations leave the FSM stuck in READWAIT, a state which
      persists until the MMC framework resets the controller, by which point
      the root filesystem is likely to have been unmounted.
      
      A less heavyweight solution is to detect the condition and nudge the
      FSM by asserting the (self-clearing) FORCE_DATA_MODE bit.
      
      N.B. This workaround was essentially discovered by accident and without
      a full understanding the inner workings of the controller, so it is
      fortunate that the "fix" only modifies error paths.
      
      See: https://github.com/raspberrypi/linux/issues/2728
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      bcm2835-mmc: Fix DMA channel leak
      
      The BCM2835 MMC host driver requests a DMA channel on probe but neglects
      to release the channel in the probe error path and on driver unbind.
      
      I'm seeing this happen on every boot of the Compute Module 3: On first
      driver probe, DMA channel 2 is allocated and then leaked with a "could
      not get clk, deferring probe" message. On second driver probe, channel 4
      is allocated.
      
      Fix it.
      
      Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
      Cc: Frank Pavlic <f.pavlic@kunbus.de>
      
      bcm2835-mmc: Fix struct mmc_host leak on probe
      
      The BCM2835 MMC host driver requests the bus address of the host's
      register map on probe.  If that fails, the driver leaks the struct
      mmc_host allocated earlier.
      
      Fix it.
      
      Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
      Cc: Frank Pavlic <f.pavlic@kunbus.de>
      
      bcm2835-mmc: Fix duplicate free_irq() on remove
      
      The BCM2835 MMC host driver requests its interrupt as a device-managed
      resource, so the interrupt is automatically freed after the driver is
      unbound.
      
      However on driver unbind, bcm2835_mmc_remove() frees the interrupt
      explicitly to avoid invocation of the interrupt handler after driver
      structures have been torn down.
      
      The interrupt is thus freed twice, leading to a WARN splat in
      __free_irq().  Fix by not requesting the interrupt as a device-managed
      resource.
      
      Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
      Cc: Frank Pavlic <f.pavlic@kunbus.de>
      
      bcm2835-mmc: Handle mmc_add_host() errors
      
      The BCM2835 MMC host driver calls mmc_add_host() but doesn't check its
      return value.  Errors occurring in that function are therefore not
      handled.  Fix it.
      
      Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
      Cc: Frank Pavlic <f.pavlic@kunbus.de>
      
      bcm2835-mmc: Deduplicate reset of driver data on remove
      
      The BCM2835 MMC host driver sets the device's driver data pointer to
      NULL on ->remove() even though the driver core subsequently does the
      same in __device_release_driver().  Drop the duplicate assignment.
      
      Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
      Cc: Frank Pavlic <f.pavlic@kunbus.de>
      
      bcm2835_mmc: Remove vestigial threaded IRQ
      
      With SDIO processing now managed by the MMC framework with a
      workqueue, the bcm2835_mmc driver no longer needs a threaded
      IRQ.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      Add missing dma_unmap_sg calls to free relevant swiotlb bounce buffers.
      This prevents DMA leaks.
      
      Signed-off-by: default avatarYaroslav Rosomakho <yaroslavros@gmail.com>
      
      Limit max_req_size under arm64 (or any other platform that uses swiotlb) to prevent potential buffer overflow due to bouncing.
      
      Signed-off-by: default avatarYaroslav Rosomakho <yaroslavros@gmail.com>
      56e5a236
    • Florian Meier's avatar
      dmaengine: Add support for BCM2708 · 0580be6d
      Florian Meier authored
      
      
      Add support for DMA controller of BCM2708 as used in the Raspberry Pi.
      Currently it only supports cyclic DMA.
      
      Signed-off-by: default avatarFlorian Meier <florian.meier@koalo.de>
      
      dmaengine: expand functionality by supporting scatter/gather transfers sdhci-bcm2708 and dma.c: fix for LITE channels
      
      DMA: fix cyclic LITE length overflow bug
      
      dmaengine: bcm2708: Remove chancnt affectations
      
      Mirror bcm2835-dma.c commit 9eba5536
      
      :
      chancnt is already filled by dma_async_device_register, which uses the channel
      list to know how much channels there is.
      
      Since it's already filled, we can safely remove it from the drivers' probe
      function.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dmaengine: bcm2708: overwrite dreq only if it is not set
      
      dreq is set when the DMA channel is fetched from Device Tree.
      slave_id is set using dmaengine_slave_config().
      Only overwrite dreq with slave_id if it is not set.
      
      dreq/slave_id in the cyclic DMA case is not touched, because I don't
      have hardware to test with.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dmaengine: bcm2708: do device registration in the board file
      
      Don't register the device in the driver. Do it in the board file.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dmaengine: bcm2708: don't restrict DT support to ARCH_BCM2835
      
      Both ARCH_BCM2835 and ARCH_BCM270x are built with OF now.
      Add Device Tree support to the non ARCH_BCM2835 case.
      Use the same driver name regardless of architecture.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      BCM270x_DT: add bcm2835-dma entry
      
      Add Device Tree entry for bcm2835-dma.
      The entry doesn't contain any resources since they are handled
      by the arch/arm/mach-bcm270x/dma.c driver.
      In non-DT mode, don't add the device in the board file.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      bcm2708-dmaengine: Add debug options
      
      BCM270x: Add memory and irq resources to dmaengine device and DT
      
      Prepare for merging of the legacy DMA API arch driver dma.c
      with bcm2708-dmaengine by adding memory and irq resources both
      to platform file device and Device Tree node.
      Don't use BCM_DMAMAN_DRIVER_NAME so we don't have to include mach/dma.h
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dmaengine: bcm2708: Merge with arch dma.c driver and disable dma.c
      
      Merge the legacy DMA API driver with bcm2708-dmaengine.
      This is done so we can use bcm2708_fb on ARCH_BCM2835 (mailbox
      driver is also needed).
      
      Changes to the dma.c code:
      - Use BIT() macro.
      - Cutdown some comments to one line.
      - Add mutex to vc_dmaman and use this, since the dev lock is locked
        during probing of the engine part.
      - Add global g_dmaman variable since drvdata is used by the engine part.
      - Restructure for readability:
        vc_dmaman_chan_alloc()
        vc_dmaman_chan_free()
        bcm_dma_chan_free()
      - Restructure bcm_dma_chan_alloc() to simplify error handling.
      - Use device irq resources instead of hardcoded bcm_dma_irqs table.
      - Remove dev_dmaman_register() and code it directly.
      - Remove dev_dmaman_deregister() and code it directly.
      - Simplify bcm_dmaman_probe() using devm_* functions.
      - Get dmachans from DT if available.
      - Keep 'dma.dmachans' module argument name for backwards compatibility.
      
      Make it available on ARCH_BCM2835 as well.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dmaengine: bcm2708: set residue_granularity field
      
      bcm2708-dmaengine supports residue reporting at burst level
      but didn't report this via the residue_granularity field.
      
      Without this field set properly we get playback issues with I2S cards.
      
      dmaengine: bcm2708-dmaengine: Fix memory leak when stopping a running transfer
      
      bcm2708-dmaengine: Use more DMA channels (but not 12)
      
      1) Only the bcm2708_fb drivers uses the legacy DMA API, and
      it requires a BULK-capable channel, so all other types
      (FAST, NORMAL and LITE) can be made available to the regular
      DMA API.
      
      2) DMA channels 11-14 share an interrupt. The driver can't
      handle this, so don't use channels 12-14 (12 was used, probably
      because it appears to have an interrupt, but in reality that
      interrupt is for activity on ANY channel). This may explain
      a lockup encountered when running out of DMA channels.
      
      The combined effect of this patch is to leave 7 DMA channels
      available + channel 0 for bcm2708_fb via the legacy API.
      
      See: https://github.com/raspberrypi/linux/issues/1110
           https://github.com/raspberrypi/linux/issues/1108
      
      
      
      dmaengine: bcm2708: Make legacy API available for bcm2835-dma
      
      bcm2708_fb uses the legacy DMA API, so in order to start using
      bcm2835-dma, bcm2835-dma has to support the legacy API. Make this
      possible by exporting bcm_dmaman_probe() and bcm_dmaman_remove().
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dmaengine: bcm2708: Change DT compatible string
      
      Both bcm2835-dma and bcm2708-dmaengine have the same compatible string.
      So change compatible to "brcm,bcm2708-dma".
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dmaengine: bcm2708: Remove driver but keep legacy API
      
      Dropping non-DT support means we don't need this driver,
      but we still need the legacy DMA API.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      bcm2708-dmaengine - Fix arm64 portability/build issues
      
      dma-bcm2708: Fix module compilation of CONFIG_DMA_BCM2708
      
      bcm2708-dmaengine.c defines functions like bcm_dma_start which are
      defined as well in dma-bcm2708.h as inline versions when
      CONFIG_DMA_BCM2708 is not defined. This works fine when
      CONFIG_DMA_BCM2708 is built in, but when it is selected as module build
      fails with redefinition errors because in the build system when
      CONFIG_DMA_BCM2708 is selected as module, the macro becomes
      CONFIG_DMA_BCM2708_MODULE.
      
      This patch makes the header use CONFIG_DMA_BCM2708_MODULE too when
      available.
      
      Fixes https://github.com/raspberrypi/linux/issues/2056
      
      
      
      Signed-off-by: default avatarAndrei Gherzan <andrei@gherzan.com>
      0580be6d
    • Harm Hanemaaijer's avatar
      Speed up console framebuffer imageblit function · a85f719c
      Harm Hanemaaijer authored
      
      
      Especially on platforms with a slower CPU but a relatively high
      framebuffer fill bandwidth, like current ARM devices, the existing
      console monochrome imageblit function used to draw console text is
      suboptimal for common pixel depths such as 16bpp and 32bpp. The existing
      code is quite general and can deal with several pixel depths. By creating
      special case functions for 16bpp and 32bpp, by far the most common pixel
      formats used on modern systems, a significant speed-up is attained
      which can be readily felt on ARM-based devices like the Raspberry Pi
      and the Allwinner platform, but should help any platform using the
      fb layer.
      
      The special case functions allow constant folding, eliminating a number
      of instructions including divide operations, and allow the use of an
      unrolled loop, eliminating instructions with a variable shift size,
      reducing source memory access instructions, and eliminating excessive
      branching. These unrolled loops also allow much better code optimization
      by the C compiler. The code that selects which optimized variant is used
      is also simplified, eliminating integer divide instructions.
      
      The speed-up, measured by timing 'cat file.txt' in the console, varies
      between 40% and 70%, when testing on the Raspberry Pi and Allwinner
      ARM-based platforms, depending on font size and the pixel depth, with
      the greater benefit for 32bpp.
      
      Signed-off-by: default avatarHarm Hanemaaijer <fgenfb@yahoo.com>
      a85f719c
    • Siarhei Siamashka's avatar
      fbdev: add FBIOCOPYAREA ioctl · d732c672
      Siarhei Siamashka authored
      Based on the patch authored by Ali Gholami Rudi at
          https://lkml.org/lkml/2009/7/13/153
      
      
      
      Provide an ioctl for userspace applications, but only if this operation
      is hardware accelerated (otherwide it does not make any sense).
      
      Signed-off-by: default avatarSiarhei Siamashka <siarhei.siamashka@gmail.com>
      
      bcm2708_fb: Add ioctl for reading gpu memory through dma
      
      video: bcm2708_fb: Add compat_ioctl support.
      
      When using a 64 bit kernel with 32 bit userspace we need
      compat ioctl handling for FBIODMACOPY as one of the
      parameters is a pointer.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      d732c672
    • James Hughes's avatar
    • popcornmix's avatar
      bcm2708 framebuffer driver · f36d515b
      popcornmix authored
      
      
      Signed-off-by: default avatarpopcornmix <popcornmix@gmail.com>
      
      bcm2708_fb : Implement blanking support using the mailbox property interface
      
      bcm2708_fb: Add pan and vsync controls
      
      bcm2708_fb: DMA acceleration for fb_copyarea
      
      Based on http://www.raspberrypi.org/phpBB3/viewtopic.php?p=62425#p62425
      
      
      Also used Simon's dmaer_master module as a reference for tweaking DMA
      settings for better performance.
      
      For now busylooping only. IRQ support might be added later.
      With non-overclocked Raspberry Pi, the performance is ~360 MB/s
      for simple copy or ~260 MB/s for two-pass copy (used when dragging
      windows to the right).
      
      In the case of using DMA channel 0, the performance improves
      to ~440 MB/s.
      
      For comparison, VFP optimized CPU copy can only do ~114 MB/s in
      the same conditions (hindered by reading uncached source buffer).
      
      Signed-off-by: default avatarSiarhei Siamashka <siarhei.siamashka@gmail.com>
      
      bcm2708_fb: report number of dma copies
      
      Add a counter (exported via debugfs) reporting the
      number of dma copies that the framebuffer driver
      has done, in order to help evaluate different
      optimization strategies.
      
      Signed-off-by: default avatarLuke Diamand <luked@broadcom.com>
      
      bcm2708_fb: use IRQ for DMA copies
      
      The copyarea ioctl() uses DMA to speed things along. This
      was busy-waiting for completion. This change supports using
      an interrupt instead for larger transfers. For small
      transfers, busy-waiting is still likely to be faster.
      
      Signed-off-by: default avatarLuke Diamand <luke@diamand.org>
      
      bcm2708: Make ioctl logging quieter
      
      video: fbdev: bcm2708_fb: Don't panic on error
      
      No need to panic the kernel if the video driver fails.
      Just print a message and return an error.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      fbdev: bcm2708_fb: Add ARCH_BCM2835 support
      
      Add Device Tree support.
      Pass the device to dma_alloc_coherent() in order to get the
      correct bus address on ARCH_BCM2835.
      Use the new DMA legacy API header file.
      Including <mach/platform.h> is not necessary.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      BCM270x_DT: Add bcm2708-fb device
      
      Add bcm2708-fb to Device Tree and don't add the
      platform device when booting in DT mode.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      Cleanup of bcm2708_fb file to kernel coding standards
      
      Some minor change to function - remove a use of
      in_atomic, plus replacing various debug messages
      that manually specify the function name with
      ("%s",.__func__)
      
      Signed-off-by: default avatarJames Hughes <james.hughes@raspberrypi.org>
      
      video: bcm2708_fb: Try allocating on the ARM and passing to VPU
      
      Currently the VPU allocates the contiguous buffer for the
      framebuffer.
      Try an alternate path first where we use dma_alloc_coherent
      and pass the buffer to the VPU. Should the VPU firmware not
      support that path, then free the buffer and revert to the
      old behaviour of using the VPU allocation.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      f36d515b
    • popcornmix's avatar
      Add dwc_otg driver · f5f6d397
      popcornmix authored
      
      
      Signed-off-by: default avatarpopcornmix <popcornmix@gmail.com>
      
      usb: dwc: fix lockdep false positive
      
      Signed-off-by: default avatarKari Suvanto <karis79@gmail.com>
      
      usb: dwc: fix inconsistent lock state
      
      Signed-off-by: default avatarKari Suvanto <karis79@gmail.com>
      
      Add FIQ patch to dwc_otg driver. Enable with dwc_otg.fiq_fix_enable=1. Should give about 10% more ARM performance.
      Thanks to Gordon and Costas
      
      Avoid dynamic memory allocation for channel lock in USB driver. Thanks ddv2005.
      
      Add NAK holdoff scheme. Enabled by default, disable with dwc_otg.nak_holdoff_enable=0. Thanks gsh
      
      Make sure we wait for the reset to finish
      
      dwc_otg: fix bug in dwc_otg_hcd.c resulting in silent kernel
      	 memory corruption, escalating to OOPS under high USB load.
      
      dwc_otg: Fix unsafe access of QTD during URB enqueue
      
      In dwc_otg_hcd_urb_enqueue during qtd creation, it was possible that the
      transaction could complete almost immediately after the qtd was assigned
      to a host channel during URB enqueue, which meant the qtd pointer was no
      longer valid having been completed and removed. Usually, this resulted in
      an OOPS during URB submission. By predetermining whether transactions
      need to be queued or not, this unsafe pointer access is avoided.
      
      This bug was only evident on the Pi model A where a device was attached
      that had no periodic endpoints (e.g. USB pendrive or some wlan devices).
      
      dwc_otg: Fix incorrect URB allocation error handling
      
      If the memory allocation for a dwc_otg_urb failed, the kernel would OOPS
      because for some reason a member of the *unallocated* struct was set to
      zero. Error handling changed to fail correctly.
      
      dwc_otg: fix potential use-after-free case in interrupt handler
      
      If a transaction had previously aborted, certain interrupts are
      enabled to track error counts and reset where necessary. On IN
      endpoints the host generates an ACK interrupt near-simultaneously
      with completion of transfer. In the case where this transfer had
      previously had an error, this results in a use-after-free on
      the QTD memory space with a 1-byte length being overwritten to
      0x00.
      
      dwc_otg: add handling of SPLIT transaction data toggle errors
      
      Previously a data toggle error on packets from a USB1.1 device behind
      a TT would result in the Pi locking up as the driver never handled
      the associated interrupt. Patch adds basic retry mechanism and
      interrupt acknowledgement to cater for either a chance toggle error or
      for devices that have a broken initial toggle state (FT8U232/FT232BM).
      
      dwc_otg: implement tasklet for returning URBs to usbcore hcd layer
      
      The dwc_otg driver interrupt handler for transfer completion will spend
      a very long time with interrupts disabled when a URB is completed -
      this is because usb_hcd_giveback_urb is called from within the handler
      which for a USB device driver with complicated processing (e.g. webcam)
      will take an exorbitant amount of time to complete. This results in
      missed completion interrupts for other USB packets which lead to them
      being dropped due to microframe overruns.
      
      This patch splits returning the URB to the usb hcd layer into a
      high-priority tasklet. This will have most benefit for isochronous IN
      transfers but will also have incidental benefit where multiple periodic
      devices are active at once.
      
      dwc_otg: fix NAK holdoff and allow on split transactions only
      
      This corrects a bug where if a single active non-periodic endpoint
      had at least one transaction in its qh, on frnum == MAX_FRNUM the qh
      would get skipped and never get queued again. This would result in
      a silent device until error detection (automatic or otherwise) would
      either reset the device or flush and requeue the URBs.
      
      Additionally the NAK holdoff was enabled for all transactions - this
      would potentially stall a HS endpoint for 1ms if a previous error state
      enabled this interrupt and the next response was a NAK. Fix so that
      only split transactions get held off.
      
      dwc_otg: Call usb_hcd_unlink_urb_from_ep with lock held in completion handler
      
      usb_hcd_unlink_urb_from_ep must be called with the HCD lock held.  Calling it
      asynchronously in the tasklet was not safe (regression in
      c4564d4a).
      
      This change unlinks it from the endpoint prior to queueing it for handling in
      the tasklet, and also adds a check to ensure the urb is OK to be unlinked
      before doing so.
      
      NULL pointer dereference kernel oopses had been observed in usb_hcd_giveback_urb
      when a USB device was unplugged/replugged during data transfer.  This effect
      was reproduced using automated USB port power control, hundreds of replug
      events were performed during active transfers to confirm that the problem was
      eliminated.
      
      USB fix using a FIQ to implement split transactions
      
      This commit adds a FIQ implementaion that schedules
      the split transactions using a FIQ so we don't get
      held off by the interrupt latency of Linux
      
      dwc_otg: fix device attributes and avoid kernel warnings on boot
      
      dcw_otg: avoid logging function that can cause panics
      
      See: https://github.com/raspberrypi/firmware/issues/21
      Thanks to cleverca22 for fix
      
      dwc_otg: mask correct interrupts after transaction error recovery
      
      The dwc_otg driver will unmask certain interrupts on a transaction
      that previously halted in the error state in order to reset the
      QTD error count. The various fine-grained interrupt handlers do not
      consider that other interrupts besides themselves were unmasked.
      
      By disabling the two other interrupts only ever enabled in DMA mode
      for this purpose, we can avoid unnecessary function calls in the
      IRQ handler. This will also prevent an unneccesary FIQ interrupt
      from being generated if the FIQ is enabled.
      
      dwc_otg: fiq: prevent FIQ thrash and incorrect state passing to IRQ
      
      In the case of a transaction to a device that had previously aborted
      due to an error, several interrupts are enabled to reset the error
      count when a device responds. This has the side-effect of making the
      FIQ thrash because the hardware will generate multiple instances of
      a NAK on an IN bulk/interrupt endpoint and multiple instances of ACK
      on an OUT bulk/interrupt endpoint. Make the FIQ mask and clear the
      associated interrupts.
      
      Additionally, on non-split transactions make sure that only unmasked
      interrupts are cleared. This caused a hard-to-trigger but serious
      race condition when you had the combination of an endpoint awaiting
      error recovery and a transaction completed on an endpoint - due to
      the sequencing and timing of interrupts generated by the dwc_otg core,
      it was possible to confuse the IRQ handler.
      
      Fix function tracing
      
      dwc_otg: whitespace cleanup in dwc_otg_urb_enqueue
      
      dwc_otg: prevent OOPSes during device disconnects
      
      The dwc_otg_urb_enqueue function is thread-unsafe. In particular the
      access of urb->hcpriv, usb_hcd_link_urb_to_ep, dwc_otg_urb->qtd and
      friends does not occur within a critical section and so if a device
      was unplugged during activity there was a high chance that the
      usbcore hub_thread would try to disable the endpoint with partially-
      formed entries in the URB queue. This would result in BUG() or null
      pointer dereferences.
      
      Fix so that access of urb->hcpriv, enqueuing to the hardware and
      adding to usbcore endpoint URB lists is contained within a single
      critical section.
      
      dwc_otg: prevent BUG() in TT allocation if hub address is > 16
      
      A fixed-size array is used to track TT allocation. This was
      previously set to 16 which caused a crash because
      dwc_otg_hcd_allocate_port would read past the end of the array.
      
      This was hit if a hub was plugged in which enumerated as addr > 16,
      due to previous device resets or unplugs.
      
      Also add #ifdef FIQ_DEBUG around hcd->hub_port_alloc[], which grows
      to a large size if 128 hub addresses are supported. This field is
      for debug only for tracking which frame an allocate happened in.
      
      dwc_otg: make channel halts with unknown state less damaging
      
      If the IRQ received a channel halt interrupt through the FIQ
      with no other bits set, the IRQ would not release the host
      channel and never complete the URB.
      
      Add catchall handling to treat as a transaction error and retry.
      
      dwc_otg: fiq_split: use TTs with more granularity
      
      This fixes certain issues with split transaction scheduling.
      
      - Isochronous multi-packet OUT transactions now hog the TT until
        they are completed - this prevents hubs aborting transactions
        if they get a periodic start-split out-of-order
      - Don't perform TT allocation on non-periodic endpoints - this
        allows simultaneous use of the TT's bulk/control and periodic
        transaction buffers
      
      This commit will mainly affect USB audio playback.
      
      dwc_otg: fix potential sleep while atomic during urb enqueue
      
      Fixes a regression introduced with eb1b482a. Kmalloc called from
      dwc_otg_hcd_qtd_add / dwc_otg_hcd_qtd_create did not always have
      the GPF_ATOMIC flag set. Force this flag when inside the larger
      critical section.
      
      dwc_otg: make fiq_split_enable imply fiq_fix_enable
      
      Failing to set up the FIQ correctly would result in
      "IRQ 32: nobody cared" errors in dmesg.
      
      dwc_otg: prevent crashes on host port disconnects
      
      Fix several issues resulting in crashes or inconsistent state
      if a Model A root port was disconnected.
      
      - Clean up queue heads properly in kill_urbs_in_qh_list by
        removing the empty QHs from the schedule lists
      - Set the halt status properly to prevent IRQ handlers from
        using freed memory
      - Add fiq_split related cleanup for saved registers
      - Make microframe scheduling reclaim host channels if
        active during a disconnect
      - Abort URBs with -ESHUTDOWN status response, informing
        device drivers so they respond in a more correct fashion
        and don't try to resubmit URBs
      - Prevent IRQ handlers from attempting to handle channel
        interrupts if the associated URB was dequeued (and the
        driver state was cleared)
      
      dwc_otg: prevent leaking URBs during enqueue
      
      A dwc_otg_urb would get leaked if the HCD enqueue function
      failed for any reason. Free the URB at the appropriate points.
      
      dwc_otg: Enable NAK holdoff for control split transactions
      
      Certain low-speed devices take a very long time to complete a
      data or status stage of a control transaction, producing NAK
      responses until they complete internal processing - the USB2.0
      spec limit is up to 500mS. This causes the same type of interrupt
      storm as seen with USB-serial dongles prior to c8edb238.
      
      In certain circumstances, usually while booting, this interrupt
      storm could cause SD card timeouts.
      
      dwc_otg: Fix for occasional lockup on boot when doing a USB reset
      
      dwc_otg: Don't issue traffic to LS devices in FS mode
      
      Issuing low-speed packets when the root port is in full-speed mode
      causes the root port to stop responding. Explicitly fail when
      enqueuing URBs to a LS endpoint on a FS bus.
      
      Fix ARM architecture issue with local_irq_restore()
      
      If local_fiq_enable() is called before a local_irq_restore(flags) where
      the flags variable has the F bit set, the FIQ will be erroneously disabled.
      
      Fixup arch_local_irq_restore to avoid trampling the F bit in CPSR.
      
      Also fix some of the hacks previously implemented for previous dwc_otg
      incarnations.
      
      dwc_otg: fiq_fsm: Base commit for driver rewrite
      
      This commit removes the previous FIQ fixes entirely and adds fiq_fsm.
      
      This rewrite features much more complete support for split transactions
      and takes into account several OTG hardware bugs. High-speed
      isochronous transactions are also capable of being performed by fiq_fsm.
      
      All driver options have been removed and replaced with:
        - dwc_otg.fiq_enable (bool)
        - dwc_otg.fiq_fsm_enable (bool)
        - dwc_otg.fiq_fsm_mask (bitmask)
        - dwc_otg.nak_holdoff (unsigned int)
      
      Defaults are specified such that fiq_fsm behaves similarly to the
      previously implemented FIQ fixes.
      
      fiq_fsm: Push error recovery into the FIQ when fiq_fsm is used
      
      If the transfer associated with a QTD failed due to a bus error, the HCD
      would retry the transfer up to 3 times (implementing the USB2.0
      three-strikes retry in software).
      
      Due to the masking mechanism used by fiq_fsm, it is only possible to pass
      a single interrupt through to the HCD per-transfer.
      
      In this instance host channels would fall off the radar because the error
      reset would function, but the subsequent channel halt would be lost.
      
      Push the error count reset into the FIQ handler.
      
      fiq_fsm: Implement timeout mechanism
      
      For full-speed endpoints with a large packet size, interrupt latency
      runs the risk of the FIQ starting a transaction too late in a full-speed
      frame. If the device is still transmitting data when EOF2 for the
      downstream frame occurs, the hub will disable the port. This change is
      not reflected in the hub status endpoint and the device becomes
      unresponsive.
      
      Prevent high-bandwidth transactions from being started too late in a
      frame. The mechanism is not guaranteed: a combination of bit stuffing
      and hub latency may still result in a device overrunning.
      
      fiq_fsm: fix bounce buffer utilisation for Isochronous OUT
      
      Multi-packet isochronous OUT transactions were subject to a few bounday
      bugs. Fix them.
      
      Audio playback is now much more robust: however, an issue stands with
      devices that have adaptive sinks - ALSA plays samples too fast.
      
      dwc_otg: Return full-speed frame numbers in HS mode
      
      The frame counter increments on every *microframe* in high-speed mode.
      Most device drivers expect this number to be in full-speed frames - this
      caused considerable confusion to e.g. snd_usb_audio which uses the
      frame counter to estimate the number of samples played.
      
      fiq_fsm: save PID on completion of interrupt OUT transfers
      
      Also add edge case handling for interrupt transports.
      
      Note that for periodic split IN, data toggles are unimplemented in the
      OTG host hardware - it unconditionally accepts any PID.
      
      fiq_fsm: add missing case for fiq_fsm_tt_in_use()
      
      Certain combinations of bitrate and endpoint activity could
      result in a periodic transaction erroneously getting started
      while the previous Isochronous OUT was still active.
      
      fiq_fsm: clear hcintmsk for aborted transactions
      
      Prevents the FIQ from erroneously handling interrupts
      on a timed out channel.
      
      fiq_fsm: enable by default
      
      fiq_fsm: fix dequeues for non-periodic split transactions
      
      If a dequeue happened between the SSPLIT and CSPLIT phases of the
      transaction, the HCD would never receive an interrupt.
      
      fiq_fsm: Disable by default
      
      fiq_fsm: Handle HC babble errors
      
      The HCTSIZ transfer size field raises a babble interrupt if
      the counter wraps. Handle the resulting interrupt in this case.
      
      dwc_otg: fix interrupt registration for fiq_enable=0
      
      Additionally make the module parameter conditional for wherever
      hcd->fiq_state is touched.
      
      fiq_fsm: Enable by default
      
      dwc_otg: Fix various issues with root port and transaction errors
      
      Process the host port interrupts correctly (and don't trample them).
      Root port hotplug now functional again.
      
      Fix a few thinkos with the transaction error passthrough for fiq_fsm.
      
      fiq_fsm: Implement hack for Split Interrupt transactions
      
      Hubs aren't too picky about which endpoint we send Control type split
      transactions to. By treating Interrupt transfers as Control, it is
      possible to use the non-periodic queue in the OTG core as well as the
      non-periodic FIFOs in the hub itself. This massively reduces the
      microframe exclusivity/contention that periodic split transactions
      otherwise have to enforce.
      
      It goes without saying that this is a fairly egregious USB specification
      violation, but it works.
      
      Original idea by Hans Petter Selasky @ FreeBSD.org.
      
      dwc_otg: FIQ support on SMP. Set up FIQ stack and handler on Core 0 only.
      
      dwc_otg: introduce fiq_fsm_spin(un|)lock()
      
      SMP safety for the FIQ relies on register read-modify write cycles being
      completed in the correct order. Several places in the DWC code modify
      registers also touched by the FIQ. Protect these by a bare-bones lock
      mechanism.
      
      This also makes it possible to run the FIQ and IRQ handlers on different
      cores.
      
      fiq_fsm: fix build on bcm2708 and bcm2709 platforms
      
      dwc_otg: put some barriers back where they should be for UP
      
      bcm2709/dwc_otg: Setup FIQ on core 1 if >1 core active
      
      dwc_otg: fixup read-modify-write in critical paths
      
      Be more careful about read-modify-write on registers that the FIQ
      also touches.
      
      Guard fiq_fsm_spin_lock with fiq_enable check
      
      fiq_fsm: Falling out of the state machine isn't fatal
      
      This edge case can be hit if the port is disabled while the FIQ is
      in the middle of a transaction. Make the effects less severe.
      
      Also get rid of the useless return value.
      
      squash: dwc_otg: Allow to build without SMP
      
      usb: core: make overcurrent messages more prominent
      
      Hub overcurrent messages are more serious than "debug". Increase loglevel.
      
      usb: dwc_otg: Don't use dma_to_virt()
      
      Commit 6ce0d200
      
       changes dma_to_virt() which breaks this driver.
      Open code the old dma_to_virt() implementation to work around this.
      
      Limit the use of __bus_to_virt() to cases where transfer_buffer_length
      is set and transfer_buffer is not set. This is done to increase the
      chance that this driver will also work on ARCH_BCM2835.
      
      transfer_buffer should not be NULL if the length is set, but the
      comment in the code indicates that there are situations where this
      might happen. drivers/usb/isp1760/isp1760-hcd.c also has a similar
      comment pointing to a possible: 'usb storage / SCSI bug'.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dwc_otg: Fix crash when fiq_enable=0
      
      dwc_otg: fiq_fsm: Make high-speed isochronous strided transfers work properly
      
      Certain low-bandwidth high-speed USB devices (specialist audio devices,
      compressed-frame webcams) have packet intervals > 1 microframe.
      
      Stride these transfers in the FIQ by using the start-of-frame interrupt
      to restart the channel at the right time.
      
      dwc_otg: Force host mode to fix incorrect compute module boards
      
      dwc_otg: Add ARCH_BCM2835 support
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dwc_otg: Simplify FIQ irq number code
      
      Dropping ATAGS means we can simplify the FIQ irq number code.
      Also add error checking on the returned irq number.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dwc_otg: Remove duplicate gadget probe/unregister function
      
      dwc_otg: Properly set the HFIR
      
      Douglas Anderson reported:
      
      According to the most up to date version of the dwc2 databook, the FRINT
      field of the HFIR register should be programmed to:
      * 125 us * (PHY clock freq for HS) - 1
      * 1000 us * (PHY clock freq for FS/LS) - 1
      
      This is opposed to older versions of the doc that claimed it should be:
      * 125 us * (PHY clock freq for HS)
      * 1000 us * (PHY clock freq for FS/LS)
      
      and reported lower timing jitter on a USB analyser
      
      dcw_otg: trim xfer length when buffer larger than allocated size is received
      
      dwc_otg: Don't free qh align buffers in atomic context
      
      dwc_otg: Enable the hack for Split Interrupt transactions by default
      
      dwc_otg.fiq_fsm_mask=0xF has long been a suggestion for users with audio stutters or other USB bandwidth issues.
      So far we are aware of many success stories but no failure caused by this setting.
      Make it a default to learn more.
      
      See: https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=70437
      
      
      
      Signed-off-by: default avatarpopcornmix <popcornmix@gmail.com>
      
      dwc_otg: Use kzalloc when suitable
      
      dwc_otg: Pass struct device to dma_alloc*()
      
      This makes it possible to get the bus address from Device Tree.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      dwc_otg: fix summarize urb->actual_length for isochronous transfers
      
      Kernel does not copy input data of ISO transfers to userspace
      if actual_length is set only in ISO transfers and not summarized
      in urb->actual_length. Fixes raspberrypi/linux#903
      
      fiq_fsm: Use correct states when starting isoc OUT transfers
      
      In fiq_fsm_start_next_periodic() if an isochronous OUT transfer
      was selected, no regard was given as to whether this was a single-packet
      transfer or a multi-packet staged transfer.
      
      For single-packet transfers, this had the effect of repeatedly sending
      OUT packets with bogus data and lengths.
      
      Eventually if the channel was repeatedly enabled enough times, this
      would lock up the OTG core and no further bus transfers would happen.
      
      Set the FSM state up properly if we select a single-packet transfer.
      
      Fixes https://github.com/raspberrypi/linux/issues/1842
      
      dwc_otg: make nak_holdoff work as intended with empty queues
      
      If URBs reading from non-periodic split endpoints were dequeued and
      the last transfer from the endpoint was a NAK handshake, the resulting
      qh->nak_frame value was stale which would result in unnecessarily long
      polling intervals for the first subsequent transfer with a fresh URB.
      
      Fixup qh->nak_frame in dwc_otg_hcd_urb_dequeue and also guard against
      a case where a single URB is submitted to the endpoint, a NAK was
      received on the transfer immediately prior to receiving data and the
      device subsequently resubmits another URB past the qh->nak_frame interval.
      
      Fixes https://github.com/raspberrypi/linux/issues/1709
      
      dwc_otg: fix split transaction data toggle handling around dequeues
      
      See https://github.com/raspberrypi/linux/issues/1709
      
      
      
      Fix several issues regarding endpoint state when URBs are dequeued
      - If the HCD is disconnected, flush FIQ-enabled channels properly
      - Save the data toggle state for bulk endpoints if the last transfer
        from an endpoint where URBs were dequeued returned a data packet
      - Reset hc->start_pkt_count properly in assign_and_init_hc()
      
      dwc_otg: fix several potential crash sources
      
      On root port disconnect events, the host driver state is cleared and
      in-progress host channels are forcibly stopped. This doesn't play
      well with the FIQ running in the background, so:
      - Guard the disconnect callback with both the host spinlock and FIQ
        spinlock
      - Move qtd dereference in dwc_otg_handle_hc_fsm() after the early-out
        so we don't dereference a qtd that has gone away
      - Turn catch-all BUG()s in dwc_otg_handle_hc_fsm() into warnings.
      
      dwc_otg: delete hcd->channel_lock
      
      The lock serves no purpose as it is only held while the HCD spinlock
      is already being held.
      
      dwc_otg: remove unnecessary dma-mode channel halts on disconnect interrupt
      
      Host channels are already halted in kill_urbs_in_qh_list() with the
      subsequent interrupt processing behaving as if the URB was dequeued
      via HCD callback.
      
      There's no need to clobber the host channel registers a second time
      as this exposes races between the driver and host channel resulting
      in hcd->free_hc_list becoming corrupted.
      
      dwcotg: Allow to build without FIQ on ARM64
      
      Signed-off-by: default avatarpopcornmix <popcornmix@gmail.com>
      
      dwc_otg: make periodic scheduling behave properly for FS buses
      
      If the root port is in full-speed mode, transfer times at 12mbit/s
      would be calculated but matched against high-speed quotas.
      
      Reinitialise hcd->frame_usecs[i] on each port enable event so that
      full-speed bandwidth can be tracked sensibly.
      
      Also, don't bother using the FIQ for transfers when in full-speed
      mode - at the slower bus speed, interrupt frequency is reduced by
      an order of magnitude.
      
      Related issue: https://github.com/raspberrypi/linux/issues/2020
      
      dwc_otg: fiq_fsm: Make isochronous compatibility checks work properly
      
      Get rid of the spammy printk and local pointer mangling.
      Also, there is a nominal benefit for using fiq_fsm for isochronous
      transfers in FS mode (~1.1k IRQs per second vs 2.1k IRQs per second)
      so remove the root port speed check.
      
      dwc_otg: add module parameter int_ep_interval_min
      
      Add a module parameter (defaulting to ignored) that clamps the polling rate
      of high-speed Interrupt endpoints to a minimum microframe interval.
      
      The parameter is modifiable at runtime as it is used when activating new
      endpoints (such as on device connect).
      
      dwc_otg: fiq_fsm: Add non-periodic TT exclusivity constraints
      
      Certain hub types do not discriminate between pipe direction (IN or OUT)
      when considering non-periodic transfers. Therefore these hubs get confused
      if multiple transfers are issued in different directions with the same
      device address and endpoint number.
      
      Constrain queuing non-periodic split transactions so they are performed
      serially in such cases.
      
      Related: https://github.com/raspberrypi/linux/issues/2024
      
      
      
      dwc_otg: Fixup change to DRIVER_ATTR interface
      
      dwc_otg: Fix compilation warnings
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      USB_DWCOTG: Disable building dwc_otg as a module (#2265)
      
      When dwc_otg is built as a module, build will fail with the following
      error:
      
      ERROR: "DWC_TASK_HI_SCHEDULE" [drivers/usb/host/dwc_otg/dwc_otg.ko] undefined!
      scripts/Makefile.modpost:91: recipe for target '__modpost' failed
      make[1]: *** [__modpost] Error 1
      Makefile:1199: recipe for target 'modules' failed
      make: *** [modules] Error 2
      
      Even if the error is solved by including the missing
      DWC_TASK_HI_SCHEDULE function, the kernel will panic when loading
      dwc_otg.
      
      As a workaround, simply prevent user from building dwc_otg as a module
      as the current kernel does not support it.
      
      See: https://github.com/raspberrypi/linux/issues/2258
      
      
      
      Signed-off-by: default avatarMalik Olivier Boussejra <malik@boussejra.com>
      
      dwc_otg: New timer API
      
      dwc_otg: Fix removed ACCESS_ONCE->READ_ONCE
      
      dwc_otg: don't unconditionally force host mode in dwc_otg_cil_init()
      
      Add the ability to disable force_host_mode for those that want to use
      dwc_otg in both device and host modes.
      
      dwc_otg: Fix a regression when dequeueing isochronous transfers
      
      In 282bed95 (dwc_otg: make nak_holdoff work as intended with empty queues)
      the dequeue mechanism was changed to leave FIQ-enabled transfers to run
      to completion - to avoid leaving hub TT buffers with stale packets lying
      around.
      
      This broke FIQ-accelerated isochronous transfers, as this then meant that
      dozens of transfers were performed after the dequeue function returned.
      
      Restore the state machine fence for isochronous transfers.
      
      fiq_fsm: rewind DMA pointer for OUT transactions that fail (#2288)
      
      See: https://github.com/raspberrypi/linux/issues/2140
      
      dwc_otg: add smp_mb() to prevent driver state corruption on boot
      
      Occasional crashes have been seen where the FIQ code dereferences
      invalid/random pointers immediately after being set up, leading to
      panic on boot.
      
      The crash occurs as the FIQ code races against hcd_init_fiq() and
      the hcd_init_fiq() code races against the outstanding memory stores
      from dwc_otg_hcd_init(). Use explicit barriers after touching
      driver state.
      
      usb: dwc_otg: fix memory corruption in dwc_otg driver
      
      [Upstream commit 51b1b649
      
      ]
      
      The move from the staging tree to the main tree exposed a
      longstanding memory corruption bug in the dwc2 driver. The
      reordering of the driver initialization caused the dwc2 driver
      to corrupt the initialization data of the sdhci driver on the
      Raspberry Pi platform, which made the bug show up.
      
      The error is in calling to_usb_device(hsotg->dev), since ->dev
      is not a member of struct usb_device. The easiest fix is to
      just remove the offending code, since it is not really needed.
      
      Thanks to Stephen Warren for tracking down the cause of this.
      
      Reported-by: default avatarAndre Heider <a.heider@gmail.com>
      Tested-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      Signed-off-by: default avatarPaul Zimmerman <paulz@synopsys.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      [lukas: port from upstream dwc2 to out-of-tree dwc_otg driver]
      Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
      
      usb: dwb_otg: Fix unreachable switch statement warning
      
      This warning appears with GCC 7.3.0 from toolchains.bootlin.com:
      
      ../drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c: In function ‘fiq_fsm_update_hs_isoc’:
      ../drivers/usb/host/dwc_otg/dwc_otg_fiq_fsm.c:595:61: warning: statement will never be executed [-Wswitch-unreachable]
         st->hctsiz_copy.b.xfersize = nrpackets * st->hcchar_copy.b.mps;
                                                  ~~~~~~~~~~~~~~~~~^~~~
      
      Signed-off-by: default avatarNathan Chancellor <natechancellor@gmail.com>
      
      dwc_otg: fiq_fsm: fix incorrect DMA register offset calculation
      
      Rationalise the offset and update all call sites.
      
      Fixes https://github.com/raspberrypi/linux/issues/2408
      
      dwc_otg: fix bug with port_addr assignment for single-TT hubs
      
      See https://github.com/raspberrypi/linux/issues/2734
      
      
      
      The "Hub Port" field in the split transaction packet was always set
      to 1 for single-TT hubs. The majority of single-TT hub products
      apparently ignore this field and broadcast to all downstream enabled
      ports, which masked the issue. A subset of hub devices apparently
      need the port number to be exact or split transactions will fail.
      
      usb: dwc_otg: Clean up build warnings on 64bit kernels
      
      No functional changes. Almost all are changes to logging lines.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      
      usb: dwc_otg: Use dma allocation for mphi dummy_send buffer
      
      The FIQ driver used a kzalloc'ed buffer for dummy_send,
      passing a kernel virtual address to the hardware block.
      The buffer is only ever used for a dummy read, so it
      should be harmless, but there is the chance that it will
      cause exceptions.
      
      Use a dma allocation so that we have a genuine bus address,
      and read from that.
      Free the allocation when done for good measure.
      
      Signed-off-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
      
      dwc_otg: only do_split when we actually need to do a split
      
      The previous test would fail if the root port was in fullspeed mode
      and there was a hub between the FS device and the root port. While
      the transfer worked, the schedule mangling performed for high-speed
      split transfers would break leading to an 8ms polling interval.
      
      dwc_otg: fix locking around dequeueing and killing URBs
      
      kill_urbs_in_qh_list() is practically only ever called with the fiq lock
      already held, so don't spinlock twice in the case where we need to cancel
      an isochronous transfer.
      
      Also fix up a case where the global interrupt register could be read with
      the fiq lock not held.
      
      Fixes the deadlock seen in https://github.com/raspberrypi/linux/issues/2907
      
      
      
      ARM64/DWC_OTG: Port dwc_otg driver to ARM64
      
      In ARM64, the FIQ mechanism used by this driver is not current
      implemented.   As a workaround, reqular IRQ is used instead
      of FIQ.
      
      In a separate change, the IRQ-CPU mapping is round robined
      on ARM64 to increase concurrency and allow multiple interrupts
      to be serviced at a time.  This reduces the need for FIQ.
      
      Tests Run:
      
      This mechanism is most likely to break when multiple USB devices
      are attached at the same time.  So the system was tested under
      stress.
      
      Devices:
      
      1. USB Speakers playing back a FLAC audio through VLC
         at 96KHz.(Higher then typically, but supported on my speakers).
      
      2. sftp transferring large files through the buildin ethernet
         connection which is connected through USB.
      
      3. Keyboard and mouse attached and being used.
      
      Although I do occasionally hear some glitches, the music seems to
      play quite well.
      
      Signed-off-by: default avatarMichael Zoran <mzoran@crowfest.net>
      
      usb: dwc_otg: Clean up interrupt claiming code
      
      The FIQ/IRQ interrupt number identification code is scattered through
      the dwc_otg driver. Rationalise it, simplifying the code and solving
      an existing issue.
      
      See: https://github.com/raspberrypi/linux/issues/2612
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      dwc_otg: Choose appropriate IRQ handover strategy
      
      2711 has no MPHI peripheral, but the ARM Control block can fake
      interrupts. Use the size of the DTB "mphi" reg block to determine
      which is required.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      usb: host: dwc_otg: fix compiling in separate directory
      
      The dwc_otg Makefile does not respect the O=path argument correctly:
      include paths in CFLAGS are given relatively to object path, not source
      path. Compiling in a separate directory yields #include errors.
      
      Signed-off-by: default avatarMarek Behún <marek.behun@nic.cz>
      
      dwc_otg: use align_buf for small IN control transfers (#3150)
      
      The hardware will do a 4-byte write to memory on any IN packet received
      that is between 1 and 3 bytes long. This tramples memory in the uvcvideo
      driver, as it uses a sequence of 1- and 2-byte control transfers to
      query the min/max/range/step of each individual camera control and
      gives us buffers that are offsets into a struct.
      
      Catch small control transfers in the data phase and use the align_buf
      to bounce the correct number of bytes into the URB's buffer.
      
      In general, short packets on non-control endpoints should be OK as URBs
      should have enough buffer space for a wMaxPacket size transfer.
      
      See: https://github.com/raspberrypi/linux/issues/3148
      
      
      
      Signed-off-by: default avatarJonathan Bell <jonathan@raspberrypi.org>
      
      dwc_otg: Declare DMA capability with HCD_DMA flag
      
      Following [1], USB controllers have to declare DMA capabilities in
      order for them to be used by adding the HCD_DMA flag to their hc_driver
      struct.
      
      [1] 7b81cb6b
      
       ("usb: add a HCD_DMA flag instead of guestimating DMA capabilities")
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      
      dwc_otg: checking the urb->transfer_buffer too early (#3332)
      
      After enable the HIGHMEM and VMSPLIT_3G, the dwc_otg driver doesn't
      work well on Pi2/3 boards with 1G physical ram. Users experience
      the failure when copying a file of 600M size to the USB stick. And
      at the same time, the dmesg shows:
      usb 1-1.1.2: reset high-speed USB device number 8 using dwc_otg
      sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
      blk_update_request: I/O error, dev sda, sector 3024048 op 0x1:(WRITE) flags 0x4000 phys_seg 15 prio class 0
      
      When this happens, the sg_buf sent to the driver is located in the
      highmem region, the usb_sg_init() in the core/message.c will leave
      transfer_buffer to NULL if the sg_buf is in highmem, but in the
      dwc_otg driver, it returns -EINVAL unconditionally if transfer_buffer
      is NULL.
      
      The driver can handle the situation of buffer to be NULL, if it is in
      DMA mode, it will convert an address from transfer_dma.
      
      But if the conversion fails or it is in the PIO mode, we should check
      buffer and return -EINVAL if it is NULL.
      
      BugLink: https://bugs.launchpad.net/bugs/1852510
      
      
      Signed-off-by: default avatarHui Wang <hui.wang@canonical.com>
      
      dwc_otg: constrain endpoint max packet and transfer size on split IN
      
      The hcd would unconditionally set the transfer length to the endpoint
      packet size for non-isoc IN transfers. If the remaining buffer length
      was less than the length of returned data, random memory would get
      scribbled over, with bad effects if it crossed a page boundary.
      
      Force a babble error if this happens by limiting the max transfer size
      to the available buffer space. DMA will stop writing to memory on a
      babble condition.
      
      The hardware expects xfersize to be an integer multiple of maxpacket
      size, so override hcchar.b.mps as well.
      
      Signed-off-by: default avatarJonathan Bell <jonathan@raspberrypi.org>
      
      dwc_otg: fiq_fsm: pause when cancelling split transactions
      
      Non-periodic splits will DMA to/from the driver-provided transfer_buffer,
      which may be freed immediately after the dequeue call returns. Block until
      we know the transfer is complete.
      
      A similar delay is needed when cleaning up disconnects, as the FIQ could
      have started a periodic transfer in the previous microframe to the one
      that triggered a disconnect.
      
      Signed-off-by: default avatarJonathan Bell <jonathan@raspberrypi.org>
      
      dwc_otg: fiq_fsm: add a barrier on entry into FIQ handler(s)
      
      On BCM2835, there is no hardware guarantee that multiple outstanding
      reads to different peripherals will complete in-order. The FIQ code
      uses peripheral reads without barriers for performance, so in the case
      where a read to a slow peripheral was issued immediately prior to FIQ
      entry, the first peripheral read that the FIQ did could end up with
      wrong read data returned.
      
      Add dsb(sy) on entry so that all outstanding reads are retired.
      
      The FIQ only issues reads to the dwc_otg core, so per-read barriers
      in the handler itself are not required.
      
      On BCM2836 and BCM2837 the barrier is not strictly required due to
      differences in how the peripheral bus is implemented, but having
      arch-specific handlers that introduce different latencies is risky.
      
      Signed-off-by: default avatarJonathan Bell <jonathan@raspberrypi.org>
      f5f6d397
    • popcornmix's avatar
      Main bcm2708/bcm2709 linux port · a7457f0b
      popcornmix authored
      
      
      Signed-off-by: default avatarpopcornmix <popcornmix@gmail.com>
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      bcm2709: Drop platform smp and timer init code
      
      irq-bcm2836 handles this through these functions:
      bcm2835_init_local_timer_frequency()
      bcm2836_arm_irqchip_smp_init()
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      bcm270x: Use watchdog for reboot/poweroff
      
      The watchdog driver already has support for reboot/poweroff.
      Make use of this and remove the code from the platform files.
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      
      board_bcm2835: Remove coherent dma pool increase - API has gone
      a7457f0b
    • notro's avatar
      a05c165f
    • Phil Elwell's avatar
      tty: amba-pl011: Avoid rare write-when-full error · e6b76821
      Phil Elwell authored
      
      
      Under some circumstances on BCM283x processors data loss can be
      observed - a single byte missing from the TX output stream. These bytes
      are always the last byte of a batch of 8 written from pl011_tx_chars
      when from_irq is true, meaning that the FIFO full flag is not checked
      before writing.
      
      The transmit optimisation relies on the FIFO being half-empty when the
      TX interrupt is raised. Instrumenting the driver further showed that
      the failure case correlated with the TX FIFO full flag being set at the
      point where the last byte was written to the data register, which
      explains the data loss but not how the FIFO appeared to be prematurely
      full. A possible explanation is that a FIFO write was in flight at the
      time the interrupt was raised, but as yet there is no hypothesis as to
      how this might occur.
      
      In the absence of a clear understanding of the failure mechanism, avoid
      the problem by checking the FIFO levels before writing the last byte of
      the group, which will have minimal performance impact.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      e6b76821
    • Phil Elwell's avatar
      tty: amba-pl011: Add un/throttle support · 79533c2b
      Phil Elwell authored
      
      
      The PL011 driver lacks throttle and unthrottle methods. As a result,
      sending more data to the Pi than it can immediately sink while CRTSCTS
      is enabled causes a NULL pointer to be followed.
      
      Add a throttle handler that disables the RX interrupts, and an
      unthrottle handler that reenables them.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      79533c2b
    • Phil Elwell's avatar
      tty: amba-pl011: Make TX optimisation conditional · 0631a08e
      Phil Elwell authored
      pl011_tx_chars takes a "from_irq" parameter to reduce the number of
      register accesses. When from_irq is true the function assumes that the
      FIFO is half empty and writes up to half a FIFO's worth of bytes
      without polling the FIFO status register, the reasoning being that
      the function is being called as a result of the TX interrupt being
      raised. This logic would work were it not for the fact that
      pl011_rx_chars, called from pl011_int before pl011_tx_chars, releases
      the spinlock before calling tty_flip_buffer_push.
      
      A user thread writing to the UART claims the spinlock and ultimately
      calls pl011_tx_chars with from_irq set to false. This reverts to the
      older logic that polls the FIFO status register before sending every
      byte. If this happen on an SMP system during the section of the IRQ
      handler where the spinlock has been released, then by the time the TX
      interrupt handler is called, the FIFO may already be full, and any
      further writes are likely to be lost.
      
      The fix involves adding a per-port flag that is true iff running from
      within the interrupt handler and the spinlock has not yet been released.
      This flag is then used as the value for the from_irq parameter of
      pl011_tx_chars, causing polling to be used in the unsafe case.
      
      Fixes: 1e84d223
      
       ("serial/amba-pl011: Refactor and simplify TX FIFO handling")
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      0631a08e
    • Phil Elwell's avatar
      amba_pl011: Add cts-event-workaround DT property · f1d3c660
      Phil Elwell authored
      The BCM2835 PL011 implementation seems to have a bug that can lead to a
      transmission lockup if CTS changes frequently. A workaround was added to
      the driver with a vendor-specific flag to enable it, but this flag is
      currently not set for ARM implementations.
      
      Add a "cts-event-workaround" property to Pi DTBs and use the presence
      of that property to force the flag to be enabled in the driver.
      
      See: https://github.com/raspberrypi/linux/issues/1280
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      f1d3c660
    • Phil Elwell's avatar
      amba_pl011: Insert mb() for correct FIFO handling · 6264cfbe
      Phil Elwell authored
      
      
      The pl011 register accessor functions use the _relaxed versions of the
      standard readl() and writel() functions, meaning that there are no
      automatic memory barriers. When polling a FIFO status register to check
      for fullness, it is necessary to ensure that any outstanding writes have
      completed; otherwise the flags are effectively stale, making it possible
      that the next write is to a full FIFO.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      6264cfbe
    • Phil Elwell's avatar
      amba_pl011: Round input clock up · ef3e5758
      Phil Elwell authored
      
      
      The UART clock is initialised to be as close to the requested
      frequency as possible without exceeding it. Now that there is a
      clock manager that returns the actual frequencies, an expected
      48MHz clock is reported as 47999625. If the requested baudrate
      == requested clock/16, there is no headroom and the slight
      reduction in actual clock rate results in failure.
      
      Detect cases where it looks like a "round" clock was chosen and
      adjust the reported clock to match that "round" value. As the
      code comment says:
      
      /*
       * If increasing a clock by less than 0.1% changes it
       * from ..999.. to ..000.., round up.
       */
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      ef3e5758
    • Phil Elwell's avatar
      amba_pl011: Don't use DT aliases for numbering · d0dd0fac
      Phil Elwell authored
      The pl011 driver looks for DT aliases of the form "serial<n>",
      and if found uses <n> as the device ID. This can cause
      /dev/ttyAMA0 to become /dev/ttyAMA1, which is confusing if the
      other serial port is provided by the 8250 driver which doesn't
      use the same logic.
      d0dd0fac
    • Phil Elwell's avatar
      lan78xx: Enable LEDs and auto-negotiation · 54892bef
      Phil Elwell authored
      
      
      For applications of the LAN78xx that don't have valid programmed
      EEPROMs or OTPs, enabling both LEDs and auto-negotiation by default
      seems reasonable.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      54892bef
    • Phil Elwell's avatar
      irqchip: irq-bcm2836: Remove regmap and syscon use · 00034cfd
      Phil Elwell authored
      The syscon node defines a register range that duplicates that used by
      the local_intc node on bcm2836/7. Since irq-bcm2835 and irq-bcm2836 are
      built in and always present together (both drivers are enabled by
      CONFIG_ARCH_BCM2835), it is possible to replace the syscon usage with a
      global variable that simplifies the code. Doing so does lose the
      locking provided by regmap, but as only one side is using the regmap
      interface (irq-bcm2835 uses readl and write) there is no loss of
      atomicity.
      
      See: https://github.com/raspberrypi/firmware/issues/926
      
      
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      00034cfd
    • Phil Elwell's avatar
      ASoC: Add prompt for ICS43432 codec · eceba962
      Phil Elwell authored
      
      
      Without a prompt string, a config setting can't be included in a
      defconfig. Give CONFIG_SND_SOC_ICS43432 a prompt so that Pi soundcards
      can use the driver.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      eceba962
    • Eric Anholt's avatar
      mm: Remove the PFN busy warning · 64feeb7d
      Eric Anholt authored
      See commit dae803e1
      
       -- the warning is
      expected sometimes when using CMA.  However, that commit still spams
      my kernel log with these warnings.
      
      Signed-off-by: default avatarEric Anholt <eric@anholt.net>
      64feeb7d
    • Noralf Trønnes's avatar
      i2c: bcm2835: Add debug support · 88b5c3d5
      Noralf Trønnes authored
      
      
      This adds a debug module parameter to aid in debugging transfer issues
      by printing info to the kernel log. When enabled, status values are
      collected in the interrupt routine and msg info in
      bcm2835_i2c_start_transfer(). This is done in a way that tries to avoid
      affecting timing. Having printk in the isr can mask issues.
      
      debug values (additive):
      1: Print info on error
      2: Print info on all transfers
      3: Print messages before transfer is started
      
      The value can be changed at runtime:
      /sys/module/i2c_bcm2835/parameters/debug
      
      Example output, debug=3:
      [  747.114448] bcm2835_i2c_xfer: msg(1/2) write addr=0x54, len=2 flags= [i2c1]
      [  747.114463] bcm2835_i2c_xfer: msg(2/2) read addr=0x54, len=32 flags= [i2c1]
      [  747.117809] start_transfer: msg(1/2) write addr=0x54, len=2 flags= [i2c1]
      [  747.117825] isr: remain=2, status=0x30000055 : TA TXW TXD TXE  [i2c1]
      [  747.117839] start_transfer: msg(2/2) read addr=0x54, len=32 flags= [i2c1]
      [  747.117849] isr: remain=32, status=0xd0000039 : TA RXR TXD RXD  [i2c1]
      [  747.117861] isr: remain=20, status=0xd0000039 : TA RXR TXD RXD  [i2c1]
      [  747.117870] isr: remain=8, status=0x32 : DONE TXD RXD  [i2c1]
      
      Signed-off-by: default avatarNoralf Trønnes <noralf@tronnes.org>
      88b5c3d5
    • Claggy3's avatar
      Update vfpmodule.c · e4652cc8
      Claggy3 authored
      Christopher Alexander Tobias Schulze - May 2, 2015, 11:57 a.m.
      This patch fixes a problem with VFP state save and restore related
      to exception handling (panic with message "BUG: unsupported FP
      instruction in kernel mode") present on VFP11 floating point units
      (as used with ARM1176JZF-S CPUs, e.g. on first generation Raspberry
      Pi boards). This patch was developed and discussed on
      
         https://github.com/raspberrypi/linux/issues/859
      
      
      
      A precondition to see the crashes is that floating point exception
      traps are enabled. In this case, the VFP11 might determine that a FPU
      operation needs to trap at a point in time when it is not possible to
      signal this to the ARM11 core any more. The VFP11 will then set the
      FPEXC.EX bit and store the trapped opcode in FPINST. (In some cases,
      a second opcode might have been accepted by the VFP11 before the
      exception was detected and could be reported to the ARM11 - in this
      case, the VFP11 also sets FPEXC.FP2V and stores the second opcode in
      FPINST2.)
      
      If FPEXC.EX is set, the VFP11 will "bounce" the next FPU opcode issued
      by the ARM11 CPU, which will be seen by the ARM11 as an undefined opcode
      trap. The VFP support code examines the FPEXC.EX and FPEXC.FP2V bits
      to decide what actions to take, i.e., whether to emulate the opcodes
      found in FPINST and FPINST2, and whether to retry the bounced instruction.
      
      If a user space application has left the VFP11 in this "pending trap"
      state, the next FPU opcode issued to the VFP11 might actually be the
      VSTMIA operation vfp_save_state() uses to store the FPU registers
      to memory (in our test cases, when building the signal stack frame).
      In this case, the kernel crashes as described above.
      
      This patch fixes the problem by making sure that vfp_save_state() is
      always entered with FPEXC.EX cleared. (The current value of FPEXC has
      already been saved, so this does not corrupt the context. Clearing
      FPEXC.EX has no effects on FPINST or FPINST2. Also note that many
      callers already modify FPEXC by setting FPEXC.EN before invoking
      vfp_save_state().)
      
      This patch also addresses a second problem related to FPEXC.EX: After
      returning from signal handling, the kernel reloads the VFP context
      from the user mode stack. However, the current code explicitly clears
      both FPEXC.EX and FPEXC.FP2V during reload. As VFP11 requires these
      bits to be preserved, this patch disables clearing them for VFP
      implementations belonging to architecture 1. There should be no
      negative side effects: the user can set both bits by executing FPU
      opcodes anyway, and while user code may now place arbitrary values
      into FPINST and FPINST2 (e.g., non-VFP ARM opcodes) the VFP support
      code knows which instructions can be emulated, and rejects other
      opcodes with "unhandled bounce" messages, so there should be no
      security impact from allowing reloading FPEXC.EX and FPEXC.FP2V.
      
      Signed-off-by: default avatarChristopher Alexander Tobias Schulze <cat.schulze@alice-dsl.net>
      e4652cc8
    • Phil Elwell's avatar
      sound: Demote deferral errors to INFO level · 58763add
      Phil Elwell authored
      
      
      At present there is no mechanism to specify driver load order,
      which can lead to deferrals and repeated retries until successful.
      Since this situation is expected, reduce the dmesg level to
      INFO and mention that the operation will be retried.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      58763add
    • Eric Anholt's avatar
      clk: bcm2835: Mark GPIO clocks enabled at boot as critical. · 2ec8e76c
      Eric Anholt authored
      
      
      These divide off of PLLD_PER and are used for the ethernet and wifi
      PHYs source PLLs.  Neither of them is currently represented by a phy
      device that would grab the clock for us.
      
      This keeps other drivers from killing the networking PHYs when they
      disable their own clocks and trigger PLLD_PER's refcount going to 0.
      
      v2: Skip marking as critical if they aren't on at boot.
      
      Signed-off-by: default avatarEric Anholt <eric@anholt.net>
      2ec8e76c
    • Phil Elwell's avatar
      clk-bcm2835: Read max core clock from firmware · a03d845a
      Phil Elwell authored
      
      
      The VPU is responsible for managing the core clock, usually under
      direction from the bcm2835-cpufreq driver but not via the clk-bcm2835
      driver. Since the core frequency can change without warning, it is
      safer to report the maximum clock rate to users of the core clock -
      I2C, SPI and the mini UART - to err on the safe side when calculating
      clock divisors.
      
      If the DT node for the clock driver includes a reference to the
      firmware node, use the firmware API to query the maximum core clock
      instead of reading the divider registers.
      
      Prior to this patch, a "100KHz" I2C bus was sometimes clocked at about
      160KHz. In particular, switching to the 4.9 kernel was likely to break
      SenseHAT usage on a Pi3.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      a03d845a
    • Phil Elwell's avatar
      clk-bcm2835: Add claim-clocks property · e78a5d78
      Phil Elwell authored
      
      
      The claim-clocks property can be used to prevent PLLs and dividers
      from being marked as critical. It contains a vector of clock IDs,
      as defined by dt-bindings/clock/bcm2835.h.
      
      Use this mechanism to claim PLLD_DSI0, PLLD_DSI1, PLLH_AUX and
      PLLH_PIX for the vc4_kms_v3d driver.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      e78a5d78
    • Phil Elwell's avatar
      clk-bcm2835: Mark used PLLs and dividers CRITICAL · 6ecfe87c
      Phil Elwell authored
      
      
      The VPU configures and relies on several PLLs and dividers. Mark all
      enabled dividers and their PLLs as CRITICAL to prevent the kernel from
      switching them off.
      
      Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
      6ecfe87c
    • popcornmix's avatar
      bcm2835-rng: Avoid initialising if already enabled · 53988799
      popcornmix authored
      Avoids the 0x40000 cycles of warmup again if firmware has already used it
      53988799
    • Martin Sperl's avatar
      Register the clocks early during the boot process, so that special/critical... · 4c117b48
      Martin Sperl authored
      
      Register the clocks early during the boot process, so that special/critical clocks can get enabled early on in the boot process avoiding the risk of disabling a clock, pll_divider or pll when a claiming driver fails to install propperly - maybe it needs to defer.
      
      Signed-off-by: default avatarMartin Sperl <kernel@martin.sperl.org>
      4c117b48
    • popcornmix's avatar
      bcm: Make RASPBERRYPI_POWER depend on PM · cdd6b0c6
      popcornmix authored
      cdd6b0c6