Re: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov
On 8/28/20 9:29 AM, Liu, Monk wrote: [AMD Official Use Only - Internal Distribution Only] Please don't change those code unless you have a full stress test and a solid reason (what bug fixed or what new feature introduced ) Otherwise if it's a pure personal refactor or cleanup it will be not necessary Hi Monk, The patch was to fix the previous inconsistent optimization patch. I don't have a sriov device so definitely wouldn't merge it without a tested-by tag so I added all relevant people. Regards, Nirmoy _ Monk Liu|GPU Virtualization Team |AMD -Original Message- From: Das, Nirmoy Sent: Thursday, August 27, 2020 11:19 PM To: amd-gfx@lists.freedesktop.org Cc: Deucher, Alexander ; Liu, Monk ; Gu, JiaWei (Will) ; Deng, Emily ; Das, Nirmoy Subject: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov This patch removes some unwanted code duplication and simplifies sriov's ip block reinit logic. Signed-off-by: Nirmoy Das --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 117 +++-- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 696a61cc3ac6..0db6db03bcd3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2587,77 +2587,80 @@ int amdgpu_device_ip_suspend(struct amdgpu_device *adev) return r; } -static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev) +/** amdgpu_device_is_early_ip_block_sriov - check for early ip_blocks + * + * @ip_block: ip block that need to be check + * + * Returns a tri-state value for a given ip block. + * If an ip block requires early reinit sriov then return 1 or 0 otherwise. + * Return -1 on invalid ip block. + * + */ + +static int +amdgpu_device_is_early_ip_block_sriov(const enum amd_ip_block_type +ip_block) { -int i, r; +switch (ip_block) { +/* early ip blocks */ +case AMD_IP_BLOCK_TYPE_GMC: +case AMD_IP_BLOCK_TYPE_COMMON: +case AMD_IP_BLOCK_TYPE_PSP: +case AMD_IP_BLOCK_TYPE_IH: +return 1; +/* late ip blocks */ +case AMD_IP_BLOCK_TYPE_SMC: +case AMD_IP_BLOCK_TYPE_DCE: +case AMD_IP_BLOCK_TYPE_GFX: +case AMD_IP_BLOCK_TYPE_SDMA: +case AMD_IP_BLOCK_TYPE_UVD: +case AMD_IP_BLOCK_TYPE_VCE: +case AMD_IP_BLOCK_TYPE_VCN: +return 0; +/* invalid ip block */ +default: +return -1; +} +} -static enum amd_ip_block_type ip_order[] = { -AMD_IP_BLOCK_TYPE_GMC, -AMD_IP_BLOCK_TYPE_COMMON, -AMD_IP_BLOCK_TYPE_PSP, -AMD_IP_BLOCK_TYPE_IH, -}; +static int amdgpu_device_ip_reinit_sriov(struct amdgpu_device *adev, + const int is_early) +{ +int i; for (i = 0; i < adev->num_ip_blocks; i++) { -int j; +int r = 0; +bool init_ip; struct amdgpu_ip_block *block; +enum amd_ip_block_type ip_block; block = >ip_blocks[i]; block->status.hw = false; +ip_block = block->version->type; +init_ip = (is_early == + amdgpu_device_is_early_ip_block_sriov(ip_block)); -for (j = 0; j < ARRAY_SIZE(ip_order); j++) { - -if (block->version->type != ip_order[j] || -!block->status.valid) -continue; +if (!init_ip || +(!is_early && block->status.hw) || +!block->status.valid) +continue; -r = block->version->funcs->hw_init(adev); -DRM_INFO("RE-INIT-early: %s %s\n", block->version->funcs->name, r?"failed":"succeeded"); -if (r) -return r; -block->status.hw = true; +if (init_ip && (ip_block == AMD_IP_BLOCK_TYPE_SMC)) { +r = block->version->funcs->resume(adev); +goto show_log; } -} - -return 0; -} -static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev) -{ -int i, r; - -static enum amd_ip_block_type ip_order[] = { -AMD_IP_BLOCK_TYPE_SMC, -AMD_IP_BLOCK_TYPE_DCE, -AMD_IP_BLOCK_TYPE_GFX, -AMD_IP_BLOCK_TYPE_SDMA, -AMD_IP_BLOCK_TYPE_UVD, -AMD_IP_BLOCK_TYPE_VCE, -AMD_IP_BLOCK_TYPE_VCN -}; - -for (i = 0; i < ARRAY_SIZE(ip_order); i++) { -int j; -struct amdgpu_ip_block *block; +if (init_ip) +r = block->version->funcs->hw_init(adev); -for (j = 0; j < adev->num_ip_blocks; j++) { -block = >ip_blocks[j]; +show_log: +DRM_INFO("RE-INIT-%s: %s %s\n", is_early ? "early":"late", + block->version->funcs->name, r ? "failed":"succeeded"); -if (block->version->type != ip_order[i] || -!block->status.valid || -block->status.hw) -continue; +if (r) +return r; -if (block->version->type == AMD_IP_BLOCK_TYPE_SMC) -r = block->version->funcs->resume(adev); -else -r = block->version->funcs->hw_init(adev); +block->status.hw = true; -DRM_INFO("RE-INIT-late: %s %s\n", block->version->funcs->name, r?"failed":"succeeded"); -if (r) -return r; -block->status.hw = true; -} } return 0; @@ -3901,7 +3904,7 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, amdgpu_amdkfd_pre_reset(adev); /* Resume IP prior to SMC */ -r = amdgpu_device_ip_reinit_early_sriov(adev); +r = amdgpu_device_ip_reinit_sriov(adev, 1); if (r) goto error; @@ -3914,7 +3917,7 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, return r;
RE: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov
[AMD Official Use Only - Internal Distribution Only] Per Monk and Emily's suggestion, I will not submit another patch to make amdgpu_device_ip_reinit_late_sriov() and amdgpu_device_ip_reinit_early_sriov() consistent. There's already no logic bug, the little difference in loop layer order does no harm. Sorry about missing the amdgpu_device_ip_reinit_late_sriov() part. Best regards, Jiawei -Original Message- From: Das, Nirmoy Sent: Friday, August 28, 2020 3:14 PM To: Gu, JiaWei (Will) ; Das, Nirmoy ; Deng, Emily ; amd-gfx@lists.freedesktop.org Cc: Deucher, Alexander ; Liu, Monk Subject: Re: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov On 8/28/20 8:58 AM, Gu, JiaWei (Will) wrote: > [AMD Official Use Only - Internal Distribution Only] > > Hi Nirmoy, > > I also found amdgpu_device_ip_reinit_late_sriov() part is missed. > Will push another patch to make them consistent soon. Thanks, Jiawei. Nirmoy > > Best regards, > Jiawei > > -Original Message- > From: Das, Nirmoy > Sent: Friday, August 28, 2020 2:33 PM > To: Deng, Emily ; Das, Nirmoy > ; amd-gfx@lists.freedesktop.org > Cc: Deucher, Alexander ; Liu, Monk > ; Gu, JiaWei (Will) > Subject: Re: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov > > > On 8/28/20 3:16 AM, Deng, Emily wrote: >> [AMD Official Use Only - Internal Distribution Only] >> >> Hi Nirmoy, >> Still think the original logical is more clear. > > No problem but we should at least make sure > amdgpu_device_ip_reinit_late_sriov() and > amdgpu_device_ip_reinit_early_sriov() > > are consistent. The last patch from Jiawei only touched > amdgpu_device_ip_reinit_early_sriov(), same optimization should apply > > to amdgpu_device_ip_reinit_late_sriov() > > > Regards, > > Nirmoy > > >> Best wishes >> Emily Deng >> >> >> >>> -Original Message- >>> From: Das, Nirmoy >>> Sent: Thursday, August 27, 2020 11:19 PM >>> To: amd-gfx@lists.freedesktop.org >>> Cc: Deucher, Alexander ; Liu, Monk >>> ; Gu, JiaWei (Will) ; Deng, >>> Emily ; Das, Nirmoy >>> Subject: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov >>> >>> This patch removes some unwanted code duplication and simplifies >>> sriov's ip block reinit logic. >>> >>> Signed-off-by: Nirmoy Das >>> --- >>> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 117 >>> +++-- >>> 1 file changed, 60 insertions(+), 57 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> index 696a61cc3ac6..0db6db03bcd3 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >>> @@ -2587,77 +2587,80 @@ int amdgpu_device_ip_suspend(struct >>> amdgpu_device *adev) return r; } >>> >>> -static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device >>> *adev) >>> +/** amdgpu_device_is_early_ip_block_sriov - check for early >>> +ip_blocks >>> + * >>> + * @ip_block: ip block that need to be check >>> + * >>> + * Returns a tri-state value for a given ip block. >>> + * If an ip block requires early reinit sriov then return 1 or 0 otherwise. >>> + * Return -1 on invalid ip block. >>> + * >>> + */ >>> + >>> +static int >>> +amdgpu_device_is_early_ip_block_sriov(const enum amd_ip_block_type >>> +ip_block) >>> { >>> -int i, r; >>> +switch (ip_block) { >>> +/* early ip blocks */ >>> +case AMD_IP_BLOCK_TYPE_GMC: >>> +case AMD_IP_BLOCK_TYPE_COMMON: >>> +case AMD_IP_BLOCK_TYPE_PSP: >>> +case AMD_IP_BLOCK_TYPE_IH: >>> +return 1; >>> +/* late ip blocks */ >>> +case AMD_IP_BLOCK_TYPE_SMC: >>> +case AMD_IP_BLOCK_TYPE_DCE: >>> +case AMD_IP_BLOCK_TYPE_GFX: >>> +case AMD_IP_BLOCK_TYPE_SDMA: >>> +case AMD_IP_BLOCK_TYPE_UVD: >>> +case AMD_IP_BLOCK_TYPE_VCE: >>> +case AMD_IP_BLOCK_TYPE_VCN: >>> +return 0; >>> +/* invalid ip block */ >>> +default: >>> +return -1; >>> +} >>> +} >>> >>> -static enum amd_ip_block_type ip_order[] = { >>> -AMD_IP_BLOCK_TYPE_GMC, -AMD_IP_BLOCK_TYPE_COMMON, >>> -AMD_IP_BLOCK_TYPE_PSP, -AMD_IP_BLOCK_TYPE_IH, -}; >>> +static int amdgpu_device_ip_reinit_sriov(struct amdgpu_device >>> +*adev, const int is_early) { int i; >>> >>> for (i = 0; i < a
RE: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov
[AMD Official Use Only - Internal Distribution Only] Please don't change those code unless you have a full stress test and a solid reason (what bug fixed or what new feature introduced ) Otherwise if it's a pure personal refactor or cleanup it will be not necessary _ Monk Liu|GPU Virtualization Team |AMD -Original Message- From: Das, Nirmoy Sent: Thursday, August 27, 2020 11:19 PM To: amd-gfx@lists.freedesktop.org Cc: Deucher, Alexander ; Liu, Monk ; Gu, JiaWei (Will) ; Deng, Emily ; Das, Nirmoy Subject: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov This patch removes some unwanted code duplication and simplifies sriov's ip block reinit logic. Signed-off-by: Nirmoy Das --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 117 +++-- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 696a61cc3ac6..0db6db03bcd3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2587,77 +2587,80 @@ int amdgpu_device_ip_suspend(struct amdgpu_device *adev) return r; } -static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev) +/** amdgpu_device_is_early_ip_block_sriov - check for early ip_blocks + * + * @ip_block: ip block that need to be check + * + * Returns a tri-state value for a given ip block. + * If an ip block requires early reinit sriov then return 1 or 0 otherwise. + * Return -1 on invalid ip block. + * + */ + +static int +amdgpu_device_is_early_ip_block_sriov(const enum amd_ip_block_type +ip_block) { -int i, r; +switch (ip_block) { +/* early ip blocks */ +case AMD_IP_BLOCK_TYPE_GMC: +case AMD_IP_BLOCK_TYPE_COMMON: +case AMD_IP_BLOCK_TYPE_PSP: +case AMD_IP_BLOCK_TYPE_IH: +return 1; +/* late ip blocks */ +case AMD_IP_BLOCK_TYPE_SMC: +case AMD_IP_BLOCK_TYPE_DCE: +case AMD_IP_BLOCK_TYPE_GFX: +case AMD_IP_BLOCK_TYPE_SDMA: +case AMD_IP_BLOCK_TYPE_UVD: +case AMD_IP_BLOCK_TYPE_VCE: +case AMD_IP_BLOCK_TYPE_VCN: +return 0; +/* invalid ip block */ +default: +return -1; +} +} -static enum amd_ip_block_type ip_order[] = { -AMD_IP_BLOCK_TYPE_GMC, -AMD_IP_BLOCK_TYPE_COMMON, -AMD_IP_BLOCK_TYPE_PSP, -AMD_IP_BLOCK_TYPE_IH, -}; +static int amdgpu_device_ip_reinit_sriov(struct amdgpu_device *adev, + const int is_early) +{ +int i; for (i = 0; i < adev->num_ip_blocks; i++) { -int j; +int r = 0; +bool init_ip; struct amdgpu_ip_block *block; +enum amd_ip_block_type ip_block; block = >ip_blocks[i]; block->status.hw = false; +ip_block = block->version->type; +init_ip = (is_early == + amdgpu_device_is_early_ip_block_sriov(ip_block)); -for (j = 0; j < ARRAY_SIZE(ip_order); j++) { - -if (block->version->type != ip_order[j] || -!block->status.valid) -continue; +if (!init_ip || +(!is_early && block->status.hw) || +!block->status.valid) +continue; -r = block->version->funcs->hw_init(adev); -DRM_INFO("RE-INIT-early: %s %s\n", block->version->funcs->name, r?"failed":"succeeded"); -if (r) -return r; -block->status.hw = true; +if (init_ip && (ip_block == AMD_IP_BLOCK_TYPE_SMC)) { +r = block->version->funcs->resume(adev); +goto show_log; } -} - -return 0; -} -static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev) -{ -int i, r; - -static enum amd_ip_block_type ip_order[] = { -AMD_IP_BLOCK_TYPE_SMC, -AMD_IP_BLOCK_TYPE_DCE, -AMD_IP_BLOCK_TYPE_GFX, -AMD_IP_BLOCK_TYPE_SDMA, -AMD_IP_BLOCK_TYPE_UVD, -AMD_IP_BLOCK_TYPE_VCE, -AMD_IP_BLOCK_TYPE_VCN -}; - -for (i = 0; i < ARRAY_SIZE(ip_order); i++) { -int j; -struct amdgpu_ip_block *block; +if (init_ip) +r = block->version->funcs->hw_init(adev); -for (j = 0; j < adev->num_ip_blocks; j++) { -block = >ip_blocks[j]; +show_log: +DRM_INFO("RE-INIT-%s: %s %s\n", is_early ? "early":"late", + block->version->funcs->name, r ? "failed":"succeeded"); -if (block->version->type != ip_order[i] || -!block->status.valid || -block->status.hw) -continue; +if (r) +return r; -if (block->version->type == AMD_IP_BLOCK_TYPE_SMC) -r = block->version->funcs->resume(adev); -else -r = block->version->funcs->hw_init(adev); +block->status.hw = true; -DRM_INFO("RE-INIT-late: %s %s\n", block->version->funcs->name, r?"failed":"succeeded"); -if (r) -return r; -block->status.hw = true; -} } return 0; @@ -3901,7 +3904,7 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, amdgpu_amdkfd_pre_reset(adev); /* Resume IP prior to SMC */ -r = amdgpu_device_ip_reinit_early_sriov(adev); +r = amdgpu_device_ip_reinit_sriov(adev, 1); if (r) goto error; @@ -3914,7 +3917,7 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, return r; /* now we are okay to resume SMC/CP/SDMA */ -r = amdgpu_device_ip_reinit_late_sriov(adev); +r = amdgpu_device_ip_reinit_sriov(adev, 0); if (r) goto error; -- 2.28.0 ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org
Re: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov
On 8/28/20 8:58 AM, Gu, JiaWei (Will) wrote: [AMD Official Use Only - Internal Distribution Only] Hi Nirmoy, I also found amdgpu_device_ip_reinit_late_sriov() part is missed. Will push another patch to make them consistent soon. Thanks, Jiawei. Nirmoy Best regards, Jiawei -Original Message- From: Das, Nirmoy Sent: Friday, August 28, 2020 2:33 PM To: Deng, Emily ; Das, Nirmoy ; amd-gfx@lists.freedesktop.org Cc: Deucher, Alexander ; Liu, Monk ; Gu, JiaWei (Will) Subject: Re: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov On 8/28/20 3:16 AM, Deng, Emily wrote: [AMD Official Use Only - Internal Distribution Only] Hi Nirmoy, Still think the original logical is more clear. No problem but we should at least make sure amdgpu_device_ip_reinit_late_sriov() and amdgpu_device_ip_reinit_early_sriov() are consistent. The last patch from Jiawei only touched amdgpu_device_ip_reinit_early_sriov(), same optimization should apply to amdgpu_device_ip_reinit_late_sriov() Regards, Nirmoy Best wishes Emily Deng -Original Message- From: Das, Nirmoy Sent: Thursday, August 27, 2020 11:19 PM To: amd-gfx@lists.freedesktop.org Cc: Deucher, Alexander ; Liu, Monk ; Gu, JiaWei (Will) ; Deng, Emily ; Das, Nirmoy Subject: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov This patch removes some unwanted code duplication and simplifies sriov's ip block reinit logic. Signed-off-by: Nirmoy Das --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 117 +++-- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 696a61cc3ac6..0db6db03bcd3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2587,77 +2587,80 @@ int amdgpu_device_ip_suspend(struct amdgpu_device *adev) return r; } -static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev) +/** amdgpu_device_is_early_ip_block_sriov - check for early +ip_blocks + * + * @ip_block: ip block that need to be check + * + * Returns a tri-state value for a given ip block. + * If an ip block requires early reinit sriov then return 1 or 0 otherwise. + * Return -1 on invalid ip block. + * + */ + +static int +amdgpu_device_is_early_ip_block_sriov(const enum amd_ip_block_type +ip_block) { -int i, r; +switch (ip_block) { +/* early ip blocks */ +case AMD_IP_BLOCK_TYPE_GMC: +case AMD_IP_BLOCK_TYPE_COMMON: +case AMD_IP_BLOCK_TYPE_PSP: +case AMD_IP_BLOCK_TYPE_IH: +return 1; +/* late ip blocks */ +case AMD_IP_BLOCK_TYPE_SMC: +case AMD_IP_BLOCK_TYPE_DCE: +case AMD_IP_BLOCK_TYPE_GFX: +case AMD_IP_BLOCK_TYPE_SDMA: +case AMD_IP_BLOCK_TYPE_UVD: +case AMD_IP_BLOCK_TYPE_VCE: +case AMD_IP_BLOCK_TYPE_VCN: +return 0; +/* invalid ip block */ +default: +return -1; +} +} -static enum amd_ip_block_type ip_order[] = { -AMD_IP_BLOCK_TYPE_GMC, -AMD_IP_BLOCK_TYPE_COMMON, -AMD_IP_BLOCK_TYPE_PSP, -AMD_IP_BLOCK_TYPE_IH, -}; +static int amdgpu_device_ip_reinit_sriov(struct amdgpu_device *adev, +const int is_early) { int i; for (i = 0; i < adev->num_ip_blocks; i++) { -int j; +int r = 0; +bool init_ip; struct amdgpu_ip_block *block; +enum amd_ip_block_type ip_block; block = >ip_blocks[i]; block->status.hw = false; +ip_block = block->version->type; +init_ip = (is_early == + amdgpu_device_is_early_ip_block_sriov(ip_block)); -for (j = 0; j < ARRAY_SIZE(ip_order); j++) { - -if (block->version->type != ip_order[j] || -!block->status.valid) -continue; +if (!init_ip || +(!is_early && block->status.hw) || +!block->status.valid) +continue; -r = block->version->funcs->hw_init(adev); -DRM_INFO("RE-INIT-early: %s %s\n", block->version- funcs->name, r?"failed":"succeeded"); -if (r) -return r; -block->status.hw = true; +if (init_ip && (ip_block == AMD_IP_BLOCK_TYPE_SMC)) { r = +block->version->funcs->resume(adev); +goto show_log; } -} - -return 0; -} -static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev) -{ -int i, r; - -static enum amd_ip_block_type ip_order[] = { -AMD_IP_BLOCK_TYPE_SMC, -AMD_IP_BLOCK_TYPE_DCE, -AMD_IP_BLOCK_TYPE_GFX, -AMD_IP_BLOCK_TYPE_SDMA, -AMD_IP_BLOCK_TYPE_UVD, -AMD_IP_BLOCK_TYPE_VCE, -AMD_IP_BLOCK_TYPE_VCN -}; - -for (i = 0; i < ARRAY_SIZE(ip_order); i++) { -int j; -struct amdgpu_ip_block *block; +if (init_ip) +r = block->version->funcs->hw_init(adev); -for (j = 0; j < adev->num_ip_blocks; j++) { -block = >ip_blocks[j]; +show_log: +DRM_INFO("RE-INIT-%s: %s %s\n", is_early ? "early":"late", + block->version->funcs->name, r ? "failed":"succeeded"); -if (block->version->type != ip_order[i] || -!block->status.valid || -block->status.hw) -continue; +if (r) +return r; -if (block->version->type == AMD_IP_BLOCK_TYPE_SM
RE: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov
[AMD Official Use Only - Internal Distribution Only] Hi Nirmoy, I also found amdgpu_device_ip_reinit_late_sriov() part is missed. Will push another patch to make them consistent soon. Best regards, Jiawei -Original Message- From: Das, Nirmoy Sent: Friday, August 28, 2020 2:33 PM To: Deng, Emily ; Das, Nirmoy ; amd-gfx@lists.freedesktop.org Cc: Deucher, Alexander ; Liu, Monk ; Gu, JiaWei (Will) Subject: Re: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov On 8/28/20 3:16 AM, Deng, Emily wrote: > [AMD Official Use Only - Internal Distribution Only] > > Hi Nirmoy, > Still think the original logical is more clear. No problem but we should at least make sure amdgpu_device_ip_reinit_late_sriov() and amdgpu_device_ip_reinit_early_sriov() are consistent. The last patch from Jiawei only touched amdgpu_device_ip_reinit_early_sriov(), same optimization should apply to amdgpu_device_ip_reinit_late_sriov() Regards, Nirmoy > > Best wishes > Emily Deng > > > >> -Original Message- >> From: Das, Nirmoy >> Sent: Thursday, August 27, 2020 11:19 PM >> To: amd-gfx@lists.freedesktop.org >> Cc: Deucher, Alexander ; Liu, Monk >> ; Gu, JiaWei (Will) ; Deng, >> Emily ; Das, Nirmoy >> Subject: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov >> >> This patch removes some unwanted code duplication and simplifies >> sriov's ip block reinit logic. >> >> Signed-off-by: Nirmoy Das >> --- >> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 117 >> +++-- >> 1 file changed, 60 insertions(+), 57 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> index 696a61cc3ac6..0db6db03bcd3 100644 >> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >> @@ -2587,77 +2587,80 @@ int amdgpu_device_ip_suspend(struct >> amdgpu_device *adev) return r; } >> >> -static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device >> *adev) >> +/** amdgpu_device_is_early_ip_block_sriov - check for early >> +ip_blocks >> + * >> + * @ip_block: ip block that need to be check >> + * >> + * Returns a tri-state value for a given ip block. >> + * If an ip block requires early reinit sriov then return 1 or 0 otherwise. >> + * Return -1 on invalid ip block. >> + * >> + */ >> + >> +static int >> +amdgpu_device_is_early_ip_block_sriov(const enum amd_ip_block_type >> +ip_block) >> { >> -int i, r; >> +switch (ip_block) { >> +/* early ip blocks */ >> +case AMD_IP_BLOCK_TYPE_GMC: >> +case AMD_IP_BLOCK_TYPE_COMMON: >> +case AMD_IP_BLOCK_TYPE_PSP: >> +case AMD_IP_BLOCK_TYPE_IH: >> +return 1; >> +/* late ip blocks */ >> +case AMD_IP_BLOCK_TYPE_SMC: >> +case AMD_IP_BLOCK_TYPE_DCE: >> +case AMD_IP_BLOCK_TYPE_GFX: >> +case AMD_IP_BLOCK_TYPE_SDMA: >> +case AMD_IP_BLOCK_TYPE_UVD: >> +case AMD_IP_BLOCK_TYPE_VCE: >> +case AMD_IP_BLOCK_TYPE_VCN: >> +return 0; >> +/* invalid ip block */ >> +default: >> +return -1; >> +} >> +} >> >> -static enum amd_ip_block_type ip_order[] = { -AMD_IP_BLOCK_TYPE_GMC, >> -AMD_IP_BLOCK_TYPE_COMMON, -AMD_IP_BLOCK_TYPE_PSP, >> -AMD_IP_BLOCK_TYPE_IH, -}; >> +static int amdgpu_device_ip_reinit_sriov(struct amdgpu_device *adev, >> +const int is_early) { int i; >> >> for (i = 0; i < adev->num_ip_blocks; i++) { -int j; >> +int r = 0; >> +bool init_ip; >> struct amdgpu_ip_block *block; >> +enum amd_ip_block_type ip_block; >> >> block = >ip_blocks[i]; >> block->status.hw = false; >> +ip_block = block->version->type; >> +init_ip = (is_early == >> + amdgpu_device_is_early_ip_block_sriov(ip_block)); >> >> -for (j = 0; j < ARRAY_SIZE(ip_order); j++) { >> - >> -if (block->version->type != ip_order[j] || >> -!block->status.valid) >> -continue; >> +if (!init_ip || >> +(!is_early && block->status.hw) || >> +!block->status.valid) >> +continue; >> >> -r = block->version->funcs->hw_init(adev); >> -DRM_INFO("RE-INIT-early: %s %s\n", block->version- >>> funcs->name, r?"failed":"succeeded"); >> -if (r) >> -return r; >> -block->status.hw = true; >> +if (init_ip && (ip_block == AMD_IP_BLOCK_TYPE_SMC)) { r = >> +block->version->funcs->resume(adev); >> +goto show_log; >> } >> -} >> - >> -return
Re: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov
On 8/28/20 3:16 AM, Deng, Emily wrote: [AMD Official Use Only - Internal Distribution Only] Hi Nirmoy, Still think the original logical is more clear. No problem but we should at least make sure amdgpu_device_ip_reinit_late_sriov() and amdgpu_device_ip_reinit_early_sriov() are consistent. The last patch from Jiawei only touched amdgpu_device_ip_reinit_early_sriov(), same optimization should apply to amdgpu_device_ip_reinit_late_sriov() Regards, Nirmoy Best wishes Emily Deng -Original Message- From: Das, Nirmoy Sent: Thursday, August 27, 2020 11:19 PM To: amd-gfx@lists.freedesktop.org Cc: Deucher, Alexander ; Liu, Monk ; Gu, JiaWei (Will) ; Deng, Emily ; Das, Nirmoy Subject: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov This patch removes some unwanted code duplication and simplifies sriov's ip block reinit logic. Signed-off-by: Nirmoy Das --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 117 +++-- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 696a61cc3ac6..0db6db03bcd3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -2587,77 +2587,80 @@ int amdgpu_device_ip_suspend(struct amdgpu_device *adev) return r; } -static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev) +/** amdgpu_device_is_early_ip_block_sriov - check for early ip_blocks + * + * @ip_block: ip block that need to be check + * + * Returns a tri-state value for a given ip block. + * If an ip block requires early reinit sriov then return 1 or 0 otherwise. + * Return -1 on invalid ip block. + * + */ + +static int +amdgpu_device_is_early_ip_block_sriov(const enum amd_ip_block_type +ip_block) { -int i, r; +switch (ip_block) { +/* early ip blocks */ +case AMD_IP_BLOCK_TYPE_GMC: +case AMD_IP_BLOCK_TYPE_COMMON: +case AMD_IP_BLOCK_TYPE_PSP: +case AMD_IP_BLOCK_TYPE_IH: +return 1; +/* late ip blocks */ +case AMD_IP_BLOCK_TYPE_SMC: +case AMD_IP_BLOCK_TYPE_DCE: +case AMD_IP_BLOCK_TYPE_GFX: +case AMD_IP_BLOCK_TYPE_SDMA: +case AMD_IP_BLOCK_TYPE_UVD: +case AMD_IP_BLOCK_TYPE_VCE: +case AMD_IP_BLOCK_TYPE_VCN: +return 0; +/* invalid ip block */ +default: +return -1; +} +} -static enum amd_ip_block_type ip_order[] = { -AMD_IP_BLOCK_TYPE_GMC, -AMD_IP_BLOCK_TYPE_COMMON, -AMD_IP_BLOCK_TYPE_PSP, -AMD_IP_BLOCK_TYPE_IH, -}; +static int amdgpu_device_ip_reinit_sriov(struct amdgpu_device *adev, + const int is_early) +{ +int i; for (i = 0; i < adev->num_ip_blocks; i++) { -int j; +int r = 0; +bool init_ip; struct amdgpu_ip_block *block; +enum amd_ip_block_type ip_block; block = >ip_blocks[i]; block->status.hw = false; +ip_block = block->version->type; +init_ip = (is_early == + amdgpu_device_is_early_ip_block_sriov(ip_block)); -for (j = 0; j < ARRAY_SIZE(ip_order); j++) { - -if (block->version->type != ip_order[j] || -!block->status.valid) -continue; +if (!init_ip || +(!is_early && block->status.hw) || +!block->status.valid) +continue; -r = block->version->funcs->hw_init(adev); -DRM_INFO("RE-INIT-early: %s %s\n", block->version- funcs->name, r?"failed":"succeeded"); -if (r) -return r; -block->status.hw = true; +if (init_ip && (ip_block == AMD_IP_BLOCK_TYPE_SMC)) { +r = block->version->funcs->resume(adev); +goto show_log; } -} - -return 0; -} -static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev) -{ -int i, r; - -static enum amd_ip_block_type ip_order[] = { -AMD_IP_BLOCK_TYPE_SMC, -AMD_IP_BLOCK_TYPE_DCE, -AMD_IP_BLOCK_TYPE_GFX, -AMD_IP_BLOCK_TYPE_SDMA, -AMD_IP_BLOCK_TYPE_UVD, -AMD_IP_BLOCK_TYPE_VCE, -AMD_IP_BLOCK_TYPE_VCN -}; - -for (i = 0; i < ARRAY_SIZE(ip_order); i++) { -int j; -struct amdgpu_ip_block *block; +if (init_ip) +r = block->version->funcs->hw_init(adev); -for (j = 0; j < adev->num_ip_blocks; j++) { -block = >ip_blocks[j]; +show_log: +DRM_INFO("RE-INIT-%s: %s %s\n", is_early ? "early":"late", + block->version->funcs->name, r ? "failed":"succeeded"); -if (block->version->type != ip_order[i] || -!block->status.valid || -block->status.hw) -continue; +if (r) +return r; -if (block->version->type == AMD_IP_BLOCK_TYPE_SMC) -r = block->version->funcs->resume(adev); -else -r = block->version->funcs->hw_init(adev); +block->status.hw = true; -DRM_INFO("RE-INIT-late: %s %s\n", block->version- funcs->name, r?"failed":"succeeded"); -if (r) -return r; -block->status.hw = true; -} } return 0; @@ -3901,7 +3904,7 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, amdgpu_amdkfd_pre_reset(adev); /* Resume IP prior to SMC */ -r = amdgpu_device_ip_reinit_early_sriov(adev); +r = amdgpu_device_ip_reinit_sriov(adev, 1); if (r) goto error; @@ -3914,7 +3917,7 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, return r; /* now we are okay to resume SMC/CP/SDMA */ -r = amdgpu_device_ip_reinit_late_sriov(adev); +r = amdgpu_device_ip_reinit_sriov(adev, 0); if
RE: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov
[AMD Official Use Only - Internal Distribution Only] Hi Nirmoy, Still think the original logical is more clear. Best wishes Emily Deng >-Original Message- >From: Das, Nirmoy >Sent: Thursday, August 27, 2020 11:19 PM >To: amd-gfx@lists.freedesktop.org >Cc: Deucher, Alexander ; Liu, Monk >; Gu, JiaWei (Will) ; Deng, Emily >; Das, Nirmoy >Subject: [PATCH 1/1] drm/amdgpu: rework ip block reinit for sriov > >This patch removes some unwanted code duplication and simplifies sriov's ip >block reinit logic. > >Signed-off-by: Nirmoy Das >--- > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 117 +++-- > 1 file changed, 60 insertions(+), 57 deletions(-) > >diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >index 696a61cc3ac6..0db6db03bcd3 100644 >--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c >@@ -2587,77 +2587,80 @@ int amdgpu_device_ip_suspend(struct >amdgpu_device *adev) > return r; > } > >-static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev) >+/** amdgpu_device_is_early_ip_block_sriov - check for early ip_blocks >+ * >+ * @ip_block: ip block that need to be check >+ * >+ * Returns a tri-state value for a given ip block. >+ * If an ip block requires early reinit sriov then return 1 or 0 otherwise. >+ * Return -1 on invalid ip block. >+ * >+ */ >+ >+static int >+amdgpu_device_is_early_ip_block_sriov(const enum amd_ip_block_type >+ip_block) > { >-int i, r; >+switch (ip_block) { >+/* early ip blocks */ >+case AMD_IP_BLOCK_TYPE_GMC: >+case AMD_IP_BLOCK_TYPE_COMMON: >+case AMD_IP_BLOCK_TYPE_PSP: >+case AMD_IP_BLOCK_TYPE_IH: >+return 1; >+/* late ip blocks */ >+case AMD_IP_BLOCK_TYPE_SMC: >+case AMD_IP_BLOCK_TYPE_DCE: >+case AMD_IP_BLOCK_TYPE_GFX: >+case AMD_IP_BLOCK_TYPE_SDMA: >+case AMD_IP_BLOCK_TYPE_UVD: >+case AMD_IP_BLOCK_TYPE_VCE: >+case AMD_IP_BLOCK_TYPE_VCN: >+return 0; >+/* invalid ip block */ >+default: >+return -1; >+} >+} > >-static enum amd_ip_block_type ip_order[] = { >-AMD_IP_BLOCK_TYPE_GMC, >-AMD_IP_BLOCK_TYPE_COMMON, >-AMD_IP_BLOCK_TYPE_PSP, >-AMD_IP_BLOCK_TYPE_IH, >-}; >+static int amdgpu_device_ip_reinit_sriov(struct amdgpu_device *adev, >+ const int is_early) >+{ >+int i; > > for (i = 0; i < adev->num_ip_blocks; i++) { >-int j; >+int r = 0; >+bool init_ip; > struct amdgpu_ip_block *block; >+enum amd_ip_block_type ip_block; > > block = >ip_blocks[i]; > block->status.hw = false; >+ip_block = block->version->type; >+init_ip = (is_early == >+ amdgpu_device_is_early_ip_block_sriov(ip_block)); > >-for (j = 0; j < ARRAY_SIZE(ip_order); j++) { >- >-if (block->version->type != ip_order[j] || >-!block->status.valid) >-continue; >+if (!init_ip || >+(!is_early && block->status.hw) || >+!block->status.valid) >+continue; > >-r = block->version->funcs->hw_init(adev); >-DRM_INFO("RE-INIT-early: %s %s\n", block->version- >>funcs->name, r?"failed":"succeeded"); >-if (r) >-return r; >-block->status.hw = true; >+if (init_ip && (ip_block == AMD_IP_BLOCK_TYPE_SMC)) { >+r = block->version->funcs->resume(adev); >+goto show_log; > } >-} >- >-return 0; >-} > >-static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev) -{ >-int i, r; >- >-static enum amd_ip_block_type ip_order[] = { >-AMD_IP_BLOCK_TYPE_SMC, >-AMD_IP_BLOCK_TYPE_DCE, >-AMD_IP_BLOCK_TYPE_GFX, >-AMD_IP_BLOCK_TYPE_SDMA, >-AMD_IP_BLOCK_TYPE_UVD, >-AMD_IP_BLOCK_TYPE_VCE, >-AMD_IP_BLOCK_TYPE_VCN >-}; >- >-for (i = 0; i < ARRAY_SIZE(ip_order); i++) { >-int j; >-struct amdgpu_ip_block *block; >+if (init_ip) >+r = block->version->funcs->hw_init(adev); > >-for (j = 0; j < adev->num_ip_blocks; j++) { >-block = >ip_blocks[j]; >+show_log: >+DRM_INFO("RE-INIT-%s: %s %s\n", is_early ? "early":"late", >+ block->version->funcs->name, r ? >"failed":"succeeded"); > >-if (block->version->type != ip_order[i] || >-!block->status.valid || >-block->status.hw) >-continue; >+if (r) >+return r; > >-if (block->version->type == >AMD_IP_BLOCK_TYPE_SMC) >-r = block->version->funcs->resume(adev); >-else >-r = block->version->funcs->hw_init(adev); >+block->status.hw = true; > >-DRM_INFO("RE-INIT-late: %s %s\n", block->version- >>funcs->name, r?"failed":"succeeded"); >-if (r) >-return r; >-block->status.hw = true; >-} > } > > return 0; >@@ -3901,7 +3904,7 @@ static int amdgpu_device_reset_sriov(struct >amdgpu_device *adev, > amdgpu_amdkfd_pre_reset(adev); > > /* Resume IP prior to SMC */ >-r = amdgpu_device_ip_reinit_early_sriov(adev); >+r = amdgpu_device_ip_reinit_sriov(adev, 1); > if (r) > goto error; > >@@ -3914,7 +3917,7 @@ static int amdgpu_device_reset_sriov(struct >amdgpu_device *adev, > return r; > > /* now we are okay to resume SMC/CP/SDMA */ >-r = amdgpu_device_ip_reinit_late_sriov(adev); >+r = amdgpu_device_ip_reinit_sriov(adev, 0); > if (r) > goto error; > >-- >2.28.0 ___ amd-gfx mailing list amd-gfx@lists.freedesktop.org