Commit 0ee20b86 authored by Le Ma's avatar Le Ma Committed by Alex Deucher
Browse files

drm/amdgpu: assign the doorbell index in 1st page to sdma page queue



Previously for vega10, the sdma_doorbell_range is only enough for sdma
gfx queue, thus the index on second doorbell page is allocated for sdma
page queue. From vega20, the sdma_doorbell_range on 1st page is enlarged.
Therefore, just leverage these index instead of allocation on 2nd page.

v2: change "(x << 1) + 2" to "(x + 1) << 1" for readability and add comments.

Signed-off-by: default avatarLe Ma <le.ma@amd.com>
Acked-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent d2555586
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1091,7 +1091,8 @@ static int amdgpu_device_doorbell_init(struct amdgpu_device *adev)
		 * doorbells are in the first page. So with paging queue enabled,
		 * the max num_kernel_doorbells should + 1 page (0x400 in dword)
		 */
		if (adev->asic_type >= CHIP_VEGA10)
		if (adev->ip_versions[SDMA0_HWIP][0] >= IP_VERSION(4, 0, 0) &&
		    adev->ip_versions[SDMA0_HWIP][0] < IP_VERSION(4, 2, 0))
			adev->doorbell.num_kernel_doorbells += 0x400;
	}

+12 −2
Original line number Diff line number Diff line
@@ -1847,8 +1847,18 @@ static int sdma_v4_0_sw_init(void *handle)
			/* paging queue use same doorbell index/routing as gfx queue
			 * with 0x400 (4096 dwords) offset on second doorbell page
			 */
			ring->doorbell_index = adev->doorbell_index.sdma_engine[i] << 1;
			if (adev->ip_versions[SDMA0_HWIP][0] >= IP_VERSION(4, 0, 0) &&
			    adev->ip_versions[SDMA0_HWIP][0] < IP_VERSION(4, 2, 0)) {
				ring->doorbell_index =
					adev->doorbell_index.sdma_engine[i] << 1;
				ring->doorbell_index += 0x400;
			} else {
				/* From vega20, the sdma_doorbell_range in 1st
				 * doorbell page is reserved for page queue.
				 */
				ring->doorbell_index =
					(adev->doorbell_index.sdma_engine[i] + 1) << 1;
			}

			if (adev->ip_versions[SDMA0_HWIP][0] == IP_VERSION(4, 2, 2) && i >= 5)
				ring->vm_hub = AMDGPU_MMHUB1(0);
+3 −4
Original line number Diff line number Diff line
@@ -1323,11 +1323,10 @@ static int sdma_v4_4_2_sw_init(void *handle)
			ring->ring_obj = NULL;
			ring->use_doorbell = true;

			/* paging queue use same doorbell index/routing as gfx queue
			 * with 0x400 (4096 dwords) offset on second doorbell page
			/* doorbell index of page queue is assigned right after
			 * gfx queue on the same instance
			 */
			ring->doorbell_index = adev->doorbell_index.sdma_engine[i] << 1;
			ring->doorbell_index += 0x400;
			ring->doorbell_index = (adev->doorbell_index.sdma_engine[i] + 1) << 1;
			ring->vm_hub = AMDGPU_MMHUB0(0);

			sprintf(ring->name, "page%d", i);