diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2863-drm-amdkfd-Add-function-to-update-grace-period.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2863-drm-amdkfd-Add-function-to-update-grace-period.patch | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2863-drm-amdkfd-Add-function-to-update-grace-period.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2863-drm-amdkfd-Add-function-to-update-grace-period.patch new file mode 100644 index 00000000..5e44a1a6 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2863-drm-amdkfd-Add-function-to-update-grace-period.patch @@ -0,0 +1,248 @@ +From 6879c912d27be8fc2fb030ace1ed5f10c4a05044 Mon Sep 17 00:00:00 2001 +From: Philip Cox <Philip.Cox@amd.com> +Date: Wed, 19 Jun 2019 15:27:44 -0400 +Subject: [PATCH 2863/2940] drm/amdkfd: Add function to update grace period + +Adding functions to save the iq_wait_time values into the DQM and init +time, and functions to update the grace period values. This will be +required for the suspend queues functionality. + +Change-Id: I8a27bd90332c0dc9f1f53c3a2e74831e1074ae46 +Signed-off-by: Philip Cox <Philip.Cox@amd.com> +--- + .../drm/amd/amdkfd/kfd_device_queue_manager.c | 5 +- + .../drm/amd/amdkfd/kfd_device_queue_manager.h | 1 + + .../gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c | 2 + + .../gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c | 34 ++++++++++ + .../gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c | 2 + + .../gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h | 65 +++++++++++++++++++ + drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 3 + + 7 files changed, 111 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +index f77b7a508f99..fceb8fdf01b9 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +@@ -1102,7 +1102,10 @@ static int initialize_cpsch(struct device_queue_manager *dqm) + + INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception); + +- return 0; ++ if (dqm->dev->kfd2kgd->get_iq_wait_times) ++ dqm->dev->kfd2kgd->get_iq_wait_times(dqm->dev->kgd, ++ &dqm->wait_times); ++ return 0; + } + + static int start_cpsch(struct device_queue_manager *dqm) +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h +index 67ae43c1acc9..90339e5a6fa9 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h +@@ -199,6 +199,7 @@ struct device_queue_manager { + bool is_hws_hang; + struct work_struct hw_exception_work; + struct kfd_mem_obj hiq_sdma_mqd; ++ uint32_t wait_times; + }; + + void device_queue_manager_init_cik( +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c +index aed32ab7102e..efc6c37ec37e 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v10.c +@@ -335,6 +335,7 @@ const struct packet_manager_funcs kfd_v10_pm_funcs = { + .set_resources = pm_set_resources_vi, + .map_queues = pm_map_queues_v10, + .unmap_queues = pm_unmap_queues_v10, ++ .set_grace_period = NULL, + .query_status = pm_query_status_v10, + .release_mem = pm_release_mem_v10, + .map_process_size = sizeof(struct pm4_mes_map_process), +@@ -342,6 +343,7 @@ const struct packet_manager_funcs kfd_v10_pm_funcs = { + .set_resources_size = sizeof(struct pm4_mes_set_resources), + .map_queues_size = sizeof(struct pm4_mes_map_queues), + .unmap_queues_size = sizeof(struct pm4_mes_unmap_queues), ++ .set_grace_period_size = 0, + .query_status_size = sizeof(struct pm4_mes_query_status), + .release_mem_size = sizeof(struct pm4_mec_release_mem) + }; +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c +index aaf9d620c771..9da582786657 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c +@@ -208,6 +208,38 @@ static int pm_map_queues_v9(struct packet_manager *pm, uint32_t *buffer, + return 0; + } + ++static int pm_set_grace_period_v9(struct packet_manager *pm, ++ uint32_t *buffer, ++ uint32_t grace_period) ++{ ++ struct pm4_mec_write_data_mmio *packet; ++ uint32_t reg_offset = 0; ++ uint32_t reg_data = 0; ++ ++ pm->dqm->dev->kfd2kgd->build_grace_period_packet_info( ++ pm->dqm->dev->kgd, ++ pm->dqm->wait_times, ++ grace_period, ++ ®_offset, ++ ®_data); ++ ++ packet = (struct pm4_mec_write_data_mmio *)buffer; ++ memset(buffer, 0, sizeof(struct pm4_mec_write_data_mmio)); ++ ++ packet->header.u32All = pm_build_pm4_header(IT_WRITE_DATA, ++ sizeof(struct pm4_mec_write_data_mmio)); ++ ++ packet->bitfields2.dst_sel = dst_sel___write_data__mem_mapped_register; ++ packet->bitfields2.addr_incr = ++ addr_incr___write_data__do_not_increment_address; ++ ++ packet->bitfields3.dst_mmreg_addr = reg_offset; ++ ++ packet->data = reg_data; ++ ++ return 0; ++} ++ + static int pm_unmap_queues_v9(struct packet_manager *pm, uint32_t *buffer, + enum kfd_queue_type type, + enum kfd_unmap_queues_filter filter, +@@ -335,6 +367,7 @@ const struct packet_manager_funcs kfd_v9_pm_funcs = { + .set_resources = pm_set_resources_vi, + .map_queues = pm_map_queues_v9, + .unmap_queues = pm_unmap_queues_v9, ++ .set_grace_period = pm_set_grace_period_v9, + .query_status = pm_query_status_v9, + .release_mem = pm_release_mem_v9, + .map_process_size = sizeof(struct pm4_mes_map_process), +@@ -342,6 +375,7 @@ const struct packet_manager_funcs kfd_v9_pm_funcs = { + .set_resources_size = sizeof(struct pm4_mes_set_resources), + .map_queues_size = sizeof(struct pm4_mes_map_queues), + .unmap_queues_size = sizeof(struct pm4_mes_unmap_queues), ++ .set_grace_period_size = sizeof(struct pm4_mec_write_data_mmio), + .query_status_size = sizeof(struct pm4_mes_query_status), + .release_mem_size = sizeof(struct pm4_mec_release_mem) + }; +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c +index 2adaf40027eb..7047f4c5a7dc 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_vi.c +@@ -363,6 +363,7 @@ const struct packet_manager_funcs kfd_vi_pm_funcs = { + .set_resources = pm_set_resources_vi, + .map_queues = pm_map_queues_vi, + .unmap_queues = pm_unmap_queues_vi, ++ .set_grace_period = NULL, + .query_status = pm_query_status_vi, + .release_mem = pm_release_mem_vi, + .map_process_size = sizeof(struct pm4_mes_map_process), +@@ -370,6 +371,7 @@ const struct packet_manager_funcs kfd_vi_pm_funcs = { + .set_resources_size = sizeof(struct pm4_mes_set_resources), + .map_queues_size = sizeof(struct pm4_mes_map_queues), + .unmap_queues_size = sizeof(struct pm4_mes_unmap_queues), ++ .set_grace_period_size = 0, + .query_status_size = sizeof(struct pm4_mes_query_status), + .release_mem_size = sizeof(struct pm4_mec_release_mem) + }; +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h b/drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h +index d4f399c2aad3..c94cb60859f1 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h +@@ -575,6 +575,71 @@ struct pm4_mec_release_mem { + + #endif + ++#ifndef PM4_MEC_WRITE_DATA_DEFINED ++#define PM4_MEC_WRITE_DATA_DEFINED ++ ++enum WRITE_DATA_dst_sel_enum { ++ dst_sel___write_data__mem_mapped_register = 0, ++ dst_sel___write_data__tc_l2 = 2, ++ dst_sel___write_data__gds = 3, ++ dst_sel___write_data__memory = 5, ++ dst_sel___write_data__memory_mapped_adc_persistent_state = 6, ++}; ++ ++enum WRITE_DATA_addr_incr_enum { ++ addr_incr___write_data__increment_address = 0, ++ addr_incr___write_data__do_not_increment_address = 1 ++}; ++ ++enum WRITE_DATA_wr_confirm_enum { ++ wr_confirm___write_data__do_not_wait_for_write_confirmation = 0, ++ wr_confirm___write_data__wait_for_write_confirmation = 1 ++}; ++ ++enum WRITE_DATA_cache_policy_enum { ++ cache_policy___write_data__lru = 0, ++ cache_policy___write_data__stream = 1 ++}; ++ ++ ++struct pm4_mec_write_data_mmio { ++ union { ++ union PM4_MES_TYPE_3_HEADER header; /*header */ ++ unsigned int ordinal1; ++ }; ++ ++ union { ++ struct { ++ unsigned int reserved1:8; ++ unsigned int dst_sel:4; ++ unsigned int reserved2:4; ++ unsigned int addr_incr:1; ++ unsigned int reserved3:2; ++ unsigned int resume_vf:1; ++ unsigned int wr_confirm:1; ++ unsigned int reserved4:4; ++ unsigned int cache_policy:2; ++ unsigned int reserved5:5; ++ } bitfields2; ++ unsigned int ordinal2; ++ }; ++ ++ union { ++ struct { ++ unsigned int dst_mmreg_addr:18; ++ unsigned int reserved6:14; ++ } bitfields3; ++ unsigned int ordinal3; ++ }; ++ ++ uint32_t reserved7; ++ ++ uint32_t data; ++ ++}; ++ ++#endif ++ + enum { + CACHE_FLUSH_AND_INV_TS_EVENT = 0x00000014 + }; +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +index a399914782c4..afbe9b3d7fda 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +@@ -1076,6 +1076,8 @@ struct packet_manager_funcs { + enum kfd_unmap_queues_filter mode, + uint32_t filter_param, bool reset, + unsigned int sdma_engine); ++ int (*set_grace_period)(struct packet_manager *pm, uint32_t *buffer, ++ uint32_t grace_period); + int (*query_status)(struct packet_manager *pm, uint32_t *buffer, + uint64_t fence_address, uint32_t fence_value); + int (*release_mem)(uint64_t gpu_addr, uint32_t *buffer); +@@ -1086,6 +1088,7 @@ struct packet_manager_funcs { + int set_resources_size; + int map_queues_size; + int unmap_queues_size; ++ int set_grace_period_size; + int query_status_size; + int release_mem_size; + }; +-- +2.17.1 + |