Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add mc wptr addr support for mes

MES requires mc wptr address for usermode queues.
Export bo gart address for mc wptr address.

Signed-off-by: Jack Xiao <Jack.Xiao@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Jack Xiao and committed by
Alex Deucher
fe4e9ff9 ca0cb895

+21 -6
+8 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
··· 675 675 queue_input.doorbell_offset = qprops->doorbell_off; 676 676 queue_input.mqd_addr = queue->mqd_gpu_addr; 677 677 queue_input.wptr_addr = qprops->wptr_gpu_addr; 678 + queue_input.wptr_mc_addr = qprops->wptr_mc_addr; 678 679 queue_input.queue_type = qprops->queue_type; 679 680 queue_input.paging = qprops->paging; 680 681 queue_input.is_kfd_process = 0; ··· 803 802 props->hqd_base_gpu_addr = ring->gpu_addr; 804 803 props->rptr_gpu_addr = ring->rptr_gpu_addr; 805 804 props->wptr_gpu_addr = ring->wptr_gpu_addr; 805 + props->wptr_mc_addr = 806 + ring->mes_ctx->meta_data_mc_addr + ring->wptr_offs; 806 807 props->queue_size = ring->ring_size; 807 808 props->eop_gpu_addr = ring->eop_gpu_addr; 808 809 props->hqd_pipe_priority = AMDGPU_GFX_PIPE_PRIO_NORMAL; ··· 965 962 r = amdgpu_bo_create_kernel(adev, 966 963 sizeof(struct amdgpu_mes_ctx_meta_data), 967 964 PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT, 968 - &ctx_data->meta_data_obj, NULL, 965 + &ctx_data->meta_data_obj, 966 + &ctx_data->meta_data_mc_addr, 969 967 &ctx_data->meta_data_ptr); 970 968 if (!ctx_data->meta_data_obj) 971 969 return -ENOMEM; ··· 980 976 void amdgpu_mes_ctx_free_meta_data(struct amdgpu_mes_ctx_data *ctx_data) 981 977 { 982 978 if (ctx_data->meta_data_obj) 983 - amdgpu_bo_free_kernel(&ctx_data->meta_data_obj, NULL, NULL); 979 + amdgpu_bo_free_kernel(&ctx_data->meta_data_obj, 980 + &ctx_data->meta_data_mc_addr, 981 + &ctx_data->meta_data_ptr); 984 982 } 985 983 986 984 int amdgpu_mes_ctx_map_meta_data(struct amdgpu_device *adev,
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
··· 176 176 uint64_t hqd_base_gpu_addr; 177 177 uint64_t rptr_gpu_addr; 178 178 uint64_t wptr_gpu_addr; 179 + uint64_t wptr_mc_addr; 179 180 uint32_t queue_size; 180 181 uint64_t eop_gpu_addr; 181 182 uint32_t hqd_pipe_priority; ··· 209 208 uint32_t doorbell_offset; 210 209 uint64_t mqd_addr; 211 210 uint64_t wptr_addr; 211 + uint64_t wptr_mc_addr; 212 212 uint32_t queue_type; 213 213 uint32_t paging; 214 214 uint32_t gws_base;
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_mes_ctx.h
··· 107 107 struct amdgpu_mes_ctx_data { 108 108 struct amdgpu_bo *meta_data_obj; 109 109 uint64_t meta_data_gpu_addr; 110 + uint64_t meta_data_mc_addr; 110 111 struct amdgpu_bo_va *meta_data_va; 111 112 void *meta_data_ptr; 112 113 uint32_t gang_ids[AMDGPU_HW_IP_DMA+1];
+7 -1
drivers/gpu/drm/amd/amdgpu/mes_v11_0.c
··· 156 156 input->gang_global_priority_level; 157 157 mes_add_queue_pkt.doorbell_offset = input->doorbell_offset; 158 158 mes_add_queue_pkt.mqd_addr = input->mqd_addr; 159 - mes_add_queue_pkt.wptr_addr = input->wptr_addr; 159 + 160 + if (((adev->mes.sched_version & AMDGPU_MES_API_VERSION_MASK) >> 161 + AMDGPU_MES_API_VERSION_SHIFT) >= 2) 162 + mes_add_queue_pkt.wptr_addr = input->wptr_mc_addr; 163 + else 164 + mes_add_queue_pkt.wptr_addr = input->wptr_addr; 165 + 160 166 mes_add_queue_pkt.queue_type = 161 167 convert_to_mes_queue_type(input->queue_type); 162 168 mes_add_queue_pkt.paging = input->paging;
+3 -3
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
··· 197 197 AMDGPU_MES_PRIORITY_LEVEL_NORMAL; 198 198 queue_input.doorbell_offset = q->properties.doorbell_off; 199 199 queue_input.mqd_addr = q->gart_mqd_addr; 200 + queue_input.wptr_addr = (uint64_t)q->properties.write_ptr; 200 201 201 202 if (q->wptr_bo) { 202 203 wptr_addr_off = (uint64_t)q->properties.write_ptr - (uint64_t)q->wptr_bo->kfd_bo->va; 203 - queue_input.wptr_addr = ((uint64_t)q->wptr_bo->tbo.resource->start << PAGE_SHIFT) + wptr_addr_off; 204 - } else 205 - queue_input.wptr_addr = (uint64_t)q->properties.write_ptr; 204 + queue_input.wptr_mc_addr = ((uint64_t)q->wptr_bo->tbo.resource->start << PAGE_SHIFT) + wptr_addr_off; 205 + } 206 206 207 207 queue_input.is_kfd_process = 1; 208 208