[PATCH] drm/amd/amdgpu: post card if there is real hw resetting performed

Deucher, Alexander Alexander.Deucher at amd.com
Fri Feb 10 22:55:07 UTC 2017


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


More information about the amd-gfx mailing list