drm/amdgpu: Add GPUVM memory management functions for KFD
v2: * Removed unused flags from struct kgd_mem * Updated some comments * Added a check to unmap_memory_from_gpu whether BO was mapped v3: add mutex_destroy in relevant places Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Acked-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
This commit is contained in:
parent
3c728d3aa1
commit
a46a2cd103
@ -767,6 +767,7 @@ F: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
|
|||||||
F: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
|
F: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
|
||||||
F: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
|
F: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
|
||||||
F: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
|
F: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
|
||||||
|
F: drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
|
||||||
F: drivers/gpu/drm/amd/amdkfd/
|
F: drivers/gpu/drm/amd/amdkfd/
|
||||||
F: drivers/gpu/drm/amd/include/cik_structs.h
|
F: drivers/gpu/drm/amd/include/cik_structs.h
|
||||||
F: drivers/gpu/drm/amd/include/kgd_kfd_interface.h
|
F: drivers/gpu/drm/amd/include/kgd_kfd_interface.h
|
||||||
|
@ -130,6 +130,7 @@ amdgpu-y += \
|
|||||||
amdgpu-y += \
|
amdgpu-y += \
|
||||||
amdgpu_amdkfd.o \
|
amdgpu_amdkfd.o \
|
||||||
amdgpu_amdkfd_fence.o \
|
amdgpu_amdkfd_fence.o \
|
||||||
|
amdgpu_amdkfd_gpuvm.o \
|
||||||
amdgpu_amdkfd_gfx_v8.o
|
amdgpu_amdkfd_gfx_v8.o
|
||||||
|
|
||||||
# add cgs
|
# add cgs
|
||||||
|
@ -58,6 +58,7 @@ int amdgpu_amdkfd_init(void)
|
|||||||
#else
|
#else
|
||||||
ret = -ENOENT;
|
ret = -ENOENT;
|
||||||
#endif
|
#endif
|
||||||
|
amdgpu_amdkfd_gpuvm_init_mem_limits();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -28,15 +28,41 @@
|
|||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/mmu_context.h>
|
#include <linux/mmu_context.h>
|
||||||
#include <kgd_kfd_interface.h>
|
#include <kgd_kfd_interface.h>
|
||||||
|
#include <drm/ttm/ttm_execbuf_util.h>
|
||||||
|
#include "amdgpu_sync.h"
|
||||||
|
#include "amdgpu_vm.h"
|
||||||
|
|
||||||
extern const struct kgd2kfd_calls *kgd2kfd;
|
extern const struct kgd2kfd_calls *kgd2kfd;
|
||||||
|
|
||||||
struct amdgpu_device;
|
struct amdgpu_device;
|
||||||
|
|
||||||
|
struct kfd_bo_va_list {
|
||||||
|
struct list_head bo_list;
|
||||||
|
struct amdgpu_bo_va *bo_va;
|
||||||
|
void *kgd_dev;
|
||||||
|
bool is_mapped;
|
||||||
|
uint64_t va;
|
||||||
|
uint64_t pte_flags;
|
||||||
|
};
|
||||||
|
|
||||||
struct kgd_mem {
|
struct kgd_mem {
|
||||||
|
struct mutex lock;
|
||||||
struct amdgpu_bo *bo;
|
struct amdgpu_bo *bo;
|
||||||
uint64_t gpu_addr;
|
struct list_head bo_va_list;
|
||||||
void *cpu_ptr;
|
/* protected by amdkfd_process_info.lock */
|
||||||
|
struct ttm_validate_buffer validate_list;
|
||||||
|
struct ttm_validate_buffer resv_list;
|
||||||
|
uint32_t domain;
|
||||||
|
unsigned int mapped_to_gpu_memory;
|
||||||
|
uint64_t va;
|
||||||
|
|
||||||
|
uint32_t mapping_flags;
|
||||||
|
|
||||||
|
struct amdkfd_process_info *process_info;
|
||||||
|
|
||||||
|
struct amdgpu_sync sync;
|
||||||
|
|
||||||
|
bool aql_queue;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* KFD Memory Eviction */
|
/* KFD Memory Eviction */
|
||||||
@ -52,6 +78,41 @@ struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context,
|
|||||||
bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm);
|
bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm);
|
||||||
struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f);
|
struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f);
|
||||||
|
|
||||||
|
struct amdkfd_process_info {
|
||||||
|
/* List head of all VMs that belong to a KFD process */
|
||||||
|
struct list_head vm_list_head;
|
||||||
|
/* List head for all KFD BOs that belong to a KFD process. */
|
||||||
|
struct list_head kfd_bo_list;
|
||||||
|
/* Lock to protect kfd_bo_list */
|
||||||
|
struct mutex lock;
|
||||||
|
|
||||||
|
/* Number of VMs */
|
||||||
|
unsigned int n_vms;
|
||||||
|
/* Eviction Fence */
|
||||||
|
struct amdgpu_amdkfd_fence *eviction_fence;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* struct amdkfd_vm -
|
||||||
|
* For Memory Eviction KGD requires a mechanism to keep track of all KFD BOs
|
||||||
|
* belonging to a KFD process. All the VMs belonging to the same process point
|
||||||
|
* to the same amdkfd_process_info.
|
||||||
|
*/
|
||||||
|
struct amdkfd_vm {
|
||||||
|
/* Keep base as the first parameter for pointer compatibility between
|
||||||
|
* amdkfd_vm and amdgpu_vm.
|
||||||
|
*/
|
||||||
|
struct amdgpu_vm base;
|
||||||
|
|
||||||
|
/* List node in amdkfd_process_info.vm_list_head*/
|
||||||
|
struct list_head vm_list_node;
|
||||||
|
|
||||||
|
struct amdgpu_device *adev;
|
||||||
|
/* Points to the KFD process VM info*/
|
||||||
|
struct amdkfd_process_info *process_info;
|
||||||
|
|
||||||
|
uint64_t pd_phys_addr;
|
||||||
|
};
|
||||||
|
|
||||||
int amdgpu_amdkfd_init(void);
|
int amdgpu_amdkfd_init(void);
|
||||||
void amdgpu_amdkfd_fini(void);
|
void amdgpu_amdkfd_fini(void);
|
||||||
|
|
||||||
@ -96,4 +157,30 @@ uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd);
|
|||||||
valid; \
|
valid; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/* GPUVM API */
|
||||||
|
int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, void **vm,
|
||||||
|
void **process_info,
|
||||||
|
struct dma_fence **ef);
|
||||||
|
void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm);
|
||||||
|
uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm);
|
||||||
|
int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
|
||||||
|
struct kgd_dev *kgd, uint64_t va, uint64_t size,
|
||||||
|
void *vm, struct kgd_mem **mem,
|
||||||
|
uint64_t *offset, uint32_t flags);
|
||||||
|
int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
|
||||||
|
struct kgd_dev *kgd, struct kgd_mem *mem);
|
||||||
|
int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
|
||||||
|
struct kgd_dev *kgd, struct kgd_mem *mem, void *vm);
|
||||||
|
int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
|
||||||
|
struct kgd_dev *kgd, struct kgd_mem *mem, void *vm);
|
||||||
|
int amdgpu_amdkfd_gpuvm_sync_memory(
|
||||||
|
struct kgd_dev *kgd, struct kgd_mem *mem, bool intr);
|
||||||
|
int amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct kgd_dev *kgd,
|
||||||
|
struct kgd_mem *mem, void **kptr, uint64_t *size);
|
||||||
|
int amdgpu_amdkfd_gpuvm_restore_process_bos(void *process_info,
|
||||||
|
struct dma_fence **ef);
|
||||||
|
|
||||||
|
void amdgpu_amdkfd_gpuvm_init_mem_limits(void);
|
||||||
|
void amdgpu_amdkfd_unreserve_system_memory_limit(struct amdgpu_bo *bo);
|
||||||
|
|
||||||
#endif /* AMDGPU_AMDKFD_H_INCLUDED */
|
#endif /* AMDGPU_AMDKFD_H_INCLUDED */
|
||||||
|
@ -143,6 +143,10 @@ static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
|
|||||||
static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
|
static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
|
||||||
static void set_scratch_backing_va(struct kgd_dev *kgd,
|
static void set_scratch_backing_va(struct kgd_dev *kgd,
|
||||||
uint64_t va, uint32_t vmid);
|
uint64_t va, uint32_t vmid);
|
||||||
|
static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
|
||||||
|
uint32_t page_table_base);
|
||||||
|
static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid);
|
||||||
|
static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
|
||||||
|
|
||||||
/* Because of REG_GET_FIELD() being used, we put this function in the
|
/* Because of REG_GET_FIELD() being used, we put this function in the
|
||||||
* asic specific file.
|
* asic specific file.
|
||||||
@ -199,7 +203,20 @@ static const struct kfd2kgd_calls kfd2kgd = {
|
|||||||
.set_scratch_backing_va = set_scratch_backing_va,
|
.set_scratch_backing_va = set_scratch_backing_va,
|
||||||
.get_tile_config = get_tile_config,
|
.get_tile_config = get_tile_config,
|
||||||
.get_cu_info = get_cu_info,
|
.get_cu_info = get_cu_info,
|
||||||
.get_vram_usage = amdgpu_amdkfd_get_vram_usage
|
.get_vram_usage = amdgpu_amdkfd_get_vram_usage,
|
||||||
|
.create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
|
||||||
|
.destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
|
||||||
|
.get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
|
||||||
|
.set_vm_context_page_table_base = set_vm_context_page_table_base,
|
||||||
|
.alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
|
||||||
|
.free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
|
||||||
|
.map_memory_to_gpu = amdgpu_amdkfd_gpuvm_map_memory_to_gpu,
|
||||||
|
.unmap_memory_to_gpu = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu,
|
||||||
|
.sync_memory = amdgpu_amdkfd_gpuvm_sync_memory,
|
||||||
|
.map_gtt_bo_to_kernel = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel,
|
||||||
|
.restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos,
|
||||||
|
.invalidate_tlbs = invalidate_tlbs,
|
||||||
|
.invalidate_tlbs_vmid = invalidate_tlbs_vmid,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void)
|
struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void)
|
||||||
@ -855,3 +872,50 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type)
|
|||||||
return hdr->common.ucode_version;
|
return hdr->common.ucode_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
|
||||||
|
uint32_t page_table_base)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = get_amdgpu_device(kgd);
|
||||||
|
|
||||||
|
if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
|
||||||
|
pr_err("trying to set page table base for wrong VMID\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, page_table_base);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
|
||||||
|
int vmid;
|
||||||
|
unsigned int tmp;
|
||||||
|
|
||||||
|
for (vmid = 0; vmid < 16; vmid++) {
|
||||||
|
if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tmp = RREG32(mmATC_VMID0_PASID_MAPPING + vmid);
|
||||||
|
if ((tmp & ATC_VMID0_PASID_MAPPING__VALID_MASK) &&
|
||||||
|
(tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) {
|
||||||
|
WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
|
||||||
|
RREG32(mmVM_INVALIDATE_RESPONSE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
|
||||||
|
|
||||||
|
if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
|
||||||
|
pr_err("non kfd vmid\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
|
||||||
|
RREG32(mmVM_INVALIDATE_RESPONSE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -101,6 +101,10 @@ static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
|
|||||||
static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
|
static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
|
||||||
static void set_scratch_backing_va(struct kgd_dev *kgd,
|
static void set_scratch_backing_va(struct kgd_dev *kgd,
|
||||||
uint64_t va, uint32_t vmid);
|
uint64_t va, uint32_t vmid);
|
||||||
|
static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
|
||||||
|
uint32_t page_table_base);
|
||||||
|
static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid);
|
||||||
|
static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
|
||||||
|
|
||||||
/* Because of REG_GET_FIELD() being used, we put this function in the
|
/* Because of REG_GET_FIELD() being used, we put this function in the
|
||||||
* asic specific file.
|
* asic specific file.
|
||||||
@ -159,7 +163,20 @@ static const struct kfd2kgd_calls kfd2kgd = {
|
|||||||
.set_scratch_backing_va = set_scratch_backing_va,
|
.set_scratch_backing_va = set_scratch_backing_va,
|
||||||
.get_tile_config = get_tile_config,
|
.get_tile_config = get_tile_config,
|
||||||
.get_cu_info = get_cu_info,
|
.get_cu_info = get_cu_info,
|
||||||
.get_vram_usage = amdgpu_amdkfd_get_vram_usage
|
.get_vram_usage = amdgpu_amdkfd_get_vram_usage,
|
||||||
|
.create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
|
||||||
|
.destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
|
||||||
|
.get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
|
||||||
|
.set_vm_context_page_table_base = set_vm_context_page_table_base,
|
||||||
|
.alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
|
||||||
|
.free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
|
||||||
|
.map_memory_to_gpu = amdgpu_amdkfd_gpuvm_map_memory_to_gpu,
|
||||||
|
.unmap_memory_to_gpu = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu,
|
||||||
|
.sync_memory = amdgpu_amdkfd_gpuvm_sync_memory,
|
||||||
|
.map_gtt_bo_to_kernel = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel,
|
||||||
|
.restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos,
|
||||||
|
.invalidate_tlbs = invalidate_tlbs,
|
||||||
|
.invalidate_tlbs_vmid = invalidate_tlbs_vmid,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void)
|
struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void)
|
||||||
@ -816,3 +833,51 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type)
|
|||||||
/* Only 12 bit in use*/
|
/* Only 12 bit in use*/
|
||||||
return hdr->common.ucode_version;
|
return hdr->common.ucode_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
|
||||||
|
uint32_t page_table_base)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = get_amdgpu_device(kgd);
|
||||||
|
|
||||||
|
if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
|
||||||
|
pr_err("trying to set page table base for wrong VMID\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, page_table_base);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
|
||||||
|
int vmid;
|
||||||
|
unsigned int tmp;
|
||||||
|
|
||||||
|
for (vmid = 0; vmid < 16; vmid++) {
|
||||||
|
if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tmp = RREG32(mmATC_VMID0_PASID_MAPPING + vmid);
|
||||||
|
if ((tmp & ATC_VMID0_PASID_MAPPING__VALID_MASK) &&
|
||||||
|
(tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) {
|
||||||
|
WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
|
||||||
|
RREG32(mmVM_INVALIDATE_RESPONSE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
|
||||||
|
|
||||||
|
if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
|
||||||
|
pr_err("non kfd vmid %d\n", vmid);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
|
||||||
|
RREG32(mmVM_INVALIDATE_RESPONSE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
1506
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
Normal file
1506
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -36,6 +36,7 @@
|
|||||||
#include <drm/drm_cache.h>
|
#include <drm/drm_cache.h>
|
||||||
#include "amdgpu.h"
|
#include "amdgpu.h"
|
||||||
#include "amdgpu_trace.h"
|
#include "amdgpu_trace.h"
|
||||||
|
#include "amdgpu_amdkfd.h"
|
||||||
|
|
||||||
static bool amdgpu_need_backup(struct amdgpu_device *adev)
|
static bool amdgpu_need_backup(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
@ -54,6 +55,9 @@ static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
|
|||||||
struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
|
struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
|
||||||
struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
|
struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo);
|
||||||
|
|
||||||
|
if (bo->kfd_bo)
|
||||||
|
amdgpu_amdkfd_unreserve_system_memory_limit(bo);
|
||||||
|
|
||||||
amdgpu_bo_kunmap(bo);
|
amdgpu_bo_kunmap(bo);
|
||||||
|
|
||||||
drm_gem_object_release(&bo->gem_base);
|
drm_gem_object_release(&bo->gem_base);
|
||||||
|
@ -92,6 +92,8 @@ struct amdgpu_bo {
|
|||||||
struct list_head mn_list;
|
struct list_head mn_list;
|
||||||
struct list_head shadow_list;
|
struct list_head shadow_list;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct kgd_mem *kfd_bo;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo)
|
static inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo)
|
||||||
|
@ -259,6 +259,13 @@ static int amdgpu_verify_access(struct ttm_buffer_object *bo, struct file *filp)
|
|||||||
{
|
{
|
||||||
struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
|
struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Don't verify access for KFD BOs. They don't have a GEM
|
||||||
|
* object associated with them.
|
||||||
|
*/
|
||||||
|
if (abo->kfd_bo)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (amdgpu_ttm_tt_get_usermm(bo->ttm))
|
if (amdgpu_ttm_tt_get_usermm(bo->ttm))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
return drm_vma_node_verify_access(&abo->gem_base.vma_node,
|
return drm_vma_node_verify_access(&abo->gem_base.vma_node,
|
||||||
|
@ -127,6 +127,25 @@ struct tile_config {
|
|||||||
uint32_t num_ranks;
|
uint32_t num_ranks;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocation flag domains
|
||||||
|
*/
|
||||||
|
#define ALLOC_MEM_FLAGS_VRAM (1 << 0)
|
||||||
|
#define ALLOC_MEM_FLAGS_GTT (1 << 1)
|
||||||
|
#define ALLOC_MEM_FLAGS_USERPTR (1 << 2) /* TODO */
|
||||||
|
#define ALLOC_MEM_FLAGS_DOORBELL (1 << 3) /* TODO */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocation flags attributes/access options.
|
||||||
|
*/
|
||||||
|
#define ALLOC_MEM_FLAGS_WRITABLE (1 << 31)
|
||||||
|
#define ALLOC_MEM_FLAGS_EXECUTABLE (1 << 30)
|
||||||
|
#define ALLOC_MEM_FLAGS_PUBLIC (1 << 29)
|
||||||
|
#define ALLOC_MEM_FLAGS_NO_SUBSTITUTE (1 << 28) /* TODO */
|
||||||
|
#define ALLOC_MEM_FLAGS_AQL_QUEUE_MEM (1 << 27)
|
||||||
|
#define ALLOC_MEM_FLAGS_COHERENT (1 << 26) /* For GFXv9 or later */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct kfd2kgd_calls
|
* struct kfd2kgd_calls
|
||||||
*
|
*
|
||||||
@ -186,6 +205,41 @@ struct tile_config {
|
|||||||
*
|
*
|
||||||
* @get_vram_usage: Returns current VRAM usage
|
* @get_vram_usage: Returns current VRAM usage
|
||||||
*
|
*
|
||||||
|
* @create_process_vm: Create a VM address space for a given process and GPU
|
||||||
|
*
|
||||||
|
* @destroy_process_vm: Destroy a VM
|
||||||
|
*
|
||||||
|
* @get_process_page_dir: Get physical address of a VM page directory
|
||||||
|
*
|
||||||
|
* @set_vm_context_page_table_base: Program page table base for a VMID
|
||||||
|
*
|
||||||
|
* @alloc_memory_of_gpu: Allocate GPUVM memory
|
||||||
|
*
|
||||||
|
* @free_memory_of_gpu: Free GPUVM memory
|
||||||
|
*
|
||||||
|
* @map_memory_to_gpu: Map GPUVM memory into a specific VM address
|
||||||
|
* space. Allocates and updates page tables and page directories as
|
||||||
|
* needed. This function may return before all page table updates have
|
||||||
|
* completed. This allows multiple map operations (on multiple GPUs)
|
||||||
|
* to happen concurrently. Use sync_memory to synchronize with all
|
||||||
|
* pending updates.
|
||||||
|
*
|
||||||
|
* @unmap_memor_to_gpu: Unmap GPUVM memory from a specific VM address space
|
||||||
|
*
|
||||||
|
* @sync_memory: Wait for pending page table updates to complete
|
||||||
|
*
|
||||||
|
* @map_gtt_bo_to_kernel: Map a GTT BO for kernel access
|
||||||
|
* Pins the BO, maps it to kernel address space. Such BOs are never evicted.
|
||||||
|
* The kernel virtual address remains valid until the BO is freed.
|
||||||
|
*
|
||||||
|
* @restore_process_bos: Restore all BOs that belong to the
|
||||||
|
* process. This is intended for restoring memory mappings after a TTM
|
||||||
|
* eviction.
|
||||||
|
*
|
||||||
|
* @invalidate_tlbs: Invalidate TLBs for a specific PASID
|
||||||
|
*
|
||||||
|
* @invalidate_tlbs_vmid: Invalidate TLBs for a specific VMID
|
||||||
|
*
|
||||||
* This structure contains function pointers to services that the kgd driver
|
* This structure contains function pointers to services that the kgd driver
|
||||||
* provides to amdkfd driver.
|
* provides to amdkfd driver.
|
||||||
*
|
*
|
||||||
@ -275,6 +329,29 @@ struct kfd2kgd_calls {
|
|||||||
void (*get_cu_info)(struct kgd_dev *kgd,
|
void (*get_cu_info)(struct kgd_dev *kgd,
|
||||||
struct kfd_cu_info *cu_info);
|
struct kfd_cu_info *cu_info);
|
||||||
uint64_t (*get_vram_usage)(struct kgd_dev *kgd);
|
uint64_t (*get_vram_usage)(struct kgd_dev *kgd);
|
||||||
|
|
||||||
|
int (*create_process_vm)(struct kgd_dev *kgd, void **vm,
|
||||||
|
void **process_info, struct dma_fence **ef);
|
||||||
|
void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm);
|
||||||
|
uint32_t (*get_process_page_dir)(void *vm);
|
||||||
|
void (*set_vm_context_page_table_base)(struct kgd_dev *kgd,
|
||||||
|
uint32_t vmid, uint32_t page_table_base);
|
||||||
|
int (*alloc_memory_of_gpu)(struct kgd_dev *kgd, uint64_t va,
|
||||||
|
uint64_t size, void *vm,
|
||||||
|
struct kgd_mem **mem, uint64_t *offset,
|
||||||
|
uint32_t flags);
|
||||||
|
int (*free_memory_of_gpu)(struct kgd_dev *kgd, struct kgd_mem *mem);
|
||||||
|
int (*map_memory_to_gpu)(struct kgd_dev *kgd, struct kgd_mem *mem,
|
||||||
|
void *vm);
|
||||||
|
int (*unmap_memory_to_gpu)(struct kgd_dev *kgd, struct kgd_mem *mem,
|
||||||
|
void *vm);
|
||||||
|
int (*sync_memory)(struct kgd_dev *kgd, struct kgd_mem *mem, bool intr);
|
||||||
|
int (*map_gtt_bo_to_kernel)(struct kgd_dev *kgd, struct kgd_mem *mem,
|
||||||
|
void **kptr, uint64_t *size);
|
||||||
|
int (*restore_process_bos)(void *process_info, struct dma_fence **ef);
|
||||||
|
|
||||||
|
int (*invalidate_tlbs)(struct kgd_dev *kgd, uint16_t pasid);
|
||||||
|
int (*invalidate_tlbs_vmid)(struct kgd_dev *kgd, uint16_t vmid);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user