diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 56 | 
1 files changed, 14 insertions, 42 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c index 28a736c507bb..16699158e00d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c @@ -99,42 +99,6 @@ bool amdgpu_gfx_is_me_queue_enabled(struct amdgpu_device *adev,  }  /** - * amdgpu_gfx_scratch_get - Allocate a scratch register - * - * @adev: amdgpu_device pointer - * @reg: scratch register mmio offset - * - * Allocate a CP scratch register for use by the driver (all asics). - * Returns 0 on success or -EINVAL on failure. - */ -int amdgpu_gfx_scratch_get(struct amdgpu_device *adev, uint32_t *reg) -{ -	int i; - -	i = ffs(adev->gfx.scratch.free_mask); -	if (i != 0 && i <= adev->gfx.scratch.num_reg) { -		i--; -		adev->gfx.scratch.free_mask &= ~(1u << i); -		*reg = adev->gfx.scratch.reg_base + i; -		return 0; -	} -	return -EINVAL; -} - -/** - * amdgpu_gfx_scratch_free - Free a scratch register - * - * @adev: amdgpu_device pointer - * @reg: scratch register mmio offset - * - * Free a CP scratch register allocated for use by the driver (all asics) - */ -void amdgpu_gfx_scratch_free(struct amdgpu_device *adev, uint32_t reg) -{ -	adev->gfx.scratch.free_mask |= 1u << (reg - adev->gfx.scratch.reg_base); -} - -/**   * amdgpu_gfx_parse_disable_cu - Parse the disable_cu module parameter   *   * @mask: array in which the per-shader array disable masks will be stored @@ -367,7 +331,7 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,  	/* create MQD for KIQ */  	ring = &adev->gfx.kiq.ring; -	if (!ring->mqd_obj) { +	if (!adev->enable_mes_kiq && !ring->mqd_obj) {  		/* originaly the KIQ MQD is put in GTT domain, but for SRIOV VRAM domain is a must  		 * otherwise hypervisor trigger SAVE_VF fail after driver unloaded which mean MQD  		 * deallocated and gart_unbind, to strict diverage we decide to use VRAM domain for @@ -464,7 +428,7 @@ int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev)  {  	struct amdgpu_kiq *kiq = &adev->gfx.kiq;  	struct amdgpu_ring *kiq_ring = &kiq->ring; -	int i, r; +	int i, r = 0;  	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)  		return -EINVAL; @@ -479,7 +443,9 @@ int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev)  	for (i = 0; i < adev->gfx.num_compute_rings; i++)  		kiq->pmf->kiq_unmap_queues(kiq_ring, &adev->gfx.compute_ring[i],  					   RESET_QUEUES, 0, 0); -	r = amdgpu_ring_test_helper(kiq_ring); + +	if (adev->gfx.kiq.ring.sched.ready) +		r = amdgpu_ring_test_helper(kiq_ring);  	spin_unlock(&adev->gfx.kiq.ring_lock);  	return r; @@ -535,6 +501,9 @@ int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev)  		return r;  	} +	if (adev->enable_mes) +		queue_mask = ~0ULL; +  	kiq->pmf->kiq_set_resources(kiq_ring, queue_mask);  	for (i = 0; i < adev->gfx.num_compute_rings; i++)  		kiq->pmf->kiq_map_queues(kiq_ring, &adev->gfx.compute_ring[i]); @@ -625,17 +594,20 @@ int amdgpu_get_gfx_off_status(struct amdgpu_device *adev, uint32_t *value)  int amdgpu_gfx_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block)  {  	int r; -	r = amdgpu_ras_block_late_init(adev, ras_block); -	if (r) -		return r;  	if (amdgpu_ras_is_supported(adev, ras_block->block)) {  		if (!amdgpu_persistent_edc_harvesting_supported(adev))  			amdgpu_ras_reset_error_status(adev, AMDGPU_RAS_BLOCK__GFX); +		r = amdgpu_ras_block_late_init(adev, ras_block); +		if (r) +			return r; +  		r = amdgpu_irq_get(adev, &adev->gfx.cp_ecc_error_irq, 0);  		if (r)  			goto late_fini; +	} else { +		amdgpu_ras_feature_enable_on_boot(adev, ras_block, 0);  	}  	return 0;  |