diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 4a47469..d0f1b81 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -612,6 +612,7 @@
   bool is_wb_ubwc_supported;
   uint32_t topology_control;
   bool dyn_bitclk_support;
+  std::vector<uint8_t> edid;
 };
 
 // All DRM Connectors as map<Connector_id , connector_info>
@@ -631,6 +632,7 @@
   uint32_t crtc_id;
   uint32_t crtc_index;
   uint32_t encoder_id;
+  uint8_t hw_port;
 };
 
 enum DRMPPFeatureID {
@@ -922,12 +924,12 @@
    * [output]: DRMDisplayToken - CRTC and Connector id's for the display.
    * [return]: 0 on success, a negative error value otherwise.
    */
-  virtual int RegisterDisplay(int32_t display_id, DRMDisplayToken *tok) = 0;
+  virtual int RegisterDisplay(int32_t display_id, DRMDisplayToken *token) = 0;
 
   /* Client should invoke this interface on display disconnect.
    * [input]: DRMDisplayToken - identifier for the display.
    */
-  virtual void UnregisterDisplay(const DRMDisplayToken &token) = 0;
+  virtual void UnregisterDisplay(DRMDisplayToken *token) = 0;
 
   /*
    * Creates and returns an instance of DRMAtomicReqInterface corresponding to a display token
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 1b4d063..c744fea 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -832,6 +832,17 @@
   */
   virtual DisplayError GetSupportedDSIClock(std::vector<uint64_t> *bitclk_rates) = 0;
 
+  /*! @brief Method to retrieve the EDID information and HW port ID for display
+
+    @param[out] HW port ID
+    @param[out] size of EDID blob data
+    @param[out] EDID blob
+
+    @return \link DisplayError \endlink
+  */
+  virtual DisplayError GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                    uint8_t *out_data) = 0;
+
  protected:
   virtual ~DisplayInterface() { }
 };
diff --git a/sdm/include/core/sdm_types.h b/sdm/include/core/sdm_types.h
index 0f6973d..5817539 100644
--- a/sdm/include/core/sdm_types.h
+++ b/sdm/include/core/sdm_types.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2014 - 2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2014 - 2019, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -59,6 +59,7 @@
   kErrorNotValidated,     //!< Draw cycle has not been validated.
   kErrorCriticalResource,   //!< Critical resource allocation has failed.
   kErrorDeviceRemoved,    //!< A device was removed unexpectedly.
