sdm: Add support for secondary vsync

Add support for enabling secondary vsync

Change-Id: Ia2231a19292314513d613efbb6953b1943530af0
CRs-fixed: 2184506
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 5df56dc..d9277e8 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -577,6 +577,7 @@
 struct DRMDisplayToken {
   uint32_t conn_id;
   uint32_t crtc_id;
+  uint32_t crtc_index;
 };
 
 enum DRMPPFeatureID {
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index b35581a..879d199 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -1622,8 +1622,7 @@
 }
 
 void HWDeviceDRM::GetDRMDisplayToken(sde_drm::DRMDisplayToken *token) const {
-  token->conn_id = token_.conn_id;
-  token->crtc_id = token_.crtc_id;
+  *token = token_;
 }
 
 void HWDeviceDRM::UpdateMixerAttributes() {
diff --git a/sdm/libs/core/drm/hw_events_drm.cpp b/sdm/libs/core/drm/hw_events_drm.cpp
index 7703bda..92a8d99 100644
--- a/sdm/libs/core/drm/hw_events_drm.cpp
+++ b/sdm/libs/core/drm/hw_events_drm.cpp
@@ -78,19 +78,18 @@
 
     switch (event_data.event_type) {
       case HWEvent::VSYNC: {
-        if (!is_primary_) {
-          // TODO(user): Once secondary support is added, use a different fd by calling drmOpen
-          break;
-        }
-
         poll_fds_[i].events = POLLIN | POLLPRI | POLLERR;
-        DRMMaster *master = nullptr;
-        int ret = DRMMaster::GetInstance(&master);
-        if (ret < 0) {
-          DLOGE("Failed to acquire DRMMaster instance");
-          return kErrorNotSupported;
+        if (is_primary_) {
+          DRMMaster *master = nullptr;
+          int ret = DRMMaster::GetInstance(&master);
+          if (ret < 0) {
+            DLOGE("Failed to acquire DRMMaster instance");
+            return kErrorNotSupported;
+          }
+          master->GetHandle(&poll_fds_[i].fd);
+        } else {
+          poll_fds_[i].fd = drmOpen("msm_drm", nullptr);
         }
-        master->GetHandle(&poll_fds_[i].fd);
         vsync_index_ = i;
       } break;
       case HWEvent::EXIT: {
@@ -223,11 +222,8 @@
     return kErrorResources;
   }
 
-  if (is_primary_) {
-    RegisterVSync();
-    vsync_registered_ = true;
-  }
-
+  RegisterVSync();
+  vsync_registered_ = true;
   RegisterPanelDead(true);
   RegisterIdleNotify(true);
   RegisterIdlePowerCollapse(true);
@@ -264,9 +260,6 @@
   switch (event) {
     case HWEvent::VSYNC: {
       std::lock_guard<std::mutex> lock(vsync_mutex_);
-      if (!is_primary_) {
-        break;
-      }
       vsync_enabled_ = enable;
       if (vsync_enabled_ && !vsync_registered_) {
         RegisterVSync();
@@ -299,7 +292,9 @@
   for (uint32_t i = 0; i < event_data_list_.size(); i++) {
     switch (event_data_list_[i].event_type) {
       case HWEvent::VSYNC:
-        // TODO(user): close for secondary
+        if (!is_primary_) {
+          Sys::close_(poll_fds_[i].fd);
+        }
         poll_fds_[i].fd = -1;
         break;
       case HWEvent::EXIT:
@@ -387,9 +382,10 @@
 }
 
 DisplayError HWEventsDRM::RegisterVSync() {
-  // TODO(user): For secondary use DRM_VBLANK_HIGH_CRTC_MASK and DRM_VBLANK_HIGH_CRTC_SHIFT
-  drmVBlank vblank{};
-  vblank.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT);
+  drmVBlank vblank {};
+  uint32_t high_crtc = token_.crtc_index << DRM_VBLANK_HIGH_CRTC_SHIFT;
+  vblank.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT |
+                                           (high_crtc & DRM_VBLANK_HIGH_CRTC_MASK));
   vblank.request.sequence = 1;
   // DRM hack to pass in context to unused field signal. Driver will write this to the node being
   // polled on, and will be read as part of drm event handling and sent to handler