<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=iso-2022-jp">
<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:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"MS PGothic";
        panose-1:2 11 6 0 7 2 5 8 2 4;}
@font-face
        {font-family:"\@MS PGothic";}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"MS PGothic",sans-serif;
        mso-fareast-language:JA;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:JA;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
p.msipheader251902e5, li.msipheader251902e5, div.msipheader251902e5
        {mso-style-name:msipheader251902e5;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"MS PGothic",sans-serif;
        mso-fareast-language:JA;}
span.EmailStyle22
        {mso-style-type:personal-compose;
        font-family:"Arial",sans-serif;
        color:#317100;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@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 lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="msipheader251902e5" style="margin:0in;margin-bottom:.0001pt"><span style="font-size:10.0pt;font-family:"Arial",sans-serif;color:#317100">[AMD Public Use]</span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoPlainText">Hi Tao,<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Thanks for your suggestion and reply inline.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Regards,<o:p></o:p></p>
<p class="MsoPlainText">Stanley<o:p></o:p></p>
<p class="MsoPlainText">> -----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">> From: Zhou1, Tao <Tao.Zhou1@amd.com><o:p></o:p></p>
<p class="MsoPlainText">> Sent: Friday, June 5, 2020 11:00 AM<o:p></o:p></p>
<p class="MsoPlainText">> To: Yang, Stanley <Stanley.Yang@amd.com>; amd-gfx@lists.freedesktop.org<o:p></o:p></p>
<p class="MsoPlainText">> Cc: Zhang, Hawking <Hawking.Zhang@amd.com>; Chen, Guchun<o:p></o:p></p>
<p class="MsoPlainText">> <Guchun.Chen@amd.com>; Liu, Monk <Monk.Liu@amd.com>; Clements,<o:p></o:p></p>
<p class="MsoPlainText">> John <John.Clements@amd.com>; Li, Dennis <Dennis.Li@amd.com>; Yang,<o:p></o:p></p>
<p class="MsoPlainText">> Stanley <Stanley.Yang@amd.com><o:p></o:p></p>
<p class="MsoPlainText">> Subject: RE: [PATCH V2] drm/amdgpu: support reserve bad page for virt<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> [AMD Public Use]<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > -----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">> > From: Stanley.Yang <Stanley.Yang@amd.com><o:p></o:p></p>
<p class="MsoPlainText">> > Sent: 2020<span lang="ZH-CN" style="font-family:DengXian;mso-fareast-language:ZH-CN">年</span>6<span lang="ZH-CN" style="font-family:DengXian;mso-fareast-language:ZH-CN">月</span>4<span lang="ZH-CN" style="font-family:DengXian;mso-fareast-language:ZH-CN">日</span>
 20:36<o:p></o:p></p>
<p class="MsoPlainText">> > To: amd-gfx@lists.freedesktop.org<o:p></o:p></p>
<p class="MsoPlainText">> > Cc: Zhang, Hawking <Hawking.Zhang@amd.com>; Chen, Guchun<o:p></o:p></p>
<p class="MsoPlainText">> > <Guchun.Chen@amd.com>; Liu, Monk <Monk.Liu@amd.com>; Clements,<o:p></o:p></p>
<p class="MsoPlainText">> John<o:p></o:p></p>
<p class="MsoPlainText">> > <John.Clements@amd.com>; Zhou1, Tao <Tao.Zhou1@amd.com>; Li,<o:p></o:p></p>
<p class="MsoPlainText">> Dennis<o:p></o:p></p>
<p class="MsoPlainText">> > <Dennis.Li@amd.com>; Yang, Stanley <Stanley.Yang@amd.com><o:p></o:p></p>
<p class="MsoPlainText">> > Subject: [PATCH V2] drm/amdgpu: support reserve bad page for virt<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > Changed from V1:<o:p></o:p></p>
<p class="MsoPlainText">> >         rename same functions name, only init ras error handler data for<o:p></o:p></p>
<p class="MsoPlainText">> >         supported asic.<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > Signed-off-by: Stanley.Yang <Stanley.Yang@amd.com><o:p></o:p></p>
<p class="MsoPlainText">> > Change-Id: Ia0ad9453ac3ac929f95c73cbee5b7a8fc42a9816<o:p></o:p></p>
<p class="MsoPlainText">> > ---<o:p></o:p></p>
<p class="MsoPlainText">> >  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |   3 +<o:p></o:p></p>
<p class="MsoPlainText">> >  drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c   | 172<o:p></o:p></p>
<p class="MsoPlainText">> > +++++++++++++++++++++<o:p></o:p></p>
<p class="MsoPlainText">> >  drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h   |  30 +++-<o:p></o:p></p>
<p class="MsoPlainText">> >  3 files changed, 201 insertions(+), 4 deletions(-)<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<o:p></o:p></p>
<p class="MsoPlainText">> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<o:p></o:p></p>
<p class="MsoPlainText">> > index 1df28b7bf22e..668ad0e35160 100644<o:p></o:p></p>
<p class="MsoPlainText">> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<o:p></o:p></p>
<p class="MsoPlainText">> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c<o:p></o:p></p>
<p class="MsoPlainText">> > @@ -2326,6 +2326,9 @@ static int amdgpu_device_ip_fini(struct<o:p></o:p></p>
<p class="MsoPlainText">> > amdgpu_device *adev)  {<o:p></o:p></p>
<p class="MsoPlainText">> >         int i, r;<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > +      if (amdgpu_sriov_vf(adev) && adev->virt.ras_init_done)<o:p></o:p></p>
<p class="MsoPlainText">> > +                    amdgpu_virt_release_ras_err_handler_data(adev);<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> >         amdgpu_ras_pre_fini(adev);<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> >         if (adev->gmc.xgmi.num_physical_nodes > 1) diff --git<o:p></o:p></p>
<p class="MsoPlainText">> > a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c<o:p></o:p></p>
<p class="MsoPlainText">> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c<o:p></o:p></p>
<p class="MsoPlainText">> > index bab9286021a7..174fcb8c8b57 100644<o:p></o:p></p>
<p class="MsoPlainText">> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c<o:p></o:p></p>
<p class="MsoPlainText">> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c<o:p></o:p></p>
<p class="MsoPlainText">> > @@ -26,6 +26,7 @@<o:p></o:p></p>
<p class="MsoPlainText">> >  #include <drm/drm_drv.h><o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> >  #include "amdgpu.h"<o:p></o:p></p>
<p class="MsoPlainText">> > +#include "amdgpu_ras.h"<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> >  bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev)  { @@ -<o:p></o:p></p>
<p class="MsoPlainText">> > 255,12 +256,169 @@ int amdgpu_virt_fw_reserve_get_checksum(void<o:p></o:p></p>
<p class="MsoPlainText">> *obj,<o:p></o:p></p>
<p class="MsoPlainText">> >         return ret;<o:p></o:p></p>
<p class="MsoPlainText">> >  }<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > +static int amdgpu_virt_init_ras_err_handler_data(struct amdgpu_device<o:p></o:p></p>
<p class="MsoPlainText">> > +*adev) {<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt *virt = &adev->virt;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt_ras_err_handler_data **data = &virt-<o:p></o:p></p>
<p class="MsoPlainText">> > >virt_eh_data;<o:p></o:p></p>
<p class="MsoPlainText">> > +      /* GPU will be marked bad on host if bp count more then 10,<o:p></o:p></p>
<p class="MsoPlainText">> > +      * so alloc 512 is enough.<o:p></o:p></p>
<p class="MsoPlainText">> > +      */<o:p></o:p></p>
<p class="MsoPlainText">> > +      unsigned int align_space = 512;<o:p></o:p></p>
<p class="MsoPlainText">> > +      void *bps = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_bo **bps_bo = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      *data = kmalloc(sizeof(struct amdgpu_virt_ras_err_handler_data),<o:p></o:p></p>
<p class="MsoPlainText">> > GFP_KERNEL);<o:p></o:p></p>
<p class="MsoPlainText">> > +      if (!*data)<o:p></o:p></p>
<p class="MsoPlainText">> > +                    return -ENOMEM;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      bps = kmalloc(align_space * sizeof((*data)->bps), GFP_KERNEL);<o:p></o:p></p>
<p class="MsoPlainText">> > +      bps_bo = kmalloc(align_space * sizeof((*data)->bps_bo),<o:p></o:p></p>
<p class="MsoPlainText">> > GFP_KERNEL);<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      if (!bps || !bps_bo) {<o:p></o:p></p>
<p class="MsoPlainText">> > +                    kfree(bps);<o:p></o:p></p>
<p class="MsoPlainText">> > +                    kfree(bps_bo);<o:p></o:p></p>
<p class="MsoPlainText">> > +                    return -ENOMEM;<o:p></o:p></p>
<p class="MsoPlainText">> > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      (*data)->bps = bps;<o:p></o:p></p>
<p class="MsoPlainText">> > +      (*data)->bps_bo = bps_bo;<o:p></o:p></p>
<p class="MsoPlainText">> > +      (*data)->count = 0;<o:p></o:p></p>
<p class="MsoPlainText">> > +      (*data)->last_reserved = 0;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      virt->ras_init_done = true;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      return 0;<o:p></o:p></p>
<p class="MsoPlainText">> > +}<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +static void amdgpu_virt_ras_release_bp(struct amdgpu_device *adev) {<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt *virt = &adev->virt;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt_ras_err_handler_data *data = virt->virt_eh_data;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_bo *bo;<o:p></o:p></p>
<p class="MsoPlainText">> > +      int i;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      if (!data)<o:p></o:p></p>
<p class="MsoPlainText">> > +                    return;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      for (i = data->last_reserved - 1; i >= 0; i--) {<o:p></o:p></p>
<p class="MsoPlainText">> > +                    bo = data->bps_bo[i];<o:p></o:p></p>
<p class="MsoPlainText">> > +                    amdgpu_bo_free_kernel(&bo, NULL, NULL);<o:p></o:p></p>
<p class="MsoPlainText">> > +                    data->bps_bo[i] = bo;<o:p></o:p></p>
<p class="MsoPlainText">> > +                    data->last_reserved = i;<o:p></o:p></p>
<p class="MsoPlainText">> > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > +}<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +void amdgpu_virt_release_ras_err_handler_data(struct amdgpu_device<o:p></o:p></p>
<p class="MsoPlainText">> > +*adev) {<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt *virt = &adev->virt;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt_ras_err_handler_data *data = virt->virt_eh_data;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      virt->ras_init_done = false;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      if (!data)<o:p></o:p></p>
<p class="MsoPlainText">> > +                    return;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      amdgpu_virt_ras_release_bp(adev);<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      kfree(data->bps);<o:p></o:p></p>
<p class="MsoPlainText">> > +      kfree(data->bps_bo);<o:p></o:p></p>
<p class="MsoPlainText">> > +      kfree(data);<o:p></o:p></p>
<p class="MsoPlainText">> > +      virt->virt_eh_data = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > +}<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +static void amdgpu_virt_ras_add_bps(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoPlainText">> > +                    struct eeprom_table_record *bps, int pages) {<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt *virt = &adev->virt;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt_ras_err_handler_data *data = virt->virt_eh_data;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      if (!data)<o:p></o:p></p>
<p class="MsoPlainText">> > +                    return;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      memcpy(&data->bps[data->count], bps, pages * sizeof(*data->bps));<o:p></o:p></p>
<p class="MsoPlainText">> > +      data->count += pages;<o:p></o:p></p>
<p class="MsoPlainText">> > +}<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +static void amdgpu_virt_ras_reserve_bps(struct amdgpu_device *adev) {<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt *virt = &adev->virt;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt_ras_err_handler_data *data = virt->virt_eh_data;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_bo *bo = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint64_t bp;<o:p></o:p></p>
<p class="MsoPlainText">> > +      int i;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      if (!data)<o:p></o:p></p>
<p class="MsoPlainText">> > +                    return;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      for (i = data->last_reserved; i < data->count; i++) {<o:p></o:p></p>
<p class="MsoPlainText">> > +                    bp = data->bps[i].retired_page;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +                    /* There are two cases of reserve error should be ignored:<o:p></o:p></p>
<p class="MsoPlainText">> > +                    * 1) a ras bad page has been allocated (used by someone);<o:p></o:p></p>
<p class="MsoPlainText">> > +                    * 2) a ras bad page has been reserved (duplicate error<o:p></o:p></p>
<p class="MsoPlainText">> > injection<o:p></o:p></p>
<p class="MsoPlainText">> > +                    *    for one page);<o:p></o:p></p>
<p class="MsoPlainText">> > +                    */<o:p></o:p></p>
<p class="MsoPlainText">> > +                    if (amdgpu_bo_create_kernel_at(adev, bp <<<o:p></o:p></p>
<p class="MsoPlainText">> > AMDGPU_GPU_PAGE_SHIFT,<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                                      AMDGPU_GPU_PAGE_SIZE,<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                                      AMDGPU_GEM_DOMAIN_VRAM,<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                                      &bo, NULL))<o:p></o:p></p>
<p class="MsoPlainText">> > +                                   DRM_DEBUG("RAS WARN: [SRV-IO] reserve vram for<o:p></o:p></p>
<p class="MsoPlainText">> > retired page %llx<o:p></o:p></p>
<p class="MsoPlainText">> > +fail\n", bp);<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> [Tao] SRIOV? Typo?<o:p></o:p></p>
<p class="MsoPlainText">[Yang, Stanley] :<o:p></o:p></p>
<p class="MsoPlainText">Will keep the same message with bare-metal according to <a id="OWAAM41939817802A441C8E6A57C990A966F1" href="mailto:Hawking.Zhang@amd.com">
<span style="font-family:"Calibri",sans-serif;text-decoration:none">@Zhang, Hawking</span></a>'s suggestion.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +                    data->bps_bo[i] = bo;<o:p></o:p></p>
<p class="MsoPlainText">> > +                    data->last_reserved = i + 1;<o:p></o:p></p>
<p class="MsoPlainText">> > +                    bo = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > +}<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +static bool amdgpu_virt_ras_check_bad_page(struct amdgpu_device<o:p></o:p></p>
<p class="MsoPlainText">> *adev,<o:p></o:p></p>
<p class="MsoPlainText">> > +                    uint64_t retired_page)<o:p></o:p></p>
<p class="MsoPlainText">> > +{<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt *virt = &adev->virt;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt_ras_err_handler_data *data = virt->virt_eh_data;<o:p></o:p></p>
<p class="MsoPlainText">> > +      int i;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      if (!data)<o:p></o:p></p>
<p class="MsoPlainText">> > +                    return true;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      for (i = 0; i < data->count; i++)<o:p></o:p></p>
<p class="MsoPlainText">> > +                    if (retired_page == data->bps[i].retired_page)<o:p></o:p></p>
<p class="MsoPlainText">> > +                                   return true;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      return false;<o:p></o:p></p>
<p class="MsoPlainText">> > +}<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +static void amdgpu_virt_add_bad_page(struct amdgpu_device *adev,<o:p></o:p></p>
<p class="MsoPlainText">> > +                    uint64_t bp_block_offset, uint32_t bp_block_size) {<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct eeprom_table_record bp;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint64_t retired_page;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t bp_idx, bp_cnt;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +      if (bp_block_size) {<o:p></o:p></p>
<p class="MsoPlainText">> > +                    bp_cnt = bp_block_size / sizeof(uint64_t);<o:p></o:p></p>
<p class="MsoPlainText">> > +                    for (bp_idx = 0; bp_idx < bp_cnt; bp_idx++) {<o:p></o:p></p>
<p class="MsoPlainText">> > +                                   retired_page = *(uint64_t *)(adev-<o:p></o:p></p>
<p class="MsoPlainText">> > >fw_vram_usage.va +<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                               bp_block_offset + bp_idx *<o:p></o:p></p>
<p class="MsoPlainText">> > sizeof(uint64_t));<o:p></o:p></p>
<p class="MsoPlainText">> > +                                   bp.retired_page = retired_page;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +                                   if (amdgpu_virt_ras_check_bad_page(adev,<o:p></o:p></p>
<p class="MsoPlainText">> > retired_page))<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                 continue;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +                                   amdgpu_virt_ras_add_bps(adev, &bp, 1);<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +                                   amdgpu_virt_ras_reserve_bps(adev);<o:p></o:p></p>
<p class="MsoPlainText">> > +                    }<o:p></o:p></p>
<p class="MsoPlainText">> > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > +}<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> >  void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)  {<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t pf2vf_size = 0;<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t checksum = 0;<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t checkval;<o:p></o:p></p>
<p class="MsoPlainText">> >         char *str;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint64_t bp_block_offset = 0;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t bp_block_size = 0;<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> >         adev->virt.fw_reserve.p_pf2vf = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> >         adev->virt.fw_reserve.p_vf2pf = NULL; @@ -275,6 +433,20 @@ void<o:p></o:p></p>
<p class="MsoPlainText">> > amdgpu_virt_init_data_exchange(struct<o:p></o:p></p>
<p class="MsoPlainText">> > amdgpu_device *adev)<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> >                       /* pf2vf message must be in 4K */<o:p></o:p></p>
<p class="MsoPlainText">> >                       if (pf2vf_size > 0 && pf2vf_size < 4096) {<o:p></o:p></p>
<p class="MsoPlainText">> > +                                   if (adev->virt.fw_reserve.p_pf2vf->version == 2) {<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                 struct amdgim_pf2vf_info_v2 *pf2vf_v2 =<o:p></o:p></p>
<p class="MsoPlainText">> > NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                 pf2vf_v2 = (struct amdgim_pf2vf_info_v2<o:p></o:p></p>
<p class="MsoPlainText">> > *)adev->virt.fw_reserve.p_pf2vf;<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                 bp_block_offset = ((uint64_t)pf2vf_v2-<o:p></o:p></p>
<p class="MsoPlainText">> > >bp_block_offset_L & 0xFFFFFFFF) |<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                                              ((((uint64_t)pf2vf_v2-<o:p></o:p></p>
<p class="MsoPlainText">> > >bp_block_offset_H) << 32) & 0xFFFFFFFF00000000);<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                 bp_block_size = pf2vf_v2->bp_block_size;<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                 if (bp_block_size && !adev-<o:p></o:p></p>
<p class="MsoPlainText">> > >virt.ras_init_done)<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> >         amdgpu_virt_init_ras_err_handler_data(adev);<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +                                                 amdgpu_virt_add_bad_page(adev,<o:p></o:p></p>
<p class="MsoPlainText">> > bp_block_offset, bp_block_size);<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> [Tao] We can add "if (adev->virt.ras_init_done)" before it to skip add bad<o:p></o:p></p>
<p class="MsoPlainText">> page handle quickly in init failed case.<o:p></o:p></p>
<p class="MsoPlainText">><o:p> </o:p></p>
<p class="MsoPlainText">[Yang, Stanley] :<o:p></o:p></p>
<p class="MsoPlainText">Yes, add this judgement is better.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > +                                   }<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> >                                      checkval = amdgpu_virt_fw_reserve_get_checksum(<o:p></o:p></p>
<p class="MsoPlainText">> >                                                    adev->virt.fw_reserve.p_pf2vf, pf2vf_size,<o:p></o:p></p>
<p class="MsoPlainText">> >                                                    adev->virt.fw_reserve.checksum_key,<o:p></o:p></p>
<p class="MsoPlainText">> > checksum); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h<o:p></o:p></p>
<p class="MsoPlainText">> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h<o:p></o:p></p>
<p class="MsoPlainText">> > index b90e822cebd7..f826945989c7 100644<o:p></o:p></p>
<p class="MsoPlainText">> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h<o:p></o:p></p>
<p class="MsoPlainText">> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h<o:p></o:p></p>
<p class="MsoPlainText">> > @@ -143,19 +143,27 @@ struct  amdgim_pf2vf_info_v2 {<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t vce_enc_max_pixels_count;<o:p></o:p></p>
<p class="MsoPlainText">> >         /* 16x16 pixels/sec, codec independent */<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t vce_enc_max_bandwidth;<o:p></o:p></p>
<p class="MsoPlainText">> > +      /* Bad pages block position in BYTE */<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t bp_block_offset_L;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t bp_block_offset_H;<o:p></o:p></p>
<p class="MsoPlainText">> > +      /* Bad pages block size in BYTE */<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t bp_block_size;<o:p></o:p></p>
<p class="MsoPlainText">> >         /* MEC FW position in kb from the start of VF visible frame buffer */<o:p></o:p></p>
<p class="MsoPlainText">> > -       uint64_t mecfw_kboffset;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t mecfw_kboffset_L;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t mecfw_kboffset_H;<o:p></o:p></p>
<p class="MsoPlainText">> >         /* MEC FW size in KB */<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t mecfw_ksize;<o:p></o:p></p>
<p class="MsoPlainText">> >         /* UVD FW position in kb from the start of VF visible frame buffer */<o:p></o:p></p>
<p class="MsoPlainText">> > -       uint64_t uvdfw_kboffset;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t uvdfw_kboffset_L;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t uvdfw_kboffset_H;<o:p></o:p></p>
<p class="MsoPlainText">> >         /* UVD FW size in KB */<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t uvdfw_ksize;<o:p></o:p></p>
<p class="MsoPlainText">> >         /* VCE FW position in kb from the start of VF visible frame buffer */<o:p></o:p></p>
<p class="MsoPlainText">> > -       uint64_t vcefw_kboffset;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t vcefw_kboffset_L;<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t vcefw_kboffset_H;<o:p></o:p></p>
<p class="MsoPlainText">> >         /* VCE FW size in KB */<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t vcefw_ksize;<o:p></o:p></p>
<p class="MsoPlainText">> > -       uint32_t reserved[AMDGIM_GET_STRUCTURE_RESERVED_SIZE(256,<o:p></o:p></p>
<p class="MsoPlainText">> 0,<o:p></o:p></p>
<p class="MsoPlainText">> > 0, (9 + sizeof(struct<o:p></o:p></p>
<p class="MsoPlainText">> > amd_sriov_msg_pf2vf_info_header)/sizeof(uint32_t)), 3)];<o:p></o:p></p>
<p class="MsoPlainText">> > +      uint32_t reserved[AMDGIM_GET_STRUCTURE_RESERVED_SIZE(256,<o:p></o:p></p>
<p class="MsoPlainText">> 0,<o:p></o:p></p>
<p class="MsoPlainText">> > 0, (18 +<o:p></o:p></p>
<p class="MsoPlainText">> > +sizeof(struct amd_sriov_msg_pf2vf_info_header)/sizeof(uint32_t)),<o:p></o:p></p>
<p class="MsoPlainText">> > +0)];<o:p></o:p></p>
<p class="MsoPlainText">> >  } __aligned(4);<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > @@ -254,6 +262,17 @@ typedef struct amdgim_vf2pf_info_v2<o:p></o:p></p>
<p class="MsoPlainText">> > amdgim_vf2pf_info ;<o:p></o:p></p>
<p class="MsoPlainText">> >                       } \<o:p></o:p></p>
<p class="MsoPlainText">> >         } while (0)<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > +struct amdgpu_virt_ras_err_handler_data {<o:p></o:p></p>
<p class="MsoPlainText">> > +      /* point to bad page records array */<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct eeprom_table_record *bps;<o:p></o:p></p>
<p class="MsoPlainText">> > +      /* point to reserved bo array */<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_bo **bps_bo;<o:p></o:p></p>
<p class="MsoPlainText">> > +      /* the count of entries */<o:p></o:p></p>
<p class="MsoPlainText">> > +      int count;<o:p></o:p></p>
<p class="MsoPlainText">> > +      /* last reserved entry's index + 1 */<o:p></o:p></p>
<p class="MsoPlainText">> > +      int last_reserved;<o:p></o:p></p>
<p class="MsoPlainText">> > +};<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> >  /* GPU virtualization */<o:p></o:p></p>
<p class="MsoPlainText">> >  struct amdgpu_virt {<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t                                          caps;<o:p></o:p></p>
<p class="MsoPlainText">> > @@ -272,6 +291,8 @@ struct amdgpu_virt {<o:p></o:p></p>
<p class="MsoPlainText">> >         uint32_t reg_access_mode;<o:p></o:p></p>
<p class="MsoPlainText">> >         int req_init_data_ver;<o:p></o:p></p>
<p class="MsoPlainText">> >         bool tdr_debug;<o:p></o:p></p>
<p class="MsoPlainText">> > +      struct amdgpu_virt_ras_err_handler_data *virt_eh_data;<o:p></o:p></p>
<p class="MsoPlainText">> > +      bool ras_init_done;<o:p></o:p></p>
<p class="MsoPlainText">> >  };<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> >  #define amdgpu_sriov_enabled(adev) \<o:p></o:p></p>
<p class="MsoPlainText">> > @@ -323,6 +344,7 @@ void amdgpu_virt_free_mm_table(struct<o:p></o:p></p>
<p class="MsoPlainText">> > amdgpu_device *adev);  int amdgpu_virt_fw_reserve_get_checksum(void<o:p></o:p></p>
<p class="MsoPlainText">> > *obj, unsigned long obj_size,<o:p></o:p></p>
<p class="MsoPlainText">> >                                                                   unsigned int key,<o:p></o:p></p>
<p class="MsoPlainText">> >                                                                   unsigned int chksum);<o:p></o:p></p>
<p class="MsoPlainText">> > +void amdgpu_virt_release_ras_err_handler_data(struct amdgpu_device<o:p></o:p></p>
<p class="MsoPlainText">> > +*adev);<o:p></o:p></p>
<p class="MsoPlainText">> >  void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev);<o:p></o:p></p>
<p class="MsoPlainText">> > void amdgpu_detect_virtualization(struct amdgpu_device *adev);<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > --<o:p></o:p></p>
<p class="MsoPlainText">> > 2.17.1<o:p></o:p></p>
</div>
</body>
</html>