lkml.org 
[lkml]   [2018]   [Oct]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.18 45/48] drm/amdkfd: Change the control stack MTYPE from UC to NC on GFX9
    Date
    From: Yong Zhao <yong.zhao@amd.com>

    [ Upstream commit 15426dbb65c5b37680d27e84d58a1ed3b8532518 ]

    CWSR fails on Raven if the control stack is MTYPE_UC, which is used
    for regular GART mappings. As a workaround we map it using MTYPE_NC.

    The MEC firmware expects the control stack at one page offset from the
    start of the MQD so it is part of the MQD allocation on GFXv9. AMDGPU
    added a memory allocation flag just for this purpose.

    Acked-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Yong Zhao <yong.zhao@amd.com>
    Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
    Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 6 +++++-
    drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 2 +-
    drivers/gpu/drm/amd/amdkfd/kfd_device.c | 3 ++-
    drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c | 2 +-
    drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 2 +-
    5 files changed, 10 insertions(+), 5 deletions(-)

    diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
    index 305143fcc1ce..1ac7933cccc5 100644
    --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
    +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
    @@ -245,7 +245,7 @@ int amdgpu_amdkfd_resume(struct amdgpu_device *adev)

    int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
    void **mem_obj, uint64_t *gpu_addr,
    - void **cpu_ptr)
    + void **cpu_ptr, bool mqd_gfx9)
    {
    struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
    struct amdgpu_bo *bo = NULL;
    @@ -261,6 +261,10 @@ int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
    bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC;
    bp.type = ttm_bo_type_kernel;
    bp.resv = NULL;
    +
    + if (mqd_gfx9)
    + bp.flags |= AMDGPU_GEM_CREATE_MQD_GFX9;
    +
    r = amdgpu_bo_create(adev, &bp, &bo);
    if (r) {
    dev_err(adev->dev,
    diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
    index a8418a3f4e9d..e3cf1c9fb3db 100644
    --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
    +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
    @@ -129,7 +129,7 @@ bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid);
    /* Shared API */
    int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
    void **mem_obj, uint64_t *gpu_addr,
    - void **cpu_ptr);
    + void **cpu_ptr, bool mqd_gfx9);
    void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
    void get_local_mem_info(struct kgd_dev *kgd,
    struct kfd_local_mem_info *mem_info);
    diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
    index 7ee6cec2c060..6881b5a9275f 100644
    --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
    +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
    @@ -423,7 +423,8 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,

    if (kfd->kfd2kgd->init_gtt_mem_allocation(
    kfd->kgd, size, &kfd->gtt_mem,
    - &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr)){
    + &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr,
    + false)) {
    dev_err(kfd_device, "Could not allocate %d bytes\n", size);
    goto out;
    }
    diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
    index 684054ff02cd..8da079cc6fb9 100644
    --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
    +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
    @@ -63,7 +63,7 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
    ALIGN(sizeof(struct v9_mqd), PAGE_SIZE),
    &((*mqd_mem_obj)->gtt_mem),
    &((*mqd_mem_obj)->gpu_addr),
    - (void *)&((*mqd_mem_obj)->cpu_ptr));
    + (void *)&((*mqd_mem_obj)->cpu_ptr), true);
    } else
    retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct v9_mqd),
    mqd_mem_obj);
    diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
    index 5733fbee07f7..f56b7553e5ed 100644
    --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
    +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
    @@ -266,7 +266,7 @@ struct tile_config {
    struct kfd2kgd_calls {
    int (*init_gtt_mem_allocation)(struct kgd_dev *kgd, size_t size,
    void **mem_obj, uint64_t *gpu_addr,
    - void **cpu_ptr);
    + void **cpu_ptr, bool mqd_gfx9);

    void (*free_gtt_mem)(struct kgd_dev *kgd, void *mem_obj);

    --
    2.17.1
    \
     
     \ /
      Last update: 2018-10-05 18:16    [W:2.724 / U:2.772 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site