|
@@ -27,16 +27,17 @@ class nvdevice;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
struct EventsInterface {
|
|
struct EventsInterface {
|
|
|
- u64 events_mask;
|
|
|
|
|
|
|
+ u64 events_mask{};
|
|
|
std::array<Kernel::EventPair, MaxNvEvents> events;
|
|
std::array<Kernel::EventPair, MaxNvEvents> events;
|
|
|
- std::array<EventState, MaxNvEvents> status;
|
|
|
|
|
- std::array<bool, MaxNvEvents> registered;
|
|
|
|
|
- std::array<u32, MaxNvEvents> assigned_syncpt;
|
|
|
|
|
- std::array<u32, MaxNvEvents> assigned_value;
|
|
|
|
|
|
|
+ std::array<EventState, MaxNvEvents> status{};
|
|
|
|
|
+ std::array<bool, MaxNvEvents> registered{};
|
|
|
|
|
+ std::array<u32, MaxNvEvents> assigned_syncpt{};
|
|
|
|
|
+ std::array<u32, MaxNvEvents> assigned_value{};
|
|
|
u32 GetFreeEvent() {
|
|
u32 GetFreeEvent() {
|
|
|
u64 mask = events_mask;
|
|
u64 mask = events_mask;
|
|
|
for (u32 i = 0; i < MaxNvEvents; i++) {
|
|
for (u32 i = 0; i < MaxNvEvents; i++) {
|
|
|
- if (mask & 0x1) {
|
|
|
|
|
|
|
+ const bool is_free = (mask & 0x1) == 0;
|
|
|
|
|
+ if (is_free) {
|
|
|
if (status[i] == EventState::Registered || status[i] == EventState::Free) {
|
|
if (status[i] == EventState::Registered || status[i] == EventState::Free) {
|
|
|
return i;
|
|
return i;
|
|
|
}
|
|
}
|
|
@@ -46,10 +47,16 @@ struct EventsInterface {
|
|
|
return 0xFFFFFFFF;
|
|
return 0xFFFFFFFF;
|
|
|
}
|
|
}
|
|
|
void SetEventStatus(const u32 event_id, EventState new_status) {
|
|
void SetEventStatus(const u32 event_id, EventState new_status) {
|
|
|
|
|
+ EventState old_status = status[event_id];
|
|
|
|
|
+ if (old_status == new_status)
|
|
|
|
|
+ return;
|
|
|
status[event_id] = new_status;
|
|
status[event_id] = new_status;
|
|
|
if (new_status == EventState::Registered) {
|
|
if (new_status == EventState::Registered) {
|
|
|
registered[event_id] = true;
|
|
registered[event_id] = true;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (new_status == EventState::Waiting || new_status == EventState::Busy) {
|
|
|
|
|
+ events_mask |= (1 << event_id);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
void RegisterEvent(const u32 event_id) {
|
|
void RegisterEvent(const u32 event_id) {
|
|
|
registered[event_id] = true;
|
|
registered[event_id] = true;
|
|
@@ -65,6 +72,7 @@ struct EventsInterface {
|
|
|
}
|
|
}
|
|
|
void LiberateEvent(const u32 event_id) {
|
|
void LiberateEvent(const u32 event_id) {
|
|
|
status[event_id] = registered[event_id] ? EventState::Registered : EventState::Free;
|
|
status[event_id] = registered[event_id] ? EventState::Registered : EventState::Free;
|
|
|
|
|
+ events_mask &= ~(1 << event_id);
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|