• Marc Gonzalez's avatar
    scsi: ufs: Use explicit access size in ufshcd_dump_regs · d6724756
    Marc Gonzalez authored
    memcpy_fromio() doesn't provide any control over access size.  For example,
    on arm64, it is implemented using readb and readq.  This may trigger a
    synchronous external abort:
    
    [    3.729943] Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP
    [    3.737000] Modules linked in:
    [    3.744371] CPU: 2 PID: 1 Comm: swapper/0 Tainted: G S                4.20.0-rc4 #16
    [    3.747413] Hardware name: Qualcomm Technologies, Inc. MSM8998 v1 MTP (DT)
    [    3.755295] pstate: 00000005 (nzcv daif -PAN -UAO)
    [    3.761978] pc : __memcpy_fromio+0x68/0x80
    [    3.766718] lr : ufshcd_dump_regs+0x50/0xb0
    [    3.770767] sp : ffff00000807ba00
    [    3.774830] x29: ffff00000807ba00 x28: 00000000fffffffb
    [    3.778344] x27: ffff0000089db068 x26: ffff8000f6e58000
    [    3.783728] x25: 000000000000000e x24: 0000000000000800
    [    3.789023] x23: ffff8000f6e587c8 x22: 0000000000000800
    [    3.794319] x21: ffff000008908368 x20: ffff8000f6e1ab80
    [    3.799615] x19: 000000000000006c x18: ffffffffffffffff
    [    3.804910] x17: 0000000000000000 x16: 0000000000000000
    [    3.810206] x15: ffff000009199648 x14: ffff000089244187
    [    3.815502] x13: ffff000009244195 x12: ffff0000091ab000
    [    3.820797] x11: 0000000005f5e0ff x10: ffff0000091998a0
    [    3.826093] x9 : 0000000000000000 x8 : ffff8000f6e1ac00
    [    3.831389] x7 : 0000000000000000 x6 : 0000000000000068
    [    3.836676] x5 : ffff8000f6e1abe8 x4 : 0000000000000000
    [    3.841971] x3 : ffff00000928c868 x2 : ffff8000f6e1abec
    [    3.847267] x1 : ffff00000928c868 x0 : ffff8000f6e1abe8
    [    3.852567] Process swapper/0 (pid: 1, stack limit = 0x(____ptrval____))
    [    3.857900] Call trace:
    [    3.864473]  __memcpy_fromio+0x68/0x80
    [    3.866683]  ufs_qcom_dump_dbg_regs+0x1c0/0x370
    [    3.870522]  ufshcd_print_host_regs+0x168/0x190
    [    3.874946]  ufshcd_init+0xd4c/0xde0
    [    3.879459]  ufshcd_pltfrm_init+0x3c8/0x550
    [    3.883264]  ufs_qcom_probe+0x24/0x60
    [    3.887188]  platform_drv_probe+0x50/0xa0
    
    Assuming aligned 32-bit registers, let's use readl, after making sure
    that 'offset' and 'len' are indeed multiples of 4.
    
    Fixes: ba80917d ("scsi: ufs: ufshcd_dump_regs to use memcpy_fromio")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarMarc Gonzalez <marc.w.gonzalez@free.fr>
    Acked-by: default avatarTomas Winkler <tomas.winkler@intel.com>
    Reviewed-by: default avatarJeffrey Hugo <jhugo@codeaurora.org>
    Reviewed-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
    Tested-by: default avatarEvan Green <evgreen@chromium.org>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    d6724756
ufshcd.c 223 KB