diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2738-drm-amdkfd-Fix-bugs-regarding-CP-queue-doorbell-mask.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2738-drm-amdkfd-Fix-bugs-regarding-CP-queue-doorbell-mask.patch | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2738-drm-amdkfd-Fix-bugs-regarding-CP-queue-doorbell-mask.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2738-drm-amdkfd-Fix-bugs-regarding-CP-queue-doorbell-mask.patch new file mode 100644 index 00000000..d0edabf4 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2738-drm-amdkfd-Fix-bugs-regarding-CP-queue-doorbell-mask.patch @@ -0,0 +1,145 @@ +From fa2213e7be9818edd2a9ce4c17ac8572ef291282 Mon Sep 17 00:00:00 2001 +From: Yong Zhao <Yong.Zhao@amd.com> +Date: Wed, 13 Feb 2019 13:15:05 -0500 +Subject: [PATCH 2738/2940] drm/amdkfd: Fix bugs regarding CP queue doorbell + mask on SOC15 + +Reserved doorbells for SDMA IH and VCN were not properly masked out +when allocating doorbells for CP user queues. This patch fixed that. + +Change-Id: I670adfc3fd7725d2ed0bd9665cb7f69f8b9023c2 +Signed-off-by: Yong Zhao <Yong.Zhao@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 34 +++++++------------ + drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 11 ++++++ + drivers/gpu/drm/amd/amdkfd/kfd_process.c | 14 +++++--- + .../gpu/drm/amd/include/kgd_kfd_interface.h | 15 ++++---- + 4 files changed, 39 insertions(+), 35 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +index 1372d6dcdb6a..ea15e27f61f9 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +@@ -174,28 +174,20 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev) + &gpu_resources.doorbell_physical_address, + &gpu_resources.doorbell_aperture_size, + &gpu_resources.doorbell_start_offset); ++ /* Since SOC15, BIF starts to statically use the ++ * lower 12 bits of doorbell addresses for routing ++ * based on settings in registers like ++ * SDMA0_DOORBELL_RANGE etc.. ++ * In order to route a doorbell to CP engine, the lower ++ * 12 bits of its address has to be outside the range ++ * set for SDMA, VCN, and IH blocks. ++ */ + if (adev->asic_type >= CHIP_VEGA10) { +- /* On SOC15 the BIF is involved in routing +- * doorbells using the low 12 bits of the +- * address. Communicate the assignments to +- * KFD. KFD uses two doorbell pages per +- * process in case of 64-bit doorbells so we +- * can use each doorbell assignment twice. +- */ +- gpu_resources.sdma_doorbell[0][i] = +- adev->doorbell_index.sdma_engine[0] + (i >> 1); +- gpu_resources.sdma_doorbell[0][i+1] = +- adev->doorbell_index.sdma_engine[0] + 0x200 + (i >> 1); +- gpu_resources.sdma_doorbell[1][i] = +- adev->doorbell_index.sdma_engine[1] + (i >> 1); +- gpu_resources.sdma_doorbell[1][i+1] = +- adev->doorbell_index.sdma_engine[1] + 0x200 + (i >> 1); +- } +- /* Doorbells 0x0f0-0ff and 0x2f0-2ff are reserved for +- * SDMA, IH and VCN. So don't use them for the CP. +- */ +- gpu_resources.reserved_doorbell_mask = 0x1f0; +- gpu_resources.reserved_doorbell_val = 0x0f0; ++ gpu_resources.non_cp_doorbells_start = ++ adev->doorbell_index.first_non_cp; ++ gpu_resources.non_cp_doorbells_end = ++ adev->doorbell_index.last_non_cp; ++ } + + kgd2kfd_device_init(adev->kfd.dev, &gpu_resources); + } +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +index 8758175d1fd4..b0102b9426bf 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +@@ -103,6 +103,17 @@ + + #define KFD_KERNEL_QUEUE_SIZE 2048 + ++/* ++ * 512 = 0x200 ++ * The doorbell index distance between SDMA RLC (2*i) and (2*i+1) in the ++ * same SDMA engine on SOC15, which has 8-byte doorbells for SDMA. ++ * 512 8-byte doorbell distance (i.e. one page away) ensures that SDMA RLC ++ * (2*i+1) doorbells (in terms of the lower 12 bit address) lie exactly in ++ * the OFFSET and SIZE set in registers like BIF_SDMA0_DOORBELL_RANGE. ++ */ ++#define KFD_QUEUE_DOORBELL_MIRROR_OFFSET 512 ++ ++ + /* + * Kernel module parameter to specify maximum number of supported queues per + * device +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c +index 6b99f6b9fdc8..7632d66cb218 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c +@@ -607,13 +607,17 @@ static int init_doorbell_bitmap(struct qcm_process_device *qpd, + if (!qpd->doorbell_bitmap) + return -ENOMEM; + +- /* Mask out any reserved doorbells */ +- for (i = 0; i < KFD_MAX_NUM_OF_QUEUES_PER_PROCESS; i++) +- if ((dev->shared_resources.reserved_doorbell_mask & i) == +- dev->shared_resources.reserved_doorbell_val) { ++ /* Mask out doorbells reserved for SDMA, IH, and VCN on SOC15. */ ++ for (i = 0; i < KFD_MAX_NUM_OF_QUEUES_PER_PROCESS / 2; i++) { ++ if (i >= dev->shared_resources.non_cp_doorbells_start ++ && i <= dev->shared_resources.non_cp_doorbells_end) { + set_bit(i, qpd->doorbell_bitmap); +- pr_debug("reserved doorbell 0x%03x\n", i); ++ set_bit(i + KFD_QUEUE_DOORBELL_MIRROR_OFFSET, ++ qpd->doorbell_bitmap); ++ pr_debug("reserved doorbell 0x%03x and 0x%03x\n", i, ++ i + KFD_QUEUE_DOORBELL_MIRROR_OFFSET); + } ++ } + + return 0; + } +diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +index ec2757b058cd..7e44dcd15cdc 100644 +--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h ++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +@@ -113,17 +113,14 @@ struct kgd2kfd_shared_resources { + /* Doorbell assignments (SOC15 and later chips only). Only + * specific doorbells are routed to each SDMA engine. Others + * are routed to IH and VCN. They are not usable by the CP. +- * +- * Any doorbell number D that satisfies the following condition +- * is reserved: (D & reserved_doorbell_mask) == reserved_doorbell_val +- * +- * KFD currently uses 1024 (= 0x3ff) doorbells per process. If +- * doorbells 0x0f0-0x0f7 and 0x2f-0x2f7 are reserved, that means +- * mask would be set to 0x1f8 and val set to 0x0f0. + */ + unsigned int sdma_doorbell[2][2]; +- unsigned int reserved_doorbell_mask; +- unsigned int reserved_doorbell_val; ++ ++ /* From SOC15 onward, the doorbell index range not usable for CP ++ * queues. ++ */ ++ uint32_t non_cp_doorbells_start; ++ uint32_t non_cp_doorbells_end; + + /* Base address of doorbell aperture. */ + phys_addr_t doorbell_physical_address; +-- +2.17.1 + |