forked from mirrors/linux
		
	drm/amdgpu/gmc: use PCI BARs for APUs in passthrough
If the GPU is passed through to a guest VM, use the PCI BAR for CPU FB access rather than the physical address of carve out. The physical address is not valid in a guest. v2: Fix HDP handing as suggested by Michel Reviewed-by: Christian König <christian.koenig@amd.com> Reviewed-by: Michel Dänzer <mdaenzer@redhat.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
		
							parent
							
								
									1647b54ed5
								
							
						
					
					
						commit
						b818a5d374
					
				
					 5 changed files with 8 additions and 7 deletions
				
			
		| 
						 | 
					@ -5733,7 +5733,7 @@ void amdgpu_device_flush_hdp(struct amdgpu_device *adev,
 | 
				
			||||||
		struct amdgpu_ring *ring)
 | 
							struct amdgpu_ring *ring)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef CONFIG_X86_64
 | 
					#ifdef CONFIG_X86_64
 | 
				
			||||||
	if (adev->flags & AMD_IS_APU)
 | 
						if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	if (adev->gmc.xgmi.connected_to_cpu)
 | 
						if (adev->gmc.xgmi.connected_to_cpu)
 | 
				
			||||||
| 
						 | 
					@ -5749,7 +5749,7 @@ void amdgpu_device_invalidate_hdp(struct amdgpu_device *adev,
 | 
				
			||||||
		struct amdgpu_ring *ring)
 | 
							struct amdgpu_ring *ring)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef CONFIG_X86_64
 | 
					#ifdef CONFIG_X86_64
 | 
				
			||||||
	if (adev->flags & AMD_IS_APU)
 | 
						if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev))
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	if (adev->gmc.xgmi.connected_to_cpu)
 | 
						if (adev->gmc.xgmi.connected_to_cpu)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -814,7 +814,7 @@ static int gmc_v10_0_mc_init(struct amdgpu_device *adev)
 | 
				
			||||||
	adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 | 
						adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_X86_64
 | 
					#ifdef CONFIG_X86_64
 | 
				
			||||||
	if (adev->flags & AMD_IS_APU) {
 | 
						if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) {
 | 
				
			||||||
		adev->gmc.aper_base = adev->gfxhub.funcs->get_mc_fb_offset(adev);
 | 
							adev->gmc.aper_base = adev->gfxhub.funcs->get_mc_fb_offset(adev);
 | 
				
			||||||
		adev->gmc.aper_size = adev->gmc.real_vram_size;
 | 
							adev->gmc.aper_size = adev->gmc.real_vram_size;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -381,8 +381,9 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)
 | 
				
			||||||
	adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 | 
						adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_X86_64
 | 
					#ifdef CONFIG_X86_64
 | 
				
			||||||
	if (adev->flags & AMD_IS_APU &&
 | 
						if ((adev->flags & AMD_IS_APU) &&
 | 
				
			||||||
	    adev->gmc.real_vram_size > adev->gmc.aper_size) {
 | 
						    adev->gmc.real_vram_size > adev->gmc.aper_size &&
 | 
				
			||||||
 | 
						    !amdgpu_passthrough(adev)) {
 | 
				
			||||||
		adev->gmc.aper_base = ((u64)RREG32(mmMC_VM_FB_OFFSET)) << 22;
 | 
							adev->gmc.aper_base = ((u64)RREG32(mmMC_VM_FB_OFFSET)) << 22;
 | 
				
			||||||
		adev->gmc.aper_size = adev->gmc.real_vram_size;
 | 
							adev->gmc.aper_size = adev->gmc.real_vram_size;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -581,7 +581,7 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
 | 
				
			||||||
	adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 | 
						adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_X86_64
 | 
					#ifdef CONFIG_X86_64
 | 
				
			||||||
	if (adev->flags & AMD_IS_APU) {
 | 
						if ((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) {
 | 
				
			||||||
		adev->gmc.aper_base = ((u64)RREG32(mmMC_VM_FB_OFFSET)) << 22;
 | 
							adev->gmc.aper_base = ((u64)RREG32(mmMC_VM_FB_OFFSET)) << 22;
 | 
				
			||||||
		adev->gmc.aper_size = adev->gmc.real_vram_size;
 | 
							adev->gmc.aper_size = adev->gmc.real_vram_size;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1456,7 +1456,7 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* check whether both host-gpu and gpu-gpu xgmi links exist */
 | 
						/* check whether both host-gpu and gpu-gpu xgmi links exist */
 | 
				
			||||||
	if ((adev->flags & AMD_IS_APU) ||
 | 
						if (((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) ||
 | 
				
			||||||
	    (adev->gmc.xgmi.supported &&
 | 
						    (adev->gmc.xgmi.supported &&
 | 
				
			||||||
	     adev->gmc.xgmi.connected_to_cpu)) {
 | 
						     adev->gmc.xgmi.connected_to_cpu)) {
 | 
				
			||||||
		adev->gmc.aper_base =
 | 
							adev->gmc.aper_base =
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue