drm/amdgpu: Fix num_doorbell calculation issue
authorOak Zeng <ozeng@amd.com>
Fri, 30 Nov 2018 15:33:02 +0000 (09:33 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 30 Nov 2018 17:01:04 +0000 (12:01 -0500)
When paging queue is enabled, it use the second page of doorbell.
The AMDGPU_DOORBELL64_MAX_ASSIGNMENT definition assumes all the
kernel doorbells are in the first page. So with paging queue enabled,
the total kernel doorbell range should be original num_doorbell plus
one page (0x400 in dword), not *2.

Signed-off-by: Oak Zeng <ozeng@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

index 8eaa40eb1c4a66ebbc062463ef2e13db17edb9ee..c75badfa5c4c6d752ec0e51e82186ef6f381cea5 100644 (file)
@@ -539,10 +539,13 @@ static int amdgpu_device_doorbell_init(struct amdgpu_device *adev)
                return -EINVAL;
 
        /* For Vega, reserve and map two pages on doorbell BAR since SDMA
-        * paging queue doorbell use the second page
+        * paging queue doorbell use the second page. The
+        * AMDGPU_DOORBELL64_MAX_ASSIGNMENT definition assumes all the
+        * doorbells are in the first page. So with paging queue enabled,
+        * the max num_doorbells should + 1 page (0x400 in dword)
         */
        if (adev->asic_type >= CHIP_VEGA10)
-               adev->doorbell.num_doorbells *= 2;
+               adev->doorbell.num_doorbells += 0x400;
 
        adev->doorbell.ptr = ioremap(adev->doorbell.base,
                                     adev->doorbell.num_doorbells *