<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>