[PATCH 85/95] drm/amdgpu: Add UALink diagnostic logging for vpod commit/activation
Alex Deucher <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
From: Mukul Joshi <[email protected]> Add UALINK:-tagged dev_info/dev_warn logging along the vpod commit -> update_accel_state -> integrity -> activate path so failing and -EAGAIN peer-wait cases are visible without dynamic debug. Also fix a wrong print arg (vpod->id -> vpod->addr_mode) in the invalid addr mode message. Signed-off-by: Mukul Joshi <[email protected]> Reviewed-by: Lijo Lazar <[email protected]> Signed-off-by: Alex Deucher <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c | 156 +++++++++++++++------ 1 file changed, 114 insertions(+), 42 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c index 8486d7b3dbe66..5d5df0a288803 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c @@ -125,26 +125,29 @@ static bool __check_vpod_info(struct amdgpu_device *adev, unsigned int weight; if (vpod->size == 0 || vpod->size > ppod->size) { - dev_dbg(adev->dev, "vPod size %u out of range [1..%u]\n", - vpod->size, ppod->size); + dev_warn(adev->dev, + "UALINK: vPod size %u out of range [1..%u]\n", + vpod->size, ppod->size); return false; } if (vpod->addr_mode >= AMDGPU_UALINK_ADDR_MODE_MAX) { - dev_dbg(adev->dev, "Invalid addr mode %u\n", vpod->id); + dev_warn(adev->dev, + "UALINK: invalid addr mode %u\n", + vpod->addr_mode); return false; } weight = bitmap_weight(vpod->active_accel_bits, AMDGPU_UALINK_ACCEL_MAX); if (weight != vpod->size) { - dev_dbg(adev->dev, - "vPod size doesn't match vpod_active_accels list: %u != %u\n", - vpod->size, weight); + dev_warn(adev->dev, + "UALINK: vPod size doesn't match vpod_active_accels list: %u != %u\n", + vpod->size, weight); return false; } if (!test_bit(ppod->accel_id, vpod->active_accel_bits)) { - dev_dbg(adev->dev, - "Accelerator ID %u not listed in vpod_active_accels\n", - ppod->accel_id); + dev_warn(adev->dev, + "UALINK: accelerator ID %u not listed in vpod_active_accels\n", + ppod->accel_id); return false; } @@ -242,18 +245,27 @@ static int amdgpu_ualink_update_accel_state( struct amdgpu_device *adev, enum amdgpu_ualink_accel_state prev_state, u32 prev_vpod_id, enum psp_gfx_ual_config_state cfg_state) { + dev_info(adev->dev, + "UALINK: update_accel_state: prev_state=%d prev_vpod_id=%u new_vpod_id=%u cfg_state=%d\n", + prev_state, prev_vpod_id, adev->ualink.info->vpod.id, + cfg_state); + /* If the device is already active and its vpod_id is unchanged, the * update does not affect vpod membership. Skip the local vpod * integrity check and re-activation. */ if (prev_state == AMDGPU_UALINK_ACCEL_STATE_ACTIVE && adev->ualink.info->vpod.id == prev_vpod_id) { + dev_info(adev->dev, + "UALINK: update_accel_state: already ACTIVE, vpod_id unchanged\n"); amdgpu_ualink_update_vpod_config(adev); return 0; } /* A new vpod_id of 0 means this GPU was removed from the vPod. */ if (adev->ualink.info->vpod.id == AMDGPU_UALINK_VPOD_ID_INVALID) { + dev_info(adev->dev, + "UALINK: update_accel_state: vpod_id=0, removing accelerator from vPod\n"); amdgpu_ualink_update_vpod_config(adev); scoped_guard(mutex, &mgpu_info.mutex) deactivate_accelerator(adev); @@ -263,6 +275,9 @@ static int amdgpu_ualink_update_accel_state( /* GPU joining a new vpod should be with invalid vpod id*/ scoped_guard(mutex, &mgpu_info.mutex) { if (prev_vpod_id == AMDGPU_UALINK_VPOD_ID_INVALID) { + dev_info(adev->dev, + "UALINK: update_accel_state: joining vpod_id=%u\n", + adev->ualink.info->vpod.id); amdgpu_ualink_info_set_accel_state( adev, adev->ualink.info, cfg_state); __amdgpu_ualink_activate_vpod_locked(adev); @@ -897,6 +912,11 @@ static void activate_accelerator(struct amdgpu_device *adev) if (adev->ualink.info->accel_state >= AMDGPU_UALINK_ACCEL_STATE_ACTIVE) return; + dev_info(adev->dev, + "UALINK: activating accelerator accel_id=%u (accel_state=%d)\n", + adev->ualink.info->ppod.accel_id, + adev->ualink.info->accel_state); + /* Enable incoming NPA address translation with NPA VMID */ r = psp_ual_set_npa_config(&adev->psp, adev->ualink.psp_if_ver, adev->vm_manager.npa_vmid, true); @@ -919,6 +939,9 @@ static void activate_accelerator(struct amdgpu_device *adev) } adev->ualink.info->accel_state = AMDGPU_UALINK_ACCEL_STATE_ACTIVE; + dev_info(adev->dev, + "UALINK: accelerator accel_id=%u is now ACTIVE\n", + adev->ualink.info->ppod.accel_id); } static void deactivate_accelerator(struct amdgpu_device *adev) @@ -926,6 +949,11 @@ static void deactivate_accelerator(struct amdgpu_device *adev) if (adev->ualink.info->accel_state < AMDGPU_UALINK_ACCEL_STATE_ACTIVE) return; + dev_info(adev->dev, + "UALINK: deactivating accelerator accel_id=%u (accel_state=%d -> PPOD_CONFIGURED)\n", + adev->ualink.info->ppod.accel_id, + adev->ualink.info->accel_state); + /* Disable incoming NPA address translation with NPA VMID */ psp_ual_set_npa_config(&adev->psp, adev->ualink.psp_if_ver, adev->vm_manager.npa_vmid, false); @@ -988,66 +1016,75 @@ static int __check_local_vpod_integrity(struct amdgpu_device *adev) peer_info = peer_adev->ualink.info; /* peer device ppod not configured */ if (peer_info->accel_state < - AMDGPU_UALINK_ACCEL_STATE_PPOD_CONFIGURED) + AMDGPU_UALINK_ACCEL_STATE_PPOD_CONFIGURED) { + dev_info(adev->dev, + "UALINK: integrity EAGAIN: peer accel_id=%u not ppod-configured (accel_state=%d)\n", + peer_info->ppod.accel_id, + peer_info->accel_state); return -EAGAIN; + } accel_id = peer_info->ppod.accel_id; if (!test_bit(accel_id, info->vpod.active_accel_bits)) continue; /* peer device vpod not configured */ if (peer_info->accel_state < - AMDGPU_UALINK_ACCEL_STATE_VPOD_CONFIGURED) + AMDGPU_UALINK_ACCEL_STATE_VPOD_CONFIGURED) { + dev_info(adev->dev, + "UALINK: integrity EAGAIN: vpod peer accel_id=%u not vpod-configured (accel_state=%d)\n", + accel_id, peer_info->accel_state); return -EAGAIN; + } if (!uuid_equal(&peer_info->ppod.id, &info->ppod.id)) { - dev_dbg(adev->dev, - "Peer %u ppod_id doesn't match: %pU != %pU", - peer_info->ppod.accel_id, &peer_info->ppod.id, - &info->ppod.id); + dev_warn(adev->dev, + "UALINK: integrity fail: peer %u ppod_id doesn't match: %pU != %pU\n", + peer_info->ppod.accel_id, &peer_info->ppod.id, + &info->ppod.id); return -EINVAL; } if (peer_info->ppod.size != info->ppod.size) { - dev_dbg(adev->dev, - "Peer %u ppod_size doesn't match: %u != %u\n", - accel_id, peer_info->ppod.size, - info->ppod.size); + dev_warn(adev->dev, + "UALINK: integrity fail: peer %u ppod_size doesn't match: %u != %u\n", + accel_id, peer_info->ppod.size, + info->ppod.size); return -EINVAL; } if (peer_info->vpod.id != info->vpod.id) { - dev_dbg(adev->dev, - "Peer %u vpod_id doesn't match: %u != %u", - accel_id, peer_info->vpod.id, info->vpod.id); + dev_warn(adev->dev, + "UALINK: integrity fail: peer %u vpod_id doesn't match: %u != %u\n", + accel_id, peer_info->vpod.id, info->vpod.id); return -EINVAL; } if (peer_info->vpod.size != info->vpod.size) { - dev_dbg(adev->dev, - "Peer %u vpod_size doesn't match: %u != %u\n", - accel_id, peer_info->vpod.size, - info->vpod.size); + dev_warn(adev->dev, + "UALINK: integrity fail: peer %u vpod_size doesn't match: %u != %u\n", + accel_id, peer_info->vpod.size, + info->vpod.size); return -EINVAL; } if (peer_info->vpod.addr_mode != info->vpod.addr_mode) { - dev_dbg(adev->dev, - "Peer %u addr_mode doesn't match: %u != %u\n", - accel_id, peer_info->vpod.addr_mode, - info->vpod.addr_mode); + dev_warn(adev->dev, + "UALINK: integrity fail: peer %u addr_mode doesn't match: %u != %u\n", + accel_id, peer_info->vpod.addr_mode, + info->vpod.addr_mode); return -EINVAL; } if (!bitmap_equal(peer_info->vpod.active_accel_bits, info->vpod.active_accel_bits, AMDGPU_UALINK_ACCEL_MAX)) { - dev_dbg(adev->dev, - "Peer %u vpod_active_accels don't match\n", - accel_id); + dev_warn(adev->dev, + "UALINK: integrity fail: peer %u vpod_active_accels don't match\n", + accel_id); return -EINVAL; } if (__test_and_set_bit(accel_id, local_accel_ids)) { - dev_dbg(adev->dev, - "Duplicate accel_id %u among local vpod peers\n", - accel_id); + dev_warn(adev->dev, + "UALINK: integrity fail: duplicate accel_id %u among local vpod peers\n", + accel_id); return -EINVAL; } local_accels[n_local_accels++] = accel_id; @@ -1086,8 +1123,16 @@ static void __amdgpu_ualink_activate_vpod_locked(struct amdgpu_device *adev) "Local vpod integrity check failed: %d\n", ret); return; } - if (!ret) - activate_local_vpod(adev); + if (ret == -EAGAIN) { + dev_info(adev->dev, + "UALINK: activate deferred, waiting for local vpod peers to reach VPOD_CONFIGURED\n"); + return; + } + + dev_info(adev->dev, + "UALINK: integrity OK, applying local vpod (%u local accels)\n", + adev->ualink.info->n_local_accels); + activate_local_vpod(adev); } static ssize_t ualink_vpod_config_commit_store(struct kobject *kobj, @@ -1105,8 +1150,16 @@ static ssize_t ualink_vpod_config_commit_store(struct kobject *kobj, if (!sysfs_streq(buf, "true")) return -EINVAL; + + dev_dbg(adev->dev, + "UALINK: vpod-commit enter: accel_state=%d staged vpod_id=%u vpod_size=%u addr_mode=%u\n", + info->accel_state, config->vpod.id, config->vpod.size, + config->vpod.addr_mode); + if (info->accel_state < AMDGPU_UALINK_ACCEL_STATE_PPOD_CONFIGURED) { - dev_dbg(adev->dev, "Ualink ppod is not yet configured\n"); + dev_warn(adev->dev, + "UALINK: vpod-commit rejected, ppod not configured (accel_state=%d)\n", + info->accel_state); return -EINVAL; } @@ -1114,15 +1167,34 @@ static ssize_t ualink_vpod_config_commit_store(struct kobject *kobj, prev_vpod_id = info->vpod.id; r = psp_ual_set_vpod_config(&adev->psp, adev->ualink.psp_if_ver, config); - if (r) + if (r) { + dev_warn(adev->dev, + "UALINK: vpod-commit psp_ual_set_vpod_config failed: %d\n", + r); return r; + } + r = psp_ual_query_info(&adev->psp, adev->ualink.psp_if_ver, info, NULL); - if (r) + if (r) { + dev_warn(adev->dev, + "UALINK: vpod-commit psp_ual_query_info failed: %d\n", + r); return r; + } + + dev_dbg(adev->dev, + "UALINK: vpod-commit fw read-back: vpod_id=%u vpod_size=%u accel_id=%u ppod.size=%u addr_mode=%u\n", + info->vpod.id, info->vpod.size, info->ppod.accel_id, + info->ppod.size, info->vpod.addr_mode); if (info->vpod.id != AMDGPU_UALINK_VPOD_ID_INVALID && - !__check_vpod_info(adev, info)) + !__check_vpod_info(adev, info)) { + dev_err(adev->dev, + "UALINK: vpod-commit __check_vpod_info() failed: %d\n", + r); return -EINVAL; + } + /* The integrity check makes sure each new GPU is consistent with the * other GPUs already in the vPod. All known local GPUs can become * "ready" at the same time. -- 2.55.0