1. 22 Aug, 2017 10 commits
  2. 02 Aug, 2017 9 commits
    • Jordan Crouse's avatar
      drm/msm: Add A5XX hardware fault detection · ac1b5ab4
      Jordan Crouse authored
      The A5XX GPU has really good hardware fault detection that can
      detect a abnormal hardware condition and fire an interrupt in
      a matter of milliseconds which is a lot better than waiting for
      the hangcheck timer.
      
      Enable the interrupt and log information before kicking off
      recovery.
      Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      ac1b5ab4
    • Jordan Crouse's avatar
      drm/msm: Remove uneeded platform dev members · 8d6f0827
      Jordan Crouse authored
      Commit eeb75474 ("drm/msm/gpu: use pm-runtime") adds a pointer
      for the GPU platform device to the msm_gpu struct so we can
      happily remove the same pointers from the individual GPU
      structs.
      Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      8d6f0827
    • Archit Taneja's avatar
      drm/msm/mdp5: Set up runtime PM for MDSS · 774e39ee
      Archit Taneja authored
      MDSS represents the top level wrapper that contains MDP5, DSI, HDMI and
      other sub-blocks. W.r.t device heirarchy, it's the parent of all these
      devices. The power domain of this device is actually tied to the GDSC
      hw. When any sub-device enables its PD, MDSS's PD is also enabled.
      
      The suspend/resume ops enable the top level clocks that end at the MDSS
      boundary. For now, we're letting them all be optional, since the child
      devices anyway hold a ref to these clocks.
      
      Until now, we'd called a runtime_get() during probe, which ensured that
      the GDSC was always on. Now that we've set up runtime PM for the children
      devices, we can get rid of this hack.
      
      Note: that the MDSS device is the platform_device in msm_drv.c. The
      msm_runtime_suspend/resume ops call the funcs that enable/disable
      the top level MDSS clocks. This is different from MDP4, where the
      platform device created in msm_drv.c represents MDP4 itself. It would
      have been nicer to hide these differences by adding new kms funcs, but
      runtime PM needs to be enabled before kms is set up (i.e, msm_kms_init
      is called).
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      774e39ee
    • Archit Taneja's avatar
      drm/msm/mdp5: Write to SMP registers even if allocations don't change · 0f379b79
      Archit Taneja authored
      Requests for assigning/freeing SMP blocks by planes are collected during
      the atomic check phase, and represented by mdp5_smp_state's 'assigned'
      and 'released' members.
      
      Once the atomic state is committed, these members are reset to 0,
      indicating that the existing configuration satisfies all the planes.
      Future atomic commits will copy the old mdp5_smp_state, and the 'assigned'
      and 'released' members would be updated only if there was a change in
      the plane configurations.
      
      When we disable and re-enable display, we lose the values we wrote to the
      SMP registers, but the code doesn't program the registers because there
      isn't any change in mdp5_smp_state.
      
      Fix this by writing to the registers irrespective of whether there was
      a change in SMP state or not. We do this by keeping a cache of the
      register values, and write them every time we commit a state.
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      0f379b79
    • Archit Taneja's avatar
      drm/msm/mdp5: Don't use mode_set helper funcs for encoders and CRTCs · 710e7a44
      Archit Taneja authored
      We shouldn't use use mode_set/mode_set_nofb helpers when we use runtime
      PM. The registers configured in these funcs lose their state when we
      eventually enable the display pipeline.
      
      Do not implement these vfuncs in the helpers, and call them in the
      crtc_enable/encoder_enable paths instead.
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      710e7a44
    • Archit Taneja's avatar
      drm/msm/dsi: Implement RPM suspend/resume callbacks · f54ca1a0
      Archit Taneja authored
      The bus clocks are always enabled/disabled along with the power
      domain, so move it to the runtime suspend/resume ops. This cleans
      up the clock code a bit. Get rid of the clk_mutex mutex since it
      isn't needed.
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      f54ca1a0
    • Archit Taneja's avatar
      drm/msm/dsi: Set up runtime PM for DSI · f6be1121
      Archit Taneja authored
      Call the pm_runtime_get/put API where we need the clocks enabled.
      
      The main entry/exit points are 1) enabling/disabling the DSI bridge
      and 2) Sending commands from the DSI host to the device.
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      f6be1121
    • Archit Taneja's avatar
      drm/msm/hdmi: Set up runtime PM for HDMI · 6ed9ed48
      Archit Taneja authored
      Enable rudimentary runtime PM in the HDMI driver. We can't really do
      agressive PM toggling at the moment because we need to leave the hpd
      clocks enabled all the time. There isn't much benefit of creating
      suspend/resume ops to toggle clocks either.
      
      We just make sure that we configure the power domain in the HDMI bridge's
      enable/disable paths, and the HDMI connector's detect() op.
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      6ed9ed48
    • Archit Taneja's avatar
      drm/msm/mdp5: Use runtime PM get/put API instead of toggling clocks · d68fe15b
      Archit Taneja authored
      mdp5_enable/disable calls are scattered all around in the MDP5 code.
      Use the pm_runtime_get/put calls here instead, and populate the
      runtime PM suspend/resume ops to manage the clocks.
      
      About the overall design: MDP5 is a child of the top level MDSS
      device. MDSS is also the parent to DSI, HDMI and other interfaces. When
      we enable MDP5's power domain, we end up enabling MDSS's PD too. It is
      only MDSS's PD that actually controlls the GDSC HW. Therefore, calling
      runtime_get/put on the MDP5 device is like just requesting a vote to
      enable/disable the GDSC.
      
      Functionally, replacing the clock enable/disable calls with the RPM API
      can result in the power domain (GDSC) state being toggled if no other
      child isn't powered on. This can result in the register context being lost.
      We make sure (in future commits) that code paths don't end up configuring
      registers and then later lose state, resulting in a bad HW state.
      
      For now, we've replaced each mdp5_enable/disable with runtime_get/put API.
      We could optimize things later by removing runtime_get/put calls which
      don't really need to be there. This could prevent unnecessary toggling of
      the power domain and clocks.
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      d68fe15b
  3. 01 Aug, 2017 17 commits
    • Arnd Bergmann's avatar
      drm/msm: gpu: don't abuse dma_alloc for non-DMA allocations · 8f93e043
      Arnd Bergmann authored
      In zap_shader_load_mdt(), we pass a pointer to a phys_addr_t
      into dmam_alloc_coherent, which the compiler warns about:
      
      drivers/gpu/drm/msm/adreno/a5xx_gpu.c: In function 'zap_shader_load_mdt':
      drivers/gpu/drm/msm/adreno/a5xx_gpu.c:54:50: error: passing argument 3 of 'dmam_alloc_coherent' from incompatible pointer type [-Werror=incompatible-pointer-types]
      
      The returned DMA address is later passed on to a function that
      takes a phys_addr_t, so it's clearly wrong to use the DMA
      mapping interface here: the memory may be uncached, or the
      address may be completely wrong if there is an IOMMU connected
      to the device. What the code actually wants to do is to get
      the physical address from the reserved-mem node. It goes through
      the dma-mapping interfaces for obscure reasons, and this
      apparently only works by chance, relying on specific bugs
      in the error handling of the arm64 dma-mapping implementation.
      
      The same problem existed in the "venus" media driver, which was
      now fixed by Stanimir Varbanov after long discussions.
      
      In order to make some progress here, I have now ported his
      approach over to the adreno driver. The patch is currently
      untested, and should get a good review, but it is now much
      simpler than the original, and it should be obvious what
      goes wrong if I made a mistake in the port.
      
      See also: a6e2d36b ("media: venus: don't abuse dma_alloc for non-DMA allocations")
      Cc: Stanimir Varbanov <stanimir.varbanov@linaro.org>
      Fixes: 7c65817e ("drm/msm: gpu: Enable zap shader for A5XX")
      Acked-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
      Acked-and-Tested-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      8f93e043
    • Arnd Bergmann's avatar
      drm/msm: gpu: call qcom_mdt interfaces only for ARCH_QCOM · bdab8e8b
      Arnd Bergmann authored
      When compile-testing for something other than ARCH_QCOM,
      we run into a link error:
      
      drivers/gpu/drm/msm/adreno/a5xx_gpu.o: In function `a5xx_hw_init':
      a5xx_gpu.c:(.text.a5xx_hw_init+0x600): undefined reference to `qcom_mdt_get_size'
      a5xx_gpu.c:(.text.a5xx_hw_init+0x93c): undefined reference to `qcom_mdt_load'
      
      There is already an #ifdef that tries to check for CONFIG_QCOM_MDT_LOADER,
      but that symbol is only meaningful when building for ARCH_QCOM.
      
      This adds a compile-time check for ARCH_QCOM, and clarifies the
      Kconfig select statement so we don't even try it for other targets.
      
      The check for CONFIG_QCOM_MDT_LOADER can then go away, which also
      improves compile-time coverage and makes the code a little nicer
      to read.
      
      Fixes: 7c65817e ("drm/msm: gpu: Enable zap shader for A5XX")
      Acked-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Acked-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      bdab8e8b
    • Archit Taneja's avatar
      drm/msm/adreno: Prevent unclocked access when retrieving timestamps · 541de4c9
      Archit Taneja authored
      msm_gpu's get_timestamp() op (called by the MSM_GET_PARAM ioctl) can
      result in register accesses. We need our power domain and clocks to
      be active for that. Make sure they are enabled here.
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      541de4c9
    • Jordan Crouse's avatar
      drm/msm: Remove __user from __u64 data types · cdbc78ba
      Jordan Crouse authored
      __user should be used to identify user pointers and not __u64
      variables containing pointers.
      Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      cdbc78ba
    • Jordan Crouse's avatar
      drm/msm: args->fence should be args->flags · b0135ab9
      Jordan Crouse authored
      Fix a typo in msm_ioctl_gem_submit - check args->flags for the
      MSM_SUBMIT_NO_IMPLICIT flag instead of args->fence.
      Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      b0135ab9
    • Jordan Crouse's avatar
      drm/msm: Turn off hardware clock gating before reading A5XX registers · a23cb3b5
      Jordan Crouse authored
      On A5XX GPU hardware clock gating needs to be turned off before
      reading certain GPU registers via AHB. Turn off HWCG before calling
      adreno_show() to safely dump all the registers without a system hang.
      Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      a23cb3b5
    • Jordan Crouse's avatar
      drm/msm: Allow hardware clock gating to be toggled · 6e749e59
      Jordan Crouse authored
      There are some use cases wherein we need to turn off hardware clock
      gating before reading certain registers. Modify the A5XX HWCG function
      to allow user to enable or disable clock gating at will.
      Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      6e749e59
    • Jordan Crouse's avatar
      drm/msm: Remove some potentially blocked register ranges · 3394f561
      Jordan Crouse authored
      The 0xf400 and 0xf800 ranges are in the RBBM_SECVID block which may
      be protected from CPU access. Skip dumping them since they are minimally
      useful for debugging and they aren't worth a system hang.
      Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      3394f561
    • Archit Taneja's avatar
      drm/msm/mdp5: Drop clock names with "_clk" suffix · d0538f50
      Archit Taneja authored
      We have upstream bindings (msm8916) that have the "_clk" suffix in the
      clock names. The downstream bindings also require it.
      
      We want to drop the "_clk" suffix and at the same time support existing
      bindings. Update the MDP5 code with the the msm_clk_get() helper to
      support both old and new clock names.
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      d0538f50
    • Archit Taneja's avatar
      drm/msm/mdp5: Fix typo in encoder_enable path · b0e77fd8
      Archit Taneja authored
      The mdp5_cmd_encoder_disable is accidentally called in the encoder enable
      path. We've not seen any problems since we haven't tested with command
      mode panels in a while. Fix the copy-paste error.
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      b0e77fd8
    • Hans Verkuil's avatar
      drm/msm: NULL pointer dereference in drivers/gpu/drm/msm/msm_gem_vma.c · 79687057
      Hans Verkuil authored
      While I was testing the upcoming adv7533 CEC support with my Dragonboard c410
      I encountered this NULL pointer dereference:
      
      [   17.912822] Unable to handle kernel NULL pointer dereference at virtual address 000000e8
      [   17.917191] user pgtable: 4k pages, 48-bit VAs, pgd = ffff800030e9f000
      [   17.925249] [00000000000000e8] *pgd=00000000b0daf003, *pud=0000000000000000
      [   17.931650] Internal error: Oops: 96000005 [#1] PREEMPT SMP
      [   17.938395] Modules linked in: btqcomsmd btqca arc4 wcn36xx mac80211 bluetooth cfg80211 ecdh_generic r8152 snd_soc_hdmi_codec adv7511 cec
      qcom_wcnss_pil msm mdt_loader drm_kms_helper msm_rng rng_core drm
      [   17.943967] CPU: 0 PID: 1684 Comm: Xorg Tainted: G        W       4.13.0-rc1-dragonboard #111
      [   17.962005] Hardware name: Qualcomm Technologies, Inc. APQ 8016 SBC (DT)
      [   17.970685] task: ffff800031236c00 task.stack: ffff800033fbc000
      [   17.977582] PC is at msm_gem_unmap_vma+0x20/0x80 [msm]
      [   17.983213] LR is at put_iova+0x60/0xb8 [msm]
      [   17.988303] pc : [<ffff000000ac2d58>] lr : [<ffff000000ac07c8>] pstate: 20000145
      [   17.992733] sp : ffff800033fbfb30
      [   18.000193] x29: ffff800033fbfb30 x28: ffff800030b5f000
      [   18.003407] x27: 00000000000000b4 x26: ffff0000009f8cd8
      [   18.008789] x25: 0000000000000004 x24: dead000000000100
      [   18.014085] x23: dead000000000200 x22: ffff800030b5fd40
      [   18.019379] x21: ffff800030b5fc00 x20: 0000000000000000
      [   18.024675] x19: ffff80003082bf00 x18: 0000000000000000
      [   18.029970] x17: 0000ffffb3347e70 x16: ffff000008207638
      [   18.035265] x15: 0000000000000053 x14: 0000000000000000
      [   18.040560] x13: 0000000000000038 x12: 0101010101010101
      [   18.045855] x11: 7f7f7f7f7f7f7f7f x10: 0000000000000040
      [   18.051150] x9 : ffff800030b5f038 x8 : ffff800031657b50
      [   18.056446] x7 : ffff800031657b78 x6 : 0000000000000000
      [   18.061740] x5 : 0000000000000000 x4 : 00000000b5c01000
      [   18.067036] x3 : 0000000000000000 x2 : ffff8000337bf300
      [   18.072330] x1 : ffff80003082bf00 x0 : 0000000000000000
      [   18.077629] Process Xorg (pid: 1684, stack limit = 0xffff800033fbc000)
      [   18.082925] Stack: (0xffff800033fbfb30 to 0xffff800033fc0000)
      [   18.089262] fb20:                                   ffff800033fbfb60 ffff000000ac07c8
      [   18.095081] fb40: ffff80003082bf00 ffff800030b5fc90 ffff800030b5fc00 ffff000000abf4a0
      [   18.102893] fb60: ffff800033fbfba0 ffff000000ac16b0 ffff800030b5fc00 ffff8000338ff870
      [   18.110706] fb80: ffff8000338ff800 ffff800030b5fc00 ffff800030b5fda8 ffff800033fbfd80
      [   18.118518] fba0: ffff800033fbfbe0 ffff0000009d4244 ffff800030b5fc00 ffff800030b5f038
      [   18.126332] fbc0: ffff800033fbfbd0 ffff800030b5fc00 ffff800030b5f038 ffff0000009d4840
      [   18.134144] fbe0: ffff800033fbfbf0 ffff0000009d4858 ffff800033fbfc10 ffff0000009d48e4
      [   18.141955] fc00: ffff800030b5fc00 ffff8000338ffd98 ffff800033fbfc30 ffff0000009d49a4
      [   18.149768] fc20: ffff800030b5fc00 ffff800030b5f000 ffff800033fbfc60 ffff0000009d4a4c
      [   18.157581] fc40: ffff800030b5f050 ffff800030b5f000 0000000000000001 ffff800030b5fc00
      [   18.165394] fc60: ffff800033fbfca0 ffff0000009d4ab0 0000000000000018 ffff800030b5f000
      [   18.173206] fc80: ffff0000009efd28 ffff800033fbfd80 ffff8000338ff800 ffff0000009d56a8
      [   18.181019] fca0: ffff800033fbfcb0 ffff0000009efd54 ffff800033fbfcc0 ffff0000009d56c8
      [   18.188831] fcc0: ffff800033fbfd00 ffff0000009d58e0 ffff0000009fa6e0 00000000c00464b4
      [   18.196643] fce0: 0000000000000004 ffff80003082b400 0000ffffea1f0e00 0000000000000000
      [   18.204456] fd00: ffff800033fbfe00 ffff000008206f0c ffff80000335caf8 ffff80003082b400
      [   18.212269] fd20: 0000ffffea1f0e00 ffff80003082b400 00000000c00464b4 0000ffffea1f0e00
      [   18.220081] fd40: 0000000000000124 000000000000001d ffff0000089d2000 ffff800031236c00
      [   18.227894] fd60: ffff800033fbfd80 0000000000000004 ffff0000009efd28 ffff800033fbfd80
      [   18.235706] fd80: 0000000100000001 0000008000000001 0000001800000020 0000000000000001
      [   18.243518] fda0: 0000000100000000 0000000100000001 0000ffff00000000 0000ffff00000000
      [   18.251331] fdc0: 0000000000000124 0000000000000038 ffff0000089d2000 ffff800031236c00
      [   18.259144] fde0: ffff800033fbfe40 ffff000008214124 ffff800033fbfe30 ffff000008203290
      [   18.266956] fe00: ffff800033fbfe80 ffff0000082076b4 0000000000000000 ffff800030d8a000
      [   18.274768] fe20: ffff80003082b400 0000000000000016 ffff800033fbfe50 ffff0000081f0488
      [   18.282581] fe40: ffff800033fbfe80 ffff000008207678 0000000000000000 ffff80003082b400
      [   18.290393] fe60: ffff800033fbfe70 ffff0000082138b0 ffff800033fbfe80 ffff000008207658
      [   18.298207] fe80: 0000000000000000 ffff000008082f84 0000000000000000 0000800034a16000
      [   18.306017] fea0: ffffffffffffffff 0000ffffb3347e7c 0000000000000000 0000000000000015
      [   18.313832] fec0: 0000000000000016 00000000c00464b4 0000ffffea1f0e00 0000000000000001
      [   18.321643] fee0: 0000000000000020 0000000000000080 0000000000000001 0000000000000000
      [   18.329456] ff00: 000000000000001d 000000012692c5b0 0101010101010101 7f7f7f7f7f7f7f7f
      [   18.337269] ff20: 0101010101010101 0000000000000038 0000000000000000 0000000000000053
      [   18.345082] ff40: 0000ffffb368b2b8 0000ffffb3347e70 0000000000000000 0000ffffb3847000
      [   18.352894] ff60: 0000ffffea1f0e00 00000000c00464b4 0000000000000016 0000ffffea1f0edc
      [   18.360705] ff80: 000000012692ad20 0000000000000003 00000001214282e4 0000000121428388
      [   18.368518] ffa0: 0000000000000000 0000ffffea1f0da0 0000ffffb367185c 0000ffffea1f0da0
      [   18.376332] ffc0: 0000ffffb3347e7c 0000000000000000 0000000000000016 000000000000001d
      [   18.384142] ffe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
      [   18.391953] Call trace:
      [   18.399760] Exception stack(0xffff800033fbf950 to 0xffff800033fbfa80)
      [   18.402023] f940:                                   ffff80003082bf00 0001000000000000
      [   18.408622] f960: ffff800033fbfb30 ffff000000ac2d58 0000000020000145 ffff8000338ffa78
      [   18.416435] f980: 0000000000000000 0000000000000000 ffff800033fbf9e0 ffff0000089afcf0
      [   18.424248] f9a0: ffff80000348f230 ffff8000338ffa78 0000000000000000 0000000000000000
      [   18.432060] f9c0: ffff8000338ffaa8 0000000000000001 ffff800033fbfb80 ffff0000009e8f38
      [   18.439872] f9e0: ffff800033fbfa10 ffff0000089a9ff8 0000000000000027 ffff80003082b918
      [   18.447684] fa00: 0000000000000000 ffff80003082bf00 ffff8000337bf300 0000000000000000
      [   18.455497] fa20: 00000000b5c01000 0000000000000000 0000000000000000 ffff800031657b78
      [   18.463310] fa40: ffff800031657b50 ffff800030b5f038 0000000000000040 7f7f7f7f7f7f7f7f
      [   18.471122] fa60: 0101010101010101 0000000000000038 0000000000000000 0000000000000053
      [   18.479062] [<ffff000000ac2d58>] msm_gem_unmap_vma+0x20/0x80 [msm]
      [   18.486862] [<ffff000000ac07c8>] put_iova+0x60/0xb8 [msm]
      [   18.492938] [<ffff000000ac16b0>] msm_gem_free_object+0x60/0x198 [msm]
      [   18.498432] [<ffff0000009d4244>] drm_gem_object_free+0x1c/0x58 [drm]
      [   18.504854] [<ffff0000009d4858>] drm_gem_object_put_unlocked+0x90/0xa0 [drm]
      [   18.511273] [<ffff0000009d48e4>] drm_gem_object_handle_put_unlocked+0x64/0xd0 [drm]
      [   18.518300] [<ffff0000009d49a4>] drm_gem_object_release_handle+0x54/0x98 [drm]
      [   18.525679] [<ffff0000009d4a4c>] drm_gem_handle_delete+0x64/0xb8 [drm]
      [   18.532968] [<ffff0000009d4ab0>] drm_gem_dumb_destroy+0x10/0x18 [drm]
      [   18.539479] [<ffff0000009efd54>] drm_mode_destroy_dumb_ioctl+0x2c/0x40 [drm]
      [   18.545992] [<ffff0000009d56c8>] drm_ioctl_kernel+0x68/0xe0 [drm]
      [   18.553105] [<ffff0000009d58e0>] drm_ioctl+0x178/0x3b0 [drm]
      [   18.558970] [<ffff000008206f0c>] do_vfs_ioctl+0xa4/0x7d0
      [   18.564694] [<ffff0000082076b4>] SyS_ioctl+0x7c/0x98
      [   18.569992] [<ffff000008082f84>] el0_svc_naked+0x38/0x3c
      [   18.574941] Code: a90153f3 aa0003f4 f90013f5 aa0103f3 (f9407400)
      [   18.580502] ---[ end trace b1ac6888ec40b0be ]---
      
      It turns out that the aspace argument in msm_gem_unmap_vma() is NULL.
      Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
      [Note: this case gets hit with !IOMMU config]
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      79687057
    • Hans Verkuil's avatar
      drm/msm: fix WARN_ON in add_vma() with no iommu · b3949a9a
      Hans Verkuil authored
      While I was testing the upcoming adv7533 CEC support with my Dragonboard c410
      I encountered this warning several times during boot:
      
      [    4.408309] WARNING: CPU: 3 PID: 1347 at drivers/gpu/drm/msm/msm_gem.c:312 add_vma+0x78/0x88 [msm]
      [    4.412951] Modules linked in: snd_soc_hdmi_codec adv7511 cec qcom_wcnss_pil msm mdt_loader drm_kms_helper msm_rng rng_core drm
      [    4.421728] CPU: 3 PID: 1347 Comm: kworker/3:3 Not tainted 4.13.0-rc1-dragonboard #111
      [    4.433090] Hardware name: Qualcomm Technologies, Inc. APQ 8016 SBC (DT)
      [    4.441081] Workqueue: events deferred_probe_work_func
      [    4.447929] task: ffff800031243600 task.stack: ffff800003394000
      [    4.453023] PC is at add_vma+0x78/0x88 [msm]
      [    4.458823] LR is at _msm_gem_new+0xd4/0x188 [msm]
      [    4.463207] pc : [<ffff000000ac01f8>] lr : [<ffff000000ac06b4>] pstate: 40000145
      [    4.467811] sp : ffff8000033978a0
      [    4.475357] x29: ffff8000033978a0 x28: ffff8000031dea18
      [    4.478572] x27: ffff800003933a00 x26: ffff800003b39800
      [    4.483953] x25: ffff8000338ff800 x24: 0000000000000001
      [    4.489249] x23: 0000000000000000 x22: ffff800003b39800
      [    4.494544] x21: ffff8000338ff800 x20: 0000000000000000
      [    4.499839] x19: ffff800003932600 x18: 0000000000000001
      [    4.505135] x17: 0000ffff8969e9e0 x16: ffff7e00000ce7a0
      [    4.510429] x15: ffffffffffffffff x14: ffff8000833977ef
      [    4.515724] x13: ffff8000033977f3 x12: 0000000000000038
      [    4.521020] x11: 0101010101010101 x10: ffffff7f7fff7f7f
      [    4.526315] x9 : 0000000000000000 x8 : ffff800003932800
      [    4.531633] x7 : 0000000000000000 x6 : 000000000000003f
      [    4.531644] x5 : 0000000000000040 x4 : 0000000000000000
      [    4.531650] x3 : ffff800031243600 x2 : 0000000000000000
      [    4.531655] x1 : 0000000000000000 x0 : 0000000000000000
      [    4.531670] Call trace:
      [    4.531676] Exception stack(0xffff8000033976c0 to 0xffff8000033977f0)
      [    4.531683] 76c0: ffff800003932600 0001000000000000 ffff8000033978a0 ffff000000ac01f8
      [    4.531688] 76e0: 0000000000000140 0000000000000000 ffff800003932550 ffff800003397780
      [    4.531694] 7700: ffff800003397730 ffff000008261ce8 0000000000000000 ffff8000031d2f80
      [    4.531699] 7720: ffff800003397800 ffff0000081d671c 0000000000000140 0000000000000000
      [    4.531705] 7740: ffff000000ac04c0 0000000000004003 ffff800003397908 00000000014080c0
      [    4.531710] 7760: 0000000000000000 ffff800003b39800 0000000000000000 0000000000000000
      [    4.531716] 7780: 0000000000000000 ffff800031243600 0000000000000000 0000000000000040
      [    4.531721] 77a0: 000000000000003f 0000000000000000 ffff800003932800 0000000000000000
      [    4.531726] 77c0: ffffff7f7fff7f7f 0101010101010101 0000000000000038 ffff8000033977f3
      [    4.531730] 77e0: ffff8000833977ef ffffffffffffffff
      [    4.531881] [<ffff000000ac01f8>] add_vma+0x78/0x88 [msm]
      [    4.532011] [<ffff000000ac06b4>] _msm_gem_new+0xd4/0x188 [msm]
      [    4.532134] [<ffff000000ac1900>] msm_gem_new+0x10/0x18 [msm]
      [    4.532260] [<ffff000000acb274>] msm_dsi_host_modeset_init+0x17c/0x268 [msm]
      [    4.532384] [<ffff000000ac9024>] msm_dsi_modeset_init+0x34/0x1b8 [msm]
      [    4.532504] [<ffff000000ab6168>] modeset_init+0x408/0x488 [msm]
      [    4.532623] [<ffff000000ab6c4c>] mdp5_kms_init+0x2b4/0x338 [msm]
      [    4.532745] [<ffff000000abeff8>] msm_drm_bind+0x218/0x4e8 [msm]
      [    4.532755] [<ffff00000855d744>] try_to_bring_up_master+0x1f4/0x318
      [    4.532762] [<ffff00000855d900>] component_add+0x98/0x180
      [    4.532887] [<ffff000000ac8da0>] dsi_dev_probe+0x18/0x28 [msm]
      [    4.532895] [<ffff000008565fe8>] platform_drv_probe+0x58/0xc0
      [    4.532901] [<ffff00000856410c>] driver_probe_device+0x324/0x458
      [    4.532907] [<ffff00000856440c>] __device_attach_driver+0xac/0x170
      [    4.532913] [<ffff000008561ef4>] bus_for_each_drv+0x4c/0x98
      [    4.532918] [<ffff000008563c38>] __device_attach+0xc0/0x160
      [    4.532924] [<ffff000008564530>] device_initial_probe+0x10/0x18
      [    4.532929] [<ffff000008562f84>] bus_probe_device+0x94/0xa0
      [    4.532934] [<ffff0000085635d4>] deferred_probe_work_func+0x8c/0xe8
      [    4.532941] [<ffff0000080d79bc>] process_one_work+0x1d4/0x330
      [    4.532946] [<ffff0000080d7b60>] worker_thread+0x48/0x468
      [    4.532952] [<ffff0000080ddae4>] kthread+0x12c/0x130
      [    4.532958] [<ffff000008082f10>] ret_from_fork+0x10/0x40
      [    4.532962] ---[ end trace b1ac6888ec40b0bb ]---
      Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      b3949a9a
    • Archit Taneja's avatar
      drm/msm/dsi: Calculate link clock rates with updated dsi->lanes · d4cea38e
      Archit Taneja authored
      After the commit mentioned below, we start computing the byte and pixel
      clocks (dsi_calc_clk_rate) in the DSI bridge's mode_set() op. The
      calculation involves the number of DSI lanes being used by the
      downstream bridge/panel.
      
      If the downstream bridge/panel tries to change the number of DSI lanes
      (as done in the ADV7533 driver) in its mode_set() op, then our DSI
      host driver will not have the correct number of lanes when computing
      byte/pixel clocks.
      
      Fix this by delaying the clock rate calculation in the DSI bridge
      enable path. In particular, compute the clock rates in
      msm_dsi_host_get_phy_clk_req().
      
      This fixes the DSI host error interrupts seen when we try to switch
      between modes that require different number of lanes (4 to 3 lanes, or
      vice versa) on db410c. The error interrupts occur since the byte/pixel
      clock rates aren't according to what the DSI video mode timing engine
      expects.
      
      Fixes: b62aa70a ("drm/msm/dsi: Move PHY operations out of host")
      Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      d4cea38e
    • Rob Clark's avatar
      drm/msm/mdp5: fix unclocked register access in _cursor_set() · af1f5f12
      Rob Clark authored
      Fixes an insta-reboot when screen-blanking kicks in, due to cursor
      updates without clocks enabled.
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      af1f5f12
    • Dan Carpenter's avatar
      drm/msm: unlock on error in msm_gem_get_iova() · 71e3dfa1
      Dan Carpenter authored
      We recently added locking to this function but there was a direct return
      that was overlooked where we need to unlock.
      
      Fixes: 0e08270a ("drm/msm: Separate locking of buffer resources from struct_mutex")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      71e3dfa1
    • Dan Carpenter's avatar
      drm/msm: fix an integer overflow test · 65e93108
      Dan Carpenter authored
      We recently added an integer overflow check but it needs an additional
      tweak to work properly on 32 bit systems.
      
      The problem is that we're doing the right hand side of the assignment as
      type unsigned long so the max it will have an integer overflow instead
      of being larger than SIZE_MAX.  That means the "sz > SIZE_MAX" condition
      is never true even on 32 bit systems.  We need to first cast it to u64
      and then do the math.
      
      Fixes: 4a630fad ("drm/msm: Fix potential buffer overflow issue")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Acked-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      65e93108
    • Viresh Kumar's avatar
      drm/msm/mdp5: Fix compilation warnings · d490c9cd
      Viresh Kumar authored
      Following compilation warnings were observed for these files:
      
        CC [M]  drivers/gpu/drm/msm/mdp/mdp5/mdp5_mdss.o
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c: In function 'blend_setup':
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c:223:7: warning: missing braces around initializer [-Wmissing-braces]
        enum mdp5_pipe stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { SSPP_NONE };
             ^
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c:223:7: warning: (near initialization for 'stage[0]') [-Wmissing-braces]
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c:224:7: warning: missing braces around initializer [-Wmissing-braces]
        enum mdp5_pipe r_stage[STAGE_MAX + 1][MAX_PIPE_STAGE] = { SSPP_NONE };
             ^
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c:224:7: warning: (near initialization for 'r_stage[0]') [-Wmissing-braces]
      
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c: In function 'mdp5_plane_mode_set':
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c:892:9: warning: missing braces around initializer [-Wmissing-braces]
        struct phase_step step = { 0 };
               ^
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c:892:9: warning: (near initialization for 'step.x') [-Wmissing-braces]
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c:893:9: warning: missing braces around initializer [-Wmissing-braces]
        struct pixel_ext pe = { 0 };
               ^
      drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c:893:9: warning: (near initialization for 'pe.left') [-Wmissing-braces]
      
      This happens because in the first case we were initializing a two
      dimensional array with {0} and in the second case we were initializing a
      struct containing two arrays with {0}.
      
      Fix them by adding another pair of {}.
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
      d490c9cd
  4. 30 Jul, 2017 4 commits