diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0133-drm-amdkfd-Add-wave-control-operation-to-debugger.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0133-drm-amdkfd-Add-wave-control-operation-to-debugger.patch | 535 |
1 files changed, 0 insertions, 535 deletions
diff --git a/common/recipes-kernel/linux/files/0133-drm-amdkfd-Add-wave-control-operation-to-debugger.patch b/common/recipes-kernel/linux/files/0133-drm-amdkfd-Add-wave-control-operation-to-debugger.patch deleted file mode 100644 index 9df04ed5..00000000 --- a/common/recipes-kernel/linux/files/0133-drm-amdkfd-Add-wave-control-operation-to-debugger.patch +++ /dev/null @@ -1,535 +0,0 @@ -From 788bf83db3017f083ebb84c93f101607c769c3a7 Mon Sep 17 00:00:00 2001 -From: Yair Shachar <yair.shachar@amd.com> -Date: Wed, 20 May 2015 13:58:12 +0300 -Subject: [PATCH 0133/1050] drm/amdkfd: Add wave control operation to debugger - -The wave control operation supports several command types executed upon -existing wave fronts that belong to the currently debugged process. - -The available commands are: - -HALT - Freeze wave front(s) execution -RESUME - Resume freezed wave front(s) execution -KILL - Kill existing wave front(s) - -Signed-off-by: Yair Shachar <yair.shachar@amd.com> -Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com> ---- - drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c | 405 +++++++++++++++++++++ - drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.c | 16 + - drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.h | 5 +- - .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 2 +- - drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 4 + - 5 files changed, 430 insertions(+), 2 deletions(-) - -diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c b/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c -index eed4a83..ee33b86 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c -@@ -47,6 +47,125 @@ static void dbgdev_address_watch_disable_nodiq(struct kfd_dev *dev) - dev->kfd2kgd->address_watch_disable(dev->kgd); - } - -+static int dbgdev_diq_submit_ib(struct kfd_dbgdev *dbgdev, -+ unsigned int pasid, uint64_t vmid0_address, -+ uint32_t *packet_buff, size_t size_in_bytes) -+{ -+ struct pm4__release_mem *rm_packet; -+ struct pm4__indirect_buffer_pasid *ib_packet; -+ struct kfd_mem_obj *mem_obj; -+ size_t pq_packets_size_in_bytes; -+ union ULARGE_INTEGER *largep; -+ union ULARGE_INTEGER addr; -+ struct kernel_queue *kq; -+ uint64_t *rm_state; -+ unsigned int *ib_packet_buff; -+ int status; -+ -+ BUG_ON(!dbgdev || !dbgdev->kq || !packet_buff || !size_in_bytes); -+ -+ kq = dbgdev->kq; -+ -+ pq_packets_size_in_bytes = sizeof(struct pm4__release_mem) + -+ sizeof(struct pm4__indirect_buffer_pasid); -+ -+ /* -+ * We acquire a buffer from DIQ -+ * The receive packet buff will be sitting on the Indirect Buffer -+ * and in the PQ we put the IB packet + sync packet(s). -+ */ -+ status = kq->ops.acquire_packet_buffer(kq, -+ pq_packets_size_in_bytes / sizeof(uint32_t), -+ &ib_packet_buff); -+ if (status != 0) { -+ pr_err("amdkfd: acquire_packet_buffer failed\n"); -+ return status; -+ } -+ -+ memset(ib_packet_buff, 0, pq_packets_size_in_bytes); -+ -+ ib_packet = (struct pm4__indirect_buffer_pasid *) (ib_packet_buff); -+ -+ ib_packet->header.count = 3; -+ ib_packet->header.opcode = IT_INDIRECT_BUFFER_PASID; -+ ib_packet->header.type = PM4_TYPE_3; -+ -+ largep = (union ULARGE_INTEGER *) &vmid0_address; -+ -+ ib_packet->bitfields2.ib_base_lo = largep->u.low_part >> 2; -+ ib_packet->bitfields3.ib_base_hi = largep->u.high_part; -+ -+ ib_packet->control = (1 << 23) | (1 << 31) | -+ ((size_in_bytes / sizeof(uint32_t)) & 0xfffff); -+ -+ ib_packet->bitfields5.pasid = pasid; -+ -+ /* -+ * for now we use release mem for GPU-CPU synchronization -+ * Consider WaitRegMem + WriteData as a better alternative -+ * we get a GART allocations ( gpu/cpu mapping), -+ * for the sync variable, and wait until: -+ * (a) Sync with HW -+ * (b) Sync var is written by CP to mem. -+ */ -+ rm_packet = (struct pm4__release_mem *) (ib_packet_buff + -+ (sizeof(struct pm4__indirect_buffer_pasid) / -+ sizeof(unsigned int))); -+ -+ status = kfd_gtt_sa_allocate(dbgdev->dev, sizeof(uint64_t), -+ &mem_obj); -+ -+ if (status != 0) { -+ pr_err("amdkfd: Failed to allocate GART memory\n"); -+ kq->ops.rollback_packet(kq); -+ return status; -+ } -+ -+ rm_state = (uint64_t *) mem_obj->cpu_ptr; -+ -+ *rm_state = QUEUESTATE__ACTIVE_COMPLETION_PENDING; -+ -+ rm_packet->header.opcode = IT_RELEASE_MEM; -+ rm_packet->header.type = PM4_TYPE_3; -+ rm_packet->header.count = sizeof(struct pm4__release_mem) / -+ sizeof(unsigned int) - 2; -+ -+ rm_packet->bitfields2.event_type = CACHE_FLUSH_AND_INV_TS_EVENT; -+ rm_packet->bitfields2.event_index = -+ event_index___release_mem__end_of_pipe; -+ -+ rm_packet->bitfields2.cache_policy = cache_policy___release_mem__lru; -+ rm_packet->bitfields2.atc = 0; -+ rm_packet->bitfields2.tc_wb_action_ena = 1; -+ -+ addr.quad_part = mem_obj->gpu_addr; -+ -+ rm_packet->bitfields4.address_lo_32b = addr.u.low_part >> 2; -+ rm_packet->address_hi = addr.u.high_part; -+ -+ rm_packet->bitfields3.data_sel = -+ data_sel___release_mem__send_64_bit_data; -+ -+ rm_packet->bitfields3.int_sel = -+ int_sel___release_mem__send_data_after_write_confirm; -+ -+ rm_packet->bitfields3.dst_sel = -+ dst_sel___release_mem__memory_controller; -+ -+ rm_packet->data_lo = QUEUESTATE__ACTIVE; -+ -+ kq->ops.submit_packet(kq); -+ -+ /* Wait till CP writes sync code: */ -+ status = amdkfd_fence_wait_timeout( -+ (unsigned int *) rm_state, -+ QUEUESTATE__ACTIVE, 1500); -+ -+ kfd_gtt_sa_free(dbgdev->dev, mem_obj); -+ -+ return status; -+} -+ - static int dbgdev_register_nodiq(struct kfd_dbgdev *dbgdev) - { - BUG_ON(!dbgdev); -@@ -117,6 +236,290 @@ static int dbgdev_unregister_diq(struct kfd_dbgdev *dbgdev) - return status; - } - -+static int dbgdev_wave_control_set_registers( -+ struct dbg_wave_control_info *wac_info, -+ union SQ_CMD_BITS *in_reg_sq_cmd, -+ union GRBM_GFX_INDEX_BITS *in_reg_gfx_index) -+{ -+ int status; -+ union SQ_CMD_BITS reg_sq_cmd; -+ union GRBM_GFX_INDEX_BITS reg_gfx_index; -+ struct HsaDbgWaveMsgAMDGen2 *pMsg; -+ -+ BUG_ON(!wac_info || !in_reg_sq_cmd || !in_reg_gfx_index); -+ -+ reg_sq_cmd.u32All = 0; -+ reg_gfx_index.u32All = 0; -+ pMsg = &wac_info->dbgWave_msg.DbgWaveMsg.WaveMsgInfoGen2; -+ -+ switch (wac_info->mode) { -+ /* Send command to single wave */ -+ case HSA_DBG_WAVEMODE_SINGLE: -+ /* -+ * Limit access to the process waves only, -+ * by setting vmid check -+ */ -+ reg_sq_cmd.bits.check_vmid = 1; -+ reg_sq_cmd.bits.simd_id = pMsg->ui32.SIMD; -+ reg_sq_cmd.bits.wave_id = pMsg->ui32.WaveId; -+ reg_sq_cmd.bits.mode = SQ_IND_CMD_MODE_SINGLE; -+ -+ reg_gfx_index.bits.sh_index = pMsg->ui32.ShaderArray; -+ reg_gfx_index.bits.se_index = pMsg->ui32.ShaderEngine; -+ reg_gfx_index.bits.instance_index = pMsg->ui32.HSACU; -+ -+ break; -+ -+ /* Send command to all waves with matching VMID */ -+ case HSA_DBG_WAVEMODE_BROADCAST_PROCESS: -+ -+ reg_gfx_index.bits.sh_broadcast_writes = 1; -+ reg_gfx_index.bits.se_broadcast_writes = 1; -+ reg_gfx_index.bits.instance_broadcast_writes = 1; -+ -+ reg_sq_cmd.bits.mode = SQ_IND_CMD_MODE_BROADCAST; -+ -+ break; -+ -+ /* Send command to all CU waves with matching VMID */ -+ case HSA_DBG_WAVEMODE_BROADCAST_PROCESS_CU: -+ -+ reg_sq_cmd.bits.check_vmid = 1; -+ reg_sq_cmd.bits.mode = SQ_IND_CMD_MODE_BROADCAST; -+ -+ reg_gfx_index.bits.sh_index = pMsg->ui32.ShaderArray; -+ reg_gfx_index.bits.se_index = pMsg->ui32.ShaderEngine; -+ reg_gfx_index.bits.instance_index = pMsg->ui32.HSACU; -+ -+ break; -+ -+ default: -+ return -EINVAL; -+ } -+ -+ switch (wac_info->operand) { -+ case HSA_DBG_WAVEOP_HALT: -+ reg_sq_cmd.bits.cmd = SQ_IND_CMD_CMD_HALT; -+ break; -+ -+ case HSA_DBG_WAVEOP_RESUME: -+ reg_sq_cmd.bits.cmd = SQ_IND_CMD_CMD_RESUME; -+ break; -+ -+ case HSA_DBG_WAVEOP_KILL: -+ reg_sq_cmd.bits.cmd = SQ_IND_CMD_CMD_KILL; -+ break; -+ -+ case HSA_DBG_WAVEOP_DEBUG: -+ reg_sq_cmd.bits.cmd = SQ_IND_CMD_CMD_DEBUG; -+ break; -+ -+ case HSA_DBG_WAVEOP_TRAP: -+ if (wac_info->trapId < MAX_TRAPID) { -+ reg_sq_cmd.bits.cmd = SQ_IND_CMD_CMD_TRAP; -+ reg_sq_cmd.bits.trap_id = wac_info->trapId; -+ } else { -+ status = -EINVAL; -+ } -+ break; -+ -+ default: -+ status = -EINVAL; -+ break; -+ } -+ -+ if (status == 0) { -+ *in_reg_sq_cmd = reg_sq_cmd; -+ *in_reg_gfx_index = reg_gfx_index; -+ } -+ -+ return status; -+} -+ -+static int dbgdev_wave_control_diq(struct kfd_dbgdev *dbgdev, -+ struct dbg_wave_control_info *wac_info) -+{ -+ -+ int status; -+ union SQ_CMD_BITS reg_sq_cmd; -+ union GRBM_GFX_INDEX_BITS reg_gfx_index; -+ struct kfd_mem_obj *mem_obj; -+ uint32_t *packet_buff_uint; -+ struct pm4__set_config_reg *packets_vec; -+ size_t ib_size = sizeof(struct pm4__set_config_reg) * 3; -+ -+ BUG_ON(!dbgdev || !wac_info); -+ -+ reg_sq_cmd.u32All = 0; -+ -+ status = dbgdev_wave_control_set_registers(wac_info, ®_sq_cmd, -+ ®_gfx_index); -+ if (status) { -+ pr_err("amdkfd: Failed to set wave control registers\n"); -+ return status; -+ } -+ -+ /* we do not control the VMID in DIQ,so reset it to a known value */ -+ reg_sq_cmd.bits.vm_id = 0; -+ -+ pr_debug("\t\t %30s\n", "* * * * * * * * * * * * * * * * * *"); -+ -+ pr_debug("\t\t mode is: %u\n", wac_info->mode); -+ pr_debug("\t\t operand is: %u\n", wac_info->operand); -+ pr_debug("\t\t trap id is: %u\n", wac_info->trapId); -+ pr_debug("\t\t msg value is: %u\n", -+ wac_info->dbgWave_msg.DbgWaveMsg.WaveMsgInfoGen2.Value); -+ pr_debug("\t\t vmid is: N/A\n"); -+ -+ pr_debug("\t\t chk_vmid is : %u\n", reg_sq_cmd.bitfields.check_vmid); -+ pr_debug("\t\t command is : %u\n", reg_sq_cmd.bitfields.cmd); -+ pr_debug("\t\t queue id is : %u\n", reg_sq_cmd.bitfields.queue_id); -+ pr_debug("\t\t simd id is : %u\n", reg_sq_cmd.bitfields.simd_id); -+ pr_debug("\t\t mode is : %u\n", reg_sq_cmd.bitfields.mode); -+ pr_debug("\t\t vm_id is : %u\n", reg_sq_cmd.bitfields.vm_id); -+ pr_debug("\t\t wave_id is : %u\n", reg_sq_cmd.bitfields.wave_id); -+ -+ pr_debug("\t\t ibw is : %u\n", -+ reg_gfx_index.bitfields.instance_broadcast_writes); -+ pr_debug("\t\t ii is : %u\n", -+ reg_gfx_index.bitfields.instance_index); -+ pr_debug("\t\t sebw is : %u\n", -+ reg_gfx_index.bitfields.se_broadcast_writes); -+ pr_debug("\t\t se_ind is : %u\n", reg_gfx_index.bitfields.se_index); -+ pr_debug("\t\t sh_ind is : %u\n", reg_gfx_index.bitfields.sh_index); -+ pr_debug("\t\t sbw is : %u\n", -+ reg_gfx_index.bitfields.sh_broadcast_writes); -+ -+ pr_debug("\t\t %30s\n", "* * * * * * * * * * * * * * * * * *"); -+ -+ status = kfd_gtt_sa_allocate(dbgdev->dev, ib_size, &mem_obj); -+ -+ if (status != 0) { -+ pr_err("amdkfd: Failed to allocate GART memory\n"); -+ return status; -+ } -+ -+ packet_buff_uint = mem_obj->cpu_ptr; -+ -+ memset(packet_buff_uint, 0, ib_size); -+ -+ packets_vec = (struct pm4__set_config_reg *) packet_buff_uint; -+ packets_vec[0].header.count = 1; -+ packets_vec[0].header.opcode = IT_SET_UCONFIG_REG; -+ packets_vec[0].header.type = PM4_TYPE_3; -+ packets_vec[0].bitfields2.reg_offset = -+ GRBM_GFX_INDEX / (sizeof(uint32_t)) - -+ USERCONFIG_REG_BASE; -+ -+ packets_vec[0].bitfields2.insert_vmid = 0; -+ packets_vec[0].reg_data[0] = reg_gfx_index.u32All; -+ -+ packets_vec[1].header.count = 1; -+ packets_vec[1].header.opcode = IT_SET_CONFIG_REG; -+ packets_vec[1].header.type = PM4_TYPE_3; -+ packets_vec[1].bitfields2.reg_offset = SQ_CMD / (sizeof(uint32_t)) - -+ CONFIG_REG_BASE; -+ -+ packets_vec[1].bitfields2.vmid_shift = SQ_CMD_VMID_OFFSET; -+ packets_vec[1].bitfields2.insert_vmid = 1; -+ packets_vec[1].reg_data[0] = reg_sq_cmd.u32All; -+ -+ /* Restore the GRBM_GFX_INDEX register */ -+ -+ reg_gfx_index.u32All = 0; -+ reg_gfx_index.bits.sh_broadcast_writes = 1; -+ reg_gfx_index.bits.instance_broadcast_writes = 1; -+ reg_gfx_index.bits.se_broadcast_writes = 1; -+ -+ -+ packets_vec[2].ordinal1 = packets_vec[0].ordinal1; -+ packets_vec[2].bitfields2.reg_offset = -+ GRBM_GFX_INDEX / (sizeof(uint32_t)) - -+ USERCONFIG_REG_BASE; -+ -+ packets_vec[2].bitfields2.insert_vmid = 0; -+ packets_vec[2].reg_data[0] = reg_gfx_index.u32All; -+ -+ status = dbgdev_diq_submit_ib( -+ dbgdev, -+ wac_info->process->pasid, -+ mem_obj->gpu_addr, -+ packet_buff_uint, -+ ib_size); -+ -+ if (status != 0) -+ pr_err("amdkfd: Failed to submit IB to DIQ\n"); -+ -+ kfd_gtt_sa_free(dbgdev->dev, mem_obj); -+ -+ return status; -+} -+ -+static int dbgdev_wave_control_nodiq(struct kfd_dbgdev *dbgdev, -+ struct dbg_wave_control_info *wac_info) -+{ -+ int status; -+ union SQ_CMD_BITS reg_sq_cmd; -+ union GRBM_GFX_INDEX_BITS reg_gfx_index; -+ struct kfd_process_device *pdd; -+ -+ BUG_ON(!dbgdev || !dbgdev->dev || !wac_info); -+ -+ reg_sq_cmd.u32All = 0; -+ -+ /* taking the VMID for that process on the safe way using PDD */ -+ pdd = kfd_get_process_device_data(dbgdev->dev, wac_info->process); -+ -+ if (!pdd) { -+ pr_err("amdkfd: Failed to get pdd for wave control no DIQ\n"); -+ return -EFAULT; -+ } -+ status = dbgdev_wave_control_set_registers(wac_info, ®_sq_cmd, -+ ®_gfx_index); -+ if (status) { -+ pr_err("amdkfd: Failed to set wave control registers\n"); -+ return status; -+ } -+ -+ /* for non DIQ we need to patch the VMID: */ -+ -+ reg_sq_cmd.bits.vm_id = pdd->qpd.vmid; -+ -+ pr_debug("\t\t %30s\n", "* * * * * * * * * * * * * * * * * *"); -+ -+ pr_debug("\t\t mode is: %u\n", wac_info->mode); -+ pr_debug("\t\t operand is: %u\n", wac_info->operand); -+ pr_debug("\t\t trap id is: %u\n", wac_info->trapId); -+ pr_debug("\t\t msg value is: %u\n", -+ wac_info->dbgWave_msg.DbgWaveMsg.WaveMsgInfoGen2.Value); -+ pr_debug("\t\t vmid is: %u\n", pdd->qpd.vmid); -+ -+ pr_debug("\t\t chk_vmid is : %u\n", reg_sq_cmd.bitfields.check_vmid); -+ pr_debug("\t\t command is : %u\n", reg_sq_cmd.bitfields.cmd); -+ pr_debug("\t\t queue id is : %u\n", reg_sq_cmd.bitfields.queue_id); -+ pr_debug("\t\t simd id is : %u\n", reg_sq_cmd.bitfields.simd_id); -+ pr_debug("\t\t mode is : %u\n", reg_sq_cmd.bitfields.mode); -+ pr_debug("\t\t vm_id is : %u\n", reg_sq_cmd.bitfields.vm_id); -+ pr_debug("\t\t wave_id is : %u\n", reg_sq_cmd.bitfields.wave_id); -+ -+ pr_debug("\t\t ibw is : %u\n", -+ reg_gfx_index.bitfields.instance_broadcast_writes); -+ pr_debug("\t\t ii is : %u\n", -+ reg_gfx_index.bitfields.instance_index); -+ pr_debug("\t\t sebw is : %u\n", -+ reg_gfx_index.bitfields.se_broadcast_writes); -+ pr_debug("\t\t se_ind is : %u\n", reg_gfx_index.bitfields.se_index); -+ pr_debug("\t\t sh_ind is : %u\n", reg_gfx_index.bitfields.sh_index); -+ pr_debug("\t\t sbw is : %u\n", -+ reg_gfx_index.bitfields.sh_broadcast_writes); -+ -+ pr_debug("\t\t %30s\n", "* * * * * * * * * * * * * * * * * *"); -+ -+ return dbgdev->dev->kfd2kgd->wave_control_execute(dbgdev->dev->kgd, -+ reg_gfx_index.u32All, -+ reg_sq_cmd.u32All); -+} -+ - void kfd_dbgdev_init(struct kfd_dbgdev *pdbgdev, struct kfd_dev *pdev, - enum DBGDEV_TYPE type) - { -@@ -131,11 +534,13 @@ void kfd_dbgdev_init(struct kfd_dbgdev *pdbgdev, struct kfd_dev *pdev, - case DBGDEV_TYPE_NODIQ: - pdbgdev->dbgdev_register = dbgdev_register_nodiq; - pdbgdev->dbgdev_unregister = dbgdev_unregister_nodiq; -+ pdbgdev->dbgdev_wave_control = dbgdev_wave_control_nodiq; - break; - case DBGDEV_TYPE_DIQ: - default: - pdbgdev->dbgdev_register = dbgdev_register_diq; - pdbgdev->dbgdev_unregister = dbgdev_unregister_diq; -+ pdbgdev->dbgdev_wave_control = dbgdev_wave_control_diq; - break; - } - -diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.c b/drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.c -index 959be98..7e2c8e2 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.c -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.c -@@ -133,3 +133,19 @@ long kfd_dbgmgr_unregister(struct kfd_dbgmgr *pmgr, struct kfd_process *p) - - return 0; - } -+ -+long kfd_dbgmgr_wave_control(struct kfd_dbgmgr *pmgr, -+ struct dbg_wave_control_info *wac_info) -+{ -+ BUG_ON(!pmgr || !pmgr->dbgdev || !wac_info); -+ -+ /* Is the requests coming from the already registered process? */ -+ if (pmgr->pasid != wac_info->process->pasid) { -+ pr_debug("H/W debugger support was not registered for requester pasid %d\n", -+ wac_info->process->pasid); -+ return -EINVAL; -+ } -+ -+ return (long) pmgr->dbgdev->dbgdev_wave_control(pmgr->dbgdev, wac_info); -+} -+ -diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.h b/drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.h -index 250cf88..6da9d36 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.h -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_dbgmgr.h -@@ -268,6 +268,8 @@ struct kfd_dbgdev { - /* virtualized function pointers to device dbg */ - int (*dbgdev_register)(struct kfd_dbgdev *dbgdev); - int (*dbgdev_unregister)(struct kfd_dbgdev *dbgdev); -+ int (*dbgdev_wave_control)(struct kfd_dbgdev *dbgdev, -+ struct dbg_wave_control_info *wac_info); - - }; - -@@ -283,5 +285,6 @@ void kfd_dbgmgr_destroy(struct kfd_dbgmgr *pmgr); - bool kfd_dbgmgr_create(struct kfd_dbgmgr **ppmgr, struct kfd_dev *pdev); - long kfd_dbgmgr_register(struct kfd_dbgmgr *pmgr, struct kfd_process *p); - long kfd_dbgmgr_unregister(struct kfd_dbgmgr *pmgr, struct kfd_process *p); -- -+long kfd_dbgmgr_wave_control(struct kfd_dbgmgr *pmgr, -+ struct dbg_wave_control_info *wac_info); - #endif /* KFD_DBGMGR_H_ */ -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 a5dc822..b08ec05 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c -@@ -915,7 +915,7 @@ out: - return retval; - } - --static int amdkfd_fence_wait_timeout(unsigned int *fence_addr, -+int amdkfd_fence_wait_timeout(unsigned int *fence_addr, - unsigned int fence_value, - unsigned long timeout) - { -diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h -index a65a281..cd1f033 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h -@@ -656,6 +656,10 @@ int pqm_update_queue(struct process_queue_manager *pqm, unsigned int qid, - struct kernel_queue *pqm_get_kernel_queue(struct process_queue_manager *pqm, - unsigned int qid); - -+int amdkfd_fence_wait_timeout(unsigned int *fence_addr, -+ unsigned int fence_value, -+ unsigned long timeout); -+ - /* Packet Manager */ - - #define KFD_HIQ_TIMEOUT (500) --- -1.9.1 - |