+  kErrorDriverData,       //!< Expected information from the driver is missing
 };
 
 /*! @brief This structure is defined for client and library compatibility check purpose only. This
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index fb88ae3..87f8fe4 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -1564,6 +1564,15 @@
   return kErrorNone;
 }
 
+DisplayError DisplayBase::GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                       uint8_t *out_data) {
+  if (!out_port || !out_data_size) {
+    return kErrorParameters;
+  }
+
+  return hw_intf_->GetDisplayIdentificationData(out_port, out_data_size, out_data);
+}
+
 DisplayError DisplayBase::GetClientTargetSupport(uint32_t width, uint32_t height,
                                                  LayerBufferFormat format,
                                                  const ColorMetaData &color_metadata) {
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
index 6513b08..ab39263 100644
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -145,6 +145,8 @@
     return kErrorNotSupported;
   }
   virtual bool IsSupportSsppTonemap();
+  virtual DisplayError GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                    uint8_t *out_data);
 
  protected:
   const char *kBt2020Pq = "bt2020_pq";
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index 51a47c8..6086033 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -444,7 +444,7 @@
 
   if (token_.conn_id > INT32_MAX) {
     DLOGE("Connector id %u beyond supported range", token_.conn_id);
-    drm_mgr_intf_->UnregisterDisplay(token_);
+    drm_mgr_intf_->UnregisterDisplay(&token_);
     return kErrorNotSupported;
   }
 
@@ -453,7 +453,7 @@
   ret = drm_mgr_intf_->CreateAtomicReq(token_, &drm_atomic_intf_);
   if (ret) {
     DLOGE("Failed creating atomic request for connector id %u. Error: %d.", token_.conn_id, ret);
-    drm_mgr_intf_->UnregisterDisplay(token_);
+    drm_mgr_intf_->UnregisterDisplay(&token_);
     return kErrorResources;
   }
 
@@ -462,7 +462,7 @@
     DLOGE("Failed getting info for connector id %u. Error: %d.", token_.conn_id, ret);
     drm_mgr_intf_->DestroyAtomicReq(drm_atomic_intf_);
     drm_atomic_intf_ = {};
-    drm_mgr_intf_->UnregisterDisplay(token_);
+    drm_mgr_intf_->UnregisterDisplay(&token_);
     return kErrorHardware;
   }
 
@@ -472,7 +472,7 @@
           connector_info_.modes.size());
     drm_mgr_intf_->DestroyAtomicReq(drm_atomic_intf_);
     drm_atomic_intf_ = {};
-    drm_mgr_intf_->UnregisterDisplay(token_);
+    drm_mgr_intf_->UnregisterDisplay(&token_);
     return kErrorDeviceRemoved;
   }
 
@@ -517,7 +517,7 @@
   display_attributes_ = {};
   drm_mgr_intf_->DestroyAtomicReq(drm_atomic_intf_);
   drm_atomic_intf_ = {};
-  drm_mgr_intf_->UnregisterDisplay(token_);
+  drm_mgr_intf_->UnregisterDisplay(&token_);
   return err;
 }
 
@@ -718,6 +718,25 @@
   DLOGI("Dynamic Bit Clk Support = %d", hw_panel_info_.dyn_bitclk_support);
 }
 
+DisplayError HWDeviceDRM::GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                       uint8_t *out_data) {
+  *out_port = token_.hw_port;
+  std::vector<uint8_t> &edid = connector_info_.edid;
+
+  if (out_data == nullptr) {
+    *out_data_size = (uint32_t)(edid.size());
+    if (*out_data_size == 0) {
+      DLOGE("EDID blob is empty, no data to return");
+      return kErrorDriverData;
+    }
+  } else {
+    *out_data_size = std::min(*out_data_size, (uint32_t)(edid.size()));
+    memcpy(out_data, edid.data(), *out_data_size);
+  }
+
+  return kErrorNone;
+}
+
 void HWDeviceDRM::GetHWDisplayPortAndMode() {
   hw_panel_info_.port = kPortDefault;
   hw_panel_info_.mode =
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index 5be5fad..21a64c2 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -123,6 +123,8 @@
   virtual DisplayError SetDisplayDppsAdROI(void *payload) { return kErrorNotSupported; }
   virtual DisplayError SetDynamicDSIClock(uint64_t bit_clk_rate);
   virtual DisplayError GetDynamicDSIClock(uint64_t *bit_clk_rate);
+  virtual DisplayError GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                    uint8_t *out_data);
 
   enum {
     kHWEventVSync,
diff --git a/sdm/libs/core/drm/hw_info_drm.cpp b/sdm/libs/core/drm/hw_info_drm.cpp
index 54c8554..faaebea 100644
--- a/sdm/libs/core/drm/hw_info_drm.cpp
+++ b/sdm/libs/core/drm/hw_info_drm.cpp
@@ -501,7 +501,7 @@
   ret = drm_mgr_intf_->GetConnectorInfo(token.conn_id, &connector_info);
   if (ret) {
     DLOGE("Failed getting info for connector id %u. Error: %d.", token.conn_id, ret);
-    drm_mgr_intf_->UnregisterDisplay(token);
+    drm_mgr_intf_->UnregisterDisplay(&token);
     return;
   }
   for (auto &fmts : connector_info.formats_supported) {
@@ -511,7 +511,7 @@
   hw_resource->supported_formats_map.erase(sub_blk_type);
   hw_resource->supported_formats_map.insert(make_pair(sub_blk_type, supported_sdm_formats));
 
-  drm_mgr_intf_->UnregisterDisplay(token);
+  drm_mgr_intf_->UnregisterDisplay(&token);
 }
 
 void HWInfoDRM::GetSDMFormat(uint32_t v4l2_format, LayerBufferFormat *sdm_format) {
diff --git a/sdm/libs/core/drm/hw_peripheral_drm.cpp b/sdm/libs/core/drm/hw_peripheral_drm.cpp
index 0bc95cd..ec865fe 100644
--- a/sdm/libs/core/drm/hw_peripheral_drm.cpp
+++ b/sdm/libs/core/drm/hw_peripheral_drm.cpp
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -336,7 +336,7 @@
 
 DisplayError HWPeripheralDRM::TeardownConcurrentWriteback(void) {
   if (cwb_config_.enabled) {
-    drm_mgr_intf_->UnregisterDisplay(cwb_config_.token);
+    drm_mgr_intf_->UnregisterDisplay(&(cwb_config_.token));
     cwb_config_.enabled = false;
     registry_.Clear();
   }
@@ -369,7 +369,7 @@
   ret = drmIoctl(dev_fd_, DRM_IOCTL_SDE_WB_CONFIG, &cwb_cfg);
 #endif
   if (ret) {
-    drm_mgr_intf_->UnregisterDisplay(cwb_config_.token);
+    drm_mgr_intf_->UnregisterDisplay(&(cwb_config_.token));
     DLOGE("Dump CWBConfig: mode_count %d flags %x", cwb_cfg.count_modes, cwb_cfg.flags);
     DumpConnectorModeInfo();
     return kErrorHardware;
diff --git a/sdm/libs/core/drm/hw_virtual_drm.cpp b/sdm/libs/core/drm/hw_virtual_drm.cpp
index fbcec91..152e28c 100644
--- a/sdm/libs/core/drm/hw_virtual_drm.cpp
+++ b/sdm/libs/core/drm/hw_virtual_drm.cpp
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -245,5 +245,13 @@
   return kErrorNone;
 }
 
+DisplayError HWVirtualDRM::GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                        uint8_t *out_data) {
+  *out_data_size = 0;
+  *out_port = token_.hw_port;
+
+  return kErrorNone;
+}
+
 }  // namespace sdm
 
diff --git a/sdm/libs/core/drm/hw_virtual_drm.h b/sdm/libs/core/drm/hw_virtual_drm.h
index 0584068..7912d88 100644
--- a/sdm/libs/core/drm/hw_virtual_drm.h
+++ b/sdm/libs/core/drm/hw_virtual_drm.h
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -60,6 +60,8 @@
   virtual DisplayError UnsetScaleLutConfig() {
     return kErrorNotSupported;
   }
+  virtual DisplayError GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                    uint8_t *out_data);
 
  private:
   void ConfigureWbConnectorFbId(uint32_t fb_id);
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index 5f451dc..5e4e1cf 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2014 - 2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2014 - 2019, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted
 * provided that the following conditions are met:
@@ -113,6 +113,10 @@
   virtual DisplayError SetDynamicDSIClock(uint64_t bit_clk_rate);
   virtual DisplayError GetDynamicDSIClock(uint64_t *bit_clk_rate);
   virtual DisplayError TeardownConcurrentWriteback(void) { return kErrorNotSupported; }
+  virtual DisplayError GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                    uint8_t *out_data) {
+    return kErrorNotSupported;
+  }
 
   enum {
     kHWEventVSync,
diff --git a/sdm/libs/core/hw_interface.h b/sdm/libs/core/hw_interface.h
index 240517a..5b68536 100644
--- a/sdm/libs/core/hw_interface.h
+++ b/sdm/libs/core/hw_interface.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2014 - 2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2014 - 2019, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted
 * provided that the following conditions are met:
@@ -124,6 +124,8 @@
   virtual DisplayError SetDynamicDSIClock(uint64_t bit_clk_rate) = 0;
   virtual DisplayError GetDynamicDSIClock(uint64_t *bit_clk_rate) = 0;
   virtual DisplayError TeardownConcurrentWriteback(void) = 0;
+  virtual DisplayError GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                    uint8_t *out_data) = 0;
 
  protected:
   virtual ~HWInterface() { }
diff --git a/sdm/libs/hwc2/display_null.cpp b/sdm/libs/hwc2/display_null.cpp
index 9076779..48f5a13 100644
--- a/sdm/libs/hwc2/display_null.cpp
+++ b/sdm/libs/hwc2/display_null.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -27,6 +27,7 @@
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+#include <algorithm>
 #include "display_null.h"
 
 #define __CLASS__ "DisplayNull"
@@ -122,6 +123,19 @@
   return kErrorNone;
 }
 
+DisplayError DisplayNull::GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                       uint8_t *out_data) {
+  *out_port = 1;  // DSI0 Encoder Index
+  if (out_data == nullptr) {
+    *out_data_size = (uint32_t)(edid_.size());
+  } else {
+    *out_data_size = std::min(*out_data_size, (uint32_t)(edid_.size()));
+    memcpy(out_data, edid_.data(), *out_data_size);
+  }
+
+  return kErrorNone;
+}
+
 DisplayError DisplayNullExternal::Commit(LayerStack *layer_stack) {
   if (!layer_stack) {
     return kErrorParameters;
@@ -167,4 +181,13 @@
   return kErrorNone;
 }
 
+DisplayError DisplayNullExternal::GetDisplayIdentificationData(uint8_t *out_port,
+                                                               uint32_t *out_data_size,
+                                                               uint8_t *out_data) {
+  DisplayNull::GetDisplayIdentificationData(out_port, out_data_size, out_data);
+  *out_port = 4;  // TMDS Encoder Index
+
+  return kErrorNone;
+}
+
 }  // namespace sdm
diff --git a/sdm/libs/hwc2/display_null.h b/sdm/libs/hwc2/display_null.h
index 2dcb9c9..1d54f65 100644
--- a/sdm/libs/hwc2/display_null.h
+++ b/sdm/libs/hwc2/display_null.h
@@ -36,6 +36,9 @@
 
 namespace sdm {
 
+using std::string;
+using std::vector;
+
 #define MAKE_NO_OP(virtual_method_signature) \
       virtual DisplayError virtual_method_signature { return kErrorNone; }
 
@@ -55,7 +58,9 @@
   virtual bool IsPrimaryDisplay() { return true; }
   virtual bool IsUnderscanSupported() { return true; }
   virtual void SetIdleTimeoutMs(uint32_t active_ms) { }
-  virtual std::string Dump() { return ""; }
+  virtual DisplayError GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                    uint8_t *out_data);
+  virtual string Dump() { return ""; }
   virtual bool IsSupportSsppTonemap() { return false; }
 
   MAKE_NO_OP(TeardownConcurrentWriteback(void))
@@ -77,13 +82,13 @@
   MAKE_NO_OP(ColorSVCRequestRoute(const PPDisplayAPIPayload &, PPDisplayAPIPayload *,
                                   PPPendingParams *))
   MAKE_NO_OP(GetColorModeCount(uint32_t *))
-  MAKE_NO_OP(GetColorModes(uint32_t *, std::vector<std::string> *))
-  MAKE_NO_OP(GetColorModeAttr(const std::string &, AttrVal *))
-  MAKE_NO_OP(SetColorMode(const std::string &))
+  MAKE_NO_OP(GetColorModes(uint32_t *, vector<string> *))
+  MAKE_NO_OP(GetColorModeAttr(const string &, AttrVal *))
+  MAKE_NO_OP(SetColorMode(const string &))
   MAKE_NO_OP(SetColorModeById(int32_t))
-  MAKE_NO_OP(GetColorModeName(int32_t, std::string *))
+  MAKE_NO_OP(GetColorModeName(int32_t, string *))
   MAKE_NO_OP(SetColorTransform(const uint32_t, const double *))
-  MAKE_NO_OP(GetDefaultColorMode(std::string *))
+  MAKE_NO_OP(GetDefaultColorMode(string *))
   MAKE_NO_OP(ApplyDefaultDisplayMode())
   MAKE_NO_OP(SetCursorPosition(int, int))
   MAKE_NO_OP(SetRefreshRate(uint32_t, bool))
@@ -103,10 +108,23 @@
   MAKE_NO_OP(SetDisplayDppsAdROI(void *))
   MAKE_NO_OP(SetDynamicDSIClock(uint64_t bit_clk_rate))
   MAKE_NO_OP(GetDynamicDSIClock(uint64_t *bit_clk_rate))
-  MAKE_NO_OP(GetSupportedDSIClock(std::vector<uint64_t> *bitclk_rates))
+  MAKE_NO_OP(GetSupportedDSIClock(vector<uint64_t> *bitclk_rates))
 
+ protected:
   DisplayConfigVariableInfo default_variable_config_ = {};
   DisplayConfigFixedInfo default_fixed_config_ = {};
+  // 1920x1080 60fps panel of name Null Display with PnPID QCM for Qualcomm
+  // Contains many 'don't-care' fields and valid checksum bytes
+  const vector<uint8_t> edid_{
+    0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x44, 0x6D, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x1B, 0x10, 0x01, 0x03, 0x80, 0x50, 0x2D, 0x78, 0x0A, 0x0D, 0xC9, 0xA0, 0x57, 0x47, 0x98, 0x27,
+    0x12, 0x48, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38, 0x2D, 0x40, 0x58, 0x2C,
+    0x45, 0x00, 0x50, 0x1D, 0x74, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x4E, 0x75, 0x6C,
+    0x6C, 0x20, 0x44, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1
+  };
 };
 
 class DisplayNullExternal : public DisplayNull {
@@ -117,6 +135,8 @@
                                        int *release_fence);
   virtual DisplayError SetFrameBufferConfig(const DisplayConfigVariableInfo &variable_info);
   virtual DisplayError GetFrameBufferConfig(DisplayConfigVariableInfo *variable_info);
+  virtual DisplayError GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                    uint8_t *out_data);
   void SetActive(bool active) { active_ = active; }
   bool IsActive() { return active_; }
 
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index d49da4c..859f369 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -2255,6 +2255,16 @@
   return ((*out_num_types > 0) ? HWC2::Error::HasChanges : HWC2::Error::None);
 }
 
+HWC2::Error HWCDisplay::GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                     uint8_t *out_data) {
+  DisplayError ret = display_intf_->GetDisplayIdentificationData(out_port, out_data_size, out_data);
+  if (ret != kErrorNone) {
+    DLOGE("GetDisplayIdentificationData failed due to SDM/Driver (err = %d, disp id = %" PRIu64
+          " %d-%d", ret, id_, sdm_id_, type_);
+  }
+  return HWC2::Error::None;
+}
+
 bool HWCDisplay::IsDisplayCommandMode() {
   return is_cmd_mode_;
 }
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index c38c6bb..35679c1 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -312,6 +312,8 @@
   virtual DisplayError ControlIdlePowerCollapse(bool enable, bool synchronous) {
     return kErrorNone;
   }
+  virtual HWC2::Error GetDisplayIdentificationData(uint8_t *out_port, uint32_t *out_data_size,
+                                                   uint8_t *out_data);
 
  protected:
   static uint32_t throttling_refresh_rate_;
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index cf52eec..9640d67 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -1122,14 +1122,17 @@
     case HWC2::FunctionDescriptor::GetRenderIntents:
       return AsFP<HWC2_PFN_GET_RENDER_INTENTS>(GetRenderIntents);
     case HWC2::FunctionDescriptor::SetColorModeWithRenderIntent:
-      return AsFP<HWC2_PFN_SET_COLOR_MODE_WITH_RENDER_INTENT>(
-          HWCSession::SetColorModeWithRenderIntent);
+      return AsFP<HWC2_PFN_SET_COLOR_MODE_WITH_RENDER_INTENT>
+             (HWCSession::SetColorModeWithRenderIntent);
     case HWC2::FunctionDescriptor::GetDataspaceSaturationMatrix:
       return AsFP<HWC2_PFN_GET_DATASPACE_SATURATION_MATRIX>(GetDataspaceSaturationMatrix);
     case HWC2::FunctionDescriptor::GetPerFrameMetadataKeys:
       return AsFP<HWC2_PFN_GET_PER_FRAME_METADATA_KEYS>(GetPerFrameMetadataKeys);
     case HWC2::FunctionDescriptor::SetLayerPerFrameMetadata:
       return AsFP<HWC2_PFN_SET_LAYER_PER_FRAME_METADATA>(SetLayerPerFrameMetadata);
+    case HWC2::FunctionDescriptor::GetDisplayIdentificationData:
+      return AsFP<HWC2_PFN_GET_DISPLAY_IDENTIFICATION_DATA>
+             (HWCSession::GetDisplayIdentificationData);
     default:
       DLOGD("Unknown/Unimplemented function descriptor: %d (%s)", int_descriptor,
             to_string(descriptor).c_str());
@@ -2932,6 +2935,21 @@
   return CallDisplayFunction(device, display, &HWCDisplay::GetReadbackBufferFence, release_fence);
 }
 
+int32_t HWCSession::GetDisplayIdentificationData(hwc2_device_t *device, hwc2_display_t display,
+                                                 uint8_t *outPort, uint32_t *outDataSize,
+                                                 uint8_t *outData) {
+  if (!outPort || !outDataSize) {
+    return HWC2_ERROR_BAD_PARAMETER;
+  }
+
+  if (display >= kNumDisplays) {
+    return HWC2_ERROR_BAD_DISPLAY;
+  }
+
+  return CallDisplayFunction(device, display, &HWCDisplay::GetDisplayIdentificationData, outPort,
+                             outDataSize, outData);
+}
+
 android::status_t HWCSession::SetQSyncMode(const android::Parcel *input_parcel) {
   auto mode = input_parcel->readInt32();
   auto device = static_cast<hwc2_device_t *>(this);
diff --git a/sdm/libs/hwc2/hwc_session.h b/sdm/libs/hwc2/hwc_session.h
index 676d3a1..3c56470 100644
--- a/sdm/libs/hwc2/hwc_session.h
+++ b/sdm/libs/hwc2/hwc_session.h
@@ -221,6 +221,9 @@
   static int32_t GetReadbackBufferFence(hwc2_device_t *device, hwc2_display_t display,
                                         int32_t *release_fence);
   static uint32_t GetMaxVirtualDisplayCount(hwc2_device_t *device);
+  static int32_t GetDisplayIdentificationData(hwc2_device_t *device, hwc2_display_t display,
+                                              uint8_t *outPort, uint32_t *outDataSize,
+                                              uint8_t *outData);
 
   // HWCDisplayEventHandler
   virtual void DisplayPowerReset();
