diff options
| author | Dave Airlie <airlied@redhat.com> | 2019-10-25 22:56:57 +0300 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2019-10-25 22:56:57 +0300 | 
| commit | 3275a71e76fac5bc276f0d60e027b18c2e8d7a5b (patch) | |
| tree | f275ab1c98be91f5e0fda869819e09c05d0918ab /drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | |
| parent | 2e79e22e092acd55da0b2db066e4826d7d152c41 (diff) | |
| parent | 1cd4d9eead73c004d08a58536dc726bd172eaaec (diff) | |
| download | linux-3275a71e76fac5bc276f0d60e027b18c2e8d7a5b.tar.xz | |
Merge tag 'drm-next-5.5-2019-10-09' of git://people.freedesktop.org/~agd5f/linux into drm-next
drm-next-5.5-2019-10-09:
amdgpu:
- Additional RAS enablement for vega20
- RAS page retirement and bad page storage in EEPROM
- No GPU reset with unrecoverable RAS errors
- Reserve vram for page tables rather than trying to evict
- Fix issues with GPU reset and xgmi hives
- DC i2c over aux fixes
- Direct submission for clears, PTE/PDE updates
- Improvements to help support recoverable GPU page faults
- Silence harmless SAD block messages
- Clean up code for creating a bo at a fixed location
- Initial DC HDCP support
- Lots of documentation fixes
- GPU reset for renoir
- Add IH clockgating support for soc15 asics
- Powerplay improvements
- DC MST cleanups
- Add support for MSI-X
- Misc cleanups and bug fixes
amdkfd:
- Query KFD device info by asic type rather than pci ids
- Add navi14 support
- Add renoir support
- Add navi12 support
- gfx10 trap handler improvements
- pasid cleanups
- Check against device cgroup
ttm:
- Return -EBUSY with pipelining with no_gpu_wait
radeon:
- Silence harmless SAD block messages
device_cgroup:
- Export devcgroup_check_permission
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191010041713.3412-1-alexander.deucher@amd.com
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 74 | 
1 files changed, 41 insertions, 33 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 6d021ecc8d59..a07897e21526 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -33,11 +33,6 @@  #include "amdgpu_amdkfd.h"  #include "amdgpu_dma_buf.h" -/* Special VM and GART address alignment needed for VI pre-Fiji due to - * a HW bug. - */ -#define VI_BO_SIZE_ALIGN (0x8000) -  /* BO flag to indicate a KFD userptr BO */  #define AMDGPU_AMDKFD_USERPTR_BO (1ULL << 63) @@ -349,13 +344,46 @@ static int vm_update_pds(struct amdgpu_vm *vm, struct amdgpu_sync *sync)  	struct amdgpu_device *adev = amdgpu_ttm_adev(pd->tbo.bdev);  	int ret; -	ret = amdgpu_vm_update_directories(adev, vm); +	ret = amdgpu_vm_update_pdes(adev, vm, false);  	if (ret)  		return ret;  	return amdgpu_sync_fence(NULL, sync, vm->last_update, false);  } +static uint64_t get_pte_flags(struct amdgpu_device *adev, struct kgd_mem *mem) +{ +	struct amdgpu_device *bo_adev = amdgpu_ttm_adev(mem->bo->tbo.bdev); +	bool coherent = mem->alloc_flags & ALLOC_MEM_FLAGS_COHERENT; +	uint32_t mapping_flags; + +	mapping_flags = AMDGPU_VM_PAGE_READABLE; +	if (mem->alloc_flags & ALLOC_MEM_FLAGS_WRITABLE) +		mapping_flags |= AMDGPU_VM_PAGE_WRITEABLE; +	if (mem->alloc_flags & ALLOC_MEM_FLAGS_EXECUTABLE) +		mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE; + +	switch (adev->asic_type) { +	case CHIP_ARCTURUS: +		if (mem->alloc_flags & ALLOC_MEM_FLAGS_VRAM) { +			if (bo_adev == adev) +				mapping_flags |= coherent ? +					AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW; +			else +				mapping_flags |= AMDGPU_VM_MTYPE_UC; +		} else { +			mapping_flags |= coherent ? +				AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC; +		} +		break; +	default: +		mapping_flags |= coherent ? +			AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC; +	} + +	return amdgpu_gem_va_map_flags(adev, mapping_flags); +} +  /* add_bo_to_vm - Add a BO to a VM   *   * Everything that needs to bo done only once when a BO is first added @@ -404,8 +432,7 @@ static int add_bo_to_vm(struct amdgpu_device *adev, struct kgd_mem *mem,  	}  	bo_va_entry->va = va; -	bo_va_entry->pte_flags = amdgpu_gmc_get_pte_flags(adev, -							 mem->mapping_flags); +	bo_va_entry->pte_flags = get_pte_flags(adev, mem);  	bo_va_entry->kgd_dev = (void *)adev;  	list_add(&bo_va_entry->bo_list, list_bo_va); @@ -1079,10 +1106,8 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  	uint64_t user_addr = 0;  	struct amdgpu_bo *bo;  	struct amdgpu_bo_param bp; -	int byte_align;  	u32 domain, alloc_domain;  	u64 alloc_flags; -	uint32_t mapping_flags;  	int ret;  	/* @@ -1135,25 +1160,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  	if ((*mem)->aql_queue)  		size = size >> 1; -	/* Workaround for TLB bug on older VI chips */ -	byte_align = (adev->family == AMDGPU_FAMILY_VI && -			adev->asic_type != CHIP_FIJI && -			adev->asic_type != CHIP_POLARIS10 && -			adev->asic_type != CHIP_POLARIS11 && -			adev->asic_type != CHIP_POLARIS12 && -			adev->asic_type != CHIP_VEGAM) ? -			VI_BO_SIZE_ALIGN : 1; - -	mapping_flags = AMDGPU_VM_PAGE_READABLE; -	if (flags & ALLOC_MEM_FLAGS_WRITABLE) -		mapping_flags |= AMDGPU_VM_PAGE_WRITEABLE; -	if (flags & ALLOC_MEM_FLAGS_EXECUTABLE) -		mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE; -	if (flags & ALLOC_MEM_FLAGS_COHERENT) -		mapping_flags |= AMDGPU_VM_MTYPE_UC; -	else -		mapping_flags |= AMDGPU_VM_MTYPE_NC; -	(*mem)->mapping_flags = mapping_flags; +	(*mem)->alloc_flags = flags;  	amdgpu_sync_create(&(*mem)->sync); @@ -1168,7 +1175,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  	memset(&bp, 0, sizeof(bp));  	bp.size = size; -	bp.byte_align = byte_align; +	bp.byte_align = 1;  	bp.domain = alloc_domain;  	bp.flags = alloc_flags;  	bp.type = bo_type; @@ -1626,9 +1633,10 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,  	INIT_LIST_HEAD(&(*mem)->bo_va_list);  	mutex_init(&(*mem)->lock); -	(*mem)->mapping_flags = -		AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE | -		AMDGPU_VM_PAGE_EXECUTABLE | AMDGPU_VM_MTYPE_NC; +	(*mem)->alloc_flags = +		((bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ? +		 ALLOC_MEM_FLAGS_VRAM : ALLOC_MEM_FLAGS_GTT) | +		ALLOC_MEM_FLAGS_WRITABLE | ALLOC_MEM_FLAGS_EXECUTABLE;  	(*mem)->bo = amdgpu_bo_ref(bo);  	(*mem)->va = va;  | 
