[PATCH v1 1/9] drm/amdgpu: update vcn_v1 devcoredump on per instance basis
Khatri, Sunil
sunil.khatri at amd.com
Mon Nov 4 04:04:42 UTC 2024
On 10/31/2024 3:16 PM, Christian König wrote:
> Am 29.10.24 um 14:50 schrieb Sunil Khatri:
>> vcn code is restructured for per instance basis. Each
>> vcn instance is represented by an ip_block and hence a
>> need to update the dump and print functions for each
>> instance as an IP.
>>
>> Existing way was to capture the ip dump for each instance
>> in a same memory dump but now each ip_block of vcn is an
>> independent one and its memory is independent and handled
>> within the ip_block now.
>>
>> Signed-off-by: Sunil Khatri <sunil.khatri at amd.com>
>> ---
>> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 +
>> drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 77 +++++++++++++--------------
>> 2 files changed, 39 insertions(+), 40 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> index d4c8cc3c1730..ef564ddcfcbb 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> @@ -392,6 +392,8 @@ struct amdgpu_ip_block {
>> const struct amdgpu_ip_block_version *version;
>> struct amdgpu_device *adev;
>> unsigned int instance;
>> + /* IP reg dump */
>
> That comment could be improved, something like "Memory to dump IP
> registers and state in GPU reset handling".
> Sure will update the commit message as you suggested.
>
> Apart from that feel free to add Reviewed-by: Christian König
> <christian.koenig at amd.com> to the patch.
>
> Regards,
> Christian.
>
>> + uint32_t *ip_dump;
>> };
>> int amdgpu_device_ip_block_version_cmp(struct amdgpu_device *adev,
>> diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>> b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>> index 7638ddeccec7..f31fdd620c86 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
>> @@ -203,12 +203,12 @@ static int vcn_v1_0_sw_init(struct
>> amdgpu_ip_block *ip_block)
>> r = jpeg_v1_0_sw_init(ip_block);
>> /* Allocate memory for VCN IP Dump buffer */
>> - ptr = kcalloc(adev->vcn.num_vcn_inst * reg_count,
>> sizeof(uint32_t), GFP_KERNEL);
>> + ptr = kcalloc(reg_count, sizeof(uint32_t), GFP_KERNEL);
>> if (!ptr) {
>> DRM_ERROR("Failed to allocate memory for VCN IP Dump\n");
>> - adev->vcn.ip_dump = NULL;
>> + ip_block->ip_dump = NULL;
>> } else {
>> - adev->vcn.ip_dump = ptr;
>> + ip_block->ip_dump = ptr;
>> }
>> return r;
>> }
>> @@ -234,7 +234,7 @@ static int vcn_v1_0_sw_fini(struct
>> amdgpu_ip_block *ip_block)
>> r = amdgpu_vcn_sw_fini(adev, inst);
>> - kfree(adev->vcn.ip_dump);
>> + kfree(ip_block->ip_dump);
>> return r;
>> }
>> @@ -1933,61 +1933,58 @@ void vcn_v1_0_ring_end_use(struct amdgpu_ring
>> *ring)
>> static void vcn_v1_0_print_ip_state(struct amdgpu_ip_block
>> *ip_block, struct drm_printer *p)
>> {
>> struct amdgpu_device *adev = ip_block->adev;
>> - int i, j;
>> + int i;
>> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_1_0);
>> - uint32_t inst_off, is_powered;
>> + uint32_t is_powered;
>> + int inst = ip_block->instance;
>> - if (!adev->vcn.ip_dump)
>> + if (!ip_block->ip_dump)
>> return;
>> - drm_printf(p, "num_instances:%d\n", adev->vcn.num_vcn_inst);
>> - for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
>> - if (adev->vcn.harvest_config & (1 << i)) {
>> - drm_printf(p, "\nHarvested Instance:VCN%d Skipping
>> dump\n", i);
>> - continue;
>> - }
>> + drm_printf(p, "Instance no:VCN%d\n", inst);
>> - inst_off = i * reg_count;
>> - is_powered = (adev->vcn.ip_dump[inst_off] &
>> - UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;
>> + if (adev->vcn.harvest_config & (1 << inst)) {
>> + drm_printf(p, "\nHarvested Instance:VCN%d Skipping dump\n",
>> inst);
>> + return;
>> + }
>> - if (is_powered) {
>> - drm_printf(p, "\nActive Instance:VCN%d\n", i);
>> - for (j = 0; j < reg_count; j++)
>> - drm_printf(p, "%-50s \t 0x%08x\n",
>> vcn_reg_list_1_0[j].reg_name,
>> - adev->vcn.ip_dump[inst_off + j]);
>> - } else {
>> - drm_printf(p, "\nInactive Instance:VCN%d\n", i);
>> - }
>> + is_powered = (ip_block->ip_dump[0] &
>> + UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;
>> +
>> + if (is_powered) {
>> + drm_printf(p, "\nActive Instance:VCN%d\n", inst);
>> + for (i = 0; i < reg_count; i++)
>> + drm_printf(p, "%-50s \t 0x%08x\n",
>> + vcn_reg_list_1_0[i].reg_name,
>> + ip_block->ip_dump[i]);
>> + } else {
>> + drm_printf(p, "\nInactive Instance:VCN%d\n", inst);
>> }
>> }
>> static void vcn_v1_0_dump_ip_state(struct amdgpu_ip_block *ip_block)
>> {
>> struct amdgpu_device *adev = ip_block->adev;
>> - int i, j;
>> + int i;
>> + int inst = ip_block->instance;
>> bool is_powered;
>> - uint32_t inst_off;
>> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_1_0);
>> - if (!adev->vcn.ip_dump)
>> + if (!ip_block->ip_dump)
>> return;
>> - for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
>> - if (adev->vcn.harvest_config & (1 << i))
>> - continue;
>> + if (adev->vcn.harvest_config & (1 << inst))
>> + return;
>> - inst_off = i * reg_count;
>> - /* mmUVD_POWER_STATUS is always readable and is first
>> element of the array */
>> - adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, i,
>> mmUVD_POWER_STATUS);
>> - is_powered = (adev->vcn.ip_dump[inst_off] &
>> - UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;
>> + /* mmUVD_POWER_STATUS is always readable and is first element of
>> the array */
>> + ip_block->ip_dump[0] = RREG32_SOC15(VCN, inst, mmUVD_POWER_STATUS);
>> + is_powered = (ip_block->ip_dump[0] &
>> + UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;
>> - if (is_powered)
>> - for (j = 1; j < reg_count; j++)
>> - adev->vcn.ip_dump[inst_off + j] =
>> - RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_1_0[j], i));
>> - }
>> + if (is_powered)
>> + for (i = 1; i < reg_count; i++)
>> + ip_block->ip_dump[i] =
>> + RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_1_0[i], inst));
>> }
>> static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
>
More information about the amd-gfx
mailing list