Merge "libdrm-meson: Expand libdrm-meson API Function List [1/1]"
diff --git a/meson/libdrm_meson_connector.h b/meson/libdrm_meson_connector.h
index 538d35f..ab339e3 100644
--- a/meson/libdrm_meson_connector.h
+++ b/meson/libdrm_meson_connector.h
@@ -6,13 +6,11 @@
  *
  * Description:
  */
-
 #ifndef LIBDRM_MESON_CONNECTOR_H_
 #define LIBDRM_MESON_CONNECTOR_H_
 #if defined(__cplusplus)
 extern "C" {
 #endif
-
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -34,6 +32,9 @@
 #define DRM_CONNECTOR_PROP_DV_ENABLE       "dv_enable"
 #define DRM_CONNECTOR_PROP_COLOR_SPACE       "color_space"
 #define DRM_CONNECTOR_PROP_COLOR_DEPTH       "color_depth"
+#define DRM_CONNECTOR_PROP_Content_Type       "content type"
+#define DRM_CONNECTOR_PROP_ACTIVE       "ACTIVE"
+#define DRM_CONNECTOR_VRR_ENABLED       "VRR_ENABLED"
 
 struct mesonConnector;
 struct mesonConnector *mesonConnectorCreate(int drmFd, int type);
diff --git a/meson/meson_drm_settings.c b/meson/meson_drm_settings.c
index cfb3d97..08b54a7 100644
--- a/meson/meson_drm_settings.c
+++ b/meson/meson_drm_settings.c
@@ -18,7 +18,6 @@
 #include "libdrm_meson_property.h"
 #include "meson_drm_settings.h"
 
-
 #define DEFAULT_CARD "/dev/dri/card0"
 #define PROP_NAME_MAX_LEN 50
 static int meson_drm_get_crtc_prop_value( int drmFd, MESON_CONNECTOR_TYPE connType,
@@ -135,6 +134,7 @@
     if (drmFd >= 0)
         close(drmFd);
 }
+
 static int meson_drm_set_property(int drmFd, drmModeAtomicReq *req, uint32_t objId,
                                   uint32_t objType, char* name, uint64_t value)
 {
@@ -155,6 +155,77 @@
     return rc;
 }
 
+int meson_drm_getPreferredMode( DisplayMode* mode) {
+    int ret = -1;
+    int i = 0;
+    int count = 0;
+    drmModeModeInfo* modes = NULL;
+    int drmFd = -1;
+    struct mesonConnector* conn = NULL;
+    drmFd = meson_open_drm();
+    conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
+    if (conn == NULL || drmFd < 0)
+    {
+        printf("\n%s %d connector create fail\n",__FUNCTION__,__LINE__);
+    }
+    if (0 != mesonConnectorGetModes(conn, drmFd, &modes, &count))
+        goto out;
+    for (i = 0; i < count; i++)
+    {
+        if (modes[i].type & DRM_MODE_TYPE_PREFERRED)
+        {
+            mode->w = modes[i].hdisplay;
+            mode->h = modes[i].vdisplay;
+            mode->interlace = (modes[i].flags & DRM_MODE_FLAG_INTERLACE) ? true : false;
+            strcpy(mode->name, modes[i].name );
+            break;
+        }
+    }
+    ret = 0;
+out:
+    if (conn)
+        mesonConnectorDestroy(drmFd,conn);
+    if (drmFd >= 0 )
+        close(drmFd);
+    return ret;
+}
+
+int meson_drm_getsupportedModesList(int drmFd, DisplayMode** modeInfo, int* modeCount )
+{
+    int ret = -1;
+    struct mesonConnector* conn = NULL;
+    if ( drmFd < 0) {
+        fprintf(stderr, "\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+        return ret;
+    }
+    conn = mesonConnectorCreate(drmFd, DRM_MODE_CONNECTOR_HDMIA);
+    if (conn == NULL || drmFd < 0)
+    {
+        printf("\n%s %d connector create fail\n",__FUNCTION__,__LINE__);
+    }
+    drmModeModeInfo* modeall = NULL;
+    int count = 0;
+    int i = 0;
+    if (0 != mesonConnectorGetModes(conn, drmFd, &modeall, &count))
+        goto out;
+    DisplayMode* modestemp =  (DisplayMode*)calloc(count, sizeof(DisplayMode));
+    for (i = 0; i < count; i++)
+    {
+        modestemp[i].w = modeall[i].hdisplay;
+        modestemp[i].h = modeall[i].vdisplay;
+        modestemp[i].vrefresh = modeall[i].vrefresh;
+        modestemp[i].interlace = (modeall[i].flags & DRM_MODE_FLAG_INTERLACE) ? true : false;
+        strcpy(modestemp[i].name, modeall[i].name );
+    }
+    *modeCount = count;
+    *modeInfo = modestemp;
+    ret = 0;
+out:
+    if (conn)
+        mesonConnectorDestroy(drmFd,conn);
+    return ret;
+}
+
 int meson_drm_getModeInfo(int drmFd, MESON_CONNECTOR_TYPE connType, DisplayMode* modeInfo)
 {
     int ret = -1;
@@ -538,6 +609,23 @@
         ret = 0;
     return ret;
 }
+
+int meson_drm_getAVMute( int drmFd, MESON_CONNECTOR_TYPE connType )
+{
+    char propName[PROP_NAME_MAX_LEN] = {'\0'};
+    sprintf( propName, "%s", MESON_DRM_HDMITX_PROP_AVMUTE);
+    uint32_t value = 0;
+    if ( drmFd < 0) {
+        fprintf(stderr, "\n%s %d drmFd < 0\n",__FUNCTION__,__LINE__);
+        return value;
+    }
+    if ( 0 != meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
+         fprintf(stderr, "\n%s %d fail\n",__FUNCTION__,__LINE__);
+    }
+    fprintf(stderr, "\n AVMute control, 1 means set avmute, 0 means not avmute\n");
+    return value;
+}
+
 ENUM_MESON_HDCPAUTH_STATUS meson_drm_getHdcpAuthStatus( int drmFd, MESON_CONNECTOR_TYPE connType )
 {
     char propName[PROP_NAME_MAX_LEN] = {'\0'};
@@ -579,5 +667,241 @@
     return ret;
 }
 
+int meson_drm_setHDCPContentType(int drmFd, drmModeAtomicReq *req,
+                       ENUM_MESON_HDCP_Content_Type HDCPType, MESON_CONNECTOR_TYPE connType)
+{
+    int ret = -1;
+    int rc = -1;
+    struct mesonConnector* conn = NULL;
+    uint32_t connId = 0;
+    if ( drmFd < 0 || req == NULL) {
+        fprintf(stderr, "\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+        return ret;
+    }
+    conn = get_current_connector(drmFd, connType);
+    if (conn) {
+        connId = mesonConnectorGetId(conn);
+        rc = meson_drm_set_property(drmFd, req, connId, DRM_MODE_OBJECT_CONNECTOR,
+                       DRM_CONNECTOR_PROP_CONTENT_TYPE, (uint64_t)HDCPType);
+        mesonConnectorDestroy(drmFd,conn);
+    }
+    if (rc >= 0)
+        ret = 0;
+    return ret;
+}
+
+ENUM_MESON_HDCP_Content_Type meson_drm_getHDCPContentType( int drmFd, MESON_CONNECTOR_TYPE connType )
+{
+    char propName[PROP_NAME_MAX_LEN] = {'\0'};
+    sprintf( propName, "%s", DRM_CONNECTOR_PROP_CONTENT_TYPE);
+    uint32_t value = 0;
+    ENUM_MESON_HDCP_Content_Type ContentType = MESON_HDCP_Type_RESERVED;
+    if ( drmFd < 0) {
+        fprintf(stderr, "\n%s %d drmFd < 0\n",__FUNCTION__,__LINE__);
+        return ContentType;
+    }
+    if ( 0 == meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
+        switch (value)
+        {
+            case 0:
+                ContentType = MESON_HDCP_Type0;
+                break;
+            case 1:
+                ContentType = MESON_HDCP_Type1;
+                break;
+            default:
+                ContentType = MESON_HDCP_Type_RESERVED;
+                break;
+        }
+    } else {
+        fprintf(stderr, "\n%s %d fail\n",__FUNCTION__,__LINE__);
+    }
+    return ContentType;
+}
+
+MESON_CONTENT_TYPE meson_drm_getContentType(int drmFd, MESON_CONNECTOR_TYPE connType ) {
+
+    char propName[PROP_NAME_MAX_LEN] = {'\0'};
+    sprintf( propName, "%s", DRM_CONNECTOR_PROP_Content_Type);
+    uint32_t value = 0;
+    MESON_CONTENT_TYPE ContentType = MESON_CONTENT_TYPE_RESERVED;
+    if ( drmFd < 0) {
+        fprintf(stderr, "\n%s %d drmFd < 0\n",__FUNCTION__,__LINE__);
+        return ContentType;
+    }
+    if ( 0 == meson_drm_get_conn_prop_value(drmFd, connType, propName, &value )) {
+        switch (value)
+        {
+            case 0:
+                ContentType = MESON_CONTENT_TYPE_Data;
+                break;
+            case 1:
+                ContentType = MESON_CONTENT_TYPE_Graphics;
+                break;
+            case 2:
+                ContentType = MESON_CONTENT_TYPE_Photo;
+                break;
+            case 3:
+                ContentType = MESON_CONTENT_TYPE_Cinema;
+                break;
+            case 4:
+                ContentType = MESON_CONTENT_TYPE_Game;
+                break;
+            default:
+                ContentType = MESON_CONTENT_TYPE_RESERVED;
+                break;
+        }
+    } else {
+        fprintf(stderr, "\n%s %d fail\n",__FUNCTION__,__LINE__);
+    }
+    return ContentType;
+}
+
+int meson_drm_setDvEnable(int drmFd, drmModeAtomicReq *req,
+                       uint32_t dvEnable, MESON_CONNECTOR_TYPE connType)
+{
+    int ret = -1;
+    int rc = -1;
+    struct mesonConnector* conn = NULL;
+    uint32_t crtcId = 0;
+    conn = get_current_connector(drmFd, connType);
+    if ( drmFd < 0 || req == NULL) {
+        fprintf(stderr, "\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+        return ret;
+    }
+    if (conn) {
+        crtcId = mesonConnectorGetCRTCId(conn);
+        rc = meson_drm_set_property(drmFd, req, crtcId, DRM_MODE_OBJECT_CRTC,
+                       DRM_CONNECTOR_PROP_DV_ENABLE, (uint64_t)dvEnable);
+        mesonConnectorDestroy(drmFd,conn);
+    }
+    if (rc >= 0)
+        ret = 0;
+    return ret;
+}
+
+int meson_drm_getDvEnable( int drmFd, MESON_CONNECTOR_TYPE connType )
+{
+    char propName[PROP_NAME_MAX_LEN] = {'\0'};
+    sprintf( propName, "%s", DRM_CONNECTOR_PROP_DV_ENABLE);
+    uint32_t value = -1;
+    if ( drmFd < 0) {
+        fprintf(stderr, "\n%s %d drmFd < 0\n",__FUNCTION__,__LINE__);
+        return value;
+    }
+    if ( 0 != meson_drm_get_crtc_prop_value( drmFd, connType, propName, &value )) {
+         fprintf(stderr, "\n%s %d fail\n",__FUNCTION__,__LINE__);
+    }
+    return value;
+}
+
+int meson_drm_setActive(int drmFd, drmModeAtomicReq *req,
+                       uint32_t active, MESON_CONNECTOR_TYPE connType)
+{
+    int ret = -1;
+    int rc = -1;
+    struct mesonConnector* conn = NULL;
+    uint32_t crtcId = 0;
+    conn = get_current_connector(drmFd, connType);
+    if ( drmFd < 0 || req == NULL) {
+        fprintf(stderr, "\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+        return ret;
+    }
+    if (conn) {
+        crtcId = mesonConnectorGetCRTCId(conn);
+        rc = meson_drm_set_property(drmFd, req, crtcId, DRM_MODE_OBJECT_CRTC,
+                       DRM_CONNECTOR_PROP_ACTIVE, (uint64_t)active);
+        mesonConnectorDestroy(drmFd,conn);
+    }
+    if (rc >= 0)
+        ret = 0;
+    return ret;
+}
+
+int meson_drm_getActive( int drmFd, MESON_CONNECTOR_TYPE connType )
+{
+    char propName[PROP_NAME_MAX_LEN] = {'\0'};
+    sprintf( propName, "%s", DRM_CONNECTOR_PROP_ACTIVE);
+    uint32_t value = 0;
+    if ( drmFd < 0) {
+        fprintf(stderr, "\n%s %d drmFd < 0\n",__FUNCTION__,__LINE__);
+        return value;
+    }
+    if ( 0 != meson_drm_get_crtc_prop_value( drmFd, connType, propName, &value )) {
+         fprintf(stderr, "\n%s %d fail\n",__FUNCTION__,__LINE__);
+    }
+    return value;
+}
+
+int meson_drm_setVrrEnabled(int drmFd, drmModeAtomicReq *req,
+                       uint32_t VrrEnable, MESON_CONNECTOR_TYPE connType)
+{
+    int ret = -1;
+    int rc = -1;
+    struct mesonConnector* conn = NULL;
+    uint32_t crtcId = 0;
+    conn = get_current_connector(drmFd, connType);
+    if ( drmFd < 0 || req == NULL) {
+        fprintf(stderr, "\n %s %d invalid parameter return\n",__FUNCTION__,__LINE__);
+        return ret;
+    }
+    if (conn) {
+        crtcId = mesonConnectorGetCRTCId(conn);
+        rc = meson_drm_set_property(drmFd, req, crtcId, DRM_MODE_OBJECT_CRTC,
+                       DRM_CONNECTOR_VRR_ENABLED, (uint64_t)VrrEnable);
+        mesonConnectorDestroy(drmFd,conn);
+    }
+    if (rc >= 0)
+        ret = 0;
+    return ret;
+}
+
+int meson_drm_getVrrEnabled( int drmFd, MESON_CONNECTOR_TYPE connType )
+{
+    char propName[PROP_NAME_MAX_LEN] = {'\0'};
+    sprintf( propName, "%s", DRM_CONNECTOR_VRR_ENABLED);
+    uint32_t value = 0;
+    if ( drmFd < 0) {
+        fprintf(stderr, "\n%s %d drmFd < 0\n",__FUNCTION__,__LINE__);
+        return value;
+    }
+    if ( 0 != meson_drm_get_crtc_prop_value( drmFd, connType, propName, &value )) {
+         fprintf(stderr, "\n%s %d fail\n",__FUNCTION__,__LINE__);
+    }
+    return value;
+}
+
+int meson_drm_getHdrCap( int drmFd, MESON_CONNECTOR_TYPE connType )
+{
+    char propName[PROP_NAME_MAX_LEN] = {'\0'};
+    sprintf( propName, "%s", DRM_CONNECTOR_PROP_RX_HDR_CAP);
+    uint32_t value = 0;
+    if ( drmFd < 0) {
+        fprintf(stderr, "\n%s %d drmFd < 0\n",__FUNCTION__,__LINE__);
+        return value;
+    }
+    if ( 0 != meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
+         fprintf(stderr, "\n%s %d fail\n",__FUNCTION__,__LINE__);
+    }
+    fprintf(stderr, "hdr_cap:presents the RX HDR capability [r]\n");
+    return value;
+}
+
+int meson_drm_getDvCap( int drmFd, MESON_CONNECTOR_TYPE connType )
+{
+    char propName[PROP_NAME_MAX_LEN] = {'\0'};
+    sprintf( propName, "%s", DRM_CONNECTOR_PROP_RX_DV_CAP);
+    uint32_t value = 0;
+    if ( drmFd < 0) {
+        fprintf(stderr, "\n%s %d drmFd < 0\n",__FUNCTION__,__LINE__);
+        return value;
+    }
+    if ( 0 != meson_drm_get_conn_prop_value( drmFd, connType, propName, &value )) {
+         fprintf(stderr, "\n%s %d fail\n",__FUNCTION__,__LINE__);
+    }
+    fprintf(stderr, "dv_cap:presents the RX dolbyvision capability, [r] such as std or ll mode \n");
+    return value;
+}
+
 
 
diff --git a/meson/meson_drm_settings.h b/meson/meson_drm_settings.h
index b7c4258..e776b54 100644
--- a/meson/meson_drm_settings.h
+++ b/meson/meson_drm_settings.h
@@ -6,7 +6,6 @@
  *
  * Description:
  */
-
 #ifndef MESON_DRM_SETTINGS_H_
 #define MESON_DRM_SETTINGS_H_
 #include <stdio.h>
@@ -20,6 +19,22 @@
 #endif
 #define DRM_DISPLAY_MODE_LEN 32
 
+typedef enum _MESON_CONTENT_TYPE {
+    MESON_CONTENT_TYPE_Data      = 0,
+    MESON_CONTENT_TYPE_Graphics,
+    MESON_CONTENT_TYPE_Photo,
+    MESON_CONTENT_TYPE_Cinema,
+    MESON_CONTENT_TYPE_Game,
+    MESON_CONTENT_TYPE_RESERVED
+} MESON_CONTENT_TYPE;
+
+/*HDCP transmission time divided into Type0&Type1 content*/
+typedef enum _ENUM_MESON_HDCP_Content_Type{
+    MESON_HDCP_Type0 = 0,  //Type0 represents support for both 1.4 and 2.2
+    MESON_HDCP_Type1,   //Type1 represents only support for 2.2
+    MESON_HDCP_Type_RESERVED
+} ENUM_MESON_HDCP_Content_Type;
+
 typedef enum {
     MESON_DISCONNECTED      = 0,
     MESON_CONNECTED         = 1,
@@ -27,10 +42,10 @@
 } ENUM_MESON_CONN_CONNECTION;
 
 typedef struct _DisplayMode {
-    uint16_t w;
-    uint16_t h;
-    uint32_t vrefresh;
-    bool interlace;
+    uint16_t w;  //<--Number of horizontal pixels in the effective display area-->//
+    uint16_t h;   //<--Number of vertical pixels in the effective display area-->//
+    uint32_t vrefresh;  //<--Display refresh rate--->//
+    bool interlace;  //<--Indicates which scanning form to choose, P represents progressive scanning, and i represents interlaced scanning; The default interlace value is 0 for P 1 for i-->//
     char name[DRM_DISPLAY_MODE_LEN];
 } DisplayMode;
 
@@ -76,6 +91,26 @@
     MESON_AUTH_STATUS_SUCCESS
 } ENUM_MESON_HDCPAUTH_STATUS;
 
+int meson_drm_setContentType(int drmFd, drmModeAtomicReq *req,
+                       MESON_CONTENT_TYPE contentType, MESON_CONNECTOR_TYPE connType);
+
+int meson_drm_setVrrEnabled(int drmFd, drmModeAtomicReq *req,
+                       uint32_t VrrEnable, MESON_CONNECTOR_TYPE connType);
+int meson_drm_getVrrEnabled( int drmFd, MESON_CONNECTOR_TYPE connType );
+
+
+int meson_drm_getActive( int drmFd, MESON_CONNECTOR_TYPE connType );
+
+int meson_drm_setActive(int drmFd, drmModeAtomicReq *req,
+                       uint32_t active, MESON_CONNECTOR_TYPE connType);
+
+int meson_drm_getDvEnable( int drmFd, MESON_CONNECTOR_TYPE connType );
+int meson_drm_setDvEnable(int drmFd, drmModeAtomicReq *req,
+                       uint32_t dvEnable, MESON_CONNECTOR_TYPE connType);
+
+MESON_CONTENT_TYPE meson_drm_getContentType(int drmFd, MESON_CONNECTOR_TYPE connType );
+
+
 int meson_drm_changeMode(int drmFd, drmModeAtomicReq *req,
                       DisplayMode* modeInfo, MESON_CONNECTOR_TYPE connType);
 int meson_drm_getModeInfo(int drmFd, MESON_CONNECTOR_TYPE connType, DisplayMode* mode );
@@ -99,10 +134,24 @@
 void meson_drm_getEDIDData(int drmFd, MESON_CONNECTOR_TYPE connType, int * data_Len, char **data );
 int meson_drm_setAVMute(int drmFd, drmModeAtomicReq *req,
                        bool mute, MESON_CONNECTOR_TYPE connType);
+int meson_drm_getAVMute( int drmFd, MESON_CONNECTOR_TYPE connType );
+
 ENUM_MESON_HDCPAUTH_STATUS meson_drm_getHdcpAuthStatus( int drmFd, MESON_CONNECTOR_TYPE connType );
 int meson_drm_setHDCPEnable(int drmFd, drmModeAtomicReq *req,
                        bool enable, MESON_CONNECTOR_TYPE connType);
 
+int meson_drm_getsupportedModesList(int drmFd, DisplayMode** modeInfo, int* modeCount );
+int meson_drm_getPreferredMode( DisplayMode* mode);
+
+int meson_drm_setHDCPContentType(int drmFd, drmModeAtomicReq *req,
+                       ENUM_MESON_HDCP_Content_Type HDCPType, MESON_CONNECTOR_TYPE connType);
+ENUM_MESON_HDCP_Content_Type meson_drm_getHDCPContentType( int drmFd, MESON_CONNECTOR_TYPE connType );
+
+int meson_drm_getHdcpVer( int drmFd, MESON_CONNECTOR_TYPE connType );
+
+int meson_drm_getHdrCap( int drmFd, MESON_CONNECTOR_TYPE connType );
+int meson_drm_getDvCap( int drmFd, MESON_CONNECTOR_TYPE connType );
+
 int meson_open_drm();
 void meson_close_drm(int drmFd);
 
diff --git a/meson/meson_drm_settings_test.c b/meson/meson_drm_settings_test.c
index 3b1fc08..18834ab 100644
--- a/meson/meson_drm_settings_test.c
+++ b/meson/meson_drm_settings_test.c
@@ -29,7 +29,9 @@
     select_len = scanf("%d",&select_s_g);
     if (select_s_g == 1 && select_len == 1) {
         printf("get value: 1.HDCP version  2.HDMI connected 3.color space 4. color depth"
-               "5. hdr mode 6. mode 7. hdr policy 8. EDID 9. hdcp auth status\n");
+               "5. hdr mode 6. mode 7. hdr policy 8. EDID 9. hdcp auth status 10.supportedModesList"
+               " 11.prefer mode 12.HDCP Content Type 13.Content Type 14.Dv Enable 15.active "
+               " 16.vrr Enable 17.AVMute 18.Hdrcap 19.DvCap\n");
         int get = 0;
         int drmFd = meson_open_drm();
         int len = scanf("%d", &get);
@@ -91,10 +93,70 @@
             value = meson_drm_getHdcpAuthStatus( drmFd, MESON_CONNECTOR_HDMIA );
              printf("\n MESON_AUTH_STATUS_FAIL      = 0 \n"
                       " MESON_AUTH_STATUS_SUCCESS = 1 \n value:%d\n", value);
+        }  else if (get == 10 && len == 1) {
+            DisplayMode* modes = NULL;
+            int count = 0;
+            if (0 == meson_drm_getsupportedModesList(drmFd, &modes, &count )) {
+                printf("\n mode count:%d\n",count);
+                int i = 0;
+                for (int i=0; i<count; i++) {
+                    printf(" (%s %d %d %d %d)\n", modes[i].name, modes[i].w, modes[i].h, modes[i].interlace,modes[i].vrefresh);
+                }
+                if (modes)
+                    free(modes);
+            } else {
+                 printf("\n %s fail\n",__FUNCTION__);
+            }
+        } else if (get == 11 && len == 1) {
+            DisplayMode mode;
+            if (0 == meson_drm_getPreferredMode(&mode)) {
+                printf(" (%s %d %d %d)\n", mode.name, mode.w, mode.h, mode.interlace);
+            } else {
+                 printf("\n %s fail\n",__FUNCTION__);
+            }
+        } else if (get == 12 && len == 1) {
+            ENUM_MESON_HDCP_Content_Type value = MESON_HDCP_Type_RESERVED;
+            value = meson_drm_getHDCPContentType(drmFd, MESON_CONNECTOR_HDMIA);
+            printf("\n MESON_HDCP_Type0      = 0 \n"
+                      " MESON_HDCP_Type1 = 1 \n value:%d\n", value);
+        } else if (get == 13 && len == 1) {
+            ENUM_MESON_COLOR_SPACE value = meson_drm_getContentType( drmFd, MESON_CONNECTOR_HDMIA );
+            printf("\n MESON_Content_Type_Data      = 0 \n"
+                      "MESON_Content_Type_Graphics = 1 \n"
+                      "MESON_Content_Type_Photo = 2 \n"
+                      "MESON_Content_Type_Cinema = 3 \n"
+                      "MESON_Content_Type_Game = 4 \n value:%d\n"
+                      , value);
+        } else if (get == 14 && len == 1) {
+            int value = meson_drm_getDvEnable( drmFd, MESON_CONNECTOR_HDMIA );
+            printf("\n Dv_Enable:%d\n",value);
+            if (value == 1) {
+                printf("Support Dolbyvision\n");
+            } else {
+                printf("Dolbyvision not supported\n");
+            }
+        } else if (get == 15 && len == 1) {
+            int value = meson_drm_getActive( drmFd, MESON_CONNECTOR_HDMIA );
+            printf("\n Active:%d\n",value);
+        } else if (get == 16 && len == 1) {
+            int value = meson_drm_getVrrEnabled( drmFd, MESON_CONNECTOR_HDMIA );
+            printf("\n Vrr_Enabled:%d\n",value);
+        } else if (get == 17 && len == 1) {
+            int value = meson_drm_getAVMute( drmFd, MESON_CONNECTOR_HDMIA );
+            printf("\n AVMute:%d\n",value);
+        }  else if (get == 18 && len == 1) {
+            // presents the RX HDR capability
+            int value = meson_drm_getHdrCap( drmFd, MESON_CONNECTOR_HDMIA );
+            printf("\n HdrCap:%d\n",value);
+        } else if (get == 19 && len == 1) {
+            // presents the RX dolbyvision capability, [r] such as std or ll mode
+            int value = meson_drm_getDvCap( drmFd, MESON_CONNECTOR_HDMIA );
+            printf("\n DvCap:%d\n",value);
         }
         meson_close_drm(drmFd);
     } else if (select_s_g == 0 && select_len == 1) {
-        printf("set value:1.av mute 2.HDMI HDCP enable \n");
+        printf("set value:1.av mute 2.HDMI HDCP enable  3.HDCP Content Type "
+             " 4.DvEnable 5.active 6.vrr Enable\n");
         int set = 0;
         int ret = -1;
         drmModeAtomicReq * req;
@@ -126,7 +188,47 @@
             len = scanf("%d", &hdcpEnable);
             if (len == 1) {
                 if (meson_drm_setHDCPEnable( drmFd, req, hdcpEnable, MESON_CONNECTOR_HDMIA))
-                    printf("\n meson_drm_setAVMute fail:\n");
+                    printf("\n meson_drm_setHDCPEnable fail:\n");
+                } else {
+                    printf("\n scanf fail\n");
+                }
+        } else if (set == 3 && len == 1) {
+            printf("\n HDCP Content Type:\n");
+            int HDCPContentType = 0;
+            len = scanf("%d", &HDCPContentType);
+            if (len == 1) {
+                if (meson_drm_setHDCPContentType( drmFd, req, HDCPContentType, MESON_CONNECTOR_HDMIA))
+                    printf("\n meson_drm_setHDCPContentType fail:\n");
+                } else {
+                    printf("\n scanf fail\n");
+                }
+        } else if (set == 4 && len == 1) {
+            printf("\n DvEnable:\n");
+            int dvEnable = 0;
+            len = scanf("%d", &dvEnable);
+            if (len == 1) {
+                if (meson_drm_setDvEnable( drmFd, req, dvEnable, MESON_CONNECTOR_HDMIA))
+                    printf("\n meson_drm_setDv_Enable fail:\n");
+                } else {
+                    printf("\n scanf fail\n");
+                }
+        } else if (set == 5 && len == 1) {
+            printf("\n Active:\n");
+            int active = 0;
+            len = scanf("%d", &active);
+            if (len == 1) {
+                if (meson_drm_setActive( drmFd, req, active, MESON_CONNECTOR_HDMIA))
+                    printf("\n meson_drm_setActive fail:\n");
+                } else {
+                    printf("\n scanf fail\n");
+                }
+        } else if (set == 6 && len == 1) {
+            printf("\n vrr Enable:\n");
+            int vrrEnable = 0;
+            len = scanf("%d", &vrrEnable);
+            if (len == 1) {
+                if (meson_drm_setVrrEnabled( drmFd, req, vrrEnable, MESON_CONNECTOR_HDMIA))
+                    printf("\n meson_drm_setVrr_Enabled fail:\n");
                 } else {
                     printf("\n scanf fail\n");
                 }