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

drm/amdgpu: create mqd for gfx queues on navi10

mqd is the memory queue descriptor for gfx and compute.

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

authored by

Hawking Zhang and committed by
Alex Deucher
54fc4472 5bfca069

+34 -1
+34 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
··· 389 389 dev_warn(adev->dev, "no memory to create MQD backup for ring %s\n", ring->name); 390 390 } 391 391 392 + if (adev->asic_type == CHIP_NAVI10 && amdgpu_async_gfx_ring) { 393 + /* create MQD for each KGQ */ 394 + for (i = 0; i < adev->gfx.num_gfx_rings; i++) { 395 + ring = &adev->gfx.gfx_ring[i]; 396 + if (!ring->mqd_obj) { 397 + r = amdgpu_bo_create_kernel(adev, mqd_size, PAGE_SIZE, 398 + AMDGPU_GEM_DOMAIN_GTT, &ring->mqd_obj, 399 + &ring->mqd_gpu_addr, &ring->mqd_ptr); 400 + if (r) { 401 + dev_warn(adev->dev, "failed to create ring mqd bo (%d)", r); 402 + return r; 403 + } 404 + 405 + /* prepare MQD backup */ 406 + adev->gfx.me.mqd_backup[i] = kmalloc(mqd_size, GFP_KERNEL); 407 + if (!adev->gfx.me.mqd_backup[i]) 408 + dev_warn(adev->dev, "no memory to create MQD backup for ring %s\n", ring->name); 409 + } 410 + } 411 + } 412 + 392 413 /* create MQD for each KCQ */ 393 414 for (i = 0; i < adev->gfx.num_compute_rings; i++) { 394 415 ring = &adev->gfx.compute_ring[i]; ··· 418 397 AMDGPU_GEM_DOMAIN_GTT, &ring->mqd_obj, 419 398 &ring->mqd_gpu_addr, &ring->mqd_ptr); 420 399 if (r) { 421 - dev_warn(adev->dev, "failed to create ring mqd ob (%d)", r); 400 + dev_warn(adev->dev, "failed to create ring mqd bo (%d)", r); 422 401 return r; 423 402 } 424 403 ··· 437 416 struct amdgpu_ring *ring = NULL; 438 417 int i; 439 418 419 + if (adev->asic_type == CHIP_NAVI10 && amdgpu_async_gfx_ring) { 420 + for (i = 0; i < adev->gfx.num_gfx_rings; i++) { 421 + ring = &adev->gfx.gfx_ring[i]; 422 + kfree(adev->gfx.me.mqd_backup[i]); 423 + amdgpu_bo_free_kernel(&ring->mqd_obj, 424 + &ring->mqd_gpu_addr, 425 + &ring->mqd_ptr); 426 + } 427 + } 428 + 440 429 for (i = 0; i < adev->gfx.num_compute_rings; i++) { 441 430 ring = &adev->gfx.compute_ring[i]; 442 431 kfree(adev->gfx.mec.mqd_backup[i]); ··· 456 425 } 457 426 458 427 ring = &adev->gfx.kiq.ring; 428 + if (adev->asic_type == CHIP_NAVI10 && amdgpu_async_gfx_ring) 429 + kfree(adev->gfx.me.mqd_backup[AMDGPU_MAX_GFX_RINGS]); 459 430 kfree(adev->gfx.mec.mqd_backup[AMDGPU_MAX_COMPUTE_RINGS]); 460 431 amdgpu_bo_free_kernel(&ring->mqd_obj, 461 432 &ring->mqd_gpu_addr,