forked from mirrors/linux
		
	drm/amdgpu: validate resume before function call
Before making a function call to resume, validate the function pointer like we do in sw_init. Use the helper function amdgpu_ip_block_resume where same checks and calls are repeated. Signed-off-by: Sunil Khatri <sunil.khatri@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
		
							parent
							
								
									e095026f00
								
							
						
					
					
						commit
						502d76308d
					
				
					 5 changed files with 49 additions and 60 deletions
				
			
		|  | @ -239,7 +239,7 @@ static int aldebaran_mode2_restore_ip(struct amdgpu_device *adev) | |||
| 		dev_err(adev->dev, "Failed to get BIF handle\n"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	r = cmn_block->version->funcs->resume(cmn_block); | ||||
| 	r = amdgpu_ip_block_resume(cmn_block); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
|  | @ -275,15 +275,10 @@ static int aldebaran_mode2_restore_ip(struct amdgpu_device *adev) | |||
| 		      adev->ip_blocks[i].version->type == | ||||
| 			      AMD_IP_BLOCK_TYPE_SDMA)) | ||||
| 			continue; | ||||
| 		r = adev->ip_blocks[i].version->funcs->resume(&adev->ip_blocks[i]); | ||||
| 		if (r) { | ||||
| 			dev_err(adev->dev, | ||||
| 				"resume of IP block <%s> failed %d\n", | ||||
| 				adev->ip_blocks[i].version->funcs->name, r); | ||||
| 			return r; | ||||
| 		} | ||||
| 
 | ||||
| 		adev->ip_blocks[i].status.hw = true; | ||||
| 		r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	for (i = 0; i < adev->num_ip_blocks; i++) { | ||||
|  |  | |||
|  | @ -365,6 +365,8 @@ bool amdgpu_device_ip_is_valid(struct amdgpu_device *adev, | |||
| 			      enum amd_ip_block_type block_type); | ||||
| int amdgpu_ip_block_suspend(struct amdgpu_ip_block *ip_block); | ||||
| 
 | ||||
| int amdgpu_ip_block_resume(struct amdgpu_ip_block *ip_block); | ||||
| 
 | ||||
| #define AMDGPU_MAX_IP_NUM 16 | ||||
| 
 | ||||
| struct amdgpu_ip_block_status { | ||||
|  |  | |||
|  | @ -290,6 +290,24 @@ int amdgpu_ip_block_suspend(struct amdgpu_ip_block *ip_block) | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int amdgpu_ip_block_resume(struct amdgpu_ip_block *ip_block) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	if (ip_block->version->funcs->resume) { | ||||
| 		r = ip_block->version->funcs->resume(ip_block); | ||||
| 		if (r) { | ||||
| 			dev_err(ip_block->adev->dev, | ||||
| 				"resume of IP block <%s> failed %d\n", | ||||
| 				ip_block->version->funcs->name, r); | ||||
| 			return r; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	ip_block->status.hw = true; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * DOC: board_info | ||||
|  * | ||||
|  | @ -2762,12 +2780,9 @@ static int amdgpu_device_fw_loading(struct amdgpu_device *adev) | |||
| 				break; | ||||
| 
 | ||||
| 			if (amdgpu_in_reset(adev) || adev->in_suspend) { | ||||
| 				r = adev->ip_blocks[i].version->funcs->resume(&adev->ip_blocks[i]); | ||||
| 				if (r) { | ||||
| 					DRM_ERROR("resume of IP block <%s> failed %d\n", | ||||
| 							  adev->ip_blocks[i].version->funcs->name, r); | ||||
| 				r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); | ||||
| 				if (r) | ||||
| 					return r; | ||||
| 				} | ||||
| 			} else { | ||||
| 				r = adev->ip_blocks[i].version->funcs->hw_init(&adev->ip_blocks[i]); | ||||
| 				if (r) { | ||||
|  | @ -2775,9 +2790,8 @@ static int amdgpu_device_fw_loading(struct amdgpu_device *adev) | |||
| 							  adev->ip_blocks[i].version->funcs->name, r); | ||||
| 					return r; | ||||
| 				} | ||||
| 				adev->ip_blocks[i].status.hw = true; | ||||
| 			} | ||||
| 
 | ||||
| 			adev->ip_blocks[i].status.hw = true; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
|  | @ -3682,15 +3696,19 @@ static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev) | |||
| 				block->status.hw) | ||||
| 				continue; | ||||
| 
 | ||||
