aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2863-drm-amdkfd-Add-function-to-update-grace-period.patch
diff options
context:
space:
mode:
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.patch248
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,
++ &reg_offset,
++ &reg_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
+