Adding support for new AQL Queue Memory allocation

Change-Id: If84fc4b961627dbdd0b77b1c509a3c9a4c709b9f
Signed-off-by: Ben Goz <ben.goz@amd.com>


[ROCm/ROCR-Runtime commit: e61500c46e]
Este commit está contenido en:
Ben Goz
2015-10-19 15:27:36 +03:00
padre 55bd82cd89
commit a511b7c4f7
Se han modificado 3 ficheros con 19 adiciones y 5 borrados
+6 -2
Ver fichero
@@ -182,7 +182,8 @@ typedef union
unsigned int DoorbellType : 2; // 0: This node has pre-1.0 doorbell characteristic
// 1: This node has 1.0 doorbell characteristic
// 2,3: reserved for future use
unsigned int Reserved : 18;
unsigned int AQLQueueDoubleMap : 1; // The unit needs a VA “double map”
unsigned int Reserved : 17;
} ui32;
} HSA_CAPABILITY;
@@ -458,7 +459,10 @@ typedef struct _HsaMemFlags
// 1: memory consistency needs to be enforced at
// synchronization points at dispatch or other software
// enforced synchronization boundaries.
unsigned int Reserved : 18;
unsigned int AQLQueueMemory: 1; // default = 0; If 1: The caller indicates that the memory will be used as AQL queue memory.
// The KFD will ensure that the memory returned is allocated in the optimal memory location
// and optimal alignment requirements
unsigned int Reserved : 17;
} ui32;
HSAuint32 Value;
@@ -296,6 +296,8 @@ struct kfd_ioctl_set_process_dgpu_aperture_args {
#define KFD_IOC_ALLOC_MEM_FLAGS_APU_DEVICE (1 << 3)
#define KFD_IOC_ALLOC_MEM_FLAGS_APU_SCRATCH (1 << 4)
#define KFD_IOC_ALLOC_MEM_FLAGS_DGPU_AQL_QUEUE_MEM (1 << 5)
struct kfd_ioctl_alloc_memory_of_gpu_new_args {
uint64_t va_addr; /* to KFD */
uint64_t size; /* to KFD */
+11 -3
Ver fichero
@@ -30,6 +30,7 @@
#include <stdio.h>
#include <inttypes.h>
#include <sys/mman.h>
#include <sys/time.h>
#define NON_VALID_GPU_ID 0
#define ARRAY_LEN(array) (sizeof(array) / sizeof(array[0]))
@@ -657,23 +658,30 @@ static void* fmm_allocate_host_gpu(uint32_t gpu_id,
manageble_aperture_t *aperture;
int32_t gpu_mem_id;
uint64_t mmap_offset;
uint32_t ioc_flags;
uint32_t size;
/* Retrieve gpu_mem id according to gpu_id */
gpu_mem_id = gpu_mem_find_by_gpu_id(gpu_id);
if (gpu_mem_id < 0)
return NULL;
size = MemorySizeInBytes;
ioc_flags = KFD_IOC_ALLOC_MEM_FLAGS_DGPU_HOST;
if (flags.ui32.CoarseGrain)
aperture = &gpu_mem[gpu_mem_id].dgpu_aperture;
else
aperture = &gpu_mem[gpu_mem_id].dgpu_alt_aperture; /* coherent */
if (flags.ui32.AQLQueueMemory) {
size = MemorySizeInBytes * 2;
ioc_flags = KFD_IOC_ALLOC_MEM_FLAGS_DGPU_AQL_QUEUE_MEM;
}
mem = __fmm_allocate_device(gpu_id, MemorySizeInBytes,
mem = __fmm_allocate_device(gpu_id, size,
aperture, 0, &mmap_offset,
KFD_IOC_ALLOC_MEM_FLAGS_DGPU_HOST);
ioc_flags);
/* FIXME: host memory allocated in this way should be mapped on all GPUs */
void *ret = mmap(mem, MemorySizeInBytes,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_SHARED | MAP_FIXED, kfd_fd , mmap_offset);