meson_display: Provide settings for hdr_ Interface of policy [1/1]

PD#OTT-37900

Problem:
Through Mason_ drm_ set_ Prop does not work.

Solution:
At mesan_ Display layer encapsulation API setting hdr_ policy.

Verify:
AH212

Change-Id: Ie2b7ab17732da357c6b9f615e594d1fec04afbfc
Signed-off-by: chen.wang1 <chen.wang1@amlogic.com>
diff --git a/display_framework/src/extension/display_settings/display_settings.c b/display_framework/src/extension/display_settings/display_settings.c
index 87270e6..daa3a57 100644
--- a/display_framework/src/extension/display_settings/display_settings.c
+++ b/display_framework/src/extension/display_settings/display_settings.c
@@ -17,8 +17,8 @@
 #include <linux/string.h>
 #include "display_settings.h"
 #include "libdrm_meson/meson_drm_settings.h"
-#define DEFAULT_CARD "/dev/dri/card0"
 #include "libdrm_meson/meson_drm_event.h"
+#define DEFAULT_CARD "/dev/dri/card0"
 
 bool registerMesonDisplayEventCallback(mesonDisplayEventCallback cb) { //register callback
     return RegisterDisplayEventCallback(cb);
@@ -75,3 +75,43 @@
     close(fd);
     return  ret;
 }
+
+int setDisplayHDRPolicy(ENUM_MESON_HDR_POLICY hdrPolicy, MESON_CONNECTOR_TYPE connType) {
+    int res = -1;
+    int ret = -1;
+    int fd = 0;
+    drmModeAtomicReq *req = NULL;
+    fd = open(DEFAULT_CARD, O_RDWR|O_CLOEXEC);
+    if (fd < 0) {
+        printf("\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+        return ret;
+    }
+    ret = drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1);
+    if (ret) {
+        printf("no atomic setting support: %d\n",ret);
+        goto out;
+    }
+    req = drmModeAtomicAlloc();
+    if (req == NULL) {
+        printf("\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+        goto out;
+    }
+    res = meson_drm_setHDRPolicy(fd, req, hdrPolicy, connType);
+    if (res == -1) {
+        fprintf(stderr,"setHDRPolicyFail\n");
+        goto out;
+    }
+    ret = drmModeAtomicCommit(fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+    if (ret) {
+        fprintf(stderr, "failed to set HDR Policy: %d-%s\n", ret, strerror(errno));
+        goto out;
+    }
+out:
+    if (req) {
+        drmModeAtomicFree(req);
+        req = NULL;
+    }
+    close(fd);
+    return  ret;
+}
+
diff --git a/display_framework/src/extension/display_settings/display_settings.h b/display_framework/src/extension/display_settings/display_settings.h
index 1d96879..082ce7d 100644
--- a/display_framework/src/extension/display_settings/display_settings.h
+++ b/display_framework/src/extension/display_settings/display_settings.h
@@ -30,6 +30,12 @@
     MESONDISPLAY_EVENT_DISCONNECTED , //!< Display disconnected event.\n"
 }ENUM_MESONDISPLAY_EVENT;
 
+typedef enum _ENUM_MESON_HDR_POLICY {
+    MESON_HDR_POLICY_FOLLOW_SINK      = 0,  //<---Always  HDR--->//
+    MESON_HDR_POLICY_FOLLOW_SOURCE     //<---Adaptive  HDR--->//
+} ENUM_MESON_HDR_POLICY;
+
+int setDisplayHDRPolicy(ENUM_MESON_HDR_POLICY hdrPolicy, MESON_CONNECTOR_TYPE connType);
 int setDisplayMode(DisplayMode* modeInfo,MESON_CONNECTOR_TYPE connType);
 typedef void (*mesonDisplayEventCallback)(ENUM_MESONDISPLAY_EVENT enEvent, void *eventData/*Optional*/);
 bool registerMesonDisplayEventCallback(mesonDisplayEventCallback cb);
@@ -39,4 +45,4 @@
 }
 #endif
 
-#endif
\ No newline at end of file
+#endif

diff --git a/display_framework/src/extension/display_settings/display_settings_Test.c b/display_framework/src/extension/display_settings/display_settings_Test.c
index f79ccda..83dc8d4 100644
--- a/display_framework/src/extension/display_settings/display_settings_Test.c
+++ b/display_framework/src/extension/display_settings/display_settings_Test.c
@@ -16,6 +16,7 @@
 #include <errno.h>
 #include <linux/string.h>
 #include "display_settings.h"
+

 
 void display_event( ENUM_MESONDISPLAY_EVENT enEvent, void *eventData/*Optional*/)
 {
@@ -24,13 +25,12 @@
                "Eevent:%d\n",enEvent);
 }
 
-int main(void)
+int main()
 {
-    printf("\n 0->set hdmi mode 1->set cvbs mode 2-> event test\n");
+    printf("\n 0->set hdmi mode 1->set cvbs mode 2-> event test 3->setdisplay --hdrPolicy\n");
     int select_s_g = 0;
     DisplayMode* modeInfo = NULL;
     modeInfo = (DisplayMode*)malloc(sizeof(DisplayMode));
-
     scanf("%d",&select_s_g);
     if (select_s_g == 0) {
         printf("please input modeInfo:interlace, w, h, vrefresh\n");
@@ -48,12 +48,27 @@
         }else{
             printf("setDisplayModeFail\n");
         }
-    } else {
+    } else if(select_s_g == 2) {
         registerMesonDisplayEventCallback(display_event);
         startMesonDisplayUeventMonitor();
+    } else if (select_s_g == 3) {
+        printf("0->set Always Hdr 1->set Adaptive Hdr\n");
+        int Policy = 0;

+        scanf("%d",&Policy);

+        if (Policy == 0) {

+        if (setDisplayHDRPolicy(MESON_HDR_POLICY_FOLLOW_SINK,MESON_CONNECTOR_HDMIA) == 0) {

+            printf("set always hdr success\n");

+            }else{

+                printf("set always hdr fail\n");

+            }

+        } else if (Policy == 1){

+            if (setDisplayHDRPolicy(MESON_HDR_POLICY_FOLLOW_SOURCE,MESON_CONNECTOR_HDMIA) == 0) {

+                printf("set adaptive hdr success\n");

+            }else{

+                printf("set adaptive hdr fail\n");

+            }
+        }
     }
     return 0;
 }
 
-
-