sdm: drm: Get HDR sink properties from kms
Get sink capabilities for HDR support from drm-kms.
CRs-Fixed: 2143509
Change-Id: I89ae16d333de995a841ea10311d092485c517226
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 4c075aa..f93825d 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -477,6 +477,7 @@
DRMRotation panel_orientation;
drm_panel_hdr_properties panel_hdr_prop;
uint32_t transfer_time_us;
+ drm_msm_ext_hdr_properties ext_hdr_prop;
};
/* Identifier token for a display */
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 92efd9f..303c89b 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -153,6 +153,8 @@
bool secure = false; //!< If this display is capable of handling secure content.
bool is_cmdmode = false; //!< If panel is command mode panel.
bool hdr_supported = false; //!< if HDR is enabled
+ bool hdr_metadata_type_one = false; //!< Metadata type one obtained from HDR sink
+ uint32_t hdr_eotf = 0; //!< Electro optical transfer function
uint32_t max_luminance = 0; //!< From Panel's peak luminance
uint32_t average_luminance = 0; //!< From Panel's average luminance
uint32_t min_luminance = 0; //!< From Panel's blackness level
diff --git a/sdm/include/private/hw_info_types.h b/sdm/include/private/hw_info_types.h
index 9f6a5d6..b086907 100644
--- a/sdm/include/private/hw_info_types.h
+++ b/sdm/include/private/hw_info_types.h
@@ -292,6 +292,8 @@
uint32_t left_roi_count = 1; // Number if ROI supported on left panel
uint32_t right_roi_count = 1; // Number if ROI supported on right panel
bool hdr_enabled = false; // HDR feature supported
+ bool hdr_metadata_type_one = false; // Static HDR metadata type one
+ uint32_t hdr_eotf = 0; // Electro optical transfer function
uint32_t peak_luminance = 0; // Panel's peak luminance level
uint32_t average_luminance = 0; // Panel's average luminance level
uint32_t blackness_level = 0; // Panel's blackness level
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 1e948a2..5c5a45a 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -400,6 +400,8 @@
fixed_info->max_luminance = fixed_info->hdr_supported ? hw_panel_info_.peak_luminance: 0;
fixed_info->average_luminance = fixed_info->hdr_supported ? hw_panel_info_.average_luminance : 0;
fixed_info->min_luminance = fixed_info->hdr_supported ? hw_panel_info_.blackness_level: 0;
+ fixed_info->hdr_eotf = hw_panel_info_.hdr_eotf;
+ fixed_info->hdr_metadata_type_one = hw_panel_info_.hdr_metadata_type_one;
return kErrorNone;
}
diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h
index 16355c8..5b7576a 100644
--- a/sdm/libs/core/drm/hw_device_drm.h
+++ b/sdm/libs/core/drm/hw_device_drm.h
@@ -97,6 +97,7 @@
virtual DisplayError GetMixerAttributes(HWMixerAttributes *mixer_attributes);
virtual void InitializeConfigs();
virtual DisplayError DumpDebugData() { return kErrorNone; }
+ virtual void PopulateHWPanelInfo();
enum {
kHWEventVSync,
@@ -113,7 +114,6 @@
DisplayError SetStride(HWDeviceType device_type, LayerBufferFormat format, uint32_t width,
uint32_t *target);
DisplayError PopulateDisplayAttributes(uint32_t index);
- void PopulateHWPanelInfo();
void GetHWDisplayPortAndMode();
void GetHWPanelMaxBrightness();
bool EnableHotPlugDetection(int enable);
diff --git a/sdm/libs/core/drm/hw_tv_drm.cpp b/sdm/libs/core/drm/hw_tv_drm.cpp
index 565652e..9081427 100644
--- a/sdm/libs/core/drm/hw_tv_drm.cpp
+++ b/sdm/libs/core/drm/hw_tv_drm.cpp
@@ -148,5 +148,21 @@
return kErrorNone;
}
+void HWTVDRM::PopulateHWPanelInfo() {
+ hw_panel_info_ = {};
+
+ HWDeviceDRM::PopulateHWPanelInfo();
+ hw_panel_info_.hdr_enabled = connector_info_.ext_hdr_prop.hdr_supported;
+ hw_panel_info_.hdr_metadata_type_one = connector_info_.ext_hdr_prop.hdr_metadata_type_one;
+ hw_panel_info_.hdr_eotf = connector_info_.ext_hdr_prop.hdr_eotf;
+ hw_panel_info_.peak_luminance = connector_info_.ext_hdr_prop.hdr_max_luminance;
+ hw_panel_info_.average_luminance = connector_info_.ext_hdr_prop.hdr_avg_luminance;
+ hw_panel_info_.blackness_level = connector_info_.ext_hdr_prop.hdr_min_luminance;
+ DLOGI("TV Panel: %s, type_one = %d, eotf = %d, luminance[max = %d, min = %d, avg = %d]",
+ hw_panel_info_.hdr_enabled ? "HDR" : "Non-HDR", hw_panel_info_.hdr_metadata_type_one,
+ hw_panel_info_.hdr_eotf, hw_panel_info_.peak_luminance, hw_panel_info_.blackness_level,
+ hw_panel_info_.average_luminance);
+}
+
} // namespace sdm
diff --git a/sdm/libs/core/drm/hw_tv_drm.h b/sdm/libs/core/drm/hw_tv_drm.h
index 54ce327..ec09862 100644
--- a/sdm/libs/core/drm/hw_tv_drm.h
+++ b/sdm/libs/core/drm/hw_tv_drm.h
@@ -46,6 +46,7 @@
virtual DisplayError Doze();
virtual DisplayError DozeSuspend();
virtual DisplayError Standby();
+ virtual void PopulateHWPanelInfo();
private:
static const int kBitRGB = 20;