secdp.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 and
  7. * only version 2 as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. */
  15. #ifndef __SECDP_H
  16. #define __SECDP_H
  17. #if IS_ENABLED(CONFIG_USB_TYPEC_MANAGER_NOTIFIER)
  18. #include <linux/usb/typec/manager/usb_typec_manager_notifier.h>
  19. #endif
  20. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  21. #include <linux/usb/typec/common/pdic_notifier.h>
  22. #endif
  23. #include <linux/secdp_logger.h>
  24. #include <linux/pm_wakeup.h>
  25. #include <linux/sched/clock.h>
  26. /*#define MODEM_RF_INFO*/
  27. #if defined(MODEM_RF_INFO) && IS_ENABLED(CONFIG_DEV_RIL_BRIDGE)
  28. #include <linux/dev_ril_bridge.h>
  29. struct rf_information {
  30. u8 rat;
  31. u32 band;
  32. u32 arfcn;
  33. } __packed;
  34. #endif
  35. #include "dp_hpd.h"
  36. #include "dp_power.h"
  37. #include "dp_panel.h"
  38. #include "dp_catalog.h"
  39. #include "dp_parser.h"
  40. #include "dp_link.h"
  41. #include "secdp_sysfs.h"
  42. /*defined at kmodule/usb/typec/common/pdic_core.h*/
  43. #define SAMSUNG_VENDOR_ID 0x04E8
  44. #define DEXDOCK_PRODUCT_ID 0xA020 /* EE-MG950 DeX Station */
  45. #define DEXPAD_PRODUCT_ID 0xA029 /* EE-M5100 DeX Pad */
  46. #define DEXCABLE_PRODUCT_ID 0xA048 /* EE-I3100 DeX Cable */
  47. #define HG950_PRODUCT_ID 0xA025 /* EE-HG950 HDMI Adapter */
  48. #define MPA2_PRODUCT_ID 0xA027 /* EE-P5000 Multiport Adapter */
  49. #define MPA3_PRODUCT_ID 0xA056 /* EE-P3200 Multiport Adapter */
  50. #define MPA4_PRODUCT_ID 0xA066 /* EE-P5400 Multiport Adapter */
  51. #define SECDP_ENUM_STR(x) #x
  52. #define SECDP_USB_CONCURRENCY
  53. #define SECDP_USE_WAKELOCK
  54. #define SECDP_MAX_HBR2
  55. /*#define SECDP_AUDIO_CTS*/
  56. /*#define SECDP_HDCP_DISABLE*/
  57. /*#define SECDP_TEST_HDCP2P2_REAUTH*/
  58. /*#define NOT_SUPPORT_DEX_RES_CHANGE*/
  59. #define REMOVE_YUV420_AT_PREFER
  60. #define SYSFS_BW_CODE
  61. #define DPCD_IEEE_OUI 0x500
  62. #define DPCD_DEVID_STR 0x503
  63. #define LEN_BRANCH_REV 3
  64. #define DPCD_BRANCH_HW_REV 0x509
  65. #define DPCD_BRANCH_SW_REV_MAJOR 0x50A
  66. #define DPCD_BRANCH_SW_REV_MINOR 0x50B
  67. #define MAX_CNT_LINK_STATUS_UPDATE 4
  68. #define MAX_CNT_HDCP_RETRY 10
  69. /* MST: max resolution, max refresh rate, max pclk */
  70. #define MST_MAX_COLS 3840
  71. #define MST_MAX_ROWS 2160
  72. #define MST_MAX_FPS 30
  73. #define MST_MAX_PCLK 300000
  74. #define PDIC_DP_NOTI_REG_DELAY 1000
  75. /* displayport self test */
  76. #if defined(CONFIG_SECDP_DBG)
  77. #define SECDP_SELF_TEST
  78. #endif
  79. #ifdef SECDP_SELF_TEST
  80. #define ST_EDID_SIZE 256
  81. #define ST_ARG_CNT 20
  82. #define ST_TEST_EXIT 555
  83. enum {
  84. ST_CLEAR_CMD,
  85. ST_LANE_CNT,
  86. ST_LINK_RATE,
  87. ST_CONNECTION_TEST,
  88. ST_HDCP_TEST,
  89. ST_PREEM_TUN,
  90. ST_VOLTAGE_TUN,
  91. ST_MAX,
  92. };
  93. struct secdp_sef_test_item {
  94. char cmd_str[20];
  95. int arg[ST_ARG_CNT];
  96. int arg_cnt;
  97. char arg_str[100];
  98. bool enabled;
  99. void (*clear)(void);
  100. };
  101. int secdp_self_test_status(int cmd);
  102. void secdp_self_test_start_reconnect(struct secdp_sysfs *dp_sysfs, void (*func)(struct secdp_misc *sec));
  103. void secdp_self_test_start_hdcp_test(struct secdp_sysfs *dp_sysfs, void (*func_on)(void),
  104. void (*func_off)(void));
  105. //void secdp_self_register_clear_func(int cmd, void (*func)(void));
  106. int *secdp_self_test_get_arg(int cmd);
  107. #endif/*SECDP_SELF_TEST*/
  108. /* monitor aspect ratio */
  109. enum mon_aspect_ratio_t {
  110. MON_RATIO_NA = -1,
  111. MON_RATIO_3_2,
  112. MON_RATIO_4_3,
  113. MON_RATIO_5_3,
  114. MON_RATIO_5_4,
  115. MON_RATIO_8_5,
  116. MON_RATIO_10P5_9,
  117. MON_RATIO_11_10,
  118. MON_RATIO_16_9,
  119. MON_RATIO_16_10,
  120. MON_RATIO_21_9,
  121. MON_RATIO_21_10,
  122. MON_RATIO_32_9,
  123. MON_RATIO_32_10,
  124. };
  125. static inline char *secdp_aspect_ratio_to_string(enum mon_aspect_ratio_t ratio)
  126. {
  127. switch (ratio) {
  128. case MON_RATIO_3_2: return DP_ENUM_STR(MON_RATIO_3_2);
  129. case MON_RATIO_4_3: return DP_ENUM_STR(MON_RATIO_4_3);
  130. case MON_RATIO_5_3: return DP_ENUM_STR(MON_RATIO_5_3);
  131. case MON_RATIO_5_4: return DP_ENUM_STR(MON_RATIO_5_4);
  132. case MON_RATIO_8_5: return DP_ENUM_STR(MON_RATIO_8_5);
  133. case MON_RATIO_10P5_9: return DP_ENUM_STR(MON_RATIO_10P5_9);
  134. case MON_RATIO_11_10: return DP_ENUM_STR(MON_RATIO_11_10);
  135. case MON_RATIO_16_9: return DP_ENUM_STR(MON_RATIO_16_9);
  136. case MON_RATIO_16_10: return DP_ENUM_STR(MON_RATIO_16_10);
  137. case MON_RATIO_21_9: return DP_ENUM_STR(MON_RATIO_21_9);
  138. case MON_RATIO_21_10: return DP_ENUM_STR(MON_RATIO_21_10);
  139. case MON_RATIO_32_9: return DP_ENUM_STR(MON_RATIO_32_9);
  140. case MON_RATIO_32_10: return DP_ENUM_STR(MON_RATIO_32_10);
  141. case MON_RATIO_NA: return DP_ENUM_STR(MON_RATIO_NA);
  142. default: return "unknown";
  143. }
  144. }
  145. /* adapter type : SST or MST */
  146. enum secdp_adapter_t {
  147. SECDP_ADT_UNKNOWN = -1,
  148. SECDP_ADT_SST = 10,
  149. SECDP_ADT_MST = 11,
  150. };
  151. /* dex supported resolutions */
  152. enum dex_support_res_t {
  153. DEX_RES_NOT_SUPPORT = 0,
  154. DEX_RES_1600X900, /* HD+ */
  155. DEX_RES_1920X1080, /* FHD */
  156. DEX_RES_1920X1200, /* WUXGA */
  157. DEX_RES_2560X1080, /* UW-UXGA */
  158. DEX_RES_2560X1440, /* QHD */
  159. DEX_RES_2560X1600, /* WQXGA */
  160. DEX_RES_3440X1440, /* UW-QHD */
  161. DEX_RES_END,
  162. };
  163. #define DEX_RES_DFT DEX_RES_1920X1080 /* DeX default timing */
  164. #define DEX_DFT_COL 1920
  165. #define DEX_DFT_ROW 1080
  166. #define DEX_RES_MAX DEX_RES_3440X1440 /* DeX max timing */
  167. #define DEX_MAX_COL 3440
  168. #define DEX_MAX_ROW 1440
  169. #define DEX_REFRESH_MIN 50
  170. #define DEX_REFRESH_MAX 60
  171. #define MIRROR_REFRESH_MIN 24
  172. static inline char *secdp_dex_res_to_string(int res)
  173. {
  174. switch (res) {
  175. case DEX_RES_NOT_SUPPORT:
  176. return DP_ENUM_STR(DEX_RES_NOT_SUPPORT);
  177. case DEX_RES_1600X900:
  178. return DP_ENUM_STR(DEX_RES_1600X900);
  179. case DEX_RES_1920X1080:
  180. return DP_ENUM_STR(DEX_RES_1920X1080);
  181. case DEX_RES_1920X1200:
  182. return DP_ENUM_STR(DEX_RES_1920X1200);
  183. case DEX_RES_2560X1080:
  184. return DP_ENUM_STR(DEX_RES_2560X1080);
  185. case DEX_RES_2560X1440:
  186. return DP_ENUM_STR(DEX_RES_2560X1440);
  187. case DEX_RES_2560X1600:
  188. return DP_ENUM_STR(DEX_RES_2560X1600);
  189. case DEX_RES_3440X1440:
  190. return DP_ENUM_STR(DEX_RES_3440X1440);
  191. default:
  192. return "unknown";
  193. }
  194. }
  195. enum DEX_STATUS {
  196. DEX_DISABLED = 0,
  197. DEX_ENABLED,
  198. DEX_MODE_CHANGING,
  199. };
  200. /** redriver devices */
  201. enum secdp_redrv_dev {
  202. SECDP_REDRV_NONE = 0,
  203. SECDP_REDRV_PTN36502, /* don't need AUX_SEL control */
  204. SECDP_REDRV_PS5169, /* need AUX_SEL control */
  205. };
  206. static inline char *secdp_redrv_to_string(int res)
  207. {
  208. switch (res) {
  209. case SECDP_REDRV_NONE:
  210. return DP_ENUM_STR(SECDP_REDRV_NONE);
  211. case SECDP_REDRV_PTN36502:
  212. return DP_ENUM_STR(SECDP_REDRV_PTN36502);
  213. case SECDP_REDRV_PS5169:
  214. return DP_ENUM_STR(SECDP_REDRV_PS5169);
  215. default:
  216. return "unknown";
  217. }
  218. }
  219. struct secdp_adapter {
  220. uint ven_id;
  221. uint prod_id;
  222. char ieee_oui[4]; /* DPCD 500h ~ 502h */
  223. char devid_str[7]; /* DPCD 503h ~ 508h */
  224. char fw_ver[10]; /* firmware ver, 0:h/w, 1:s/w major, 2:s/w minor */
  225. bool ss_genuine;
  226. bool ss_legacy;
  227. enum dex_support_res_t dex_type;
  228. };
  229. #define MON_NAME_LEN 14 /* monitor name length, max 13 chars + null */
  230. #define MAX_NUM_HMD 32
  231. #define DEX_TAG_HMD "HMD"
  232. struct secdp_sink_dev {
  233. uint ven_id; /* vendor id from PDIC */
  234. uint prod_id; /* product id from PDIC */
  235. char monitor_name[MON_NAME_LEN]; /* from EDID */
  236. };
  237. struct secdp_pdic_noti {
  238. struct delayed_work reg_work;
  239. struct notifier_block nb;
  240. bool registered;
  241. bool reset; /* true if PDIC or SSUSB get reset after DP connection */
  242. };
  243. struct secdp_prefer {
  244. enum mon_aspect_ratio_t ratio;
  245. bool exist; /* true if preferred resolution */
  246. int hdisp; /* horizontal pixel of preferred resolution */
  247. int vdisp; /* vertical pixel of preferred resolution */
  248. int refresh; /* refresh rate of preferred resolution */
  249. };
  250. struct secdp_dex {
  251. struct class *sysfs_class;
  252. enum dex_support_res_t res; /* dex supported resolution */
  253. enum DEX_STATUS prev; /* previously known as "dex_now" */
  254. enum DEX_STATUS curr; /* previously known as "dex_en" */
  255. int setting_ui; /* "dex_set", true if setting has Dex mode */
  256. bool ignore_prefer_ratio; /* true if prefer ratio does not match to dex ratio */
  257. bool adapter_check_skip;
  258. /*
  259. * 2 if resolution is changed during dex mode change.
  260. * And once dex framework reads the dex_node_stauts using dex node,
  261. * it's assigned to same value with curr.
  262. */
  263. enum DEX_STATUS status; /* previously known as "dex_node_status" */
  264. bool reconnecting; /* true if dex is under reconnecting */
  265. };
  266. struct secdp_display_timing {
  267. u32 active_h;
  268. u32 active_v;
  269. u32 refresh_rate;
  270. bool interlaced;
  271. int clock; /* pixel clock, refer to "struct drm_display_mode" */
  272. enum dex_support_res_t dex_res; /* dex supported resolution */
  273. enum mon_aspect_ratio_t mon_ratio; /* monitor aspect ratio */
  274. int supported; /* for unit test */
  275. u64 total;
  276. };
  277. struct secdp_hmd {
  278. struct secdp_sink_dev list[MAX_NUM_HMD]; /* supported HMD dev list */
  279. struct mutex lock;
  280. bool exist; /* true if connected sink is known HMD device */
  281. };
  282. struct secdp_hdcp {
  283. struct delayed_work start_work;
  284. int retry; /* count if dp link is unstable during hdcp */
  285. };
  286. struct secdp_hpd {
  287. struct delayed_work noti_work;
  288. bool noti_deferred;
  289. atomic_t val; /* 1 if hpd high, 0 if hpd low" */
  290. bool prev_evt;
  291. };
  292. struct secdp_debug {
  293. bool prefer_check_skip;
  294. };
  295. struct secdp_misc {
  296. struct delayed_work link_status_work;
  297. struct delayed_work link_backoff_work;
  298. bool backoff_start;
  299. struct delayed_work poor_discon_work;
  300. struct device *uevent_dev;
  301. #ifdef MODEM_RF_INFO
  302. struct rf_information rf_info;
  303. struct notifier_block modem_rfinfo_nb;
  304. #endif
  305. bool extdisp_off;
  306. bool cable_connected; /* previously known as "cable_connected_phy" */
  307. bool link_conf; /* previously known as "sec_link_conf" */
  308. struct secdp_hpd hpd;
  309. int mode_cnt;
  310. struct secdp_adapter adapter;
  311. struct secdp_pdic_noti pdic_noti;
  312. struct secdp_display_timing prf_timing; /* preferred timing */
  313. struct secdp_display_timing mrr_timing; /* max "mirror" timing */
  314. struct secdp_display_timing dex_timing; /* max "dex" timing */
  315. struct secdp_prefer prefer;
  316. struct secdp_hdcp hdcp;
  317. struct secdp_debug debug;
  318. struct secdp_sysfs *sysfs;
  319. struct secdp_dex dex;
  320. struct secdp_hmd hmd;
  321. struct completion dp_off_comp;
  322. struct completion dp_discon_comp;
  323. bool dp_disconnecting;
  324. bool lpm_booting;
  325. struct mutex notify_lock;
  326. struct mutex attention_lock;
  327. struct mutex notifier_lock;
  328. atomic_t noti_status;
  329. struct notifier_block reboot_nb;
  330. bool reboot; /* true if rebooted or shutdown */
  331. #ifdef SECDP_USE_WAKELOCK
  332. struct wakeup_source *ws;
  333. #endif
  334. #ifdef SECDP_SELF_TEST
  335. struct delayed_work self_test_reconnect_work;
  336. struct delayed_work self_test_hdcp_test_work;
  337. void (*self_test_reconnect_cb)(struct secdp_misc *sec);
  338. void (*self_test_hdcp_on_cb)(void);
  339. void (*self_test_hdcp_off_cb)(void);
  340. #endif
  341. };
  342. bool secdp_adapter_check_parade(struct secdp_misc *sec);
  343. bool secdp_adapter_check_ps176(struct secdp_misc *sec);
  344. bool secdp_adapter_check_ps176_legacy(struct secdp_misc *sec);
  345. bool secdp_adapter_check_realtek(struct secdp_misc *sec);
  346. bool secdp_get_lpm_mode(struct secdp_misc *sec);
  347. int secdp_send_deferred_hpd_noti(struct secdp_misc *sec);
  348. int secdp_pdic_noti_register_ex(struct secdp_misc *sec, bool retry);
  349. bool secdp_phy_reset_check(void);
  350. bool secdp_get_power_status(void);
  351. bool secdp_get_cable_status(void);
  352. bool secdp_get_hpd_irq_status(void);
  353. int secdp_get_hpd_status(void);
  354. struct drm_connector *secdp_get_connector(void);
  355. bool secdp_get_reboot_status(void);
  356. bool secdp_check_hmd_dev(struct secdp_misc *sec, const char *name_to_search);
  357. int secdp_store_hmd_dev(struct secdp_misc *sec, char *buf, size_t len, int num);
  358. void secdp_timing_init(struct secdp_misc *sec);
  359. void secdp_extdisp_on(struct secdp_misc *sec);
  360. void secdp_extdisp_off(struct secdp_misc *sec);
  361. void secdp_reconnect(struct secdp_misc *sec);
  362. bool secdp_check_reconnect(struct secdp_misc *sec);
  363. void secdp_link_backoff_start(void);
  364. void secdp_link_backoff_stop(void);
  365. bool secdp_adapter_is_legacy(void);
  366. bool secdp_panel_hdr_supported(void);
  367. #endif/*__SECDP_H*/