| 			if (block->version->type == AMD_IP_BLOCK_TYPE_SMC) | ||||
| 				r = block->version->funcs->resume(&adev->ip_blocks[i]); | ||||
| 			else | ||||
| 			if (block->version->type == AMD_IP_BLOCK_TYPE_SMC) { | ||||
| 				r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); | ||||
| 				if (r) | ||||
| 					return r; | ||||
| 			} else { | ||||
| 				r = block->version->funcs->hw_init(&adev->ip_blocks[i]); | ||||
| 
 | ||||
| 			DRM_INFO("RE-INIT-late: %s %s\n", block->version->funcs->name, r?"failed":"succeeded"); | ||||
| 			if (r) | ||||
| 				return r; | ||||
| 			block->status.hw = true; | ||||
| 				if (r) { | ||||
| 					DRM_ERROR("hw_init of IP block <%s> failed %d\n", | ||||
| 						  adev->ip_blocks[i].version->funcs->name, r); | ||||
| 					return r; | ||||
| 				} | ||||
| 				block->status.hw = true; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -3721,13 +3739,9 @@ static int amdgpu_device_ip_resume_phase1(struct amdgpu_device *adev) | |||
| 		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH || | ||||
| 		    (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP && amdgpu_sriov_vf(adev))) { | ||||
| 
 | ||||
| 			r = adev->ip_blocks[i].version->funcs->resume(&adev->ip_blocks[i]); | ||||
| 			if (r) { | ||||
| 				DRM_ERROR("resume of IP block <%s> failed %d\n", | ||||
| 					  adev->ip_blocks[i].version->funcs->name, r); | ||||
| 			r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); | ||||
| 			if (r) | ||||
| 				return r; | ||||
| 			} | ||||
| 			adev->ip_blocks[i].status.hw = true; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -3759,13 +3773,9 @@ static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev) | |||
| 		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH || | ||||
| 		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) | ||||
| 			continue; | ||||
| 		r = adev->ip_blocks[i].version->funcs->resume(&adev->ip_blocks[i]); | ||||
| 		if (r) { | ||||
| 			DRM_ERROR("resume of IP block <%s> failed %d\n", | ||||
| 				  adev->ip_blocks[i].version->funcs->name, r); | ||||
| 		r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 		} | ||||
| 		adev->ip_blocks[i].status.hw = true; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
|  |  | |||
|  | @ -169,15 +169,9 @@ static int sienna_cichlid_mode2_restore_ip(struct amdgpu_device *adev) | |||
| 
 | ||||
| 	for (i = 0; i < adev->num_ip_blocks; i++) { | ||||
| 		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH) { | ||||
| 			r = adev->ip_blocks[i].version->funcs->resume(&adev->ip_blocks[i]); | ||||
| 			if (r) { | ||||
| 				dev_err(adev->dev, | ||||
| 					"resume of IP block <%s> failed %d\n", | ||||
| 					adev->ip_blocks[i].version->funcs->name, r); | ||||
| 			r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); | ||||
| 			if (r) | ||||
| 				return r; | ||||
| 			} | ||||
| 
 | ||||
| 			adev->ip_blocks[i].status.hw = true; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -187,15 +181,9 @@ static int sienna_cichlid_mode2_restore_ip(struct amdgpu_device *adev) | |||
| 		      adev->ip_blocks[i].version->type == | ||||
| 			      AMD_IP_BLOCK_TYPE_SDMA)) | ||||
| 			continue; | ||||
| 		r = adev->ip_blocks[i].version->funcs->resume(&adev->ip_blocks[i]); | ||||
| 		if (r) { | ||||
| 			dev_err(adev->dev, | ||||
| 				"resume of IP block <%s> failed %d\n", | ||||
| 				adev->ip_blocks[i].version->funcs->name, r); | ||||
| 		r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 		} | ||||
| 
 | ||||
| 		adev->ip_blocks[i].status.hw = true; | ||||
| 	} | ||||
| 
 | ||||
| 	for (i = 0; i < adev->num_ip_blocks; i++) { | ||||
|  |  | |||
|  | @ -180,15 +180,9 @@ static int smu_v13_0_10_mode2_restore_ip(struct amdgpu_device *adev) | |||
| 		      adev->ip_blocks[i].version->type == | ||||
| 			      AMD_IP_BLOCK_TYPE_SDMA)) | ||||
| 			continue; | ||||
| 		r = adev->ip_blocks[i].version->funcs->resume(&adev->ip_blocks[i]); | ||||
| 		if (r) { | ||||
| 			dev_err(adev->dev, | ||||
| 				"resume of IP block <%s> failed %d\n", | ||||
| 				adev->ip_blocks[i].version->funcs->name, r); | ||||
| 		r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 		} | ||||
| 
 | ||||
| 		adev->ip_blocks[i].status.hw = true; | ||||
| 	} | ||||
| 
 | ||||
| 	for (i = 0; i < adev->num_ip_blocks; i++) { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Sunil Khatri
						Sunil Khatri