<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Aptos;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:12.0pt;
font-family:"Aptos",sans-serif;
color:black;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0in;
font-size:10.0pt;
font-family:"Courier New";
color:black;}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:Consolas;
color:black;}
span.EmailStyle21
{mso-style-type:personal-reply;
font-family:"Arial",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor="white" lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<p style="font-family:Calibri;font-size:10pt;color:#0000FF;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[AMD Official Use Only - AMD Internal Distribution Only]<br>
</p>
<br>
<div>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif;color:windowtext">Validate the ip dump date first for vcn before committing. I reviewed based on the code changes as it looks fine.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Arial",sans-serif;color:windowtext"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:windowtext">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:windowtext"> amd-gfx <amd-gfx-bounces@lists.freedesktop.org>
<b>On Behalf Of </b>Khatri, Sunil<br>
<b>Sent:</b> Tuesday, October 22, 2024 2:27 PM<br>
<b>To:</b> Zhang, Boyuan <Boyuan.Zhang@amd.com>; amd-gfx@lists.freedesktop.org; Liu, Leo <Leo.Liu@amd.com>; Koenig, Christian <Christian.Koenig@amd.com>; Deucher, Alexander <Alexander.Deucher@amd.com><br>
<b>Subject:</b> Re: [PATCH 29/32] drm/amdgpu: dump_ip_state for each vcn instance<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p>Reviewed-by: Sunil Khatri <<a href="mailto:christian.koenig@amd.com">sunil.khatri@amd.com</a>><o:p></o:p></p>
<div>
<p class="MsoNormal">On 10/17/2024 6:50 PM, <a href="mailto:boyuan.zhang@amd.com">
boyuan.zhang@amd.com</a> wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>From: Boyuan Zhang <a href="mailto:boyuan.zhang@amd.com"><boyuan.zhang@amd.com></a><o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Perform dump_ip_state only for the instance of the current vcn IP block,<o:p></o:p></pre>
<pre>instead of perform it for all vcn instances.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Signed-off-by: Boyuan Zhang <a href="mailto:boyuan.zhang@amd.com"><boyuan.zhang@amd.com></a><o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre> drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 27 +++++++++----------<o:p></o:p></pre>
<pre> drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 27 +++++++++----------<o:p></o:p></pre>
<pre> drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 27 +++++++++----------<o:p></o:p></pre>
<pre> drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 27 +++++++++----------<o:p></o:p></pre>
<pre> drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 31 +++++++++++-----------<o:p></o:p></pre>
<pre> drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 35 ++++++++++++-------------<o:p></o:p></pre>
<pre> drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c | 31 +++++++++++-----------<o:p></o:p></pre>
<pre> drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c | 27 +++++++++----------<o:p></o:p></pre>
<pre> 8 files changed, 112 insertions(+), 120 deletions(-)<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c<o:p></o:p></pre>
<pre>index 9255bcfc6c3d..27e0f206c9dd 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c<o:p></o:p></pre>
<pre>@@ -1964,7 +1964,8 @@ static void vcn_v1_0_print_ip_state(struct amdgpu_ip_block *ip_block, struct drm<o:p></o:p></pre>
<pre> static void vcn_v1_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct amdgpu_device *adev = ip_block->adev;<o:p></o:p></pre>
<pre>- int i, j;<o:p></o:p></pre>
<pre>+ int inst = ip_block->instance;<o:p></o:p></pre>
<pre>+ int j;<o:p></o:p></pre>
<pre> bool is_powered;<o:p></o:p></pre>
<pre> uint32_t inst_off;<o:p></o:p></pre>
<pre> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_1_0);<o:p></o:p></pre>
<pre>@@ -1972,21 +1973,19 @@ static void vcn_v1_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> if (!adev->vcn.ip_dump)<o:p></o:p></pre>
<pre> return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- for (i = 0; i < adev->vcn.num_vcn_inst; i++) {<o:p></o:p></pre>
<pre>- if (adev->vcn.harvest_config & (1 << i))<o:p></o:p></pre>
<pre>- continue;<o:p></o:p></pre>
<pre>+ if (adev->vcn.harvest_config & (1 << inst))<o:p></o:p></pre>
<pre>+ return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- inst_off = i * reg_count;<o:p></o:p></pre>
<pre>- /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, i, mmUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>- is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>- UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>+ inst_off = inst * reg_count;<o:p></o:p></pre>
<pre>+ /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, inst, mmUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>+ is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>+ UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- if (is_powered)<o:p></o:p></pre>
<pre>- for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>- RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_1_0[j], i));<o:p></o:p></pre>
<pre>- }<o:p></o:p></pre>
<pre>+ if (is_powered)<o:p></o:p></pre>
<pre>+ for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>+ RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_1_0[j], inst));<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c<o:p></o:p></pre>
<pre>index 94f000ed4895..665b749c5ac0 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c<o:p></o:p></pre>
<pre>@@ -2072,7 +2072,8 @@ static void vcn_v2_0_print_ip_state(struct amdgpu_ip_block *ip_block, struct drm<o:p></o:p></pre>
<pre> static void vcn_v2_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct amdgpu_device *adev = ip_block->adev;<o:p></o:p></pre>
<pre>- int i, j;<o:p></o:p></pre>
<pre>+ int inst = ip_block->instance;<o:p></o:p></pre>
<pre>+ int j;<o:p></o:p></pre>
<pre> bool is_powered;<o:p></o:p></pre>
<pre> uint32_t inst_off;<o:p></o:p></pre>
<pre> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_2_0);<o:p></o:p></pre>
<pre>@@ -2080,21 +2081,19 @@ static void vcn_v2_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> if (!adev->vcn.ip_dump)<o:p></o:p></pre>
<pre> return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- for (i = 0; i < adev->vcn.num_vcn_inst; i++) {<o:p></o:p></pre>
<pre>- if (adev->vcn.harvest_config & (1 << i))<o:p></o:p></pre>
<pre>- continue;<o:p></o:p></pre>
<pre>+ if (adev->vcn.harvest_config & (1 << inst))<o:p></o:p></pre>
<pre>+ return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- inst_off = i * reg_count;<o:p></o:p></pre>
<pre>- /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, i, mmUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>- is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>- UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>+ inst_off = inst * reg_count;<o:p></o:p></pre>
<pre>+ /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, inst, mmUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>+ is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>+ UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- if (is_powered)<o:p></o:p></pre>
<pre>- for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>- RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_2_0[j], i));<o:p></o:p></pre>
<pre>- }<o:p></o:p></pre>
<pre>+ if (is_powered)<o:p></o:p></pre>
<pre>+ for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>+ RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_2_0[j], inst));<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static const struct amd_ip_funcs vcn_v2_0_ip_funcs = {<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c<o:p></o:p></pre>
<pre>index 7c9a0169215e..5332b2903ce1 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c<o:p></o:p></pre>
<pre>@@ -1946,7 +1946,8 @@ static void vcn_v2_5_print_ip_state(struct amdgpu_ip_block *ip_block, struct drm<o:p></o:p></pre>
<pre> static void vcn_v2_5_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct amdgpu_device *adev = ip_block->adev;<o:p></o:p></pre>
<pre>- int i, j;<o:p></o:p></pre>
<pre>+ int inst = ip_block->instance;<o:p></o:p></pre>
<pre>+ int j;<o:p></o:p></pre>
<pre> bool is_powered;<o:p></o:p></pre>
<pre> uint32_t inst_off;<o:p></o:p></pre>
<pre> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_2_5);<o:p></o:p></pre>
<pre>@@ -1954,21 +1955,19 @@ static void vcn_v2_5_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> if (!adev->vcn.ip_dump)<o:p></o:p></pre>
<pre> return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- for (i = 0; i < adev->vcn.num_vcn_inst; i++) {<o:p></o:p></pre>
<pre>- if (adev->vcn.harvest_config & (1 << i))<o:p></o:p></pre>
<pre>- continue;<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal">Since this for loop is removed which dump for each instances,clear my understanding here, there are multiple ip_blocks for vcn now and ip_block->instance is 0, 1, 2, 3 etc representing one instance ?<br>
Assuming the use case of 2 instances so first time when vcn_v2_5_dump_ip_state is called it will comes with ip_block->instance = 0 and then 1 and 2 in sequence as we are dumping that information in loop and storing in coredump in that sequence only.
<br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>+ if (adev->vcn.harvest_config & (1 << inst))<o:p></o:p></pre>
<pre>+ return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- inst_off = i * reg_count;<o:p></o:p></pre>
<pre>- /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, i, mmUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>- is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>- UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>+ inst_off = inst * reg_count;<o:p></o:p></pre>
<pre>+ /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, inst, mmUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>+ is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>+ UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- if (is_powered)<o:p></o:p></pre>
<pre>- for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>- RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_2_5[j], i));<o:p></o:p></pre>
<pre>- }<o:p></o:p></pre>
<pre>+ if (is_powered)<o:p></o:p></pre>
<pre>+ for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>+ RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_2_5[j], inst));<o:p></o:p></pre>
<pre> Storage we have linear to accomodate each vcn instance. So we need to make sure that when dump is called for instance sequentially we are adding values in vcn.ip_dump in same order so print should give right value else there could be a mismatch based on existing logic. Please try to cause a dump and hack around the code so is_powered is bypassed and we dump the values for each instance thats the only way to see if its working fine.<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal">By looking at the code it seems it should work but there are some vcn variable which i am not so sure in new design. Also patch for dump should come first and then print to reverse the order of 28 and 29 patch.<br>
But testing is needed to make sure its working fine.<br>
Regards<br>
Sunil khatri<br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static const struct amd_ip_funcs vcn_v2_5_ip_funcs = {<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c<o:p></o:p></pre>
<pre>index 061c958700d8..40a3d29d4e71 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c<o:p></o:p></pre>
<pre>@@ -2269,7 +2269,8 @@ static void vcn_v3_0_print_ip_state(struct amdgpu_ip_block *ip_block, struct drm<o:p></o:p></pre>
<pre> static void vcn_v3_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct amdgpu_device *adev = ip_block->adev;<o:p></o:p></pre>
<pre>- int i, j;<o:p></o:p></pre>
<pre>+ int inst = ip_block->instance;<o:p></o:p></pre>
<pre>+ int j;<o:p></o:p></pre>
<pre> bool is_powered;<o:p></o:p></pre>
<pre> uint32_t inst_off;<o:p></o:p></pre>
<pre> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_3_0);<o:p></o:p></pre>
<pre>@@ -2277,21 +2278,19 @@ static void vcn_v3_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> if (!adev->vcn.ip_dump)<o:p></o:p></pre>
<pre> return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- for (i = 0; i < adev->vcn.num_vcn_inst; i++) {<o:p></o:p></pre>
<pre>- if (adev->vcn.harvest_config & (1 << i))<o:p></o:p></pre>
<pre>- continue;<o:p></o:p></pre>
<pre>+ if (adev->vcn.harvest_config & (1 << inst))<o:p></o:p></pre>
<pre>+ return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- inst_off = i * reg_count;<o:p></o:p></pre>
<pre>- /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, i, mmUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>- is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>- UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>+ inst_off = inst * reg_count;<o:p></o:p></pre>
<pre>+ /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, inst, mmUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>+ is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>+ UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- if (is_powered)<o:p></o:p></pre>
<pre>- for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>- RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_3_0[j], i));<o:p></o:p></pre>
<pre>- }<o:p></o:p></pre>
<pre>+ if (is_powered)<o:p></o:p></pre>
<pre>+ for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>+ RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_3_0[j], inst));<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static const struct amd_ip_funcs vcn_v3_0_ip_funcs = {<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c<o:p></o:p></pre>
<pre>index fdf346bf3e34..3b2f4f1e0939 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c<o:p></o:p></pre>
<pre>@@ -2177,7 +2177,8 @@ static void vcn_v4_0_print_ip_state(struct amdgpu_ip_block *ip_block, struct drm<o:p></o:p></pre>
<pre> static void vcn_v4_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct amdgpu_device *adev = ip_block->adev;<o:p></o:p></pre>
<pre>- int i, j;<o:p></o:p></pre>
<pre>+ int inst = ip_block->instance;<o:p></o:p></pre>
<pre>+ int j;<o:p></o:p></pre>
<pre> bool is_powered;<o:p></o:p></pre>
<pre> uint32_t inst_off;<o:p></o:p></pre>
<pre> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_4_0);<o:p></o:p></pre>
<pre>@@ -2185,22 +2186,20 @@ static void vcn_v4_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> if (!adev->vcn.ip_dump)<o:p></o:p></pre>
<pre> return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- for (i = 0; i < adev->vcn.num_vcn_inst; i++) {<o:p></o:p></pre>
<pre>- if (adev->vcn.harvest_config & (1 << i))<o:p></o:p></pre>
<pre>- continue;<o:p></o:p></pre>
<pre>+ if (adev->vcn.harvest_config & (1 << inst))<o:p></o:p></pre>
<pre>+ return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- inst_off = i * reg_count;<o:p></o:p></pre>
<pre>- /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, i, regUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>- is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>- UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>-<o:p></o:p></pre>
<pre>- if (is_powered)<o:p></o:p></pre>
<pre>- for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>- RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_4_0[j],<o:p></o:p></pre>
<pre>- i));<o:p></o:p></pre>
<pre>- }<o:p></o:p></pre>
<pre>+ inst_off = inst * reg_count;<o:p></o:p></pre>
<pre>+ /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, inst, regUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>+ is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>+ UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ if (is_powered)<o:p></o:p></pre>
<pre>+ for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>+ RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_4_0[j],<o:p></o:p></pre>
<pre>+ inst));<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static const struct amd_ip_funcs vcn_v4_0_ip_funcs = {<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c<o:p></o:p></pre>
<pre>index daaf2fb6b3e5..be03d31cb206 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c<o:p></o:p></pre>
<pre>@@ -1757,7 +1757,8 @@ static void vcn_v4_0_3_print_ip_state(struct amdgpu_ip_block *ip_block, struct d<o:p></o:p></pre>
<pre> static void vcn_v4_0_3_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct amdgpu_device *adev = ip_block->adev;<o:p></o:p></pre>
<pre>- int i, j;<o:p></o:p></pre>
<pre>+ int inst = ip_block->instance;<o:p></o:p></pre>
<pre>+ int j;<o:p></o:p></pre>
<pre> bool is_powered;<o:p></o:p></pre>
<pre> uint32_t inst_off, inst_id;<o:p></o:p></pre>
<pre> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_4_0_3);<o:p></o:p></pre>
<pre>@@ -1765,23 +1766,21 @@ static void vcn_v4_0_3_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> if (!adev->vcn.ip_dump)<o:p></o:p></pre>
<pre> return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- for (i = 0; i < adev->vcn.num_vcn_inst; i++) {<o:p></o:p></pre>
<pre>- if (adev->vcn.harvest_config & (1 << i))<o:p></o:p></pre>
<pre>- continue;<o:p></o:p></pre>
<pre>-<o:p></o:p></pre>
<pre>- inst_id = GET_INST(VCN, i);<o:p></o:p></pre>
<pre>- inst_off = i * reg_count;<o:p></o:p></pre>
<pre>- /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, inst_id, regUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>- is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>- UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>-<o:p></o:p></pre>
<pre>- if (is_powered)<o:p></o:p></pre>
<pre>- for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>- RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_4_0_3[j],<o:p></o:p></pre>
<pre>- inst_id));<o:p></o:p></pre>
<pre>- }<o:p></o:p></pre>
<pre>+ if (adev->vcn.harvest_config & (1 << inst))<o:p></o:p></pre>
<pre>+ return;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ inst_id = GET_INST(VCN, inst);<o:p></o:p></pre>
<pre>+ inst_off = inst * reg_count;<o:p></o:p></pre>
<pre>+ /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, inst_id, regUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>+ is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>+ UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ if (is_powered)<o:p></o:p></pre>
<pre>+ for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>+ RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_4_0_3[j],<o:p></o:p></pre>
<pre>+ inst_id));<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static const struct amd_ip_funcs vcn_v4_0_3_ip_funcs = {<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c<o:p></o:p></pre>
<pre>index ff8db22b9614..43b1f3d06157 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c<o:p></o:p></pre>
<pre>@@ -1638,7 +1638,8 @@ static void vcn_v4_0_5_print_ip_state(struct amdgpu_ip_block *ip_block, struct d<o:p></o:p></pre>
<pre> static void vcn_v4_0_5_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct amdgpu_device *adev = ip_block->adev;<o:p></o:p></pre>
<pre>- int i, j;<o:p></o:p></pre>
<pre>+ int inst = ip_block->instance;<o:p></o:p></pre>
<pre>+ int j;<o:p></o:p></pre>
<pre> bool is_powered;<o:p></o:p></pre>
<pre> uint32_t inst_off;<o:p></o:p></pre>
<pre> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_4_0_5);<o:p></o:p></pre>
<pre>@@ -1646,22 +1647,20 @@ static void vcn_v4_0_5_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> if (!adev->vcn.ip_dump)<o:p></o:p></pre>
<pre> return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- for (i = 0; i < adev->vcn.num_vcn_inst; i++) {<o:p></o:p></pre>
<pre>- if (adev->vcn.harvest_config & (1 << i))<o:p></o:p></pre>
<pre>- continue;<o:p></o:p></pre>
<pre>+ if (adev->vcn.harvest_config & (1 << inst))<o:p></o:p></pre>
<pre>+ return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- inst_off = i * reg_count;<o:p></o:p></pre>
<pre>- /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, i, regUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>- is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>- UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>-<o:p></o:p></pre>
<pre>- if (is_powered)<o:p></o:p></pre>
<pre>- for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>- RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_4_0_5[j],<o:p></o:p></pre>
<pre>- i));<o:p></o:p></pre>
<pre>- }<o:p></o:p></pre>
<pre>+ inst_off = inst * reg_count;<o:p></o:p></pre>
<pre>+ /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, inst, regUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>+ is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>+ UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+ if (is_powered)<o:p></o:p></pre>
<pre>+ for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>+ RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_4_0_5[j],<o:p></o:p></pre>
<pre>+ inst));<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static const struct amd_ip_funcs vcn_v4_0_5_ip_funcs = {<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c<o:p></o:p></pre>
<pre>index c83a5c09f410..65554c4e86cd 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c<o:p></o:p></pre>
<pre>@@ -1365,7 +1365,8 @@ static void vcn_v5_0_print_ip_state(struct amdgpu_ip_block *ip_block, struct drm<o:p></o:p></pre>
<pre> static void vcn_v5_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> {<o:p></o:p></pre>
<pre> struct amdgpu_device *adev = ip_block->adev;<o:p></o:p></pre>
<pre>- int i, j;<o:p></o:p></pre>
<pre>+ int inst = ip_block->instance;<o:p></o:p></pre>
<pre>+ int j;<o:p></o:p></pre>
<pre> bool is_powered;<o:p></o:p></pre>
<pre> uint32_t inst_off;<o:p></o:p></pre>
<pre> uint32_t reg_count = ARRAY_SIZE(vcn_reg_list_5_0);<o:p></o:p></pre>
<pre>@@ -1373,21 +1374,19 @@ static void vcn_v5_0_dump_ip_state(struct amdgpu_ip_block *ip_block)<o:p></o:p></pre>
<pre> if (!adev->vcn.ip_dump)<o:p></o:p></pre>
<pre> return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- for (i = 0; i < adev->vcn.num_vcn_inst; i++) {<o:p></o:p></pre>
<pre>- if (adev->vcn.harvest_config & (1 << i))<o:p></o:p></pre>
<pre>- continue;<o:p></o:p></pre>
<pre>+ if (adev->vcn.harvest_config & (1 << inst))<o:p></o:p></pre>
<pre>+ return;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- inst_off = i * reg_count;<o:p></o:p></pre>
<pre>- /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, i, regUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>- is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>- UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre>+ inst_off = inst * reg_count;<o:p></o:p></pre>
<pre>+ /* mmUVD_POWER_STATUS is always readable and is first element of the array */<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off] = RREG32_SOC15(VCN, inst, regUVD_POWER_STATUS);<o:p></o:p></pre>
<pre>+ is_powered = (adev->vcn.ip_dump[inst_off] &<o:p></o:p></pre>
<pre>+ UVD_POWER_STATUS__UVD_POWER_STATUS_MASK) != 1;<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>- if (is_powered)<o:p></o:p></pre>
<pre>- for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>- adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>- RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_5_0[j], i));<o:p></o:p></pre>
<pre>- }<o:p></o:p></pre>
<pre>+ if (is_powered)<o:p></o:p></pre>
<pre>+ for (j = 1; j < reg_count; j++)<o:p></o:p></pre>
<pre>+ adev->vcn.ip_dump[inst_off + j] =<o:p></o:p></pre>
<pre>+ RREG32(SOC15_REG_ENTRY_OFFSET_INST(vcn_reg_list_5_0[j], inst));<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> static const struct amd_ip_funcs vcn_v5_0_0_ip_funcs = {<o:p></o:p></pre>
</blockquote>
</div>
</div>
</body>
</html>