<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#ffffff">
    <p>Hello Boyuan</p>
    <p>It probably wont work fine as memory allocated for core dump also
      needs to change based on ip design where not we have an ip_block
      for each instance too. <br>
      <br>
      So here is what i think and let me know if that sounds fine with
      you. Once you get the review complete for patches #1 - #27 get
      them merged and on that code base i will rework the changes needs
      for core dump for vcn and then you could get rest of your changes
      reviewed and merged.<br>
      <br>
      Also i am assuming there is no dependency of patches if they are
      in order and build independently so you can leave the ipdump
      patches #28 and #29 and let the review process complete. I need to
      change them according to new design and validate too.<br>
      <br>
      Ignore the review on these two patches till then :)<br>
    </p>
    <p>Regards<br>
      Sunil Khatri <br>
    </p>
    <div class="moz-cite-prefix">On 10/22/2024 2:29 PM, Khatri, Sunil
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:BL1PR12MB5753DC49036662D60E1234CE934C2@BL1PR12MB5753.namprd12.prod.outlook.com">
      
      <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;}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]-->
      <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 <a class="moz-txt-link-rfc2396E" href="mailto:amd-gfx-bounces@lists.freedesktop.org"><amd-gfx-bounces@lists.freedesktop.org></a>
                  <b>On Behalf Of </b>Khatri, Sunil<br>
                  <b>Sent:</b> Tuesday, October 22, 2024 2:27 PM<br>
                  <b>To:</b> Zhang, Boyuan <a class="moz-txt-link-rfc2396E" href="mailto:Boyuan.Zhang@amd.com"><Boyuan.Zhang@amd.com></a>;
                  <a class="moz-txt-link-abbreviated" href="mailto:amd-gfx@lists.freedesktop.org">amd-gfx@lists.freedesktop.org</a>; Liu, Leo
                  <a class="moz-txt-link-rfc2396E" href="mailto:Leo.Liu@amd.com"><Leo.Liu@amd.com></a>; Koenig, Christian
                  <a class="moz-txt-link-rfc2396E" href="mailto:Christian.Koenig@amd.com"><Christian.Koenig@amd.com></a>; Deucher, Alexander
                  <a class="moz-txt-link-rfc2396E" href="mailto:Alexander.Deucher@amd.com"><Alexander.Deucher@amd.com></a><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"
              moz-do-not-send="true">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"
                moz-do-not-send="true">
                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" moz-do-not-send="true"><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" moz-do-not-send="true"><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>
    </blockquote>
  </body>
</html>