From d8a1df836d9edf6737f163101a7b1697ac57cc3b Mon Sep 17 00:00:00 2001 From: Ben Goz Date: Wed, 18 Mar 2015 15:33:43 +0200 Subject: [PATCH] Adding support for mmap events page from Thunk Signed-off-by: Ben Goz [ROCm/ROCR-Runtime commit: b27de08442537dd9f853a6e401f21799316b82a8] --- projects/rocr-runtime/include/linux/kfd_ioctl.h | 4 ++-- projects/rocr-runtime/src/events.c | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/projects/rocr-runtime/include/linux/kfd_ioctl.h b/projects/rocr-runtime/include/linux/kfd_ioctl.h index 442f2e4622..09a22cc681 100644 --- a/projects/rocr-runtime/include/linux/kfd_ioctl.h +++ b/projects/rocr-runtime/include/linux/kfd_ioctl.h @@ -170,13 +170,13 @@ struct kfd_ioctl_dbg_wave_control_args { #define KFD_IOC_WAIT_RESULT_FAIL 2 struct kfd_ioctl_create_event_args { - uint64_t event_trigger_address; /* from KFD - signal events only */ + uint64_t event_page_offset; /* from KFD */ uint32_t event_trigger_data; /* from KFD - signal events only */ uint32_t event_type; /* to KFD */ uint32_t auto_reset; /* to KFD */ uint32_t node_id; /* to KFD - only valid for certain event types */ uint32_t event_id; /* from KFD */ - uint32_t pad; + uint32_t event_slot_index; /* from KFD */ }; struct kfd_ioctl_destroy_event_args { diff --git a/projects/rocr-runtime/src/events.c b/projects/rocr-runtime/src/events.c index ab2df5b333..8b057b0fc7 100644 --- a/projects/rocr-runtime/src/events.c +++ b/projects/rocr-runtime/src/events.c @@ -29,8 +29,11 @@ #include #include #include +#include #include "linux/kfd_ioctl.h" +static HSAuint64 *events_page = NULL; + static bool IsSystemEventType(HSA_EVENTTYPE type) { // Debug events behave as signal events. @@ -73,10 +76,22 @@ hsaKmtCreateEvent( return HSAKMT_STATUS_ERROR; } + if (events_page == NULL && args.event_page_offset > 0) { + events_page = mmap(NULL, 4096, PROT_WRITE | PROT_READ, + MAP_SHARED, kfd_fd, args.event_page_offset); + if (events_page == NULL) { + hsaKmtDestroyEvent(e); + return HSAKMT_STATUS_ERROR; + } + } + + if (args.event_page_offset > 0 && args.event_slot_index < 256) + e->EventData.HWData2 = (HSAuint64)&events_page[args.event_slot_index]; + e->EventId = args.event_id; e->EventData.EventType = EventDesc->EventType; e->EventData.HWData1 = args.event_id; - e->EventData.HWData2 = args.event_trigger_address; + e->EventData.HWData3 = args.event_trigger_data; if (IsSignaled && !IsSystemEventType(e->EventData.EventType)) {