Commit 8fe7cf58 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdkfd: add an interface to query whether is KFD is active



Add an interface to query whether KFD has any active queues.

v2: fix build issues

Acked-by: default avatarSrinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ecfe9b23
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -890,6 +890,15 @@ int amdgpu_amdkfd_start_sched(struct amdgpu_device *adev, uint32_t node_id)
	return kgd2kfd_start_sched(adev->kfd.dev, node_id);
}

/* check if there are KFD queues active */
bool amdgpu_amdkfd_compute_active(struct amdgpu_device *adev, uint32_t node_id)
{
	if (!adev->kfd.init_complete)
		return false;

	return kgd2kfd_compute_active(adev->kfd.dev, node_id);
}

/* Config CGTT_SQ_CLK_CTRL */
int amdgpu_amdkfd_config_sq_perfmon(struct amdgpu_device *adev, uint32_t xcp_id,
	bool core_override_enable, bool reg_override_enable, bool perfmon_override_enable)
+7 −0
Original line number Diff line number Diff line
@@ -268,6 +268,7 @@ int amdgpu_amdkfd_start_sched(struct amdgpu_device *adev, uint32_t node_id);
int amdgpu_amdkfd_stop_sched(struct amdgpu_device *adev, uint32_t node_id);
int amdgpu_amdkfd_config_sq_perfmon(struct amdgpu_device *adev, uint32_t xcp_id,
	bool core_override_enable, bool reg_override_enable, bool perfmon_override_enable);
bool amdgpu_amdkfd_compute_active(struct amdgpu_device *adev, uint32_t node_id);


/* Read user wptr from a specified user address space with page fault
@@ -431,6 +432,7 @@ int kgd2kfd_check_and_lock_kfd(void);
void kgd2kfd_unlock_kfd(void);
int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id);
int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id);
bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id);
#else
static inline int kgd2kfd_init(void)
{
@@ -511,5 +513,10 @@ static inline int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)
{
	return 0;
}

static inline bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
{
	return false;
}
#endif
#endif /* AMDGPU_AMDKFD_H_INCLUDED */
+25 −0
Original line number Diff line number Diff line
@@ -1392,6 +1392,13 @@ void kfd_dec_compute_active(struct kfd_node *node)
	WARN_ONCE(count < 0, "Compute profile ref. count error");
}

static bool kfd_compute_active(struct kfd_node *node)
{
	if (atomic_read(&node->kfd->compute_profile))
		return true;
	return false;
}

void kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask)
{
	/*
@@ -1485,6 +1492,24 @@ int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)
	return node->dqm->ops.halt(node->dqm);
}

bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
{
	struct kfd_node *node;

	if (!kfd->init_complete)
		return false;

	if (node_id >= kfd->num_nodes) {
		dev_warn(kfd->adev->dev, "Invalid node ID: %u exceeds %u\n",
			 node_id, kfd->num_nodes - 1);
		return false;
	}

	node = kfd->nodes[node_id];

	return kfd_compute_active(node);
}

#if defined(CONFIG_DEBUG_FS)

/* This function will send a package to HIQ to hang the HWS