diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1199-drm-amdkfd-Clamp-EOP-queue-size-correctly-on-Gfx8.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1199-drm-amdkfd-Clamp-EOP-queue-size-correctly-on-Gfx8.patch | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1199-drm-amdkfd-Clamp-EOP-queue-size-correctly-on-Gfx8.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1199-drm-amdkfd-Clamp-EOP-queue-size-correctly-on-Gfx8.patch new file mode 100644 index 00000000..0e5a4943 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1199-drm-amdkfd-Clamp-EOP-queue-size-correctly-on-Gfx8.patch @@ -0,0 +1,41 @@ +From c2fe93fbe0ad3d8891e672370a3585b9ca087bbb Mon Sep 17 00:00:00 2001 +From: Jay Cornwall <Jay.Cornwall@amd.com> +Date: Mon, 10 Oct 2016 14:02:56 -0500 +Subject: [PATCH 1199/4131] drm/amdkfd: Clamp EOP queue size correctly on Gfx8 + +Gfx8 HW incorrectly clamps CP_HQD_EOP_CONTROL.EOP_SIZE, which can +lead to scheduling deadlock due to SE EOP done counter overflow. + +Enforce a EOP queue size limit which prevents the CP from sending +more than 0xFF events at a time. + +Signed-off-by: Jay Cornwall <Jay.Cornwall@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c +index ebb4664..579cc68 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c +@@ -215,8 +215,15 @@ static int __update_mqd(struct mqd_manager *mm, void *mqd, + 3 << CP_HQD_IB_CONTROL__MIN_IB_AVAIL_SIZE__SHIFT | + mtype << CP_HQD_IB_CONTROL__MTYPE__SHIFT; + +- m->cp_hqd_eop_control |= +- ffs(q->eop_ring_buffer_size / sizeof(unsigned int)) - 1 - 1; ++ /* ++ * HW does not clamp this field correctly. Maximum EOP queue size ++ * is constrained by per-SE EOP done signal count, which is 8-bit. ++ * Limit is 0xFF EOP entries (= 0x7F8 dwords). CP will not submit ++ * more than (EOP entry count - 1) so a queue size of 0x800 dwords ++ * is safe, giving a maximum field value of 0xA. ++ */ ++ m->cp_hqd_eop_control |= min(0xA, ++ ffs(q->eop_ring_buffer_size / sizeof(unsigned int)) - 1 - 1); + m->cp_hqd_eop_base_addr_lo = + lower_32_bits(q->eop_ring_buffer_address >> 8); + m->cp_hqd_eop_base_addr_hi = +-- +2.7.4 + |