Skip to content

Commit 2ade36e

Browse files
committed
drm/amdkfd: add proper handling for S0ix
When in S0i3, the GFX state is retained, so all we need to do is stop the runlist so GFX can enter gfxoff. Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org> Tested-by: David Perry <david.perry@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> (cherry picked from commit 4bfa860) Cc: stable@vger.kernel.org
1 parent f9b8051 commit 2ade36e

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -250,16 +250,24 @@ void amdgpu_amdkfd_interrupt(struct amdgpu_device *adev,
250250

251251
void amdgpu_amdkfd_suspend(struct amdgpu_device *adev, bool suspend_proc)
252252
{
253-
if (adev->kfd.dev)
254-
kgd2kfd_suspend(adev->kfd.dev, suspend_proc);
253+
if (adev->kfd.dev) {
254+
if (adev->in_s0ix)
255+
kgd2kfd_stop_sched_all_nodes(adev->kfd.dev);
256+
else
257+
kgd2kfd_suspend(adev->kfd.dev, suspend_proc);
258+
}
255259
}
256260

257261
int amdgpu_amdkfd_resume(struct amdgpu_device *adev, bool resume_proc)
258262
{
259263
int r = 0;
260264

261-
if (adev->kfd.dev)
262-
r = kgd2kfd_resume(adev->kfd.dev, resume_proc);
265+
if (adev->kfd.dev) {
266+
if (adev->in_s0ix)
267+
r = kgd2kfd_start_sched_all_nodes(adev->kfd.dev);
268+
else
269+
r = kgd2kfd_resume(adev->kfd.dev, resume_proc);
270+
}
263271

264272
return r;
265273
}

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,9 @@ void kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask);
426426
int kgd2kfd_check_and_lock_kfd(struct kfd_dev *kfd);
427427
void kgd2kfd_unlock_kfd(struct kfd_dev *kfd);
428428
int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id);
429+
int kgd2kfd_start_sched_all_nodes(struct kfd_dev *kfd);
429430
int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id);
431+
int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd);
430432
bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id);
431433
bool kgd2kfd_vmfault_fast_path(struct amdgpu_device *adev, struct amdgpu_iv_entry *entry,
432434
bool retry_fault);
@@ -516,11 +518,21 @@ static inline int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id)
516518
return 0;
517519
}
518520

521+
static inline int kgd2kfd_start_sched_all_nodes(struct kfd_dev *kfd)
522+
{
523+
return 0;
524+
}
525+
519526
static inline int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)
520527
{
521528
return 0;
522529
}
523530

531+
static inline int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd)
532+
{
533+
return 0;
534+
}
535+
524536
static inline bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
525537
{
526538
return false;

drivers/gpu/drm/amd/amdkfd/kfd_device.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,25 @@ int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id)
15501550
return ret;
15511551
}
15521552

1553+
int kgd2kfd_start_sched_all_nodes(struct kfd_dev *kfd)
1554+
{
1555+
struct kfd_node *node;
1556+
int i, r;
1557+
1558+
if (!kfd->init_complete)
1559+
return 0;
1560+
1561+
for (i = 0; i < kfd->num_nodes; i++) {
1562+
node = kfd->nodes[i];
1563+
r = node->dqm->ops.unhalt(node->dqm);
1564+
if (r) {
1565+
dev_err(kfd_device, "Error in starting scheduler\n");
1566+
return r;
1567+
}
1568+
}
1569+
return 0;
1570+
}
1571+
15531572
int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)
15541573
{
15551574
struct kfd_node *node;
@@ -1567,6 +1586,23 @@ int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)
15671586
return node->dqm->ops.halt(node->dqm);
15681587
}
15691588

1589+
int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd)
1590+
{
1591+
struct kfd_node *node;
1592+
int i, r;
1593+
1594+
if (!kfd->init_complete)
1595+
return 0;
1596+
1597+
for (i = 0; i < kfd->num_nodes; i++) {
1598+
node = kfd->nodes[i];
1599+
r = node->dqm->ops.halt(node->dqm);
1600+
if (r)
1601+
return r;
1602+
}
1603+
return 0;
1604+
}
1605+
15701606
bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
15711607
{
15721608
struct kfd_node *node;

0 commit comments

Comments
 (0)