> -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf > Of Jim Qu > Sent: Friday, February 10, 2017 3:06 AM > To: amd-gfx at lists.freedesktop.org > Cc: Qu, Jim > Subject: [PATCH] drm/amd/amdgpu: post card if there is real hw resetting > performed > > Change-Id: I8fbe9a6b74888385eaff70db544dacb51164267a > Signed-off-by: Jim Qu <Jim.Qu at amd.com> Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 5 ++++- > drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 22 +++++++++++++----- > ---- > drivers/gpu/drm/amd/amdgpu/cik.c | 1 + > drivers/gpu/drm/amd/amdgpu/vi.c | 1 + > 5 files changed, 20 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 73086d0..2b940ac 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -1496,6 +1496,9 @@ struct amdgpu_device { > spinlock_t gtt_list_lock; > struct list_head gtt_list; > > + /* record hw reset is performed */ > + bool has_hw_reset; > + > }; > > static inline struct amdgpu_device *amdgpu_ttm_adev(struct > ttm_bo_device *bdev) > @@ -1722,7 +1725,7 @@ static inline void > amdgpu_ring_write_multiple(struct amdgpu_ring *ring, void *sr > int amdgpu_gpu_reset(struct amdgpu_device *adev); > bool amdgpu_need_backup(struct amdgpu_device *adev); > void amdgpu_pci_config_reset(struct amdgpu_device *adev); > -bool amdgpu_card_posted(struct amdgpu_device *adev); > +bool amdgpu_need_post(struct amdgpu_device *adev); > void amdgpu_update_display_priority(struct amdgpu_device *adev); > > int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data); > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c > index 7900511..46ce883 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c > @@ -100,7 +100,7 @@ static bool igp_read_bios_from_vram(struct > amdgpu_device *adev) > resource_size_t size = 256 * 1024; /* ??? */ > > if (!(adev->flags & AMD_IS_APU)) > - if (!amdgpu_card_posted(adev)) > + if (amdgpu_need_post(adev)) > return false; > > adev->bios = NULL; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index 7e64110..34500f2 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -620,25 +620,29 @@ void amdgpu_gtt_location(struct amdgpu_device > *adev, struct amdgpu_mc *mc) > * GPU helpers function. > */ > /** > - * amdgpu_card_posted - check if the hw has already been initialized > + * amdgpu_need_post - check if the hw need post or not > * > * @adev: amdgpu_device pointer > * > - * Check if the asic has been initialized (all asics). > - * Used at driver startup. > - * Returns true if initialized or false if not. > + * Check if the asic has been initialized (all asics) at driver startup > + * or post is needed if hw reset is performed. > + * Returns true if need or false if not. > */ > -bool amdgpu_card_posted(struct amdgpu_device *adev) > +bool amdgpu_need_post(struct amdgpu_device *adev) > { > uint32_t reg; > > + if (adev->has_hw_reset) { > + adev->has_hw_reset = false; > + return true; > + } > /* then check MEM_SIZE, in case the crtcs are off */ > reg = RREG32(mmCONFIG_MEMSIZE); > > if (reg) > - return true; > + return false; > > - return false; > + return true; > > } > > @@ -666,7 +670,7 @@ static bool amdgpu_vpost_needed(struct > amdgpu_device *adev) > return true; > } > } > - return !amdgpu_card_posted(adev); > + return amdgpu_need_post(adev); > } > > /** > @@ -2160,7 +2164,7 @@ int amdgpu_device_resume(struct drm_device > *dev, bool resume, bool fbcon) > amdgpu_atombios_scratch_regs_restore(adev); > > /* post card */ > - if (!amdgpu_card_posted(adev) || !resume) { > + if (amdgpu_need_post(adev)) { > r = amdgpu_atom_asic_init(adev- > >mode_info.atom_context); > if (r) > DRM_ERROR("amdgpu asic init failed\n"); > diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c > b/drivers/gpu/drm/amd/amdgpu/cik.c > index e885db4..fb17ad0 100644 > --- a/drivers/gpu/drm/amd/amdgpu/cik.c > +++ b/drivers/gpu/drm/amd/amdgpu/cik.c > @@ -1177,6 +1177,7 @@ static int cik_gpu_pci_config_reset(struct > amdgpu_device *adev) > if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) { > /* enable BM */ > pci_set_master(adev->pdev); > + adev->has_hw_reset = true; > r = 0; > break; > } > diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c > b/drivers/gpu/drm/amd/amdgpu/vi.c > index aeef3c9..8c784b4 100644 > --- a/drivers/gpu/drm/amd/amdgpu/vi.c > +++ b/drivers/gpu/drm/amd/amdgpu/vi.c > @@ -722,6 +722,7 @@ static int vi_gpu_pci_config_reset(struct > amdgpu_device *adev) > if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) { > /* enable BM */ > pci_set_master(adev->pdev); > + adev->has_hw_reset = true; > return 0; > } > udelay(1); > -- > 1.9.1 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx