From 9f7ae5b9e28187dd899ef3abf1a1b841faa8cb29 Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Tue, 12 May 2020 15:12:52 -0400 Subject: [PATCH] libhsakmt: add new flag for memory mapped as uncached It is to provide an option to map specific memory as uncached on A+A HW platform. Signed-off-by: Eric Huang Change-Id: Ib665cb306a0e78aba3ea5ee2f0e46cb62ae139f8 [ROCm/ROCR-Runtime commit: 2464bfc7149b4003be849c85bffb71fb74893658] --- projects/rocr-runtime/include/hsakmttypes.h | 3 ++- projects/rocr-runtime/include/linux/kfd_ioctl.h | 1 + projects/rocr-runtime/src/fmm.c | 10 ++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/projects/rocr-runtime/include/hsakmttypes.h b/projects/rocr-runtime/include/hsakmttypes.h index 7a7dc2ad10..b821268c50 100644 --- a/projects/rocr-runtime/include/hsakmttypes.h +++ b/projects/rocr-runtime/include/hsakmttypes.h @@ -541,7 +541,8 @@ typedef struct _HsaMemFlags // and optimal alignment requirements unsigned int FixedAddress : 1; // Allocate memory at specified virtual address. Fail if address is not free. unsigned int NoNUMABind: 1; // Don't bind system memory to a specific NUMA node - unsigned int Reserved : 15; + unsigned int Uncached: 1; // Caching flag for fine-grained memory on A+A HW platform + unsigned int Reserved : 14; } ui32; HSAuint32 Value; diff --git a/projects/rocr-runtime/include/linux/kfd_ioctl.h b/projects/rocr-runtime/include/linux/kfd_ioctl.h index 6a7dd1f44a..aa00e919dd 100644 --- a/projects/rocr-runtime/include/linux/kfd_ioctl.h +++ b/projects/rocr-runtime/include/linux/kfd_ioctl.h @@ -479,6 +479,7 @@ struct kfd_ioctl_acquire_vm_args { #define KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE (1 << 28) #define KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM (1 << 27) #define KFD_IOC_ALLOC_MEM_FLAGS_COHERENT (1 << 26) +#define KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED (1 << 25) /* Allocate memory for later SVM (shared virtual memory) mapping. * diff --git a/projects/rocr-runtime/src/fmm.c b/projects/rocr-runtime/src/fmm.c index 6867c69599..5fe6518ea6 100644 --- a/projects/rocr-runtime/src/fmm.c +++ b/projects/rocr-runtime/src/fmm.c @@ -1334,8 +1334,11 @@ void *fmm_allocate_device(uint32_t gpu_id, void *address, uint64_t MemorySizeInB aperture = &gpu_mem[gpu_mem_id].gpuvm_aperture; } - if (!flags.ui32.CoarseGrain || svm.disable_cache) + if (!flags.ui32.CoarseGrain || svm.disable_cache) { ioc_flags |= KFD_IOC_ALLOC_MEM_FLAGS_COHERENT; + if (flags.ui32.Uncached) + ioc_flags |= KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED; + } mem = __fmm_allocate_device(gpu_id, address, size, aperture, &mmap_offset, ioc_flags, &vm_obj); @@ -1540,8 +1543,11 @@ static void *fmm_allocate_host_gpu(uint32_t node_id, void *address, else aperture = svm.dgpu_alt_aperture; /* always coherent */ - if (!flags.ui32.CoarseGrain || svm.disable_cache) + if (!flags.ui32.CoarseGrain || svm.disable_cache) { ioc_flags |= KFD_IOC_ALLOC_MEM_FLAGS_COHERENT; + if (flags.ui32.Uncached) + ioc_flags |= KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED; + } ioc_flags |= fmm_translate_hsa_to_ioc_flags(flags); if (flags.ui32.AQLQueueMemory)