diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 28 | 
1 files changed, 19 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index a025f080aa6a..a8ecf04389b3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c @@ -23,7 +23,12 @@  #include <linux/module.h> +#ifdef CONFIG_X86 +#include <asm/hypervisor.h> +#endif +  #include <drm/drm_drv.h> +#include <xen/xen.h>  #include "amdgpu.h"  #include "amdgpu_ras.h" @@ -710,7 +715,8 @@ void amdgpu_detect_virtualization(struct amdgpu_device *adev)  		adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV;  	if (!reg) { -		if (is_virtual_machine())	/* passthrough mode exclus sriov mod */ +		/* passthrough mode exclus sriov mod */ +		if (is_virtual_machine() && !xen_initial_domain())  			adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;  	} @@ -723,8 +729,12 @@ void amdgpu_detect_virtualization(struct amdgpu_device *adev)  			break;  		case CHIP_VEGA10:  			soc15_set_virt_ops(adev); -			/* send a dummy GPU_INIT_DATA request to host on vega10 */ -			amdgpu_virt_request_init_data(adev); +#ifdef CONFIG_X86 +			/* not send GPU_INIT_DATA with MS_HYPERV*/ +			if (!hypervisor_is_type(X86_HYPER_MS_HYPERV)) +#endif +				/* send a dummy GPU_INIT_DATA request to host on vega10 */ +				amdgpu_virt_request_init_data(adev);  			break;  		case CHIP_VEGA20:  		case CHIP_ARCTURUS: @@ -862,11 +872,11 @@ static u32 amdgpu_virt_rlcg_reg_rw(struct amdgpu_device *adev, u32 offset, u32 v  	uint32_t timeout = 50000;  	uint32_t i, tmp;  	uint32_t ret = 0; -	static void *scratch_reg0; -	static void *scratch_reg1; -	static void *scratch_reg2; -	static void *scratch_reg3; -	static void *spare_int; +	void *scratch_reg0; +	void *scratch_reg1; +	void *scratch_reg2; +	void *scratch_reg3; +	void *spare_int;  	if (!adev->gfx.rlc.rlcg_reg_access_supported) {  		dev_err(adev->dev, @@ -919,7 +929,7 @@ static u32 amdgpu_virt_rlcg_reg_rw(struct amdgpu_device *adev, u32 offset, u32 v  						"wrong operation type, rlcg failed to program reg: 0x%05x\n", offset);  				} else if (tmp & AMDGPU_RLCG_REG_NOT_IN_RANGE) {  					dev_err(adev->dev, -						"regiser is not in range, rlcg failed to program reg: 0x%05x\n", offset); +						"register is not in range, rlcg failed to program reg: 0x%05x\n", offset);  				} else {  					dev_err(adev->dev,  						"unknown error type, rlcg failed to program reg: 0x%05x\n", offset);  |