Update KFD SMI event notification handling
Event bitmask in KFD SMI event is now replaced with event index in the SMI event message. Sending a event bitmask, which was a 64-bit field with only 1 bit set, was quite wasteful of memory and also potentially limiting to 64 events. Instead the kernel would send event index in the SMI event message. As a result, update the KFD SMI event handling to expect the event index in the message. Change-Id: I3e74620788d3c1f7c0bdaa69e9d9ab3d1aba2c92
This commit is contained in:
@@ -541,8 +541,12 @@ struct kfd_ioctl_import_dmabuf_args {
|
|||||||
/*
|
/*
|
||||||
* KFD SMI(System Management Interface) events
|
* KFD SMI(System Management Interface) events
|
||||||
*/
|
*/
|
||||||
/* Event type (defined by bitmask) */
|
enum kfd_smi_event {
|
||||||
#define KFD_SMI_EVENT_VMFAULT 0x0000000000000001
|
KFD_SMI_EVENT_NONE = 0, /* not used */
|
||||||
|
KFD_SMI_EVENT_VMFAULT = 1, /* event start counting at 1 */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define KFD_SMI_EVENT_MASK_FROM_INDEX(i) (1ULL << ((i) - 1))
|
||||||
|
|
||||||
struct kfd_ioctl_smi_events_args {
|
struct kfd_ioctl_smi_events_args {
|
||||||
__u32 gpuid; /* to KFD */
|
__u32 gpuid; /* to KFD */
|
||||||
|
|||||||
@@ -284,6 +284,11 @@ typedef enum {
|
|||||||
RSMI_EVT_NOTIF_LAST = RSMI_EVT_NOTIF_VMFAULT
|
RSMI_EVT_NOTIF_LAST = RSMI_EVT_NOTIF_VMFAULT
|
||||||
} rsmi_evt_notification_type_t;
|
} rsmi_evt_notification_type_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macro to generate event bitmask from event id
|
||||||
|
*/
|
||||||
|
#define RSMI_EVENT_MASK_FROM_INDEX(i) (1ULL << ((i) - 1))
|
||||||
|
|
||||||
//! Maximum number of characters an event notification message will be
|
//! Maximum number of characters an event notification message will be
|
||||||
#define MAX_EVENT_NOTIFICATION_MSG_SIZE 64
|
#define MAX_EVENT_NOTIFICATION_MSG_SIZE 64
|
||||||
|
|
||||||
@@ -3217,8 +3222,14 @@ rsmi_event_notification_init(uint32_t dv_ind);
|
|||||||
* @param dv_ind a device index corresponding to the device on which to
|
* @param dv_ind a device index corresponding to the device on which to
|
||||||
* listen for events
|
* listen for events
|
||||||
*
|
*
|
||||||
* @param mask 0 or more elements of ::rsmi_evt_notification_type_t OR'd
|
* @param mask Bitmask generated by OR'ing 1 or more elements of
|
||||||
* together that indicate which event types to listen for.
|
* ::rsmi_evt_notification_type_t indicating which event types to listen for,
|
||||||
|
* where the rsmi_evt_notification_type_t value indicates the bit field, with
|
||||||
|
* bit position starting from 1.
|
||||||
|
* For example, if the mask field is 0x0000000000000003, which means first bit,
|
||||||
|
* bit 1 (bit position start from 1) and bit 2 are set, which indicate interest
|
||||||
|
* in receiving RSMI_EVT_NOTIF_VMFAULT (which has a value of 1) and the next
|
||||||
|
* event in that list which has a value of 2.
|
||||||
*
|
*
|
||||||
* @retval ::RSMI_STATUS_INIT_ERROR is returned if
|
* @retval ::RSMI_STATUS_INIT_ERROR is returned if
|
||||||
* ::rsmi_event_notification_init() has not been called before a call to this
|
* ::rsmi_event_notification_init() has not been called before a call to this
|
||||||
|
|||||||
+2
-2
@@ -3595,8 +3595,8 @@ rsmi_event_notification_get(int timeout_ms,
|
|||||||
data_item =
|
data_item =
|
||||||
reinterpret_cast<rsmi_evt_notification_data_t *>(&data[*num_elem]);
|
reinterpret_cast<rsmi_evt_notification_data_t *>(&data[*num_elem]);
|
||||||
|
|
||||||
uint64_t event;
|
uint32_t event;
|
||||||
while (fscanf(anon_fp, "%lx %63s\n", &event,
|
while (fscanf(anon_fp, "%x %63s\n", &event,
|
||||||
reinterpret_cast<char *>(&data_item->message)) == 2) {
|
reinterpret_cast<char *>(&data_item->message)) == 2) {
|
||||||
/* Output is in format as "event information\n"
|
/* Output is in format as "event information\n"
|
||||||
* Both event are expressed in hex.
|
* Both event are expressed in hex.
|
||||||
|
|||||||
@@ -101,11 +101,11 @@ void TestEvtNotifReadWrite::Run(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rsmi_evt_notification_type_t evt_type = RSMI_EVT_NOTIF_FIRST;
|
rsmi_evt_notification_type_t evt_type = RSMI_EVT_NOTIF_FIRST;
|
||||||
uint64_t mask = evt_type;
|
uint64_t mask = RSMI_EVENT_MASK_FROM_INDEX(evt_type);
|
||||||
while (evt_type != RSMI_EVT_NOTIF_LAST) {
|
while (evt_type != RSMI_EVT_NOTIF_LAST) {
|
||||||
mask |= evt_type;
|
mask |= RSMI_EVENT_MASK_FROM_INDEX(evt_type);
|
||||||
evt_type = static_cast<rsmi_evt_notification_type_t>(
|
evt_type = static_cast<rsmi_evt_notification_type_t>(
|
||||||
static_cast<uint64_t>(evt_type)*2);
|
static_cast<uint32_t>(evt_type)+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (dv_ind = 0; dv_ind < num_monitor_devs(); ++dv_ind) {
|
for (dv_ind = 0; dv_ind < num_monitor_devs(); ++dv_ind) {
|
||||||
|
|||||||
Reference in New Issue
Block a user