meson-display: add mode check function [1/2]

PD#SWPL-139465

Problem:
S1A need support color space setting UI

Solution:
add mode check function

Verify:
ah212

Change-Id: I440e976906ea86e6d2726bd0a492e6ac70ad3eb7
Signed-off-by: limin.tian <limin.tian@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 16798eb..730b604 100644
--- a/display_framework/src/extension/display_settings/display_settings.c
+++ b/display_framework/src/extension/display_settings/display_settings.c
@@ -20,6 +20,7 @@
 #include "libdrm_meson/meson_drm_event.h"
 #define DEFAULT_CARD "/dev/dri/card0"
 #include "libdrm_meson/meson_drm_log.h"
+#include "linux/amlogic/drm/meson_drm.h"
 
 int display_meson_get_open() {
     int fd = -1;
@@ -785,5 +786,51 @@
     display_meson_close(fd);
     return ret;
 }
+bool modeAttrSupportedCheck(char* modeName, ENUM_MESON_COLOR_SPACE colorSpace,
+                            uint32_t colorDepth, MESON_CONNECTOR_TYPE connType )
+{
+    bool ret = false;
+    char attr[32] = {'\0'};
+    char color[5] = {'\0'};
+    int fd = -1;
+    if (modeName == NULL || colorSpace > MESON_COLOR_SPACE_YCBCR420 ||
+        ( connType != MESON_CONNECTOR_HDMIA && connType != MESON_CONNECTOR_HDMIB) ) {
+        ERROR("%s %d invalid parameters ", __FUNCTION__,__LINE__);
+        return ret;
+    }
+    switch ( colorSpace ) {
+        case MESON_COLOR_SPACE_RGB:
+            sprintf(color, "rgb");
+            break;
+        case MESON_COLOR_SPACE_YCBCR420:
+            sprintf(color, "420");
+            break;
+        case MESON_COLOR_SPACE_YCBCR422:
+            sprintf(color, "422");
+            break;
+        case MESON_COLOR_SPACE_YCBCR444:
+            sprintf(color, "444");
+            break;
+        default:
+            sprintf(color, "fail");
+            break;
+    }
+    snprintf(attr, sizeof(attr)-1, "%s,%dbit", color, colorDepth);
+    DEBUG("%s %d mode:%s attr:%s", __FUNCTION__,__LINE__,modeName, attr);
+    struct drm_mode_test_attr args;
+    memset(&args, 0, sizeof(struct drm_mode_test_attr));
+    strcpy(args.modename, modeName);
+    strcpy(args.attr, attr);
+    fd = display_meson_get_open();
+    DEBUG("%s %d drm fd:%d, args (%s %s)",__FUNCTION__,__LINE__, fd, args.modename, args.attr);
+    if (ioctl(fd, DRM_IOCTL_MESON_TESTATTR, &args) == 0) {
+        if (args.valid == 1)
+            ret = true;
+    } else {
+        ERROR("%s %d ioctl fail ", __FUNCTION__,__LINE__);
+    }
+    display_meson_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 4752a47..337d3f6 100644
--- a/display_framework/src/extension/display_settings/display_settings.h
+++ b/display_framework/src/extension/display_settings/display_settings.h
@@ -124,6 +124,8 @@
 int display_meson_set_open();
 

 void display_meson_close(int fd);
+bool modeAttrSupportedCheck(char* modeName, ENUM_MESON_COLOR_SPACE colorSpace,

+                          uint32_t colorDepth, MESON_CONNECTOR_TYPE connType );

 
 #if defined(__cplusplus)
 }
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 d28f150..4d2444a 100644
--- a/display_framework/src/extension/display_settings/display_settings_Test.c
+++ b/display_framework/src/extension/display_settings/display_settings_Test.c
@@ -165,7 +165,7 @@
     else if(select_s == 1 && select_len == 1) {
         printf("get:0->hdrPolicy 1->modeinfo 2->HDCP version 3->HDMI connected 4->color depth 5->color space"
          " 6->EDID 7->hdcp auth status 8->supportedModesList 9->prefer mode 10->HDCP Content Type 11->Content Type"
-         " 12->Dv Enable 13->active 14->vrr Enable 15->av mute 16->hdr mode 17->CvbsModesList\n");
+         " 12->Dv Enable 13->active 14->vrr Enable 15->av mute 16->hdr mode 17->CvbsModesList 18-> mode support check \n");
         len = scanf("%d",&get);
         if (get == 0 && len == 1) {
             ENUM_MESON_HDR_POLICY value = getDisplayHDRPolicy( MESON_CONNECTOR_HDMIA);
@@ -289,6 +289,22 @@
                  printf("\n %s get Display cvbs ModesList fail\n",__FUNCTION__);
             }
         }
+        else if (get == 18 && len == 1) {
+            char mode[32] = {'\0'};
+            int color_space = 255;
+            int color_depth = 255;
+            bool ret = false;
+            printf("\n please input mode name:\n");
+            scanf("%s", mode);
+            printf("\n please input color space:\n");
+            scanf("%d", &color_space);
+            printf("\n please input color depth:\n");
+            scanf("%d", &color_depth);
+            ret = modeAttrSupportedCheck(mode, (ENUM_MESON_COLOR_SPACE)color_space,
+            color_depth, MESON_CONNECTOR_HDMIA );
+            printf("\n mode:%s color attr %d, depth %dbit, SupportedCheck:%d\n",
+                mode, color_space, color_depth, ret);
+        }
     }
     else {
         printf("\n Incorrect input method\n");