lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 183/575] drm/amdgpu: Fix MMIO access page fault
    Date
    From: Andrey Grodzovsky <andrey.grodzovsky@amd.com>

    [ Upstream commit c03509cbc01559549700e14c4a6239f2572ab4ba ]

    Add more guards to MMIO access post device
    unbind/unplug

    Bug: https://bugs.archlinux.org/task/72092?project=1&order=dateopened&sort=desc&pagenum=1
    Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
    Reviewed-by: James Zhu <James.Zhu@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 8 ++++++--
    drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 17 +++++++++++------
    2 files changed, 17 insertions(+), 8 deletions(-)

    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
    index f493b5c3d382b..79bcc78f77045 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
    @@ -22,6 +22,7 @@
    */

    #include <linux/firmware.h>
    +#include <drm/drm_drv.h>

    #include "amdgpu.h"
    #include "amdgpu_vcn.h"
    @@ -192,11 +193,14 @@ static int vcn_v2_0_sw_init(void *handle)
    */
    static int vcn_v2_0_sw_fini(void *handle)
    {
    - int r;
    + int r, idx;
    struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst->fw_shared_cpu_addr;

    - fw_shared->present_flag_0 = 0;
    + if (drm_dev_enter(&adev->ddev, &idx)) {
    + fw_shared->present_flag_0 = 0;
    + drm_dev_exit(idx);
    + }

    amdgpu_virt_free_mm_table(adev);

    diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
    index ce64d4016f903..381839d005db9 100644
    --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
    +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
    @@ -22,6 +22,7 @@
    */

    #include <linux/firmware.h>
    +#include <drm/drm_drv.h>

    #include "amdgpu.h"
    #include "amdgpu_vcn.h"
    @@ -233,17 +234,21 @@ static int vcn_v2_5_sw_init(void *handle)
    */
    static int vcn_v2_5_sw_fini(void *handle)
    {
    - int i, r;
    + int i, r, idx;
    struct amdgpu_device *adev = (struct amdgpu_device *)handle;
    volatile struct amdgpu_fw_shared *fw_shared;

    - for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
    - if (adev->vcn.harvest_config & (1 << i))
    - continue;
    - fw_shared = adev->vcn.inst[i].fw_shared_cpu_addr;
    - fw_shared->present_flag_0 = 0;
    + if (drm_dev_enter(&adev->ddev, &idx)) {
    + for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
    + if (adev->vcn.harvest_config & (1 << i))
    + continue;
    + fw_shared = adev->vcn.inst[i].fw_shared_cpu_addr;
    + fw_shared->present_flag_0 = 0;
    + }
    + drm_dev_exit(idx);
    }

    +
    if (amdgpu_sriov_vf(adev))
    amdgpu_virt_free_mm_table(adev);

    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 03:12    [W:4.059 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site