+/* type to string ***********************************************************/
+struct tdm_type_name {
+ int type;
+ const char *name;
+};
+
+#define TDM_TYPE_NAME_FN(res) \
+static inline const char * tdm_##res##_str(int type) \
+{ \
+ unsigned int i; \
+ for (i = 0; i < TDM_ARRAY_SIZE(tdm_##res##_names); i++) { \
+ if (tdm_##res##_names[i].type == type) \
+ return tdm_##res##_names[i].name; \
+ } \
+ return "(invalid)"; \
+}
+
+static struct tdm_type_name tdm_error_names[] = {
+ { TDM_ERROR_NONE, "Success" },
+ { TDM_ERROR_BAD_REQUEST, "bad request" },
+ { TDM_ERROR_OPERATION_FAILED, "operaion failed" },
+ { TDM_ERROR_INVALID_PARAMETER, "wrong input parameter" },
+ { TDM_ERROR_PERMISSION_DENIED, "access denied" },
+ { TDM_ERROR_BUSY, "hardware resource busy" },
+ { TDM_ERROR_OUT_OF_MEMORY, "no free memory" },
+ { TDM_ERROR_BAD_MODULE, "bad backend module" },
+ { TDM_ERROR_NOT_IMPLEMENTED, "not implemented" },
+ { TDM_ERROR_NO_CAPABILITY, "no capability" },
+ { TDM_ERROR_DPMS_OFF, "dpms off" },
+ { TDM_ERROR_OUTPUT_DISCONNECTED, "output disconnected" },
+ { TDM_ERROR_PROTOCOL_ERROR, "protocol error" },
+};
+TDM_TYPE_NAME_FN(error)
+
+static struct tdm_type_name tdm_dpms_names[] = {
+ { TDM_OUTPUT_DPMS_ON, "on" },
+ { TDM_OUTPUT_DPMS_STANDBY, "standby" },
+ { TDM_OUTPUT_DPMS_SUSPEND, "suspend" },
+ { TDM_OUTPUT_DPMS_OFF, "off" },
+ { TDM_OUTPUT_DPMS_AOD, "aod" },
+};
+TDM_TYPE_NAME_FN(dpms)
+
+static struct tdm_type_name tdm_status_names[] = {
+ { TDM_OUTPUT_CONN_STATUS_DISCONNECTED, "disconnected" },
+ { TDM_OUTPUT_CONN_STATUS_CONNECTED, "connected" },
+ { TDM_OUTPUT_CONN_STATUS_MODE_SETTED, "mode_setted" },
+};
+TDM_TYPE_NAME_FN(status)
+
+static struct tdm_type_name tdm_conn_names[] = {
+ { TDM_OUTPUT_TYPE_Unknown, "Unknown" },
+ { TDM_OUTPUT_TYPE_VGA, "VGA" },
+ { TDM_OUTPUT_TYPE_DVII, "DVII" },
+ { TDM_OUTPUT_TYPE_DVID, "DVID" },
+ { TDM_OUTPUT_TYPE_DVIA, "DVIA" },
+ { TDM_OUTPUT_TYPE_Composite, "Composite" },
+ { TDM_OUTPUT_TYPE_SVIDEO, "SVIDEO" },
+ { TDM_OUTPUT_TYPE_LVDS, "LVDS" },
+ { TDM_OUTPUT_TYPE_Component, "Component" },
+ { TDM_OUTPUT_TYPE_9PinDIN, "9PinDIN" },
+ { TDM_OUTPUT_TYPE_DisplayPort, "DisplayPort" },
+ { TDM_OUTPUT_TYPE_HDMIA, "HDMIA" },
+ { TDM_OUTPUT_TYPE_HDMIB, "HDMIB" },
+ { TDM_OUTPUT_TYPE_TV, "TV" },
+ { TDM_OUTPUT_TYPE_eDP, "eDP" },
+ { TDM_OUTPUT_TYPE_VIRTUAL, "VIRTUAL" },
+ { TDM_OUTPUT_TYPE_DSI, "DSI" },
+};
+TDM_TYPE_NAME_FN(conn)
+
+static struct tdm_type_name tdm_capture_type_names[] = {
+ { TDM_CAPTURE_TYPE_ONESHOT, "none" },
+ { TDM_CAPTURE_TYPE_STREAM, "90" },
+};
+TDM_TYPE_NAME_FN(capture_type)
+
+static struct tdm_type_name tdm_transform_names[] = {
+ { TDM_TRANSFORM_NORMAL, "none" },
+ { TDM_TRANSFORM_90, "90" },
+ { TDM_TRANSFORM_180, "180" },
+ { TDM_TRANSFORM_270, "270" },
+ { TDM_TRANSFORM_FLIPPED, "flipped" },
+ { TDM_TRANSFORM_FLIPPED_90, "90,flipped" },
+ { TDM_TRANSFORM_FLIPPED_180, "180,flipped" },
+ { TDM_TRANSFORM_FLIPPED_270, "270,flipped" },
+};
+TDM_TYPE_NAME_FN(transform)
+
+static struct tdm_type_name tdm_value_type_names[] = {
+ { TDM_VALUE_TYPE_UNKNOWN, "unknown" },
+ { TDM_VALUE_TYPE_PTR, "ptr" },
+ { TDM_VALUE_TYPE_INT32, "int32" },
+ { TDM_VALUE_TYPE_UINT32, "uint32" },
+ { TDM_VALUE_TYPE_INT64, "int64" },
+ { TDM_VALUE_TYPE_UINT64, "uint64" },
+};
+TDM_TYPE_NAME_FN(value_type)
+
+static struct tdm_type_name tdm_cb_type_names[] = {
+ { TDM_THREAD_CB_NONE, "none" },
+ { TDM_THREAD_CB_EXIT, "exit" },
+ { TDM_THREAD_CB_OUTPUT_COMMIT, "output-commit" },
+ { TDM_THREAD_CB_OUTPUT_VBLANK, "output-vblank" },
+ { TDM_THREAD_CB_OUTPUT_STATUS, "output-status" },
+ { TDM_THREAD_CB_OUTPUT_DPMS, "output-dpms" },
+ { TDM_THREAD_CB_PP_DONE, "pp-done" },
+ { TDM_THREAD_CB_CAPTURE_DONE, "capture-done" },
+ { TDM_THREAD_CB_VBLANK_SW, "vblank-sw" },
+ { TDM_THREAD_CB_VBLANK_CREATE, "vblank-create" },
+ { TDM_THREAD_CB_HWC_COMMIT, "hwc-commit" },
+};
+TDM_TYPE_NAME_FN(cb_type)
+
+#define TDM_BIT_NAME_FB(res) \
+static inline const char * tdm_##res##_str(int type, char **reply, int *len) \
+{ \
+ unsigned int i; \
+ const char *sep = ""; \
+ if (type == 0) { \
+ TDM_SNPRINTF(*reply, len, "none"); \
+ return NULL; \
+ } \
+ for (i = 0; i < TDM_ARRAY_SIZE(tdm_##res##_names); i++) { \
+ if (type & (1 << i)) { \
+ TDM_SNPRINTF(*reply, len, "%s%s", sep, tdm_##res##_names[i]); \
+ sep = ","; \
+ } \
+ } \
+ return NULL; \
+}
+
+static const char *tdm_mode_type_names[] = {
+ "builtin",
+ "clock_c",
+ "crtc_c",
+ "preferred",
+ "default",
+ "userdef",
+ "driver",
+};
+TDM_BIT_NAME_FB(mode_type)
+
+static const char *tdm_mode_flag_names[] = {
+ "phsync",
+ "nhsync",
+ "pvsync",
+ "nvsync",
+ "interlace",
+ "dblscan",
+ "csync",
+ "pcsync",
+ "ncsync",
+ "hskew",
+ "bcast",
+ "pixmux",
+ "dblclk",
+ "clkdiv2"
+};
+TDM_BIT_NAME_FB(mode_flag)
+
+static const char *tdm_layer_caps_names[] = {
+ "cursor",
+ "primary",
+ "overlay",
+ "",
+ "graphic",
+ "video",
+ "",
+ "",
+ "scale",
+ "transform",
+ "scanout",
+ "reserved",
+ "no_crop",
+};
+TDM_BIT_NAME_FB(layer_caps)
+
+static const char *tdm_pp_caps_names[] = {
+ "sync",
+ "async",
+ "scale",
+ "transform",
+};
+TDM_BIT_NAME_FB(pp_caps)
+
+static const char *tdm_capture_caps_names[] = {
+ "output",
+ "layer",
+ "scale",
+ "transform",
+};
+TDM_BIT_NAME_FB(capture_caps)
+
+/* check condition **********************************************************/